     1                                  ; ****************************************************************************
     2                                  ; dsectpm2.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'dsectpm2.prg')
     3                                  ; ---------------------------------------------------------------------------
     4                                  ; DSECTPM2.PRG ! TEST program !
     5                                  ; 'Display Disk Sectors' by using TRDOS 386 disk and timer interrupts.
     6                                  ;
     7                                  ; 27/05/2016
     8                                  ;
     9                                  ; Derived from 'dsestrm2.s' source code for Retro UNIX 386 v1 'boot'
    10                                  ;
    11                                  ; [ Last Modification: 18/06/2016 ]
    12                                  ;
    13                                  ; ****************************************************************************
    14                                  ; dsectrm2.s (21/02/2015, Retro UNIX 386 v1, standalone program, real mode)
    15                                  ; dsectpm.s (28/02/2015, Retro UNIX 386 v1, standalone prog, protected mode)
    16                                  ; 
    17                                  ; Assembler: NASM 2.11
    18                                  
    19                                  ; display disk sector data [R etro Unix 386 v1 - test ]
    20                                  ; by Erdogan Tan [ Real Mode adaption (Standalone program), 21/02/2015 ]
    21                                  
    22                                  ESCKey	 equ 1Bh    ;27		
    23                                  ENTERKey equ 0Dh    ;13
    24                                  SPACEKey equ 20h    ;32
    25                                  BACKSPC	 equ 08h    ; 8
    26                                  DELKey	 equ 53E0h
    27                                  F1Key	 equ 3B00h
    28                                  F2Key	 equ 3C00h
    29                                  F3Key	 equ 3D00h
    30                                  HOMEKey  equ 47E0h
    31                                  ENDKey	 equ 4FE0h
    32                                  PgUpKey	 equ 49E0h
    33                                  PgDnKey  equ 51E0h 
    34                                  
    35                                  [BITS 32]
    36                                  	
    37                                  	; clear bss area
    38                                  
    39                                  	; ecx = 0
    40 00000000 B9B8120000              	mov	ecx, bss_end - bss_start
    41 00000005 66C1E902                	shr	cx, 2 ; dword count
    42 00000009 BF[B0160000]            	mov	edi, bss_start
    43                                  	; eax = 0
    44                                  	;xor	eax, eax
    45 0000000E F3AB                    	rep	stosd
    46                                  	
    47 00000010 BE[EA150000]                    mov     esi, prg_msg
    48 00000015 E8560D0000              	call	print_msg
    49                                  
    50                                  	; Filling disk parameters tables
    51                                  _fd0:
    52                                  	;xor	dl, dl ; fd0
    53                                  	;mov	[drv], dl
    54 0000001A BB[00170000]            	mov	ebx, fd0_dpt
    55 0000001F B408                    	mov	ah, 08h	; return disk parameters
    56 00000021 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    57 00000023 724B                    	jc	short _hd0
    58 00000025 C605[BE160000]80        	mov	byte [drv_status], 80h
    59 0000002C 001D[80160000]          	add	[fd0_type], bl
    60 00000032 8815[66290000]          	mov	[fdc], dl
    61 00000038 E870080000              	call	set_disk_parms
    62 0000003D FE0D[66290000]          	dec	byte [fdc]
    63 00000043 742B                    	jz	short _hd0
    64                                  _fd1:
    65 00000045 B201                    	mov	dl, 1 ; fd1
    66 00000047 8815[BD160000]          	mov	[drv], dl
    67 0000004D BB[10170000]            	mov	ebx, fd1_dpt
    68 00000052 B408                    	mov	ah, 08h	; return disk parameters
    69 00000054 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    70 00000056 7218                    	jc	short _hd0
    71 00000058 C605[BF160000]80        	mov	byte [drv_status+1], 80h
    72 0000005F 001D[81160000]          	add	[fd1_type], bl
    73 00000065 E843080000              	call	set_disk_parms
    74 0000006A FE0D[66290000]                  dec     byte [fdc] ; = 0 
    75                                  _hd0:
    76 00000070 B280                    	mov	dl, 80h ; hd0
    77 00000072 8815[BD160000]          	mov	[drv], dl
    78 00000078 BB[20170000]            	mov	ebx, hd0_dpt
    79 0000007D B408                    	mov	ah, 08h	; return disk parameters
    80 0000007F CD33                      	int	33h	; TRDOS 386 disk io interrupt
    81 00000081 7224                    	jc	short _hd1
    82 00000083 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
    83 00000086 C0E806                  	shr	al, 6 ; bit 6 = bit 0
    84 00000089 0480                    	add	al, 80h
    85 0000008B A2[C0160000]            	mov	[drv_status+2], al
    86 00000090 8815[65290000]          	mov	[hdc], dl
    87 00000096 E812080000              	call	set_disk_parms
    88 0000009B FE0D[65290000]          	dec	byte [hdc]  ; number of fixed disk drives - 1
    89 000000A1 0F8485000000            	jz	sccps
    90                                  _hd1:
    91 000000A7 B281                    	mov	dl, 81h ; hd1
    92 000000A9 8815[BD160000]          	mov	[drv], dl
    93 000000AF BB[40170000]            	mov	ebx, hd1_dpt
    94 000000B4 B408                    	mov	ah, 08h	; return disk parameters
    95 000000B6 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    96 000000B8 721A                    	jc	short _hd2
    97 000000BA 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
    98 000000BD C0E806                  	shr	al, 6 ; bit 6 = bit 0
    99 000000C0 0480                    	add	al, 80h
   100 000000C2 A2[C1160000]            	mov	[drv_status+3], al
   101 000000C7 E8E1070000              	call	set_disk_parms
   102 000000CC FE0D[65290000]          	dec	byte [hdc]
   103 000000D2 7458                    	jz	short sccps
   104                                  _hd2:
   105 000000D4 B282                    	mov	dl, 82h ; hd2
   106 000000D6 8815[BD160000]          	mov	[drv], dl
   107 000000DC BB[60170000]            	mov	ebx, hd2_dpt
   108 000000E1 B408                    	mov	ah, 08h	; return disk parameters
   109 000000E3 CD33                      	int	33h	; TRDOS 386 disk io interrupt
   110 000000E5 721A                    	jc	short _hd3
   111 000000E7 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
   112 000000EA C0E806                  	shr	al, 6 ; bit 6 = bit 0
   113 000000ED 0480                    	add	al, 80h
   114 000000EF A2[C2160000]            	mov	[drv_status+4], al
   115 000000F4 E8B4070000              	call	set_disk_parms
   116 000000F9 FE0D[65290000]          	dec	byte [hdc]
   117 000000FF 742B                    	jz	short sccps
   118                                  _hd3:
   119 00000101 B283                    	mov	dl, 83h ; hd3
   120 00000103 8815[BD160000]          	mov	[drv], dl
   121 00000109 BB[80170000]            	mov	ebx, hd3_dpt
   122 0000010E B408                    	mov	ah, 08h	; return disk parameters
   123 00000110 CD33                      	int	33h	; TRDOS 386 disk io interrupt
   124 00000112 7218                    	jc	short sccps
   125 00000114 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
   126 00000117 C0E806                  	shr	al, 6 ; bit 6 = bit 0
   127 0000011A 0480                    	add	al, 80h
   128 0000011C A2[C3160000]            	mov	[drv_status+5], al
   129 00000121 E887070000              	call	set_disk_parms
   130 00000126 FE0D[65290000]          	dec	byte [hdc] ; = 0
   131                                  
   132                                  sccps:
   133                                  	; get cursor position
   134 0000012C 31DB                    	xor	ebx, ebx ; bh = video page 0
   135 0000012E B403                    	mov	ah, 03h	; get cursor position and shape
   136 00000130 CD31                    	int	31h 	; TRDOS 386 video interrupt
   137                                  			; (IBM PC/AT ROMBIOS, INT 10h) 	
   138 00000132 668915[B0160000]        	mov	[cursor_posn], dx ; position
   139 00000139 66890D[B2160000]        	mov	[cursor_shp], cx ; shape
   140                                  
   141                                  	; Save video page (before displaying sector)
   142                                  
   143                                  	; copy video page 0 to video page 6
   144                                  	;sub	ebx, ebx ; bl = 0 -> system to system
   145                                  			 ; bh = 0 -> 80*25 text mode 
   146 00000140 28C9                    	sub	cl, cl   ; source = video page 0
   147 00000142 B206                    	mov	dl, 6    ; destination = video page 6
   148 00000144 B81F000000              	mov	eax, 31  ; 'sysvideo'
   149 00000149 CD40                    	int	40h	 ; TRDOS 386 system call  
   150                                  
   151                                  display_sectors:
   152 0000014B E83F070000              	call	hide_cursor
   153                                  	; Save cursor position
   154 00000150 66A1[B0160000]          	mov	ax, [cursor_posn] ; cursor pos. 
   155                                  				  ; for video page 0
   156 00000156 66A3[B4160000]          	mov	[cursor_posb], ax
   157 0000015C E861050000              	call	clear_frame
   158                                  
   159                                  	; start (Real Time Clock) timer function
   160 00000161 B3FF                            mov     bl, 0FFh ; signal return (response) byte
   161 00000163 B703                            mov     bh, 3    ; 1 second (rtc interrupt) 
   162                                  	;mov	ecx, 1
   163 00000165 66B90100                	mov	cx, 1
   164 00000169 BA[A9160000]            	mov	edx, timer_event ; signal return (response) address
   165 0000016E B821000000              	mov	eax, 33	; 'systimer'
   166 00000173 CD40                    	int	40h	; TRDOS 386 system call
   167 00000175 7238                            jc      short dscl_0
   168                                  
   169 00000177 A2[64290000]            	mov	[timer_event_number], al 
   170                                  
   171 0000017C EB31                    	jmp	short dscl_0
   172                                  
   173                                  dscl_esc:
   174 0000017E E8F5030000              	call	restore_video_page
   175                                  dscl_getc:
   176 00000183 E896030000              	call	getch
   177                                  	;
   178 00000188 3C1B                    	cmp	al, ESCKey
   179 0000018A 0F8453030000                    je      dscl_exit
   180 00000190 C605[B7160000]00        	mov	byte [dscmd], 0
   181 00000197 663D003B                	cmp	ax, F1Key
   182 0000019B 7412                            je	short dscl_0
   183                                  	;
   184 0000019D FE05[B7160000]          	inc	byte [dscmd]
   185 000001A3 663D003D                	cmp	ax, F3Key
   186 000001A7 7530                            jne     short dscl_5
   187 000001A9 FE05[B7160000]          	inc	byte [dscmd] ; Display disk params.
   188                                  dscl_0:
   189 000001AF E8B6030000              	call	save_video_page
   190 000001B4 BE[97150000]            	mov	esi, F1_ib ; F1 (Change drive)
   191                                  			   ; Inputbox address
   192                                  dscl_ib:
   193 000001B9 E820060000              	call	inputbox
   194                                  		; cursor position in DX
   195 000001BE E8D3060000              	call	show_cursor
   196                                  		; cursor blinks at current position
   197 000001C3 8B0D[B8170000]          	mov	ecx, [prev_sec]
   198                                  dscl_3:
   199 000001C9 E850030000              	call	getch
   200 000001CE 3C1B                    	cmp	al, ESCKey
   201 000001D0 7524                    	jne	short dscl_27
   202 000001D2 E8B8060000                      call    hide_cursor
   203 000001D7 EBA5                            jmp     dscl_esc
   204                                  dscl_5:
   205 000001D9 663D003C                	cmp	ax, F2Key
   206 000001DD 0F8568020000            	jne	dscl_6
   207 000001E3 E882030000              	call	save_video_page
   208 000001E8 BE[A5150000]            	mov	esi, F2_ib ; F2 (Change sector)
   209                                  		           ; Inputbox address
   210 000001ED C605[B7160000]01        	mov	byte [dscmd], 1
   211 000001F4 EBC3                            jmp     short dscl_ib
   212                                  dscl_27:
   213 000001F6 3C20                    	cmp	al, SPACEKey
   214 000001F8 743C                    	je	short dscl_4	
   215 000001FA 3C0D                         	cmp	al, ENTERKey
   216 000001FC 7438                    	je	short dscl_4
   217                                  	;
   218 000001FE 31DB                    	xor	ebx, ebx
   219 00000200 803D[B7160000]01            	cmp     byte [dscmd], 1
   220 00000207 746A                    	je	short dscl_12
   221                                  	;
   222 00000209 3C30                    	cmp	al, '0'
   223 0000020B 72BC                    	jb	short dscl_3
   224 0000020D 3C35                    	cmp	al, '5'
   225 0000020F 77B8                    	ja	short dscl_3
   226 00000211 8B3D[AC160000]          	mov	edi, [current_txtpos]
   227 00000217 AA                      	stosb
   228                                  	;
   229                                  	;xor	bh, bh  ; video page 0
   230 00000218 B40A                    	mov	ah, 0Ah ; write chr at current cursor pos.
   231 0000021A CD31                    	int	31h     ; TRDOS 386 video interrupt
   232                                  	;
   233 0000021C 2C30                    	sub	al, '0'
   234 0000021E 88C2                    	mov	dl, al
   235 00000220 30F6                    	xor	dh, dh
   236 00000222 88C3                    	mov	bl, al
   237 00000224 C0E302                  	shl	bl, 2  ; *4
   238 00000227 81C3[A0170000]          	add	ebx, ds_sec ; current_sector
   239 0000022D 8B0B                    	mov	ecx, [ebx]
   240 0000022F BE[BC170000]                    mov     esi, sector_buffer
   241 00000234 EB93                    	jmp	short dscl_3 
   242                                  dscl_4:
   243 00000236 803D[B8160000]00        	cmp	byte [inds],  0 ; display other half or not ?
   244 0000023D 0F871C010000                    ja      dscl_oh         ; other half
   245 00000243 6652                    	push	dx
   246                                  	; save regs (ESI, ECX, DX)
   247 00000245 E845060000              	call	hide_cursor
   248                                  	; restore regs (ESI, ECX, DX)
   249 0000024A 665A                    	pop	dx
   250 0000024C 89C8                    	mov	eax, ecx
   251                                  	;
   252 0000024E 803D[B7160000]01        	cmp     byte [dscmd], 1 ; Requested function ?
   253 00000255 0F84C7000000                    je      dscl_17         ; Change sector (F2)
   254 0000025B 0F8238010000                    jb      dscl_ns         ; Change drive (F1)
   255                                  
   256                                  	; Display disk parameters (dscmd = 2)
   257 00000261 80FA02                  	cmp	dl, 2
   258 00000264 7203                    	jb	short dscl_28
   259 00000266 80C27E                  	add	dl, 7Eh
   260                                  dscl_28:
   261 00000269 E8E9070000              	call	dskprm
   262 0000026E E90BFFFFFF                      jmp     dscl_esc
   263                                  dscl_12:
   264 00000273 663DE053                	cmp	ax, DELKey	; DEL key
   265 00000277 7404                    	je	short dscl_bs
   266 00000279 3C08                    	cmp	al, BACKSPC	; Backspace key
   267 0000027B 7535                    	jne	short dscl_13
   268                                  dscl_bs:
   269 0000027D 803D[B6160000]00        	cmp	byte [txtposoff], 0
   270 00000284 0F863FFFFFFF                    jna     dscl_3
   271 0000028A FE0D[B6160000]          	dec	byte [txtposoff]
   272 00000290 FE0D[B0160000]          	dec	byte [cursor_posn]
   273 00000296 E840130000              	call	set_cpos
   274 0000029B 0FB61D[B6160000]        	movzx	ebx, byte [txtposoff]
   275 000002A2 FE0D[B6160000]          	dec	byte [txtposoff]
   276 000002A8 FE0D[B0160000]          	dec	byte [cursor_posn]
   277 000002AE B020                    	mov	al, 20h
   278 000002B0 EB1B                            jmp     short dscl_14
   279                                  dscl_13:
   280 000002B2 8A1D[B6160000]          	mov	bl, [txtposoff]
   281 000002B8 80FB08                  	cmp	bl, 8
   282 000002BB 0F8308FFFFFF                    jnb     dscl_3
   283                                  	;
   284 000002C1 3C30                    	cmp	al, '0'
   285 000002C3 0F8200FFFFFF                    jb      dscl_3
   286 000002C9 3C39                    	cmp	al, '9'
   287 000002CB 7735                    	ja	short dscl_15
   288                                  dscl_14:
   289 000002CD D0E3                    	shl	bl, 1
   290 000002CF 8B35[AC160000]          	mov	esi, [current_txtpos]
   291 000002D5 01F3                    	add	ebx, esi
   292 000002D7 8803                    	mov	[ebx], al
   293                                  	;
   294 000002D9 30FF                    	xor	bh, bh  ; video page 0
   295 000002DB B40A                    	mov	ah, 0Ah ; write chr at current cursor pos.
   296 000002DD CD31                    	int	31h     ; TRDOS 386 video interrupt
   297                                  	;
   298 000002DF 803D[B6160000]08        	cmp	byte [txtposoff], 8
   299 000002E6 0F8DDDFEFFFF            	jge	dscl_3 ; JGE !
   300 000002EC FE05[B6160000]          	inc	byte [txtposoff]
   301 000002F2 FE05[B0160000]          	inc	byte [cursor_posn]
   302 000002F8 E8DE120000              	call	set_cpos
   303 000002FD E9C7FEFFFF                      jmp     dscl_3 
   304                                  dscl_15:
   305 00000302 3C41                    	cmp	al, 'A'
   306 00000304 0F82BFFEFFFF                    jb      dscl_3
   307 0000030A 3C46                    	cmp	al, 'F'
   308 0000030C 76BF                            jna     short dscl_14
   309                                  dscl_16:
   310 0000030E 3C61                    	cmp	al, 'a'
   311 00000310 0F82B3FEFFFF                    jb      dscl_3
   312 00000316 3C66                    	cmp	al, 'f'
   313 00000318 0F87ABFEFFFF                    ja      dscl_3
   314 0000031E 2C20                    	sub	al, 'a' - 'A'
   315 00000320 EBAB                    	jmp	short dscl_14
   316                                  	;
   317                                  dscl_17:
   318 00000322 8B35[AC160000]          	mov	esi, [current_txtpos]
   319 00000328 31C0                    	xor	eax, eax
   320 0000032A A2[B6160000]            	mov	byte [txtposoff], al ; 0
   321 0000032F 50                      	push	eax  ; sector value (reset)	
   322                                  dscl_18:
   323 00000330 66AD                    	lodsw
   324 00000332 3C30                    	cmp	al, '0'
   325 00000334 7219                    	jb	short dscl_22
   326                                  dscl_19: 
   327 00000336 29C9                    	sub	ecx, ecx
   328 00000338 BB[63140000]            	mov	ebx, hexchrs
   329                                  dscl_20:
   330 0000033D 3A03                    	cmp	al, [ebx]
   331 0000033F 7405                    	je	short dscl_21
   332                                  	;cmp	cl, 15
   333                                  	;jnb	short dscl_22
   334 00000341 FEC1                    	inc	cl
   335 00000343 43                      	inc	ebx
   336 00000344 EBF7                    	jmp	short dscl_20
   337                                  dscl_21: 
   338 00000346 58                      	pop	eax
   339 00000347 C1E004                  	shl	eax, 4	; * 16
   340 0000034A 01C8                    	add	eax, ecx
   341 0000034C 50                      	push	eax
   342 0000034D EBE1                    	jmp	short dscl_18
   343                                  dscl_22:
   344 0000034F 8A15[73140000]          	mov	dl, [ds_drv]
   345 00000355 30F6                    	xor	dh, dh
   346 00000357 58                      	pop	eax
   347 00000358 BE[BC170000]                    mov     esi, sector_buffer
   348 0000035D EB3A                            jmp     short dscl_ns
   349                                  dscl_oh:
   350 0000035F 8A15[73140000]          	mov	dl, [ds_drv]
   351 00000365 0FB6DA                  	movzx	ebx, dl
   352 00000368 C0E302                  	shl	bl, 2
   353 0000036B 81C3[A0170000]          	add	ebx, ds_sec
   354 00000371 8B03                    	mov	eax, [ebx]
   355 00000373 BE[BC170000]                    mov     esi, sector_buffer
   356                                  	;
   357 00000378 8A35[74140000]          	mov	dh, [ds_drv+1]
   358 0000037E 08F6                    	or	dh, dh
   359 00000380 7404                    	jz	short dscl_nh ; second half of sector (0->1)
   360 00000382 30F6                    	xor	dh, dh	      ; reset (0)	
   361 00000384 EB08                    	jmp	short dscl_nx
   362                                  dscl_nh:
   363 00000386 81C600010000            	add	esi, 256
   364 0000038C FEC6                    	inc	dh
   365                                  dscl_nx:
   366 0000038E 8835[74140000]          	mov	[ds_drv+1], dh
   367 00000394 E991000000                      jmp     dscl_25
   368                                  dscl_ns:
   369 00000399 8835[74140000]          	mov	[ds_drv+1], dh
   370 0000039F 0FB6DA                  	movzx	ebx, dl
   371 000003A2 C0E302                  	shl	bl, 2
   372 000003A5 81C3[A0170000]          	add	ebx, ds_sec
   373 000003AB 3A15[73140000]          	cmp	dl, [ds_drv]
   374 000003B1 7504                    	jne	short dscl_23
   375 000003B3 3B03                    	cmp	eax, [ebx]
   376 000003B5 7473                    	je	dscl_25
   377                                  dscl_23:
   378 000003B7 8A0D[73140000]          	mov	cl, [ds_drv]
   379 000003BD 880D[67290000]          	mov	[prev_drv], cl
   380 000003C3 8815[73140000]          	mov	[ds_drv], dl
   381                                  dscl_26:
   382 000003C9 8B0B                    	mov	ecx, [ebx]
   383 000003CB 890D[B8170000]          	mov	[prev_sec], ecx
   384 000003D1 8903                    	mov	[ebx], eax
   385 000003D3 E84F050000              	call	read_disk_sector
   386 000003D8 7336                    	jnc	short dscl_24
   387                                  dscl_rd_err:
   388                                  	;
   389                                  	;mov	al, ah	; error code
   390                                  	;mov	edi, err_code_str
   391                                  	;call	write_hex
   392                                  	;
   393 000003DA BE[B5150000]            	mov	esi, dskr_err ; drive not ready or read error
   394 000003DF E8FA030000              	call	inputbox
   395 000003E4 E835010000              	call	getch
   396 000003E9 E88A010000              	call	restore_video_page
   397 000003EE 0FB61D[67290000]        	movzx	ebx, byte [prev_drv]
   398 000003F5 881D[73140000]          	mov	[ds_drv], bl
   399 000003FB C0E302                  	shl	bl, 2
   400 000003FE 81C3[A0170000]          	add	ebx, ds_sec
   401 00000404 A1[B8170000]            	mov	eax, [prev_sec]
   402 00000409 8903                    	mov	[ebx], eax
   403 0000040B E973FDFFFF                      jmp     dscl_getc
   404                                  dscl_24:
   405 00000410 668B15[73140000]        	mov	dx, [ds_drv]
   406 00000417 0FB6DA                  	movzx	ebx, dl
   407 0000041A C0E302                  	shl	bl, 2
   408 0000041D 81C3[A0170000]          	add	ebx, ds_sec
   409 00000423 8B03                    	mov	eax, [ebx]
   410 00000425 BE[BC170000]                    mov     esi, sector_buffer
   411                                  dscl_25:
   412 0000042A E865010000              	call	display_sector
   413 0000042F E836010000              	call	save_video_page
   414 00000434 E94AFDFFFF                      jmp     dscl_getc
   415                                  dscl_11:
   416 00000439 BE[BC170000]                    mov     esi, sector_buffer
   417 0000043E 8A15[73140000]          	mov	dl, [ds_drv]
   418 00000444 28F6                    	sub	dh, dh	 ; 0 = first half of sector
   419 00000446 E94EFFFFFF                      jmp     dscl_ns
   420                                  dscl_6:	
   421 0000044B 3C20                    	cmp	al, SPACEKey
   422 0000044D 0F840CFFFFFF                    je      dscl_oh
   423 00000453 3C0D                         	cmp	al, ENTERKey
   424 00000455 0F8404FFFFFF                    je      dscl_oh
   425                                  	;
   426 0000045B 663DE047                	cmp	ax, HOMEKey
   427 0000045F 7504                    	jne	short dscl_7
   428 00000461 31C0                    	xor	eax, eax
   429 00000463 EBD4                    	jmp	short dscl_11
   430                                  dscl_7:
   431 00000465 663DE04F                	cmp	ax, ENDKey
   432 00000469 7515                    	jne	short dscl_8
   433 0000046B 0FB61D[73140000]        	movzx	ebx, byte [ds_drv]
   434 00000472 C0E302                  	shl	bl, 2
   435 00000475 81C3[E8160000]                  add     ebx, drv_size
   436 0000047B 8B03                    	mov	eax, [ebx]
   437 0000047D 48                      	dec	eax
   438 0000047E EBB9                    	jmp	short dscl_11
   439                                  dscl_8:
   440 00000480 663DE051                	cmp	ax, PgDnKey
   441 00000484 753E                    	jne	short dscl_10
   442 00000486 E810000000              	call	dscl_9
   443 0000048B 40                      	inc	eax
   444 0000048C 39C8                    	cmp	eax, ecx ; last sector
   445 0000048E 0F8605FFFFFF            	jna	dscl_ns
   446 00000494 31C0                    	xor	eax, eax
   447 00000496 E92EFFFFFF              	jmp	dscl_26 
   448                                  dscl_9:	
   449 0000049B 0FB615[73140000]        	movzx	edx, byte [ds_drv]
   450 000004A2 89D3                    	mov	ebx, edx
   451 000004A4 C0E302                  	shl	bl, 2  ; *4
   452 000004A7 81C3[E8160000]                  add     ebx, drv_size
   453 000004AD 8B0B                    	mov	ecx, [ebx]
   454 000004AF 49                      	dec	ecx
   455 000004B0 81EB[E8160000]                  sub     ebx, drv_size
   456 000004B6 81C3[A0170000]          	add	ebx, ds_sec ; current sector
   457 000004BC 8B03                    	mov	eax, [ebx]	
   458 000004BE BE[BC170000]                    mov     esi, sector_buffer
   459 000004C3 C3                              retn
   460                                  dscl_10:
   461 000004C4 663DE049                	cmp	ax, PgUpKey
   462 000004C8 0F85B5FCFFFF                    jne     dscl_getc
   463 000004CE E8C8FFFFFF              	call	dscl_9
   464 000004D3 48                      	dec	eax
   465 000004D4 39C8                    	cmp	eax, ecx ; last sector
   466 000004D6 0F86BDFEFFFF            	jna	dscl_ns
   467 000004DC 89C8                    	mov	eax, ecx
   468 000004DE E9E6FEFFFF              	jmp	dscl_26
   469                                  
   470                                  dscl_exit:
   471                                  	;
   472                                  	; Stop timer event
   473 000004E3 0FB61D[64290000]        	movzx	ebx, byte [timer_event_number]
   474                                  		; bh = 0 -> stop timer event
   475                                  
   476 000004EA 20DB                    	and	bl, bl
   477 000004EC 7409                    	jz	short dscl_rvp
   478 000004EE B821000000              	mov	eax, 33	; 'systimer'
   479 000004F3 CD40                    	int	40h	; TRDOS 386 system call
   480                                  
   481 000004F5 28DB                    	sub	bl, bl
   482                                  dscl_rvp:
   483                                  	; Restore video page (before displaying sector)
   484                                  
   485                                  	; copy video page 6 to video page 0
   486                                  	;sub	ebx, ebx ; bl = 0 -> system to system
   487                                  			 ; bh = 0 -> 80*25 text mode 
   488 000004F7 B106                    	mov	cl, 6    ; source = video page 6
   489                                  
   490 000004F9 E87E000000              	call	restore_v_pg_x
   491                                  
   492                                  	; Restore cursor position
   493 000004FE 668B15[B4160000]        	mov	dx, [cursor_posb] 
   494                                  	;
   495                                  	; Set cursor position
   496                                  	;xor	bh, bh  ; Video page 0
   497 00000505 B402                    	mov	ah, 2	; set cursor position
   498 00000507 CD31                    	int	31h 	; TRDOS 386 video interrupt
   499                                  	
   500                                  	; Show standard blinking text cursor 
   501 00000509 668B0D[B2160000]                mov 	cx, [cursor_shp]
   502 00000510 B401                    	mov	ah, 1	; set cursor type
   503 00000512 CD31                    	int	31h 	; TRDOS 386 video interrupt
   504                                  
   505                                  terminate:
   506 00000514 B801000000              	mov	eax, 1	; 'sysexit'
   507 00000519 CD40                    	int	40h	; TRDOS 386 system call
   508                                  haltsys:
   509 0000051B F4                      	hlt
   510 0000051C EBFD                    	jmp	short haltsys
   511                                  
   512                                  getch:
   513                                  dscl_rtc_p:
   514 0000051E 803D[A9160000]00        	cmp	byte [timer_event], 0
   515 00000525 7638                    	jna	short dscl_getch
   516                                  
   517                                  	; timer function
   518 00000527 C605[A9160000]00        	mov	byte [timer_event], 0
   519                                  		
   520 0000052E BF[B41A0000]            	mov	edi, video_buffer + 0A0h + 50h ; Row 1, Column 40
   521 00000533 807F013F                	cmp     byte [edi+1], 3Fh ; cyan (3) Background
   522                                  			; white (F) forecolor 
   523                                  			; (display disk sector frame)
   524 00000537 752C                    	jne	short dscl_getchar
   525                                  
   526 00000539 51                      	push	ecx
   527 0000053A 52                      	push	edx
   528                                  
   529 0000053B E8F3010000              	call	rtc_p
   530                                  
   531                                  	; print real time clock content (as formatted)
   532                                  	; to video page line 1, column 40
   533 00000540 BE[B41A0000]            	mov	esi, video_buffer + 0A0h + 50h
   534 00000545 B928000100              	mov	ecx, 10028h ; row 1, column 40 (top left)
   535 0000054A BA4E000100                      mov     edx, 10028h + rtc_msg_end - rtc_msg ; (bottom right)
   536                                  			    ; row 1, column 40 + rtc_msg lenth 
   537 0000054F 29FF                    	sub	edi, edi ; no swap
   538 00000551 BB05000000              	mov	ebx, 5  ; user to system window transfer (active page)
   539 00000556 B81F000000              	mov	eax, 31 ; 'sysvideo'
   540 0000055B CD40                    	int	40h	; TRDOS 386 system call	
   541                                  
   542 0000055D 5A                      	pop	edx
   543 0000055E 59                      	pop	ecx
   544                                  	
   545                                  dscl_getch:
   546                                  	; Check keyboard buffer
   547 0000055F B411                    	mov	ah, 11h
   548 00000561 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   549                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   550 00000563 74B9                    	jz	short dscl_rtc_p ; keyboard buffer empty
   551                                  
   552                                  dscl_getchar:
   553                                  	; Getchar by using keyboard interrupt
   554 00000565 B410                    	mov	ah, 10h
   555 00000567 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   556                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   557 00000569 C3                      	retn
   558                                  		
   559                                  save_video_page:
   560                                  	; Save video page
   561                                  
   562                                  	; copy video page 0 to video page 7
   563 0000056A 29DB                    	sub	ebx, ebx ; bl = 0 -> system to system
   564                                  			 ; bh = 0 -> 80*25 text mode 
   565 0000056C 28C9                    	sub	cl, cl   ; source = video page 0
   566 0000056E B207                    	mov	dl, 7    ; destination = video page 7
   567 00000570 B81F000000              	mov	eax, 31  ; 'sysvideo'
   568 00000575 CD40                    	int	40h	 ; TRDOS 386 system call
   569                                  
   570 00000577 C3                      	retn  
   571                                  
   572                                  restore_video_page:
   573                                  	; copy video page 7 to video page 0
   574 00000578 29DB                    	sub	ebx, ebx ; bl = 0 -> system to system
   575                                  			 ; bh = 0 -> 80*25 text mode 
   576 0000057A B107                    	mov	cl, 7    ; source = video page 7
   577                                  
   578                                  restore_v_pg_x:
   579 0000057C 28D2                    	sub	dl, dl   ; destination = video page 0
   580 0000057E B81F000000              	mov	eax, 31  ; 'sysvideo'
   581 00000583 CD40                    	int	40h	 ; TRDOS 386 system call  
   582                                  
   583 00000585 B302                    	mov	bl, 2	 ; system to user
   584                                  	;xor	dl, dl   ; video page 0
   585 00000587 B9[C4190000]            	mov	ecx, video_buffer ; user buffer
   586 0000058C B81F000000              	mov	eax, 31	 ; 'sysvideo'
   587 00000591 CD40                     	int	40h	 ; TRDOS 386 system call  
   588                                  	
   589 00000593 C3                      	retn
   590                                  	
   591                                  display_sector:
   592                                  	; display disk sector data (on video page 0)
   593                                  	;
   594                                  	; INPUT ->
   595                                  	;	ESI = sector buffer offset
   596                                  	; 	      (sector size: 512 bytes)
   597                                  	;	EAX = sector number
   598                                  	;	DL = drive number (0,1,2,3,4,5,6)
   599                                  	;	DH = portion control byte 
   600                                  	;		 (0= first half of the sector, 
   601                                  	;		 >0= second half of the sector) 
   602                                  	; OUTPUT ->
   603                                  	;	Video page 0 (0B8000h) will be filled
   604                                  	;	with sector data
   605                                  	;	(ESI points to byte 256 of the buffer
   606                                  	;	or end of the buffer)	
   607                                  	;
   608                                  	; Modified registers: eax, edx, ecx, ebx, esi, edi
   609                                  	;
   610                                  	;
   611                                  	;xor	ecx, ecx ; reset for cx loop counts
   612 00000594 C605[B8160000]01        	mov	byte [inds], 1 ; for ENTER key handling 
   613                                  	;
   614 0000059B 50                      	push	eax
   615 0000059C 52                      	push	edx
   616 0000059D E820010000              	call	clear_frame
   617 000005A2 5A                      	pop	edx
   618 000005A3 58                      	pop	eax
   619                                  dsfh:
   620 000005A4 31DB                    	xor	ebx, ebx
   621 000005A6 08F6                    	or	dh, dh
   622 000005A8 7402                    	jz	short dsfh1
   623 000005AA B310                    	mov	bl, 10h
   624                                  dsfh1:
   625 000005AC 881D[B9160000]          	mov	[paragr], bl	; Paragraph (16 bytes)
   626                                  	;
   627 000005B2 88D3                    	mov	bl, dl
   628 000005B4 C0E302                  	shl	bl, 2	; *4
   629 000005B7 81C3[75140000]          	add	ebx, drv_names
   630 000005BD 8B13                    	mov	edx, [ebx]
   631 000005BF 8915[96140000]          	mov	[drv_name], edx
   632 000005C5 E8BF000000              	call	dwordtohex
   633 000005CA 8915[A4140000]          	mov	[sector_num], edx
   634 000005D0 A3[A8140000]            	mov	[sector_num+4], eax
   635 000005D5 B001                    	mov	al, 1
   636 000005D7 B43F                    	mov	ah, 3Fh ; cyan background, white forecolor
   637 000005D9 BB[8D140000]            	mov	ebx, dpheader
   638 000005DE E8CC000000              	call	print_line
   639 000005E3 B015                    	mov	al, 21
   640                                  	;mov	ah, 3Fh ; cyan background, white forecolor
   641 000005E5 BB[FE140000]            	mov	ebx, dpfooter1
   642 000005EA E8C0000000              	call	print_line
   643 000005EF B016                    	mov	al, 22
   644                                  	;mov	ah, 3Fh ; cyan background, white forecolor
   645 000005F1 BB[48150000]            	mov	ebx, dpfooter2
   646 000005F6 E8B4000000              	call	print_line
   647                                  ds1:
   648 000005FB B910000000              	mov	ecx, 16
   649                                  ds2:
   650 00000600 A0[B9160000]            	mov	al, [paragr]
   651 00000605 E841000000              	call	bytetohex
   652 0000060A 66A3[B4140000]          	mov	[sdline_1], ax
   653                                  	;
   654 00000610 51                      	push	ecx
   655 00000611 B110                    	mov	cl, 16
   656 00000613 BF[BC140000]            	mov	edi, sdline_2
   657                                  ds3:
   658 00000618 AC                      	lodsb	
   659 00000619 E82D000000              	call	bytetohex
   660 0000061E 66AB                    	stosw
   661 00000620 47                      	inc	edi
   662 00000621 E2F5                    	loop	ds3
   663 00000623 83EE10                  	sub	esi, 16
   664 00000626 47                      	inc	edi
   665 00000627 B110                    	mov	cl, 16
   666 00000629 F3A4                    	rep	movsb
   667 0000062B 59                      	pop	ecx
   668 0000062C B013                    	mov	al, 19	; line (row) 3 to 24
   669 0000062E 28C8                    	sub	al, cl
   670 00000630 B407                    	mov	ah, 07h ; Black background, light gray forecolor
   671 00000632 BB[AE140000]            	mov	ebx, sdline
   672 00000637 E85F000000              	call	print_line_80 ; 04/12/2014
   673 0000063C E205                    	loop	ds4
   674                                  	
   675                                  	;call	video_page_update
   676                                  	;retn
   677                                  
   678 0000063E E9B8000000              	jmp	video_page_update
   679                                  ds4:
   680 00000643 FE05[B9160000]          	inc	byte [paragr]
   681 00000649 EBB5                    	jmp	short ds2
   682                                  
   683                                  ; Convert binary number to hexadecimal string
   684                                  
   685                                  bytetohex:
   686                                  	; INPUT ->
   687                                  	; 	AL = byte (binary number)
   688                                  	; OUTPUT ->
   689                                  	;	AX = hexadecimal string
   690                                  	;
   691 0000064B 53                      	push	ebx
   692 0000064C 0FB6D8                  	movzx	ebx, al
   693 0000064F C0EB04                  	shr	bl, 4
   694 00000652 8A9B[63140000]          	mov	bl, [ebx+hexchrs] 	 	
   695 00000658 86D8                    	xchg	bl, al
   696 0000065A 80E30F                  	and	bl, 0Fh
   697 0000065D 8AA3[63140000]          	mov	ah, [ebx+hexchrs] 
   698 00000663 5B                      	pop	ebx	
   699 00000664 C3                      	retn
   700                                  
   701                                  wordtohex:
   702                                  	; INPUT ->
   703                                  	; 	AX = word (binary number)
   704                                  	; OUTPUT ->
   705                                  	;	EAX = hexadecimal string
   706                                  	;
   707 00000665 53                      	push	ebx
   708 00000666 86E0                    	xchg	ah, al
   709 00000668 6650                    	push	ax
   710 0000066A 0FB6DC                  	movzx	ebx, ah
   711 0000066D C0EB04                  	shr	bl, 4
   712 00000670 8A83[63140000]          	mov	al, [ebx+hexchrs] 	 	
   713 00000676 88E3                    	mov	bl, ah
   714 00000678 80E30F                  	and	bl, 0Fh
   715 0000067B 8AA3[63140000]          	mov	ah, [ebx+hexchrs]
   716 00000681 C1E010                  	shl	eax, 16
   717 00000684 6658                    	pop	ax
   718 00000686 5B                      	pop	ebx
   719 00000687 EBC2                    	jmp	short bytetohex
   720                                  	;mov	bl, al
   721                                  	;shr	bl, 4
   722                                  	;mov	bl, [ebx+hexchrs] 	 	
   723                                  	;xchg	bl, al	 	
   724                                  	;and	bl, 0Fh
   725                                  	;mov	ah, [ebx+hexchrs] 
   726                                  	;pop	ebx	
   727                                  	;retn
   728                                  
   729                                  dwordtohex:
   730                                  	; INPUT ->
   731                                  	; 	EAX = dword (binary number)
   732                                  	; OUTPUT ->
   733                                  	;	EDX:EAX = hexadecimal string
   734                                  	;
   735 00000689 50                      	push	eax
   736 0000068A C1E810                  	shr	eax, 16
   737 0000068D E8D3FFFFFF              	call	wordtohex
   738 00000692 89C2                    	mov	edx, eax
   739 00000694 58                      	pop	eax
   740 00000695 E8CBFFFFFF              	call	wordtohex
   741 0000069A C3                      	retn
   742                                  
   743                                  print_line_80:
   744                                  	; 04/12/2014
   745                                  	; al = line (0 to 24)
   746                                  	; ah = color attributes
   747                                  	; ebx = 80 chars string address	
   748 0000069B E881000000              	call 	get_lpos
   749 000006A0 51                      	push	ecx
   750 000006A1 B950000000              	mov	ecx, 80
   751                                  pl80:
   752 000006A6 8A03                    	mov	al, [ebx]
   753 000006A8 43                      	inc	ebx
   754 000006A9 66AB                    	stosw
   755 000006AB E2F9                    	loop	pl80
   756 000006AD 59                      	pop	ecx
   757 000006AE C3                      	retn
   758                                  
   759                                  print_line:
   760                                  	; al = line (0 to 24)
   761                                  	; ah = color attributes	
   762                                  	; ebx = ASCIIZ string address
   763 000006AF E86D000000              	call	get_lpos
   764 000006B4 56                      	push	esi
   765 000006B5 89DE                    	mov	esi, ebx
   766                                  prl1:
   767 000006B7 AC                      	lodsb
   768 000006B8 20C0                    	and	al, al
   769 000006BA 7404                    	jz	short prl2
   770 000006BC 66AB                    	stosw
   771 000006BE EBF7                    	jmp	short prl1
   772                                  prl2:
   773 000006C0 5E                      	pop	esi
   774 000006C1 C3                      	retn
   775                                  
   776                                  clear_frame:
   777 000006C2 30C0                    	xor	al, al ; Line 0
   778 000006C4 E846000000              	call	clear_line
   779 000006C9 B001                    	mov	al, 1
   780 000006CB B43F                    	mov	ah, 3Fh ; cyan background, white forecolor
   781 000006CD E83F000000              	call	fill_color
   782 000006D2 B001                    	mov	al, 1
   783                                  dscf0:	
   784 000006D4 FEC0                    	inc	al
   785 000006D6 6650                    	push	ax
   786 000006D8 E832000000              	call	clear_line
   787 000006DD 6658                    	pop	ax
   788 000006DF 3C13                    	cmp	al, 19
   789 000006E1 72F1                    	jb	short dscf0
   790                                  	;inc	al ; line 20
   791 000006E3 B43F                    	mov	ah, 3Fh
   792                                  dscf1:
   793 000006E5 FEC0                    	inc	al
   794 000006E7 6650                    	push	ax
   795 000006E9 E823000000              	call	fill_color	  
   796 000006EE 6658                    	pop	ax
   797 000006F0 3C17                    	cmp	al, 23
   798 000006F2 72F1                    	jb	short dscf1
   799 000006F4 FEC0                    	inc	al
   800 000006F6 E814000000              	call	clear_line
   801                                  
   802                                  	;call	video_page_update
   803                                  	;retn
   804                                  
   805                                  video_page_update:
   806                                  	; copy video buffer content to video page 0
   807 000006FB BB01000000              	mov	ebx, 1	; BL = 1 = user to system
   808 00000700 B200                    	mov	dl, 0	; video page 0
   809 00000702 B9[C4190000]            	mov	ecx, video_buffer
   810 00000707 B81F000000              	mov	eax, 31 ; 'sysvideo'
   811 0000070C CD40                    	int	40h	; TRDOS 386 system call	
   812 0000070E C3                      	retn
   813                                  
   814                                  clear_line:
   815 0000070F 30E4                    	xor	ah, ah ; blank
   816                                  fill_color:
   817                                  	; al = line (0 to 24)
   818                                  	; ah = color attributes
   819 00000711 E80B000000              	call	get_lpos
   820 00000716 B950000000              	mov	ecx, 80
   821 0000071B B020                    	mov	al, 20h ; space/blank
   822 0000071D F366AB                  	rep	stosw
   823 00000720 C3                      	retn
   824                                  
   825                                  get_lpos:  ; Get line position in video buffer
   826 00000721 6650                    	push	ax
   827 00000723 B4A0                    	mov	ah, 80*2
   828 00000725 F6E4                    	mul	ah
   829 00000727 0FB7F8                  	movzx	edi, ax
   830 0000072A 81C7[C4190000]          	add	edi, video_buffer
   831 00000730 6658                    	pop	ax
   832 00000732 C3                      	retn
   833                                  
   834                                  rtc_p:	
   835                                  	; Print Real Time Clock content
   836                                  	;
   837 00000733 B404                    	mov	ah, 4	; read the date
   838 00000735 CD35                    	int	35h	; TRDOS 386 date&time interrupt
   839                                  			; (IBM PC/AT ROMBIOS, INT 1Ah)
   840                                  	;mov	[date_day], dl
   841                                  	;mov	[date_month], dh
   842 00000737 668915[BC190000]        	mov	[date_day], dx
   843                                  	;mov	[date_year], cl
   844                                  	;mov	[date_century], ch
   845 0000073E 66890D[BE190000]        	mov	[date_year], cx
   846                                  	;
   847 00000745 B402                    	mov	ah, 2	; read the time
   848 00000747 CD35                    	int	35h	; TRDOS 386 date&time interrupt
   849 00000749 8835[C0190000]                  mov     [time_second], dh
   850                                          ;mov    [time_minute], cl
   851                                          ;mov    [time_hour], ch
   852 0000074F 66890D[C1190000]                mov     [time_minute], cx
   853                                  	;
   854 00000756 A0[BF190000]            	mov	al, [date_century]
   855 0000075B E875000000              	call	bcd_to_ascii
   856 00000760 66A3[9A160000]          	mov	word [datestr+6], ax
   857 00000766 A0[BE190000]            	mov	al, byte [date_year]
   858 0000076B E865000000              	call	bcd_to_ascii
   859 00000770 66A3[9C160000]          	mov	word [datestr+8], ax
   860 00000776 A0[BD190000]            	mov	al, byte [date_month]
   861 0000077B E855000000              	call	bcd_to_ascii
   862 00000780 66A3[97160000]          	mov	word [datestr+3], ax
   863 00000786 A0[BC190000]            	mov	al, byte [date_day]
   864 0000078B E845000000              	call	bcd_to_ascii
   865 00000790 66A3[94160000]          	mov	word [datestr], ax
   866                                  	;
   867 00000796 A0[C2190000]                    mov     al, byte [time_hour]
   868 0000079B E835000000              	call	bcd_to_ascii
   869 000007A0 66A3[A0160000]          	mov	word [timestr], ax
   870 000007A6 A0[C1190000]                    mov     al, byte [time_minute]
   871 000007AB E825000000              	call	bcd_to_ascii
   872 000007B0 66A3[A3160000]          	mov	word [timestr+3], ax
   873 000007B6 A0[C0190000]                    mov     al, byte [time_second]
   874 000007BB E815000000              	call	bcd_to_ascii
   875 000007C0 66A3[A6160000]          	mov	word [timestr+6], ax
   876                                  	;		
   877 000007C6 BE[82160000]            	mov	esi, rtc_msg ; message offset
   878                                  	;
   879                                  	;mov	edi, video_buffer + 0A0h + 050h ; Row 1, Column 40
   880                                  	;mov	ah, [edi+1]
   881                                  	;cmp	ah, 3Fh ; cyan (3) Background
   882                                  			; white (F) forecolor 
   883                                  			; (display disk sector frame)
   884                                  	;jne	short prtcmsg_ok	
   885                                  prtcmsg:
   886 000007CB AC                      	lodsb
   887 000007CC 08C0                    	or	al, al
   888 000007CE 7404                    	jz	short prtcmsg_ok
   889 000007D0 AA                      	stosb
   890 000007D1 47                      	inc 	edi
   891 000007D2 EBF7                    	jmp	short prtcmsg
   892                                  prtcmsg_ok:
   893 000007D4 C3                      	retn
   894                                  
   895                                  bcd_to_ascii:
   896                                  	; INPUT ->
   897                                  	;	AL = Packed BCD number
   898                                  	; OUTPUT ->
   899                                  	;	AX = ASCII word/number
   900                                  	;
   901 000007D5 D410                    	db	0D4h, 10h	; Undocumented inst. AAM
   902                                  				; AH = AL / 10h
   903                                  				; AL = AL MOD 10h
   904 000007D7 660D3030                	or	ax, '00'	; Make it ASCII based
   905                                  
   906 000007DB 86E0                            xchg	ah, al 
   907                                  	
   908 000007DD C3                      	retn	
   909                                  
   910                                  inputbox:
   911                                  	; Show an input box for user/keyboard input
   912                                  	; INPUT ->
   913                                  	;	ESI = input structure address 
   914                                  	; OUTPUT ->
   915                                  	;	DX  = cursor position for input
   916                                  	;	input box will be displayed (on tty0)
   917                                  	;
   918                                  	; Modified registers: eax, ebx, ecx, edx, esi, edi
   919                                  
   920 000007DE C605[B8160000]00        	mov	byte [inds], 0 ; for ENTER key handling
   921 000007E5 31C9                    	xor	ecx, ecx
   922 000007E7 BB[C4190000]            	mov	ebx, video_buffer
   923 000007EC B818500000              	mov	eax, 5018h ; 80, 24
   924 000007F1 668B16                  	mov	dx, [esi] ; box width (dl)
   925                                  			  ; box height (dh)
   926 000007F4 28F0                    	sub	al, dh
   927 000007F6 D0E8                    	shr	al, 1
   928 000007F8 A2[BB160000]            	mov	[ibcp+1], al ; row
   929 000007FD F6E4                    	mul	ah
   930 000007FF 66D1E0                  	shl	ax, 1  ; char + attribute
   931 00000802 01C3                    	add	ebx, eax
   932 00000804 B050                    	mov	al, 80
   933 00000806 28D0                    	sub	al, dl
   934 00000808 D0E8                    	shr	al, 1 
   935 0000080A A2[BA160000]            	mov	[ibcp], al ; column
   936 0000080F D0E0                    	shl	al, 1  ; char + attribute
   937 00000811 28E4                    	sub	ah, ah
   938 00000813 01C3                    	add	ebx, eax
   939 00000815 8A6605                  	mov	ah, [esi+5] ; color attributes
   940 00000818 B020                    	mov	al, 20h	; space/blank
   941 0000081A 88F1                    	mov	cl, dh ; height
   942                                  ib0:
   943 0000081C 51                      	push	ecx
   944 0000081D 88D1                    	mov	cl, dl
   945 0000081F 89DF                    	mov	edi, ebx	
   946 00000821 F366AB                  	rep	stosw
   947 00000824 59                      	pop	ecx
   948 00000825 81C3A0000000            	add	ebx, 80*2 ; number of columns * 2
   949 0000082B E2EF                    	loop	ib0
   950                                  	;
   951 0000082D BF[C4190000]            	mov	edi, video_buffer
   952 00000832 A0[BB160000]            	mov	al, [ibcp+1] ; row position
   953 00000837 024602                  	add	al, [esi+2] ; label offset (row)
   954 0000083A A2[BB160000]            	mov	[ibcp+1], al
   955 0000083F B4A0                    	mov	ah, 80*2
   956 00000841 F6E4                    	mul	ah
   957 00000843 01C7                    	add	edi, eax
   958 00000845 A0[BA160000]            	mov	al, [ibcp] ; column position
   959 0000084A 024603                  	add	al, [esi+3] ; label offset (column)
   960 0000084D A2[BA160000]            	mov	[ibcp], al
   961 00000852 30E4                    	xor	ah, ah
   962 00000854 D0E0                    	shl	al, 1
   963 00000856 01C7                    	add	edi, eax
   964 00000858 89F3                    	mov	ebx, esi
   965 0000085A 83C606                  	add	esi, 6 ; Label offset
   966                                  ib2:
   967 0000085D AC                      	lodsb
   968 0000085E 08C0                    	or	al, al
   969 00000860 7406                    	jz	short ib3
   970 00000862 AA                      	stosb
   971 00000863 47                      	inc 	edi	
   972 00000864 FEC1                    	inc	cl
   973 00000866 EBF5                    	jmp	short ib2
   974                                  ib3:
   975 00000868 000D[BA160000]          	add	[ibcp], cl ; column position
   976 0000086E 893D[AC160000]          	mov	[current_txtpos], edi
   977                                  	;
   978 00000874 8A4B04                  	mov	cl, [ebx+4] ; input char count
   979 00000877 08C9                    	or	cl, cl
   980 00000879 7407                    	jz	short ib5 ; message box (no input)	
   981 0000087B B020                    	mov	al, 20h
   982 0000087D B407                    	mov	ah, 07h ; black background
   983                                  			; light gray fore color	
   984                                  ib4:
   985 0000087F F366AB                  	rep	stosw
   986                                  ib5:	
   987 00000882 E874FEFFFF              	call	video_page_update
   988 00000887 668B15[BA160000]        	mov	dx, [ibcp] ; cursor position
   989 0000088E C3                      	retn
   990                                  
   991                                  hide_cursor:
   992                                        	;CH = cursor start line (bits 0-4) 
   993                                  	;     and options (bits 5-7).
   994                                  	;CL = bottom cursor line (bits 0-4).
   995                                  	; when bit 5 of CH is set to 0, the cursor is visible. 
   996                                  	; when bit 5 is 1, the cursor is not visible. 
   997                                  	; hide blinking text cursor: 
   998 0000088F 51                              push	ecx
   999 00000890 B520                    	mov 	ch, 32
  1000 00000892 30FF                    	xor	bh, bh ; video page 0
  1001 00000894 EB0F                    	jmp	short hc_sc
  1002                                  
  1003                                  show_cursor:
  1004                                    	; dh = row
  1005                                  	; dl = column
  1006 00000896 51                      	push	ecx
  1007 00000897 668915[B0160000]        	mov	[cursor_posn], dx
  1008 0000089E E83F0D0000              	call	set_cposx
  1009                                  	;
  1010                                  	;show box-shaped blinking text cursor
  1011 000008A3 B50D                    	mov	ch, 13
  1012                                  hc_sc:
  1013 000008A5 B10F                            mov 	cl, 15
  1014 000008A7 B401                            mov 	ah, 1
  1015 000008A9 CD31                            int 	31h
  1016 000008AB 59                      	pop	ecx
  1017 000008AC C3                      	retn
  1018                                  
  1019                                  set_disk_parms:
  1020 000008AD 0FB61D[BD160000]                movzx   ebx, byte [drv]
  1021 000008B4 80FB80                  	cmp	bl, 80h
  1022 000008B7 7203                    	jb	short sdp0
  1023 000008B9 80EB7E                  	sub	bl, 7Eh
  1024                                  sdp0:	
  1025                                  	;add	ebx, drv_status
  1026                                          ;mov     byte [ebx], 80h ; 'Present' flag
  1027                                  	;
  1028 000008BC 88E8                    	mov	al, ch ; last cylinder (bits 0-7)
  1029 000008BE 88CC                    	mov	ah, cl ; 
  1030 000008C0 C0EC06                  	shr	ah, 6  ; last cylinder (bits 8-9)
  1031                                  	;sub	ebx, drv_status
  1032 000008C3 D0E3                    	shl	bl, 1
  1033 000008C5 81C3[C4160000]          	add	ebx, drv_cylinders
  1034 000008CB 6640                    	inc	ax  ; convert max. cyl number to cyl count		
  1035 000008CD 668903                  	mov	[ebx], ax
  1036 000008D0 6650                    	push	ax ; ** cylinders
  1037 000008D2 81EB[C4160000]          	sub	ebx, drv_cylinders
  1038 000008D8 81C3[D0160000]          	add	ebx, drv_heads
  1039 000008DE 88F0                    	mov	al, dh ; last head number
  1040 000008E0 30E4                    	xor	ah, ah
  1041 000008E2 6640                    	inc	ax     ; heads 	
  1042 000008E4 668903                  	mov	[ebx], ax
  1043 000008E7 81EB[D0160000]                  sub     ebx, drv_heads
  1044 000008ED 81C3[DC160000]                  add     ebx, drv_spt
  1045 000008F3 6683E13F                	and	cx, 3Fh  ; sectors (bits 0-6)
  1046 000008F7 66890B                  	mov	[ebx], cx
  1047 000008FA 81EB[DC160000]                  sub     ebx, drv_spt
  1048 00000900 66D1E3                  	shl	bx, 1
  1049 00000903 81C3[E8160000]          	add	ebx, drv_size ; disk size (in sectors)
  1050                                  	; LBA size = cylinders * heads * secpertrack
  1051 00000909 66F7E1                  	mul	cx 
  1052 0000090C 6689C2                  	mov	dx, ax ; heads*spt					
  1053 0000090F 6658                    	pop	ax ; ** cylinders
  1054 00000911 803D[BD160000]80        	cmp	byte [drv], 80h
  1055 00000918 7202                    	jb	short sdp1
  1056 0000091A 6648                    	dec	ax ; 1 cylinder reserved (!?)
  1057                                  sdp1:
  1058 0000091C 66F7E2                  	mul	dx ; cylinders * (heads*spt)		
  1059 0000091F 668903                  	mov	[ebx], ax
  1060 00000922 66895302                	mov	[ebx+2], dx
  1061                                  	;
  1062 00000926 C3                      	retn
  1063                                  
  1064                                  read_disk_sector:
  1065                                  	; EAX = sector number (LBA)
  1066                                  	;
  1067 00000927 0FB61D[73140000]        	movzx	ebx, byte [ds_drv]
  1068 0000092E 88DA                    	mov	dl, bl	
  1069 00000930 80FA02                  	cmp	dl, 2
  1070 00000933 7203                    	jb	short rd0
  1071 00000935 80C27E                  	add	dl, 7Eh  ; 80h, 81h, 82h, 83h
  1072                                  rd0:
  1073 00000938 89DE                    	mov	esi, ebx
  1074 0000093A 8815[BD160000]          	mov	[drv], dl
  1075 00000940 81C3[BE160000]          	add	ebx, drv_status
  1076 00000946 8A33                    	mov	dh, [ebx]
  1077                                  rd1:
  1078 00000948 80FEF0                  	cmp	dh, 0F0h
  1079 0000094B F5                      	cmc
  1080 0000094C 7262                            jc      short rd_lba_fails
  1081                                  	;
  1082 0000094E 89F3                    	mov	ebx, esi
  1083 00000950 C0E302                  	shl	bl, 2
  1084 00000953 81C3[A0170000]          	add	ebx, ds_sec
  1085 00000959 8B03                    	mov	eax, [ebx]
  1086 0000095B 81EB[A0170000]          	sub	ebx, ds_sec
  1087 00000961 81C3[E8160000]                  add     ebx, drv_size 
  1088 00000967 3B03                    	cmp	eax, [ebx] ; Last sector + 1 (number of secs.)
  1089 00000969 F5                      	cmc
  1090 0000096A 7244                            jc      short rd_lba_fails
  1091                                  	;
  1092 0000096C F6C601                  	test	dh, 1 ; LBA ready ?
  1093 0000096F 7440                            jz      short rd_chs
  1094                                  rd_lba:
  1095                                  	; LBA read (private function)
  1096                                  	;((Retro UNIX 386 v1 - DISK I/O Test))
  1097 00000971 81C6[BE160000]          	add	esi, drv_status
  1098 00000977 80268F                  	and	byte [esi], 8Fh ; clear error bits
  1099                                  	;
  1100 0000097A 89C1                    	mov	ecx, eax ; Logical Block/Sector Address
  1101 0000097C C1EB10                  	shr	ebx, 16
  1102 0000097F BB[BC170000]                    mov     ebx, sector_buffer
  1103 00000984 8A15[BD160000]          	mov	dl, [drv]
  1104 0000098A C605[BC160000]04        	mov	byte [retry_count], 4
  1105                                  rd_lba_retry:
  1106 00000991 B41B                    	mov	ah, 1Bh ; LBA read (private function)		
  1107 00000993 B001                    	mov	al, 1
  1108 00000995 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1109 00000997 7317                    	jnc	short rd_lba_ok
  1110                                  
  1111 00000999 80FC80                  	cmp	ah, 80h ; time out ?
  1112 0000099C 7411                    	je	short rd_lba_rfails
  1113 0000099E FE0D[BC160000]          	dec	byte [retry_count]
  1114 000009A4 7409                    	jz	short rd_lba_rfails
  1115                                  	
  1116 000009A6 B40D                    	mov	ah, 0Dh ; Alternate reset
  1117 000009A8 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1118 000009AA 73E5                            jnc     short rd_lba_retry
  1119 000009AC 800EF0                  	or	byte [esi], 0F0h ; drive not ready !
  1120                                  rd_lba_rfails:
  1121 000009AF F9                      	stc
  1122                                  rd_lba_fails:
  1123                                  rd_lba_ok:
  1124 000009B0 C3                      	retn
  1125                                  	;
  1126                                  	; CHS read (convert LBA address to CHS values)	;	
  1127                                  rd_chs:
  1128 000009B1 D1E6                    	shl	esi, 1
  1129 000009B3 89F3                    	mov	ebx, esi
  1130 000009B5 31D2                    	xor	edx, edx ; 0
  1131 000009B7 29C9                    	sub	ecx, ecx 
  1132 000009B9 81C3[DC160000]                  add     ebx, drv_spt
  1133 000009BF 668B0B                  	mov	cx, [ebx] ; sector per track
  1134                                                  ; EAX = sector address (LBA)
  1135 000009C2 F7F1                    	div	ecx
  1136 000009C4 88D1                    	mov	cl, dl	; sector number - 1
  1137 000009C6 FEC1                    	inc	cl	; sector number (1 based)
  1138 000009C8 6651                    	push	cx
  1139 000009CA 89F3                    	mov	ebx, esi
  1140 000009CC 81C3[D0160000]                  add     ebx, drv_heads
  1141 000009D2 668B0B                  	mov	cx, [ebx] ; heads
  1142 000009D5 31D2                    	xor	edx, edx
  1143                                  		; EAX = cylinders * heads + head
  1144 000009D7 F7F1                    	div	ecx
  1145 000009D9 6659                    	pop	cx     ; sector number
  1146 000009DB 88D6                    	mov	dh, dl ; head number
  1147 000009DD 8A15[BD160000]          	mov	dl, [drv]
  1148 000009E3 88C5                    	mov	ch, al ; cylinder (bits 0-7)
  1149 000009E5 C0E406                  	shl	ah, 6
  1150 000009E8 08E1                    	or	cl, ah ; cylinder (bits 8-9)
  1151                                  		       ; sector (bits 0-7)
  1152 000009EA BB[BC170000]                    mov     ebx, sector_buffer
  1153                                  		; CL = sector (bits 0-6)
  1154                                  		;      cylinder (bits 7-8 -> bits 8-9)
  1155                                  		; CH = cylinder (bits 0-7)
  1156                                  		; DH = head
  1157                                  		; DL = drive
  1158                                  
  1159 000009EF D1EE                    	shr	esi, 1 ; drive index (byte alignment)
  1160 000009F1 81C6[BE160000]          	add	esi, drv_status
  1161 000009F7 80268F                  	and	byte [esi], 8Fh ; clear error bits
  1162                                  	;
  1163 000009FA C605[BC160000]04        	mov	byte [retry_count], 4
  1164                                  rd_retry:	
  1165 00000A01 B402                    	mov	ah, 02h ; read sectors
  1166 00000A03 B001                    	mov	al, 1 ; sector count	
  1167 00000A05 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1168 00000A07 7320                    	jnc	short rd_ok
  1169 00000A09 80FC80                  	cmp	ah, 80h ; time out ?
  1170 00000A0C 7408                    	je	short rd_rfails
  1171 00000A0E FE0D[BC160000]          	dec	byte [retry_count]
  1172 00000A14 7502                    	jnz	short rd_reset
  1173                                  rd_rfails:
  1174 00000A16 F9                      	stc
  1175                                  rd_fails:
  1176 00000A17 C3                      	retn
  1177                                  rd_reset:
  1178 00000A18 28E4                    	sub	ah, ah
  1179 00000A1A 80FA80                  	cmp	dl, 80h
  1180 00000A1D 7202                    	jb	short rd_fd_reset
  1181 00000A1F B40D                    	mov	ah, 0Dh ; Alternate reset
  1182                                  rd_fd_reset:
  1183 00000A21 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1184 00000A23 73DC                            jnc     short rd_retry
  1185 00000A25 800EF0                  	or	byte [esi], 0F0h ; drive not ready !
  1186 00000A28 F9                      	stc
  1187                                  rd_ok:
  1188 00000A29 C3                      	retn
  1189                                  
  1190                                  clear_screen:
  1191 00000A2A BF[C4190000]            	mov	edi, video_buffer
  1192 00000A2F B9D0070000              	mov	ecx, 80*25
  1193 00000A34 66B82007                        mov     ax, 0720h ; light gray char space (blank)
  1194 00000A38 F366AB                  	rep	stosw
  1195                                  
  1196 00000A3B E8BBFCFFFF              	call	video_page_update
  1197                                  
  1198 00000A40 6631D2                          xor     dx, dx    ; column 0, row 0
  1199 00000A43 E99A0B0000              	jmp	set_cposx ; set cursor position
  1200                                  
  1201                                  rfdp_err:
  1202 00000A48 E8DDFFFFFF              	call	clear_screen
  1203 00000A4D BE[69160000]            	mov	esi, drv_not_ready
  1204 00000A52 E919030000              	jmp	print_msg	
  1205                                  
  1206                                  dskprm:
  1207                                  	; DISPLAY DISK PARAMETERS TABLE
  1208                                  	;
  1209                                  	; INPUT -> DL = Disk/Drive #
  1210                                  	; 
  1211 00000A57 8815[BD160000]          	mov	byte [drv], dl  ; 0,1,80h,81h,82h,83h 
  1212                                  	;
  1213 00000A5D F6C280                  	test	dl, 80h
  1214 00000A60 7403                    	jz	short dskprm0
  1215 00000A62 80EA7E                  	sub	dl, 7Eh ; hd0 = 2
  1216                                  dskprm0:
  1217 00000A65 0FB6DA                  	movzx	ebx, dl
  1218 00000A68 81C3[BE160000]          	add	ebx, drv_status
  1219                                  
  1220 00000A6E 803B80                  	cmp	byte [ebx], 80h  ; existing ?
  1221 00000A71 72D5                    	jb	short rfdp_err
  1222                                  	;
  1223 00000A73 E8B2FFFFFF              	call	clear_screen	 ; clear video page 0	
  1224                                  	;
  1225 00000A78 8A1D[BD160000]                  mov	bl, [drv]
  1226 00000A7E F6C380                  	test	bl, 80h
  1227 00000A81 0F85F7000000                    jnz     print_hdpt
  1228                                  
  1229 00000A87 0FB6F3                  	movzx	esi, bl
  1230 00000A8A 80C330                  	add	bl, 30h	; '0'
  1231 00000A8D 881D[8C0D0000]          	mov	byte [flpdnum], bl
  1232 00000A93 81C6[80160000]          	add	esi, fd0_type
  1233 00000A99 8A06                    	mov	al, [esi]
  1234 00000A9B A2[C30D0000]                    mov     byte [flpdtype], al 
  1235                                                                     ; floppy disk drive type
  1236                                  				   ; (1=360K, 2=1.2M, 3=720K, 4=1.44M)
  1237                                  print_flpdpt:
  1238                                  	; Writing the Diskette Parameter Table on screen
  1239 00000AA0 C0E304                  	shl	bl, 4 ; * 16
  1240 00000AA3 0FB6F3                  	movzx	esi, bl
  1241 00000AA6 81C6[00170000]          	add	esi, fd0_dpt
  1242 00000AAC AC                      	lodsb 	; bits 0-3: SRT step rate time
  1243                                  		; bits 4-7: head unload time
  1244 00000AAD BF[0D0E0000]            	mov	edi, rSrtHdUnld
  1245 00000AB2 E8AC000000              	call	write_hex
  1246 00000AB7 AC                      	lodsb 	; bit 0: 1=use DMA
  1247                                  		; bits 2-7: head load time
  1248 00000AB8 BF[550E0000]            	mov	edi, rDmaHdLd
  1249 00000ABD E8A1000000              	call	write_hex
  1250 00000AC2 AC                      	lodsb 	; 55-ms increments 
  1251                                  		; before turning disk motor off
  1252 00000AC3 BF[9C0E0000]            	mov	edi, bMotorOff
  1253 00000AC8 E896000000              	call	write_hex
  1254 00000ACD AC                      	lodsb 	; sector size
  1255                                  		; (0=128, 1=256, 2=512, 3=1024)
  1256 00000ACE BF[E10E0000]            	mov	edi, bSectSize
  1257 00000AD3 E88B000000              	call	write_hex
  1258 00000AD8 AC                      	lodsb 	; EOT (last sector on a track)
  1259 00000AD9 BF[0D0F0000]            	mov	edi, bLastTrack
  1260 00000ADE E880000000              	call	write_hex
  1261 00000AE3 AC                      	lodsb 	; gap length 
  1262                                  		; for read/write operations
  1263 00000AE4 BF[290F0000]            	mov	edi, bGapLen
  1264 00000AE9 E875000000              	call	write_hex
  1265 00000AEE AC                      	lodsb 	; DTL (Data Transfer Length)
  1266                                  		; max transfer when length not set	
  1267 00000AEF BF[450F0000]            	mov	edi, bDTL
  1268 00000AF4 E86A000000              	call	write_hex
  1269 00000AF9 AC                      	lodsb 	; gap length for format operation
  1270 00000AFA BF[610F0000]            	mov	edi, bGapFmt
  1271 00000AFF E85F000000              	call	write_hex
  1272 00000B04 AC                      	lodsb 	; fill character for format 
  1273                                  		; (normally F6H)
  1274 00000B05 BF[7D0F0000]            	mov	edi, bFillChar
  1275 00000B0A E854000000              	call	write_hex
  1276 00000B0F AC                      	lodsb 	; head-settle time
  1277                                  		; (in milliseconds)
  1278 00000B10 BF[A80F0000]            	mov	edi, bHdSettle
  1279 00000B15 E849000000              	call	write_hex
  1280 00000B1A AC                      	lodsb 	; motor-startup time
  1281                                  		; (in 1/8th-second intervals)
  1282 00000B1B BF[D10F0000]            	mov	edi, bMotorOn
  1283 00000B20 E83E000000              	call	write_hex
  1284                                  	;
  1285                                  	; (extension, not in original bios function)
  1286 00000B25 AC                      	lodsb	; Max. track number
  1287 00000B26 BF[0B100000]            	mov	edi, bMaxTrack
  1288 00000B2B E833000000              	call	write_hex
  1289 00000B30 AC                      	lodsb	; Data transfer rate
  1290 00000B31 BF[27100000]            	mov	edi, bDataRate
  1291 00000B36 E828000000              	call	write_hex
  1292                                  	;
  1293 00000B3B A0[BD160000]            	mov	al, [drv]
  1294 00000B40 0430                    	add	al, 30h ; '0'
  1295 00000B42 A2[8C0D0000]                    mov     byte [flpdnum], al
  1296 00000B47 BE[840D0000]                    mov     esi, FLPDPT
  1297 00000B4C E81F020000              	call	print_msg
  1298 00000B51 C3                      	retn
  1299                                  
  1300                                  write_dhex:
  1301 00000B52 88E3                    	mov	bl, ah
  1302 00000B54 C0EB04                          shr     bl, 4
  1303 00000B57 E813000000                      call    dhgd
  1304 00000B5C 88E3                    	mov	bl, ah
  1305 00000B5E E80C000000              	call	dhgd
  1306                                  
  1307                                  write_hex:
  1308 00000B63 88C3                    	mov	bl, al
  1309 00000B65 C0EB04                          shr     bl, 4
  1310 00000B68 E802000000              	call	dhgd
  1311 00000B6D 88C3                    	mov	bl, al
  1312                                  	;call	dhgd
  1313                                  	;retn
  1314                                  dhgd:
  1315 00000B6F 50                      	push	eax
  1316 00000B70 83E30F                  	and	ebx, 0Fh
  1317 00000B73 81C3[63140000]                  add     ebx, hex_digits
  1318 00000B79 8A03                            mov     al, [ebx]
  1319 00000B7B AA                      	stosb
  1320 00000B7C 58                      	pop	eax
  1321 00000B7D C3                      	retn
  1322                                  
  1323                                  print_hdpt:
  1324                                  	;mov	bl, [drv]
  1325 00000B7E 80E303                  	and	bl, 3
  1326 00000B81 88D8                    	mov	al, bl
  1327 00000B83 0402                    	add	al, 2
  1328 00000B85 A2[BD160000]            	mov	[drv], al
  1329                                  	;
  1330 00000B8A C0E305                  	shl	bl, 5 ; * 32
  1331 00000B8D 0FB6F3                  	movzx	esi, bl
  1332 00000B90 81C6[20170000]          	add	esi, hd0_dpt  
  1333                                  	;
  1334 00000B96 807E03A0                	cmp	byte [esi+3], 0A0h ; Translated table
  1335 00000B9A 0F84EB000000                    je      print_thdpt       ; indicator
  1336                                  	;
  1337                                  	; Writing Fixed Disk Parameter Table on screen
  1338 00000BA0 66AD                    	lodsw 	; Number of Cylinders
  1339 00000BA2 BF[9A100000]            	mov	edi, cylnum
  1340 00000BA7 E8A6FFFFFF              	call	write_dhex
  1341 00000BAC AC                      	lodsb	; Number of Heads
  1342 00000BAD BF[B7100000]            	mov	edi, headnum
  1343 00000BB2 E8ACFFFFFF              	call	write_hex
  1344 00000BB7 AC                      	lodsb	; Reserved
  1345 00000BB8 BF[D2100000]            	mov	edi, rsvd3
  1346 00000BBD E8A1FFFFFF              	call	write_hex
  1347 00000BC2 AC                      	lodsb	; Reserved
  1348 00000BC3 BF[ED100000]            	mov	edi, rsvd4
  1349 00000BC8 E896FFFFFF              	call	write_hex
  1350 00000BCD 66AD                    	lodsw	; Precompensation (Obsolete)
  1351 00000BCF BF[08110000]            	mov	edi, pcompnum
  1352 00000BD4 E879FFFFFF              	call	write_dhex
  1353 00000BD9 AC                      	lodsb	; Reserved
  1354 00000BDA BF[25110000]            	mov	edi, rsvd7
  1355 00000BDF E87FFFFFFF              	call	write_hex
  1356 00000BE4 AC                      	lodsb	; Drive Control Byte
  1357 00000BE5 BF[40110000]            	mov	edi, dcbnum
  1358 00000BEA E874FFFFFF              	call	write_hex
  1359 00000BEF 66AD                    	lodsw	; Reserved
  1360 00000BF1 BF[5B110000]            	mov	edi, rsvd9
  1361 00000BF6 E857FFFFFF              	call	write_dhex
  1362 00000BFB AC                      	lodsb	; Reserved
  1363 00000BFC BF[78110000]            	mov	edi, rsvd11
  1364 00000C01 E85DFFFFFF              	call	write_hex
  1365 00000C06 66AD                    	lodsw	; Landing Zone (Obsolete)
  1366 00000C08 BF[93110000]            	mov	edi, lzonenum
  1367 00000C0D E840FFFFFF              	call	write_dhex
  1368 00000C12 AC                      	lodsb	; Sectors per Track
  1369 00000C13 BF[B0110000]            	mov	edi, psptnum
  1370 00000C18 E846FFFFFF              	call	write_hex
  1371 00000C1D AC                      	lodsb	; Reserved
  1372 00000C1E BF[CB110000]            	mov	edi, rsvd15
  1373 00000C23 E83BFFFFFF              	call	write_hex
  1374                                  	;
  1375                                  	; (extension, not in original bios function)
  1376 00000C28 66AD                    	lodsw	; I/O Port Base Address
  1377 00000C2A BF[E8110000]            	mov	edi, bPortAddr
  1378 00000C2F E81EFFFFFF              	call	write_dhex
  1379                                  	; 06/01/2015
  1380 00000C34 66AD                    	lodsw	; Control Port Address
  1381 00000C36 BF[05120000]            	mov	edi, cPortAddr
  1382 00000C3B E812FFFFFF              	call	write_dhex
  1383 00000C40 AC                      	lodsb	; Head Register Upper Nibble 
  1384 00000C41 BF[22120000]            	mov	edi, hregupnib
  1385 00000C46 E818FFFFFF              	call	write_hex
  1386                                  	;
  1387 00000C4B A0[BD160000]            	mov     al, [drv]
  1388 00000C50 88C3                    	mov	bl, al
  1389 00000C52 0430                    	add	al, '0'
  1390 00000C54 A2[62100000]                    mov     [dsknum], al
  1391                                  	;	      
  1392 00000C59 C0E302                  	shl	bl, 2
  1393 00000C5C 0FB6F3                  	movzx	esi, bl
  1394 00000C5F 81C6[E8160000]                  add     esi, drv_size
  1395 00000C65 668B4602                	mov	ax, [esi+2]
  1396 00000C69 BF[3F120000]                    mov     edi, disksize
  1397 00000C6E E8DFFEFFFF              	call	write_dhex
  1398 00000C73 668B06                  	mov	ax, [esi]
  1399 00000C76 BF[43120000]            	mov	edi, disksize+4
  1400 00000C7B E8D2FEFFFF              	call	write_dhex	
  1401                                  	;
  1402 00000C80 BE[5A100000]                    mov     esi, HDPT
  1403 00000C85 E8E6000000              	call	print_msg
  1404 00000C8A C3                      	retn
  1405                                  
  1406                                  print_thdpt:
  1407                                  	; Writing the Translated FDPT on screen
  1408                                  	; (PHOENIX - EDD specification v1.1)
  1409 00000C8B 66AD                    	lodsw 	; Logical Numbers of Cylinders, Limit 1024
  1410 00000C8D BF[98120000]            	mov	edi, lcylnum
  1411 00000C92 E8BBFEFFFF              	call	write_dhex
  1412 00000C97 AC                      	lodsb	; Logical Numbers of Heads, Limit 256
  1413 00000C98 BF[B5120000]            	mov	edi, lheadnum
  1414 00000C9D E8C1FEFFFF              	call	write_hex
  1415 00000CA2 AC                      	lodsb	; A0h signature, indicates translated table
  1416 00000CA3 BF[D0120000]            	mov	edi, tsignum
  1417 00000CA8 E8B6FEFFFF              	call	write_hex
  1418 00000CAD AC                      	lodsb	; Physical Sectors per Track
  1419 00000CAE BF[EB120000]            	mov	edi, tpsptnum
  1420 00000CB3 E8ABFEFFFF              	call	write_hex
  1421 00000CB8 66AD                    	lodsw	; Precompensation (Obsolete)
  1422 00000CBA BF[06130000]            	mov	edi, tpcompnum
  1423 00000CBF E88EFEFFFF              	call	write_dhex
  1424 00000CC4 AC                      	lodsb	; Reserved
  1425 00000CC5 BF[2F130000]            	mov	edi, trsvd7
  1426 00000CCA E894FEFFFF              	call	write_hex
  1427 00000CCF AC                      	lodsb	; Drive Control Byte
  1428 00000CD0 BF[4A130000]            	mov	edi, tdcbnum
  1429 00000CD5 E889FEFFFF              	call	write_hex
  1430 00000CDA 66AD                    	lodsw	; Physical Cylinders, limit 65536
  1431 00000CDC BF[65130000]            	mov	edi, tpcylnum
  1432 00000CE1 E86CFEFFFF              	call	write_dhex
  1433 00000CE6 AC                      	lodsb	; Physical Heads, limit 16
  1434 00000CE7 BF[82130000]            	mov	edi, tpheadnum
  1435 00000CEC E872FEFFFF              	call	write_hex
  1436 00000CF1 66AD                    	lodsw	; Landing Zone (Obsolete)
  1437 00000CF3 BF[9D130000]            	mov	edi, tlzonenum
  1438 00000CF8 E855FEFFFF              	call	write_dhex
  1439 00000CFD AC                      	lodsb	; Logical Sectors per Track, Limit 63
  1440 00000CFE BF[C6130000]            	mov	edi, lsptnum
  1441 00000D03 E85BFEFFFF              	call	write_hex
  1442 00000D08 AC                      	lodsb	; Checksum for translated FDPT 
  1443 00000D09 BF[E1130000]            	mov	edi, checksum
  1444 00000D0E E850FEFFFF              	call	write_hex
  1445                                  	;
  1446                                  	; (extension, not in original bios function)
  1447 00000D13 66AD                    	lodsw	; I/O Port Base Address
  1448 00000D15 BF[FE130000]            	mov	edi, tbPortAddr
  1449 00000D1A E833FEFFFF              	call	write_dhex
  1450                                  	; 06/01/2015
  1451 00000D1F 66AD                    	lodsw	; Control Port Address
  1452 00000D21 BF[1B140000]            	mov	edi, tcPortAddr
  1453 00000D26 E827FEFFFF              	call	write_dhex
  1454 00000D2B AC                      	lodsb	; Head Register Upper Nibble 
  1455 00000D2C BF[38140000]            	mov	edi, thregupnib
  1456 00000D31 E82DFEFFFF              	call	write_hex
  1457                                  	;
  1458 00000D36 A0[BD160000]            	mov     al, [drv]
  1459 00000D3B 88C3                    	mov	bl, al
  1460 00000D3D 0430                    	add	al, '0'
  1461 00000D3F A2[55120000]                    mov     [tdsknum], al
  1462                                  	;  
  1463 00000D44 C0E302                  	shl	bl, 2
  1464 00000D47 0FB6F3                  	movzx	esi, bl
  1465 00000D4A 81C6[E8160000]                  add     esi, drv_size
  1466 00000D50 668B4602                	mov	ax, [esi+2]
  1467 00000D54 BF[55140000]            	mov	edi, tdisksize
  1468 00000D59 E8F4FDFFFF              	call	write_dhex
  1469 00000D5E 668B06                  	mov	ax, [esi]
  1470 00000D61 BF[59140000]            	mov	edi, tdisksize+4
  1471 00000D66 E8E7FDFFFF              	call	write_dhex	
  1472                                  	;
  1473 00000D6B BE[4D120000]            	mov     esi, THDPT
  1474                                  	;call	print_msg
  1475                                  	;retn
  1476                                  
  1477                                  print_msg:
  1478 00000D70 66BB0700                	mov	bx, 7
  1479 00000D74 B40E                            mov     ah, 0Eh
  1480                                  pmsg_loop:
  1481 00000D76 AC                      	lodsb
  1482 00000D77 20C0                    	and	al, al
  1483 00000D79 7404                    	jz	short pmsg_ok
  1484 00000D7B CD31                    	int	31h	; TRDOS 386 video interrupt
  1485 00000D7D EBF7                    	jmp	short pmsg_loop	
  1486                                  pmsg_ok:
  1487 00000D7F B410                    	mov	ah, 10h ; Getchar
  1488 00000D81 CD32                    	int	32h	; TRDOS 386 keyboard interrupt
  1489 00000D83 C3                      	retn
  1490                                  ;
  1491                                  FLPDPT:
  1492 00000D84 07                      	db 07h
  1493 00000D85 0D0A                    	db 0Dh, 0Ah	
  1494 00000D87 4469736B20              	db 'Disk '
  1495                                  flpdnum:
  1496 00000D8C 58202D20                	db 'X - '
  1497 00000D90 4449534B4554544520-     	db 'DISKETTE PARAMETER TABLE'
  1497 00000D99 504152414D45544552-
  1497 00000DA2 205441424C45       
  1498 00000DA8 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah
  1499 00000DAC 547970652020202020-     	db 'Type                 : '
  1499 00000DB5 202020202020202020-
  1499 00000DBE 2020203A20         
  1500                                  flpdtype:
  1501 00000DC3 58202020                	db 'X   '
  1502 00000DC7 5B2031203D20333630-     	db '[ 1 = 360K, 2 = 1.2M, 3 = 720K, 4 = 1.44M ]'
  1502 00000DD0 4B2C2032203D20312E-
  1502 00000DD9 324D2C2033203D2037-
  1502 00000DE2 32304B2C2034203D20-
  1502 00000DEB 312E34344D205D     
  1503 00000DF2 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1504 00000DF6 535254202D20486561-     	db 'SRT - Head Unld Time : '
  1504 00000DFF 6420556E6C64205469-
  1504 00000E08 6D65203A20         
  1505                                  rSrtHdUnld:
  1506 00000E0D 585868202862697473-     	db 'XXh (bits 0-3: SRT, bits 4-7: head unload time)'
  1506 00000E16 20302D333A20535254-
  1506 00000E1F 2C206269747320342D-
  1506 00000E28 373A20686561642075-
  1506 00000E31 6E6C6F61642074696D-
  1506 00000E3A 6529               
  1507 00000E3C 0D0A                    	db 0Dh, 0Ah
  1508 00000E3E 444D41202D20486561-     	db 'DMA - Head Load Time : '
  1508 00000E47 64204C6F6164205469-
  1508 00000E50 6D65203A20         
  1509                                  rDmaHdLd:
  1510 00000E55 585868202862697420-     	db 'XXh (bit 0: 1 = DMA, bits 2-7: head load time)'
  1510 00000E5E 303A2031203D20444D-
  1510 00000E67 412C20626974732032-
  1510 00000E70 2D373A206865616420-
  1510 00000E79 6C6F61642074696D65-
  1510 00000E82 29                 
  1511 00000E83 0D0A                    	db 0Dh, 0Ah
  1512 00000E85 4D6F746F72204F6666-     	db 'Motor Off Count      : '
  1512 00000E8E 20436F756E74202020-
  1512 00000E97 2020203A20         
  1513                                  bMotorOff:
  1514 00000E9C 585868202877697468-     	db 'XXh (with 55ms icrements before turning off)'
  1514 00000EA5 2035356D7320696372-
  1514 00000EAE 656D656E7473206265-
  1514 00000EB7 666F7265207475726E-
  1514 00000EC0 696E67206F666629   
  1515 00000EC8 0D0A                    	db 0Dh, 0Ah
  1516 00000ECA 536563746F72205369-     	db 'Sector Size          : '
  1516 00000ED3 7A6520202020202020-
  1516 00000EDC 2020203A20         
  1517                                  bSectSize:
  1518 00000EE1 585868202832203D20-     	db 'XXh (2 = 512 bytes)'
  1518 00000EEA 353132206279746573-
  1518 00000EF3 29                 
  1519 00000EF4 0D0A                    	db 0Dh, 0Ah	
  1520 00000EF6 4C6173742053656374-     	db 'Last Sect on a Track : '
  1520 00000EFF 206F6E206120547261-
  1520 00000F08 636B203A20         
  1521                                  bLastTrack:
  1522 00000F0D 585868                  	db 'XXh'
  1523 00000F10 0D0A                    	db 0Dh, 0Ah
  1524 00000F12 476170204C656E6774-     	db 'Gap Length  (R/W)    : '
  1524 00000F1B 68202028522F572920-
  1524 00000F24 2020203A20         
  1525                                  bGapLen:
  1526 00000F29 585868                  	db 'XXh'
  1527 00000F2C 0D0A                    	db 0Dh, 0Ah
  1528 00000F2E 44617461205472616E-     	db 'Data Transfer Length : '
  1528 00000F37 73666572204C656E67-
  1528 00000F40 7468203A20         
  1529                                  bDTL:
  1530 00000F45 585868                  	db 'XXh'
  1531 00000F48 0D0A                    	db 0Dh, 0Ah		
  1532 00000F4A 476170204C656E6774-     	db 'Gap Length (Format)  : '
  1532 00000F53 682028466F726D6174-
  1532 00000F5C 2920203A20         
  1533                                  bGapFmt:
  1534 00000F61 585868                  	db 'XXh'
  1535 00000F64 0D0A                    	db 0Dh, 0Ah
  1536 00000F66 46696C6C2043686172-     	db 'Fill Char for format : '
  1536 00000F6F 20666F7220666F726D-
  1536 00000F78 6174203A20         
  1537                                  bFillChar:
  1538 00000F7D 58586820286E6F726D-     	db 'XXh (normally F6h)'
  1538 00000F86 616C6C792046366829 
  1539 00000F8F 0D0A                    	db 0Dh, 0Ah
  1540 00000F91 486561642053657474-     	db 'Head Settle Time     : '
  1540 00000F9A 6C652054696D652020-
  1540 00000FA3 2020203A20         
  1541                                  bHdSettle:
  1542 00000FA8 585868206D696C6C69-     	db 'XXh milliseconds'
  1542 00000FB1 7365636F6E6473     
  1543 00000FB8 0D0A                    	db 0Dh, 0Ah
  1544 00000FBA 4D6F746F7220537461-     	db 'Motor Startup Time   : '
  1544 00000FC3 727475702054696D65-
  1544 00000FCC 2020203A20         
  1545                                  bMotorOn:
  1546 00000FD1 5858682028696E2031-     	db 'XXh (in 1/8th second intervals)'
  1546 00000FDA 2F387468207365636F-
  1546 00000FE3 6E6420696E74657276-
  1546 00000FEC 616C7329           
  1547 00000FF0 0D0A                    	db 0Dh, 0Ah
  1548                                  	; 19/12/2014
  1549 00000FF2 0D0A                    	db 0Dh, 0Ah
  1550 00000FF4 4D6178696D756D2054-     	db 'Maximum Track Number : '
  1550 00000FFD 7261636B204E756D62-
  1550 00001006 6572203A20         
  1551                                  bMaxTrack:
  1552 0000100B 585868                  	db 'XXh'
  1553 0000100E 0D0A                    	db 0Dh, 0Ah
  1554 00001010 44617461205472616E-     	db 'Data Transfer Rate   : '
  1554 00001019 736665722052617465-
  1554 00001022 2020203A20         
  1555                                  bDataRate:
  1556 00001027 585868202830306820-     	db 'XXh (00h = 500KBS, 40h = 300KBS, 80H = 250KBS)'
  1556 00001030 3D203530304B42532C-
  1556 00001039 20343068203D203330-
  1556 00001042 304B42532C20383048-
  1556 0000104B 203D203235304B4253-
  1556 00001054 29                 
  1557 00001055 0D0A                    	db 0Dh, 0Ah
  1558 00001057 0D0A00                  	db 0Dh, 0Ah, 0
  1559                                  
  1560                                  HDPT:
  1561 0000105A 07                      	db 07h
  1562 0000105B 0D0A                    	db 0Dh, 0Ah
  1563 0000105D 4469736B20              	db 'Disk '
  1564                                  dsknum:
  1565 00001062 58202D20                	db 'X - '	
  1566 00001066 464958454420444953-     	db 'FIXED DISK PARAMETER TABLE'
  1566 0000106F 4B20504152414D4554-
  1566 00001078 4552205441424C45   
  1567 00001080 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1568 00001084 4E756D626572206F66-     	db 'Number of Cylinders : '
  1568 0000108D 2043796C696E646572-
  1568 00001096 73203A20           
  1569                                  cylnum:
  1570 0000109A 5858585868              	db 'XXXXh'
  1571 0000109F 0D0A                    	db 0Dh, 0Ah
  1572 000010A1 4E756D626572206F66-     	db 'Number of Heads     : '
  1572 000010AA 204865616473202020-
  1572 000010B3 20203A20           
  1573                                  headnum:
  1574 000010B7 585868                  	db 'XXh'
  1575 000010BA 0D0A                    	db 0Dh, 0Ah
  1576 000010BC 526573657276656420-     	db 'Reserved            : '
  1576 000010C5 202020202020202020-
  1576 000010CE 20203A20           
  1577                                  rsvd3:
  1578 000010D2 585868                  	db 'XXh'
  1579 000010D5 0D0A                    	db 0Dh, 0Ah
  1580 000010D7 526573657276656420-     	db 'Reserved            : '
  1580 000010E0 202020202020202020-
  1580 000010E9 20203A20           
  1581                                  rsvd4:
  1582 000010ED 585868                  	db 'XXh'
  1583 000010F0 0D0A                    	db 0Dh, 0Ah	
  1584 000010F2 507265636F6D70656E-     	db 'Precompensation     : '
  1584 000010FB 736174696F6E202020-
  1584 00001104 20203A20           
  1585                                  pcompnum:
  1586 00001108 5858585868              	db 'XXXXh'
  1587 0000110D 0D0A                    	db 0Dh, 0Ah
  1588 0000110F 526573657276656420-     	db 'Reserved            : '
  1588 00001118 202020202020202020-
  1588 00001121 20203A20           
  1589                                  rsvd7:
  1590 00001125 585868                  	db 'XXh'
  1591 00001128 0D0A                    	db 0Dh, 0Ah
  1592 0000112A 447269766520436F6E-     	db 'Drive Control Byte  : '
  1592 00001133 74726F6C2042797465-
  1592 0000113C 20203A20           
  1593                                  dcbnum:
  1594 00001140 585868                  	db 'XXh'
  1595 00001143 0D0A                    	db 0Dh, 0Ah		
  1596 00001145 526573657276656420-     	db 'Reserved            : '
  1596 0000114E 202020202020202020-
  1596 00001157 20203A20           
  1597                                  rsvd9:
  1598 0000115B 5858585868              	db 'XXXXh'
  1599 00001160 0D0A                    	db 0Dh, 0Ah
  1600 00001162 526573657276656420-     	db 'Reserved            : '
  1600 0000116B 202020202020202020-
  1600 00001174 20203A20           
  1601                                  rsvd11:
  1602 00001178 585868                  	db 'XXh'
  1603 0000117B 0D0A                    	db 0Dh, 0Ah
  1604 0000117D 4C616E64696E67205A-     	db 'Landing Zone        : '
  1604 00001186 6F6E65202020202020-
  1604 0000118F 20203A20           
  1605                                  lzonenum:
  1606 00001193 5858585868              	db 'XXXXh'
  1607 00001198 0D0A                    	db 0Dh, 0Ah
  1608 0000119A 536563746F72732070-     	db 'Sectors per Track   : '
  1608 000011A3 657220547261636B20-
  1608 000011AC 20203A20           
  1609                                  psptnum:
  1610 000011B0 585868                  	db 'XXh'
  1611 000011B3 0D0A                    	db 0Dh, 0Ah
  1612 000011B5 526573657276656420-     	db 'Reserved            : '
  1612 000011BE 202020202020202020-
  1612 000011C7 20203A20           
  1613                                  rsvd15:
  1614 000011CB 585868                  	db 'XXh'
  1615 000011CE 0D0A                    	db 0Dh, 0Ah
  1616 000011D0 0D0A                    	db 0Dh, 0Ah
  1617 000011D2 492F4F20506F727420-     	db 'I/O Port Base Addr  : '
  1617 000011DB 426173652041646472-
  1617 000011E4 20203A20           
  1618                                  bPortAddr:
  1619 000011E8 5858585868              	db 'XXXXh'
  1620 000011ED 0D0A                    	db 0Dh, 0Ah
  1621 000011EF 436F6E74726F6C2050-     	db 'Control Port Addr   : '
  1621 000011F8 6F7274204164647220-
  1621 00001201 20203A20           
  1622                                  cPortAddr:
  1623 00001205 5858585868              	db 'XXXXh'
  1624 0000120A 0D0A                    	db 0Dh, 0Ah
  1625 0000120C 486561642052656720-     	db 'Head Reg Upp Nibb   : '
  1625 00001215 557070204E69626220-
  1625 0000121E 20203A20           
  1626                                  hregupnib:
  1627 00001222 585868                  	db 'XXh'
  1628 00001225 0D0A                    	db 0Dh, 0Ah
  1629 00001227 0D0A                    	db 0Dh, 0Ah
  1630 00001229 53697A652028696E20-     	db 'Size (in sectors)   : '
  1630 00001232 736563746F72732920-
  1630 0000123B 20203A20           
  1631                                  disksize:
  1632 0000123F 585858585858585868      	db 'XXXXXXXXh'
  1633 00001248 0D0A                    	db 0Dh, 0Ah
  1634 0000124A 0D0A00                  	db 0Dh, 0Ah, 0
  1635                                  
  1636                                  THDPT:
  1637 0000124D 07                      	db 07h
  1638 0000124E 0D0A                    	db 0Dh, 0Ah
  1639 00001250 4469736B20              	db 'Disk '
  1640                                  tdsknum:
  1641 00001255 58202D20                	db 'X - '	
  1642 00001259 5452414E534C415445-     	db 'TRANSLATED FIXED DISK PARAMETER TABLE'
  1642 00001262 442046495845442044-
  1642 0000126B 49534B20504152414D-
  1642 00001274 45544552205441424C-
  1642 0000127D 45                 
  1643 0000127E 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1644 00001282 4C6F676963616C2043-     	db 'Logical Cylinders   : '
  1644 0000128B 796C696E6465727320-
  1644 00001294 20203A20           
  1645                                  lcylnum:
  1646 00001298 5858585868              	db 'XXXXh'
  1647 0000129D 0D0A                    	db 0Dh, 0Ah
  1648 0000129F 4C6F676963616C2048-     	db 'Logical Heads       : '
  1648 000012A8 656164732020202020-
  1648 000012B1 20203A20           
  1649                                  lheadnum:
  1650 000012B5 585868                  	db 'XXh'
  1651 000012B8 0D0A                    	db 0Dh, 0Ah
  1652 000012BA 5369676E6174757265-     	db 'Signature           : '
  1652 000012C3 202020202020202020-
  1652 000012CC 20203A20           
  1653                                  tsignum:
  1654 000012D0 585868                  	db 'XXh'
  1655 000012D3 0D0A                    	db 0Dh, 0Ah
  1656 000012D5 506879205365632070-     	db 'Phy Sec per Track   : '
  1656 000012DE 657220547261636B20-
  1656 000012E7 20203A20           
  1657                                  tpsptnum:
  1658 000012EB 585868                  	db 'XXh'
  1659 000012EE 0D0A                    	db 0Dh, 0Ah	
  1660 000012F0 507265636F6D70656E-     	db 'Precompensation     : '
  1660 000012F9 736174696F6E202020-
  1660 00001302 20203A20           
  1661                                  tpcompnum:
  1662 00001306 58585858682020284F-     	db 'XXXXh  (Obsolete)'
  1662 0000130F 62736F6C65746529   
  1663 00001317 0D0A                    	db 0Dh, 0Ah
  1664 00001319 526573657276656420-     	db 'Reserved            : '
  1664 00001322 202020202020202020-
  1664 0000132B 20203A20           
  1665                                  trsvd7:
  1666 0000132F 585868                  	db 'XXh'
  1667 00001332 0D0A                    	db 0Dh, 0Ah
  1668 00001334 447269766520436F6E-     	db 'Drive Control Byte  : '
  1668 0000133D 74726F6C2042797465-
  1668 00001346 20203A20           
  1669                                  tdcbnum:
  1670 0000134A 585868                  	db 'XXh'
  1671 0000134D 0D0A                    	db 0Dh, 0Ah		
  1672 0000134F 506879736963616C20-     	db 'Physical Cylinders  : '
  1672 00001358 43796C696E64657273-
  1672 00001361 20203A20           
  1673                                  tpcylnum:
  1674 00001365 5858585868              	db 'XXXXh'
  1675 0000136A 0D0A                    	db 0Dh, 0Ah
  1676 0000136C 506879736963616C20-     	db 'Physical Heads      : '
  1676 00001375 486561647320202020-
  1676 0000137E 20203A20           
  1677                                  tpheadnum:
  1678 00001382 585868                  	db 'XXh'
  1679 00001385 0D0A                    	db 0Dh, 0Ah
  1680 00001387 4C616E64696E67205A-     	db 'Landing Zone        : '
  1680 00001390 6F6E65202020202020-
  1680 00001399 20203A20           
  1681                                  tlzonenum:
  1682 0000139D 58585858682020284F-     	db 'XXXXh  (Obsolete)'
  1682 000013A6 62736F6C65746529   
  1683 000013AE 0D0A                    	db 0Dh, 0Ah
  1684 000013B0 4C6F67696320536563-     	db 'Logic Sec per Trk   : '
  1684 000013B9 207065722054726B20-
  1684 000013C2 20203A20           
  1685                                  lsptnum:
  1686 000013C6 585868                  	db 'XXh'
  1687 000013C9 0D0A                    	db 0Dh, 0Ah
  1688 000013CB 436865636B73756D20-     	db 'Checksum            : '
  1688 000013D4 202020202020202020-
  1688 000013DD 20203A20           
  1689                                  checksum:
  1690 000013E1 585868                  	db 'XXh'
  1691 000013E4 0D0A                    	db 0Dh, 0Ah
  1692 000013E6 0D0A                    	db 0Dh, 0Ah
  1693 000013E8 492F4F20506F727420-     	db 'I/O Port Base Addr  : '
  1693 000013F1 426173652041646472-
  1693 000013FA 20203A20           
  1694                                  tbPortAddr:
  1695 000013FE 5858585868              	db 'XXXXh'
  1696 00001403 0D0A                    	db 0Dh, 0Ah
  1697 00001405 436F6E74726F6C2050-     	db 'Control Port Addr   : '
  1697 0000140E 6F7274204164647220-
  1697 00001417 20203A20           
  1698                                  tcPortAddr:
  1699 0000141B 5858585868              	db 'XXXXh'
  1700 00001420 0D0A                    	db 0Dh, 0Ah
  1701 00001422 486561642052656720-     	db 'Head Reg Upp Nibb   : '
  1701 0000142B 557070204E69626220-
  1701 00001434 20203A20           
  1702                                  thregupnib:
  1703 00001438 585868                  	db 'XXh'
  1704 0000143B 0D0A                    	db 0Dh, 0Ah
  1705 0000143D 0D0A                    	db 0Dh, 0Ah
  1706 0000143F 53697A652028696E20-     	db 'Size (in sectors)   : '
  1706 00001448 736563746F72732920-
  1706 00001451 20203A20           
  1707                                  tdisksize:
  1708 00001455 585858585858585868      	db 'XXXXXXXXh'
  1709 0000145E 0D0A                    	db 0Dh, 0Ah
  1710 00001460 0D0A00                  	db 0Dh, 0Ah, 0
  1711                                  
  1712                                  hex_digits:
  1713                                  hexchrs:
  1714 00001463 303132333435363738-     	db '0123456789ABCDEF'
  1714 0000146C 39414243444546     
  1715                                  
  1716                                  ds_drv:
  1717 00001473 FF                      	db 0FFh ; Current drive (on display)
  1718 00001474 00                       	db 0    ; Current half (0 or >0)
  1719                                  
  1720                                  drv_names:
  1721 00001475 666430206664312068-     	db 'fd0 fd1 hd0 hd1 hd2 hd3 '
  1721 0000147E 643020686431206864-
  1721 00001487 322068643320       
  1722                                  
  1723                                  dpheader:
  1724 0000148D 204472697665203A20      	db ' Drive : '
  1725                                  drv_name:
  1726 00001496 3030302020              	db '000  '
  1727 0000149B 536563746F72203A20      	db  'Sector : '
  1728                                  sector_num:
  1729 000014A4 464646464646464668      	db  'FFFFFFFFh'
  1730 000014AD 00                              db 0
  1731                                  
  1732                                  sdline:
  1733 000014AE 204279746520            	db ' Byte '
  1734                                  sdline_1:
  1735 000014B4 30303068                	db '000h'
  1736 000014B8 202D2020                	db ' -  '
  1737                                  sdline_2:
  1738 000014BC 303020303020303020-     	db '00 00 00 00 00 00 00 00 '
  1738 000014C5 303020303020303020-
  1738 000014CE 303020303020       
  1739 000014D4 303020303020303020-     	db '00 00 00 00 00 00 00 00 '
  1739 000014DD 303020303020303020-
  1739 000014E6 303020303020       
  1740 000014EC 20                      	db ' '
  1741                                  sdline_3:
  1742 000014ED 2E2E2E2E2E2E2E2E2E-     	db '................'
  1742 000014F6 2E2E2E2E2E2E2E     
  1743 000014FD 20                      	db 20h
  1744                                  
  1745                                  dpfooter1:
  1746 000014FE 204631203D20436861-     	db ' F1 = Change Drive  '
  1746 00001507 6E6765204472697665-
  1746 00001510 2020               
  1747 00001512 486F6D65203D204669-     	db 'Home = First Sector '
  1747 0000151B 72737420536563746F-
  1747 00001524 7220               
  1748 00001526 50675570203D205072-     	db 'PgUp = Previous Sector '
  1748 0000152F 6576696F7573205365-
  1748 00001538 63746F7220         
  1749 0000153D 455343203D20455849-     	db 'ESC = EXIT'
  1749 00001546 54                 
  1750 00001547 00                      	db 0
  1751                                  dpfooter2:
  1752 00001548 204632203D20436861-     	db ' F2 = Change Sector '
  1752 00001551 6E676520536563746F-
  1752 0000155A 7220               
  1753 0000155C 456E64203D204C6173-     	db 'End = Last Sector   '
  1753 00001565 7420536563746F7220-
  1753 0000156E 2020               
  1754 00001570 5067446F776E203D20-     	db 'PgDown = Next Sector   ' 
  1754 00001579 4E6578742053656374-
  1754 00001582 6F72202020         
  1755 00001587 454E544552203D2050-     	db 'ENTER = Prv/Nxt'
  1755 00001590 72762F4E7874       
  1756 00001596 00                      	db 0
  1757                                  
  1758                                  F1_ib:
  1759 00001597 10                      	db 16	; box width (columns)
  1760 00001598 03                      	db 3	; box height (rows)
  1761 00001599 01                      	db 1	; label offset (vertical)
  1762 0000159A 01                      	db 1	; label offset (horizontal)
  1763 0000159B 01                      	db 1	; text (input) size
  1764 0000159C 4E                      	db 4Eh	; box color
  1765 0000159D 44726976653A20          	db 'Drive: '  ; Label
  1766 000015A4 00                      	db 0
  1767                                  
  1768                                  F2_ib:
  1769 000015A5 14                      	db 20	; box width (columns)
  1770 000015A6 03                      	db 3	; box height (rows)
  1771 000015A7 01                      	db 1	; label offset (vertical)
  1772 000015A8 01                      	db 1	; label offset (horizontal)
  1773 000015A9 08                      	db 8	; text (input) size
  1774 000015AA 4E                      	db 4Eh	; box color
  1775 000015AB 536563746F72203A20      	db 'Sector : '  ; Label
  1776 000015B4 00                      	db 0
  1777                                  
  1778                                  dskr_err:
  1779 000015B5 21                      	db 33	; box width (columns)
  1780                                  	;db 17	
  1781 000015B6 03                      	db 3	; box height (rows)
  1782 000015B7 01                      	db 1	; label offset (vertical)
  1783 000015B8 01                      	db 1	; label offset (horizontal)
  1784 000015B9 00                      	db 0	; text (input) size
  1785 000015BA 4E                      	db 4Eh	; box color
  1786 000015BB 4472697665206E6F74-     	db 'Drive not ready or read error !'  ; Label
  1786 000015C4 207265616479206F72-
  1786 000015CD 207265616420657272-
  1786 000015D6 6F722021           
  1787                                  	;db ' Error : '
  1788                                  ;err_code_str:
  1789                                  ;	db '00h ! '	
  1790 000015DA 00                      	db 0	
  1791                                  
  1792                                  ; Additional functions, variables/pointers for 
  1793                                  ; Real Mode adaption (out of unix386.s) variables/pointers
  1794                                  
  1795                                  set_cpos:
  1796 000015DB 668B15[B0160000]        	mov	dx, [cursor_posn] ; dh = row, dl = column
  1797                                  set_cposx:
  1798                                  	; DX = cursor position
  1799 000015E2 B402                    	mov	ah, 2		; Set cursor position
  1800 000015E4 30FF                    	xor	bh, bh		; for video page 0
  1801 000015E6 CD31                    	int	31h		; TRDOS 386 video interrupt
  1802 000015E8 C3                      	retn
  1803                                  
  1804 000015E9 90                      align 2
  1805                                  
  1806                                  prg_msg:
  1807 000015EA 0D0A07                  	db 0Dh, 0Ah, 07h
  1808 000015ED 4469736B2052656164-     	db 'Disk Read Utility - TRDOS 386 v1 Disk I/O and timer test.'
  1808 000015F6 205574696C69747920-
  1808 000015FF 2D205452444F532033-
  1808 00001608 383620763120446973-
  1808 00001611 6B20492F4F20616E64-
  1808 0000161A 2074696D6572207465-
  1808 00001623 73742E             
  1809 00001626 0D0A                    	db 0Dh, 0Ah	
  1810 00001628 6279204572646F6761-     	db 'by Erdogan Tan  [18/06/2016]'
  1810 00001631 6E2054616E20205B31-
  1810 0000163A 382F30362F32303136-
  1810 00001643 5D                 
  1811 00001644 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
  1812 00001648 28507265737320616E-             db '(Press any key to continue...)'
  1812 00001651 79206B657920746F20-
  1812 0000165A 636F6E74696E75652E-
  1812 00001663 2E2E29             
  1813 00001666 0D0A00                  	db 0Dh, 0Ah, 0
  1814                                  
  1815                                  drv_not_ready:
  1816 00001669 070D0A                  	db 07h, 0Dh, 0Ah 
  1817 0000166C 4472697665206E6F74-     	db 'Drive not ready !'
  1817 00001675 2072656164792021   
  1818 0000167D 0D0A00                  	db 0Dh, 0Ah, 0
  1819                                  
  1820 00001680 30                      fd0_type: db '0'
  1821 00001681 30                      fd1_type: db '0'
  1822                                  
  1823                                  rtc_msg:
  1824 00001682 5265616C2054696D65-     	db "Real Time Clock - "
  1824 0000168B 20436C6F636B202D20 
  1825                                  datestr:
  1826 00001694 30302F30302F303030-     	db "00/00/0000"
  1826 0000169D 30                 
  1827 0000169E 2020                    	db "  "
  1828                                  timestr:	
  1829 000016A0 30303A30303A3030                db "00:00:00"
  1830                                  rtc_msg_end:
  1831 000016A8 00                      	db 0
  1832                                  
  1833                                  timer_event:
  1834 000016A9 00                      	db 0 
  1835                                  
  1836 000016AA 90<rept>                align 4 ; dword alignment
  1837                                  
  1838 000016AC [C4190000]              current_txtpos: dd video_buffer
  1839                                  
  1840                                  bss_start:
  1841                                  
  1842                                  ABSOLUTE bss_start
  1843                                  
  1844 000016B0 <res 00000002>          cursor_posn: resw 1
  1845 000016B2 <res 00000002>          cursor_shp:  resw 1
  1846 000016B4 <res 00000002>          cursor_posb: resw 1 ; (cursor position backup, for video page 0)
  1847                                  
  1848 000016B6 <res 00000001>          txtposoff:   resb 1 ; txtpos offset for sector number input	
  1849 000016B7 <res 00000001>          dscmd:	     resb 1 ; 0 = change drive
  1850                                  	            ; 1 = change sector
  1851                                  	            ; 2 = display disk parameters
  1852                                  
  1853 000016B8 <res 00000001>          inds:	     resb 1 	 
  1854 000016B9 <res 00000001>          paragr:	     resb 1	 
  1855                                  
  1856 000016BA <res 00000001>          ibcp:	     resb 1 ; input box - row position
  1857 000016BB <res 00000001>          	     resb 1 ; input box - column position
  1858                                  
  1859 000016BC <res 00000001>          retry_count: resb 1
  1860 000016BD <res 00000001>          drv:	     resb 1  ; physical drive number (0, 1, 80h, 81h, 82h, 83h)
  1861                                  
  1862 000016BE <res 00000002>          drv_status:  resb 2  ; fd0, fd1 (FFh = failure, 80h = existing)		
  1863 000016C0 <res 00000004>          	     resb 4  ; hd0, hd1 hd2, hd3 (FFh = failure)
  1864                                                      ;                   (80h - 87h = existing)
  1865                                                      ;                   (bit 0 = 1 : LBA ready)
  1866                                  
  1867 000016C4 <res 0000000C>          drv_cylinders :	resw 6
  1868 000016D0 <res 0000000C>          drv_heads     :	resw 6
  1869 000016DC <res 0000000C>          drv_spt       :	resw 6
  1870                                  alignb 4
  1871 000016E8 <res 00000018>          drv_size :	resd 6
  1872                                  
  1873 00001700 <res 00000010>          fd0_dpt: resb 16
  1874 00001710 <res 00000010>          fd1_dpt: resb 16
  1875 00001720 <res 00000020>          hd0_dpt: resb 32
  1876 00001740 <res 00000020>          hd1_dpt: resb 32
  1877 00001760 <res 00000020>          hd2_dpt: resb 32
  1878 00001780 <res 00000020>          hd3_dpt: resb 32
  1879                                  
  1880                                  ds_sec:
  1881 000017A0 <res 00000004>          	resd 1 ; Current sector (on display), drv 0		
  1882 000017A4 <res 00000004>          	resd 1 ; Current sector (on display), drv 1
  1883 000017A8 <res 00000004>          	resd 1 ; Current sector (on display), drv 2
  1884 000017AC <res 00000004>          	resd 1 ; Current sector (on display), drv 3
  1885 000017B0 <res 00000004>          	resd 1 ; Current sector (on display), drv 4
  1886 000017B4 <res 00000004>          	resd 1 ; Current sector (on display), drv 5
  1887                                  
  1888 000017B8 <res 00000004>          prev_sec: resd 1  ; previous sector (before reading)	
  1889                                  
  1890                                  sector_buffer:
  1891 000017BC <res 00000200>          	resb 512
  1892                                  
  1893                                  date_day:
  1894 000019BC <res 00000001>          	resb 1
  1895                                  date_month:
  1896 000019BD <res 00000001>          	resb 1
  1897                                  date_year:
  1898 000019BE <res 00000001>          	resb 1
  1899                                  date_century:
  1900 000019BF <res 00000001>          	resb 1
  1901                                  
  1902                                  time_second:
  1903 000019C0 <res 00000001>          	resb 1
  1904                                  time_minute:
  1905 000019C1 <res 00000001>          	resb 1
  1906                                  time_hour:
  1907 000019C2 <res 00000001>          	resb 1
  1908                                  	
  1909 000019C3 <res 00000001>          	resb 1
  1910                                  
  1911                                  video_buffer:
  1912 000019C4 <res 00000FA0>          	resb	4000 ; 80*25*2
  1913                                  
  1914                                  timer_event_number:
  1915 00002964 <res 00000001>          	resb 1
  1916                                  
  1917 00002965 <res 00000001>          hdc:	resb 1
  1918 00002966 <res 00000001>          fdc:	resb 1
  1919                                  
  1920                                  prev_drv:
  1921 00002967 <res 00000001>          	resb 1
  1922                                  
  1923                                  alignb 4
  1924                                  
  1925                                  bss_end:
  1926                                  	
  1927                                  _end:
