     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 'dsectrm2.s' source code for Retro UNIX 386 v1 'boot'
    10                                  ;
    11                                  ; [ Last Modification: 26/08/2020 ]
    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                                  ; 02/07/2016
    36                                  
    37                                  [BITS 32]
    38                                  	
    39                                  	; clear bss area
    40                                  
    41                                  	; ecx = 0
    42 00000000 B9B8120000              	mov	ecx, bss_end - bss_start
    43 00000005 66C1E902                	shr	cx, 2 ; dword count
    44 00000009 BF[D8160000]            	mov	edi, bss_start
    45                                  	; eax = 0
    46                                  	;xor	eax, eax
    47 0000000E F3AB                    	rep	stosd
    48                                  	
    49 00000010 BE[12160000]                    mov     esi, prg_msg
    50 00000015 E87F0D0000              	call	print_msg
    51                                  
    52                                  	; Filling disk parameters tables
    53                                  _fd0:
    54                                  	;xor	dl, dl ; fd0
    55                                  	;mov	[drv], dl
    56 0000001A BB[28170000]            	mov	ebx, fd0_dpt
    57 0000001F B408                    	mov	ah, 08h	; return disk parameters
    58 00000021 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    59 00000023 724B                    	jc	short _hd0
    60 00000025 C605[E6160000]80        	mov	byte [drv_status], 80h
    61 0000002C 001D[A8160000]          	add	[fd0_type], bl
    62 00000032 8815[8E290000]          	mov	[fdc], dl
    63 00000038 E878080000              	call	set_disk_parms
    64 0000003D FE0D[8E290000]          	dec	byte [fdc]
    65 00000043 742B                    	jz	short _hd0
    66                                  _fd1:
    67 00000045 B201                    	mov	dl, 1 ; fd1
    68 00000047 8815[E5160000]          	mov	[drv], dl
    69 0000004D BB[38170000]            	mov	ebx, fd1_dpt
    70 00000052 B408                    	mov	ah, 08h	; return disk parameters
    71 00000054 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    72 00000056 7218                    	jc	short _hd0
    73 00000058 C605[E7160000]80        	mov	byte [drv_status+1], 80h
    74 0000005F 001D[A9160000]          	add	[fd1_type], bl
    75 00000065 E84B080000              	call	set_disk_parms
    76 0000006A FE0D[8E290000]                  dec     byte [fdc] ; = 0 
    77                                  _hd0:
    78 00000070 B280                    	mov	dl, 80h ; hd0
    79 00000072 8815[E5160000]          	mov	[drv], dl
    80 00000078 BB[48170000]            	mov	ebx, hd0_dpt
    81 0000007D B408                    	mov	ah, 08h	; return disk parameters
    82 0000007F CD33                      	int	33h	; TRDOS 386 disk io interrupt
    83 00000081 7224                    	jc	short _hd1
    84 00000083 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
    85 00000086 C0E806                  	shr	al, 6 ; bit 6 = bit 0
    86 00000089 0480                    	add	al, 80h
    87 0000008B A2[E8160000]            	mov	[drv_status+2], al
    88 00000090 8815[8D290000]          	mov	[hdc], dl
    89 00000096 E81A080000              	call	set_disk_parms
    90 0000009B FE0D[8D290000]          	dec	byte [hdc]  ; number of fixed disk drives - 1
    91 000000A1 0F8485000000            	jz	sccps
    92                                  _hd1:
    93 000000A7 B281                    	mov	dl, 81h ; hd1
    94 000000A9 8815[E5160000]          	mov	[drv], dl
    95 000000AF BB[68170000]            	mov	ebx, hd1_dpt
    96 000000B4 B408                    	mov	ah, 08h	; return disk parameters
    97 000000B6 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    98 000000B8 721A                    	jc	short _hd2
    99 000000BA 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
   100 000000BD C0E806                  	shr	al, 6 ; bit 6 = bit 0
   101 000000C0 0480                    	add	al, 80h
   102 000000C2 A2[E9160000]            	mov	[drv_status+3], al
   103 000000C7 E8E9070000              	call	set_disk_parms
   104 000000CC FE0D[8D290000]          	dec	byte [hdc]
   105 000000D2 7458                    	jz	short sccps
   106                                  _hd2:
   107 000000D4 B282                    	mov	dl, 82h ; hd2
   108 000000D6 8815[E5160000]          	mov	[drv], dl
   109 000000DC BB[88170000]            	mov	ebx, hd2_dpt
   110 000000E1 B408                    	mov	ah, 08h	; return disk parameters
   111 000000E3 CD33                      	int	33h	; TRDOS 386 disk io interrupt
   112 000000E5 721A                    	jc	short _hd3
   113 000000E7 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
   114 000000EA C0E806                  	shr	al, 6 ; bit 6 = bit 0
   115 000000ED 0480                    	add	al, 80h
   116 000000EF A2[EA160000]            	mov	[drv_status+4], al
   117 000000F4 E8BC070000              	call	set_disk_parms
   118 000000F9 FE0D[8D290000]          	dec	byte [hdc]
   119 000000FF 742B                    	jz	short sccps
   120                                  _hd3:
   121 00000101 B283                    	mov	dl, 83h ; hd3
   122 00000103 8815[E5160000]          	mov	[drv], dl
   123 00000109 BB[A8170000]            	mov	ebx, hd3_dpt
   124 0000010E B408                    	mov	ah, 08h	; return disk parameters
   125 00000110 CD33                      	int	33h	; TRDOS 386 disk io interrupt
   126 00000112 7218                    	jc	short sccps
   127 00000114 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
   128 00000117 C0E806                  	shr	al, 6 ; bit 6 = bit 0
   129 0000011A 0480                    	add	al, 80h
   130 0000011C A2[EB160000]            	mov	[drv_status+5], al
   131 00000121 E88F070000              	call	set_disk_parms
   132 00000126 FE0D[8D290000]          	dec	byte [hdc] ; = 0
   133                                  
   134                                  sccps:
   135                                  	; get cursor position
   136 0000012C 31DB                    	xor	ebx, ebx ; bh = video page 0
   137 0000012E B403                    	mov	ah, 03h	; get cursor position and shape
   138 00000130 CD31                    	int	31h 	; TRDOS 386 video interrupt
   139                                  			; (IBM PC/AT ROMBIOS, INT 10h) 	
   140 00000132 668915[D8160000]        	mov	[cursor_posn], dx ; position
   141 00000139 66890D[DA160000]        	mov	[cursor_shp], cx ; shape
   142                                  
   143                                  	; Save video page (before displaying sector)
   144                                  
   145                                  	; copy video page 0 to video page 6
   146                                  	;sub	ebx, ebx ; bl = 0 -> system to system
   147                                  			 ; bh = 0 -> 80*25 text mode 
   148 00000140 28C9                    	sub	cl, cl   ; source = video page 0
   149 00000142 B206                    	mov	dl, 6    ; destination = video page 6
   150 00000144 B81F000000              	mov	eax, 31  ; 'sysvideo'
   151 00000149 CD40                    	int	40h	 ; TRDOS 386 system call  
   152                                  
   153                                  display_sectors:
   154 0000014B E847070000              	call	hide_cursor
   155                                  	; Save cursor position
   156 00000150 66A1[D8160000]          	mov	ax, [cursor_posn] ; cursor pos. 
   157                                  				  ; for video page 0
   158 00000156 66A3[DC160000]          	mov	[cursor_posb], ax
   159 0000015C E869050000              	call	clear_frame
   160                                  
   161                                  	; start (Real Time Clock) timer function
   162 00000161 B3FF                            mov     bl, 0FFh ; signal return (response) byte
   163 00000163 B703                            mov     bh, 3    ; 1 second (rtc interrupt) 
   164                                  	;mov	ecx, 1
   165 00000165 66B90100                	mov	cx, 1
   166 00000169 BA[D1160000]            	mov	edx, timer_event ; signal return (response) address
   167 0000016E B821000000              	mov	eax, 33	; 'systimer'
   168 00000173 CD40                    	int	40h	; TRDOS 386 system call
   169 00000175 7238                            jc      short dscl_0
   170                                  
   171 00000177 A2[8C290000]            	mov	[timer_event_number], al 
   172                                  
   173 0000017C EB31                    	jmp	short dscl_0
   174                                  
   175                                  dscl_esc:
   176 0000017E E8FD030000              	call	restore_video_page
   177                                  dscl_getc:
   178 00000183 E89E030000              	call	getch
   179                                  	;
   180 00000188 3C1B                    	cmp	al, ESCKey
   181 0000018A 0F845B030000                    je      dscl_exit
   182 00000190 C605[DF160000]00        	mov	byte [dscmd], 0
   183 00000197 663D003B                	cmp	ax, F1Key
   184 0000019B 7412                            je	short dscl_0
   185                                  	;
   186 0000019D FE05[DF160000]          	inc	byte [dscmd]
   187 000001A3 663D003D                	cmp	ax, F3Key
   188 000001A7 7530                            jne     short dscl_5
   189 000001A9 FE05[DF160000]          	inc	byte [dscmd] ; Display disk params.
   190                                  dscl_0:
   191 000001AF E8BE030000              	call	save_video_page
   192 000001B4 BE[C0150000]            	mov	esi, F1_ib ; F1 (Change drive)
   193                                  			   ; Inputbox address
   194                                  dscl_ib:
   195 000001B9 E828060000              	call	inputbox
   196                                  		; cursor position in DX
   197 000001BE E8DB060000              	call	show_cursor
   198                                  		; cursor blinks at current position
   199 000001C3 8B0D[E0170000]          	mov	ecx, [prev_sec]
   200                                  dscl_3:
   201 000001C9 E858030000              	call	getch
   202 000001CE 3C1B                    	cmp	al, ESCKey
   203 000001D0 7524                    	jne	short dscl_27
   204 000001D2 E8C0060000                      call    hide_cursor
   205 000001D7 EBA5                            jmp     dscl_esc
   206                                  dscl_5:
   207 000001D9 663D003C                	cmp	ax, F2Key
   208 000001DD 0F8570020000            	jne	dscl_6
   209 000001E3 E88A030000              	call	save_video_page
   210 000001E8 BE[CE150000]            	mov	esi, F2_ib ; F2 (Change sector)
   211                                  		           ; Inputbox address
   212 000001ED C605[DF160000]01        	mov	byte [dscmd], 1
   213 000001F4 EBC3                            jmp     short dscl_ib
   214                                  dscl_27:
   215 000001F6 3C20                    	cmp	al, SPACEKey
   216 000001F8 7440                    	je	short dscl_4	
   217 000001FA 3C0D                         	cmp	al, ENTERKey
   218 000001FC 743C                    	je	short dscl_4
   219                                  	;
   220 000001FE 31DB                    	xor	ebx, ebx
   221 00000200 803D[DF160000]01            	cmp     byte [dscmd], 1
   222 00000207 746E                    	je	short dscl_12
   223                                  	;
   224 00000209 3C30                    	cmp	al, '0'
   225 0000020B 72BC                    	jb	short dscl_3
   226 0000020D 3C35                    	cmp	al, '5'
   227 0000020F 77B8                    	ja	short dscl_3
   228 00000211 8B3D[D4160000]          	mov	edi, [current_txtpos]
   229 00000217 AA                      	stosb
   230                                  	;
   231                                  	;xor	bh, bh  ; video page 0
   232 00000218 66B90100                	mov	cx, 1   ; character count
   233 0000021C B40A                    	mov	ah, 0Ah ; write chr at current cursor pos.
   234 0000021E CD31                    	int	31h     ; TRDOS 386 video interrupt
   235                                  	;
   236 00000220 2C30                    	sub	al, '0'
   237 00000222 88C2                    	mov	dl, al
   238 00000224 30F6                    	xor	dh, dh
   239 00000226 88C3                    	mov	bl, al
   240 00000228 C0E302                  	shl	bl, 2  ; *4
   241 0000022B 81C3[C8170000]          	add	ebx, ds_sec ; current_sector
   242 00000231 8B0B                    	mov	ecx, [ebx]
   243 00000233 BE[E4170000]                    mov     esi, sector_buffer
   244 00000238 EB8F                    	jmp	short dscl_3 
   245                                  dscl_4:
   246 0000023A 803D[E0160000]00        	cmp	byte [inds],  0 ; display other half or not ?
   247 00000241 0F8720010000                    ja      dscl_oh         ; other half
   248 00000247 6652                    	push	dx
   249                                  	; save regs (ESI, ECX, DX)
   250 00000249 E849060000              	call	hide_cursor
   251                                  	; restore regs (ESI, ECX, DX)
   252 0000024E 665A                    	pop	dx
   253 00000250 89C8                    	mov	eax, ecx
   254                                  	;
   255 00000252 803D[DF160000]01        	cmp     byte [dscmd], 1 ; Requested function ?
   256 00000259 0F84CB000000                    je      dscl_17         ; Change sector (F2)
   257 0000025F 0F823C010000                    jb      dscl_ns         ; Change drive (F1)
   258                                  
   259                                  	; Display disk parameters (dscmd = 2)
   260 00000265 80FA02                  	cmp	dl, 2
   261 00000268 7203                    	jb	short dscl_28
   262 0000026A 80C27E                  	add	dl, 7Eh
   263                                  dscl_28:
   264 0000026D E80E080000              	call	dskprm
   265 00000272 E907FFFFFF                      jmp     dscl_esc
   266                                  dscl_12:
   267 00000277 663DE053                	cmp	ax, DELKey	; DEL key
   268 0000027B 7404                    	je	short dscl_bs
   269 0000027D 3C08                    	cmp	al, BACKSPC	; Backspace key
   270 0000027F 7535                    	jne	short dscl_13
   271                                  dscl_bs:
   272 00000281 803D[DE160000]00        	cmp	byte [txtposoff], 0
   273 00000288 0F863BFFFFFF                    jna     dscl_3
   274 0000028E FE0D[DE160000]          	dec	byte [txtposoff]
   275 00000294 FE0D[D8160000]          	dec	byte [cursor_posn]
   276 0000029A E865130000              	call	set_cpos
   277 0000029F 0FB61D[DE160000]        	movzx	ebx, byte [txtposoff]
   278 000002A6 FE0D[DE160000]          	dec	byte [txtposoff]
   279 000002AC FE0D[D8160000]          	dec	byte [cursor_posn]
   280 000002B2 B020                    	mov	al, 20h
   281 000002B4 EB1B                            jmp     short dscl_14
   282                                  dscl_13:
   283 000002B6 8A1D[DE160000]          	mov	bl, [txtposoff]
   284 000002BC 80FB08                  	cmp	bl, 8
   285 000002BF 0F8304FFFFFF                    jnb     dscl_3
   286                                  	;
   287 000002C5 3C30                    	cmp	al, '0'
   288 000002C7 0F82FCFEFFFF                    jb      dscl_3
   289 000002CD 3C39                    	cmp	al, '9'
   290 000002CF 7739                    	ja	short dscl_15
   291                                  dscl_14:
   292 000002D1 D0E3                    	shl	bl, 1
   293 000002D3 8B35[D4160000]          	mov	esi, [current_txtpos]
   294 000002D9 01F3                    	add	ebx, esi
   295 000002DB 8803                    	mov	[ebx], al
   296                                  	;
   297 000002DD 30FF                    	xor	bh, bh  ; video page 0
   298 000002DF 66B90100                	mov	cx, 1	; character count
   299 000002E3 B40A                    	mov	ah, 0Ah ; write chr at current cursor pos.
   300 000002E5 CD31                    	int	31h     ; TRDOS 386 video interrupt
   301                                  	;
   302 000002E7 803D[DE160000]08        	cmp	byte [txtposoff], 8
   303 000002EE 0F8DD5FEFFFF            	jge	dscl_3 ; JGE !
   304 000002F4 FE05[DE160000]          	inc	byte [txtposoff]
   305 000002FA FE05[D8160000]          	inc	byte [cursor_posn]
   306 00000300 E8FF120000              	call	set_cpos
   307 00000305 E9BFFEFFFF                      jmp     dscl_3 
   308                                  dscl_15:
   309 0000030A 3C41                    	cmp	al, 'A'
   310 0000030C 0F82B7FEFFFF                    jb      dscl_3
   311 00000312 3C46                    	cmp	al, 'F'
   312 00000314 76BB                            jna     short dscl_14
   313                                  dscl_16:
   314 00000316 3C61                    	cmp	al, 'a'
   315 00000318 0F82ABFEFFFF                    jb      dscl_3
   316 0000031E 3C66                    	cmp	al, 'f'
   317 00000320 0F87A3FEFFFF                    ja      dscl_3
   318 00000326 2C20                    	sub	al, 'a' - 'A'
   319 00000328 EBA7                    	jmp	short dscl_14
   320                                  	;
   321                                  dscl_17:
   322 0000032A 8B35[D4160000]          	mov	esi, [current_txtpos]
   323 00000330 31C0                    	xor	eax, eax
   324 00000332 A2[DE160000]            	mov	byte [txtposoff], al ; 0
   325 00000337 50                      	push	eax  ; sector value (reset)	
   326                                  dscl_18:
   327 00000338 66AD                    	lodsw
   328 0000033A 3C30                    	cmp	al, '0'
   329 0000033C 7219                    	jb	short dscl_22
   330                                  dscl_19: 
   331 0000033E 29C9                    	sub	ecx, ecx
   332 00000340 BB[8C140000]            	mov	ebx, hexchrs
   333                                  dscl_20:
   334 00000345 3A03                    	cmp	al, [ebx]
   335 00000347 7405                    	je	short dscl_21
   336                                  	;cmp	cl, 15
   337                                  	;jnb	short dscl_22
   338 00000349 FEC1                    	inc	cl
   339 0000034B 43                      	inc	ebx
   340 0000034C EBF7                    	jmp	short dscl_20
   341                                  dscl_21: 
   342 0000034E 58                      	pop	eax
   343 0000034F C1E004                  	shl	eax, 4	; * 16
   344 00000352 01C8                    	add	eax, ecx
   345 00000354 50                      	push	eax
   346 00000355 EBE1                    	jmp	short dscl_18
   347                                  dscl_22:
   348 00000357 8A15[9C140000]          	mov	dl, [ds_drv]
   349 0000035D 30F6                    	xor	dh, dh
   350 0000035F 58                      	pop	eax
   351 00000360 BE[E4170000]                    mov     esi, sector_buffer
   352 00000365 EB3A                            jmp     short dscl_ns
   353                                  dscl_oh:
   354 00000367 8A15[9C140000]          	mov	dl, [ds_drv]
   355 0000036D 0FB6DA                  	movzx	ebx, dl
   356 00000370 C0E302                  	shl	bl, 2
   357 00000373 81C3[C8170000]          	add	ebx, ds_sec
   358 00000379 8B03                    	mov	eax, [ebx]
   359 0000037B BE[E4170000]                    mov     esi, sector_buffer
   360                                  	;
   361 00000380 8A35[9D140000]          	mov	dh, [ds_drv+1]
   362 00000386 08F6                    	or	dh, dh
   363 00000388 7404                    	jz	short dscl_nh ; second half of sector (0->1)
   364 0000038A 30F6                    	xor	dh, dh	      ; reset (0)	
   365 0000038C EB08                    	jmp	short dscl_nx
   366                                  dscl_nh:
   367 0000038E 81C600010000            	add	esi, 256
   368 00000394 FEC6                    	inc	dh
   369                                  dscl_nx:
   370 00000396 8835[9D140000]          	mov	[ds_drv+1], dh
   371 0000039C E991000000                      jmp     dscl_25
   372                                  dscl_ns:
   373 000003A1 8835[9D140000]          	mov	[ds_drv+1], dh
   374 000003A7 0FB6DA                  	movzx	ebx, dl
   375 000003AA C0E302                  	shl	bl, 2
   376 000003AD 81C3[C8170000]          	add	ebx, ds_sec
   377 000003B3 3A15[9C140000]          	cmp	dl, [ds_drv]
   378 000003B9 7504                    	jne	short dscl_23
   379 000003BB 3B03                    	cmp	eax, [ebx]
   380 000003BD 7473                    	je	dscl_25
   381                                  dscl_23:
   382 000003BF 8A0D[9C140000]          	mov	cl, [ds_drv]
   383 000003C5 880D[8F290000]          	mov	[prev_drv], cl
   384 000003CB 8815[9C140000]          	mov	[ds_drv], dl
   385                                  dscl_26:
   386 000003D1 8B0B                    	mov	ecx, [ebx]
   387 000003D3 890D[E0170000]          	mov	[prev_sec], ecx
   388 000003D9 8903                    	mov	[ebx], eax
   389 000003DB E870050000              	call	read_disk_sector
   390 000003E0 7336                    	jnc	short dscl_24
   391                                  dscl_rd_err:
   392                                  	;
   393                                  	;mov	al, ah	; error code
   394                                  	;mov	edi, err_code_str
   395                                  	;call	write_hex
   396                                  	;
   397 000003E2 BE[DE150000]            	mov	esi, dskr_err ; drive not ready or read error
   398 000003E7 E8FA030000              	call	inputbox
   399 000003EC E835010000              	call	getch
   400 000003F1 E88A010000              	call	restore_video_page
   401 000003F6 0FB61D[8F290000]        	movzx	ebx, byte [prev_drv]
   402 000003FD 881D[9C140000]          	mov	[ds_drv], bl
   403 00000403 C0E302                  	shl	bl, 2
   404 00000406 81C3[C8170000]          	add	ebx, ds_sec
   405 0000040C A1[E0170000]            	mov	eax, [prev_sec]
   406 00000411 8903                    	mov	[ebx], eax
   407 00000413 E96BFDFFFF                      jmp     dscl_getc
   408                                  dscl_24:
   409 00000418 668B15[9C140000]        	mov	dx, [ds_drv]
   410 0000041F 0FB6DA                  	movzx	ebx, dl
   411 00000422 C0E302                  	shl	bl, 2
   412 00000425 81C3[C8170000]          	add	ebx, ds_sec
   413 0000042B 8B03                    	mov	eax, [ebx]
   414 0000042D BE[E4170000]                    mov     esi, sector_buffer
   415                                  dscl_25:
   416 00000432 E865010000              	call	display_sector
   417 00000437 E836010000              	call	save_video_page
   418 0000043C E942FDFFFF                      jmp     dscl_getc
   419                                  dscl_11:
   420 00000441 BE[E4170000]                    mov     esi, sector_buffer
   421 00000446 8A15[9C140000]          	mov	dl, [ds_drv]
   422 0000044C 28F6                    	sub	dh, dh	 ; 0 = first half of sector
   423 0000044E E94EFFFFFF                      jmp     dscl_ns
   424                                  dscl_6:	
   425 00000453 3C20                    	cmp	al, SPACEKey
   426 00000455 0F840CFFFFFF                    je      dscl_oh
   427 0000045B 3C0D                         	cmp	al, ENTERKey
   428 0000045D 0F8404FFFFFF                    je      dscl_oh
   429                                  	;
   430 00000463 663DE047                	cmp	ax, HOMEKey
   431 00000467 7504                    	jne	short dscl_7
   432 00000469 31C0                    	xor	eax, eax
   433 0000046B EBD4                    	jmp	short dscl_11
   434                                  dscl_7:
   435 0000046D 663DE04F                	cmp	ax, ENDKey
   436 00000471 7515                    	jne	short dscl_8
   437 00000473 0FB61D[9C140000]        	movzx	ebx, byte [ds_drv]
   438 0000047A C0E302                  	shl	bl, 2
   439 0000047D 81C3[10170000]                  add     ebx, drv_size
   440 00000483 8B03                    	mov	eax, [ebx]
   441 00000485 48                      	dec	eax
   442 00000486 EBB9                    	jmp	short dscl_11
   443                                  dscl_8:
   444 00000488 663DE051                	cmp	ax, PgDnKey
   445 0000048C 753E                    	jne	short dscl_10
   446 0000048E E810000000              	call	dscl_9
   447 00000493 40                      	inc	eax
   448 00000494 39C8                    	cmp	eax, ecx ; last sector
   449 00000496 0F8605FFFFFF            	jna	dscl_ns
   450 0000049C 31C0                    	xor	eax, eax
   451 0000049E E92EFFFFFF              	jmp	dscl_26 
   452                                  dscl_9:	
   453 000004A3 0FB615[9C140000]        	movzx	edx, byte [ds_drv]
   454 000004AA 89D3                    	mov	ebx, edx
   455 000004AC C0E302                  	shl	bl, 2  ; *4
   456 000004AF 81C3[10170000]                  add     ebx, drv_size
   457 000004B5 8B0B                    	mov	ecx, [ebx]
   458 000004B7 49                      	dec	ecx
   459 000004B8 81EB[10170000]                  sub     ebx, drv_size
   460 000004BE 81C3[C8170000]          	add	ebx, ds_sec ; current sector
   461 000004C4 8B03                    	mov	eax, [ebx]	
   462 000004C6 BE[E4170000]                    mov     esi, sector_buffer
   463 000004CB C3                              retn
   464                                  dscl_10:
   465 000004CC 663DE049                	cmp	ax, PgUpKey
   466 000004D0 0F85ADFCFFFF                    jne     dscl_getc
   467 000004D6 E8C8FFFFFF              	call	dscl_9
   468 000004DB 48                      	dec	eax
   469 000004DC 39C8                    	cmp	eax, ecx ; last sector
   470 000004DE 0F86BDFEFFFF            	jna	dscl_ns
   471 000004E4 89C8                    	mov	eax, ecx
   472 000004E6 E9E6FEFFFF              	jmp	dscl_26
   473                                  
   474                                  dscl_exit:
   475                                  	;
   476                                  	; Stop timer event
   477 000004EB 0FB61D[8C290000]        	movzx	ebx, byte [timer_event_number]
   478                                  		; bh = 0 -> stop timer event
   479                                  
   480 000004F2 20DB                    	and	bl, bl
   481 000004F4 7409                    	jz	short dscl_rvp
   482 000004F6 B821000000              	mov	eax, 33	; 'systimer'
   483 000004FB CD40                    	int	40h	; TRDOS 386 system call
   484                                  
   485 000004FD 28DB                    	sub	bl, bl
   486                                  dscl_rvp:
   487                                  	; Restore video page (before displaying sector)
   488                                  
   489                                  	; copy video page 6 to video page 0
   490                                  	;sub	ebx, ebx ; bl = 0 -> system to system
   491                                  			 ; bh = 0 -> 80*25 text mode 
   492 000004FF B106                    	mov	cl, 6    ; source = video page 6
   493                                  
   494 00000501 E87E000000              	call	restore_v_pg_x
   495                                  
   496                                  	; Restore cursor position
   497 00000506 668B15[DC160000]        	mov	dx, [cursor_posb] 
   498                                  	;
   499                                  	; Set cursor position
   500                                  	;xor	bh, bh  ; Video page 0
   501 0000050D B402                    	mov	ah, 2	; set cursor position
   502 0000050F CD31                    	int	31h 	; TRDOS 386 video interrupt
   503                                  	
   504                                  	; Show standard blinking text cursor 
   505 00000511 668B0D[DA160000]                mov 	cx, [cursor_shp]
   506 00000518 B401                    	mov	ah, 1	; set cursor type
   507 0000051A CD31                    	int	31h 	; TRDOS 386 video interrupt
   508                                  
   509                                  terminate:
   510 0000051C B801000000              	mov	eax, 1	; 'sysexit'
   511 00000521 CD40                    	int	40h	; TRDOS 386 system call
   512                                  haltsys:
   513 00000523 F4                      	hlt
   514 00000524 EBFD                    	jmp	short haltsys
   515                                  
   516                                  getch:
   517                                  dscl_rtc_p:
   518 00000526 803D[D1160000]00        	cmp	byte [timer_event], 0
   519 0000052D 7638                    	jna	short dscl_getch
   520                                  
   521                                  	; timer function
   522 0000052F C605[D1160000]00        	mov	byte [timer_event], 0
   523                                  		
   524 00000536 BF[DC1A0000]            	mov	edi, video_buffer + 0A0h + 50h ; Row 1, Column 40
   525 0000053B 807F013F                	cmp     byte [edi+1], 3Fh ; cyan (3) Background
   526                                  			; white (F) forecolor 
   527                                  			; (display disk sector frame)
   528 0000053F 752C                    	jne	short dscl_getchar
   529                                  
   530 00000541 51                      	push	ecx
   531 00000542 52                      	push	edx
   532                                  
   533 00000543 E8F3010000              	call	rtc_p
   534                                  
   535                                  	; print real time clock content (as formatted)
   536                                  	; to video page line 1, column 40
   537 00000548 BE[DC1A0000]            	mov	esi, video_buffer + 0A0h + 50h
   538 0000054D B928000100              	mov	ecx, 10028h ; row 1, column 40 (top left)
   539 00000552 BA4E000100                      mov     edx, 10028h + rtc_msg_end - rtc_msg ; (bottom right)
   540                                  			    ; row 1, column 40 + rtc_msg lenth 
   541 00000557 29FF                    	sub	edi, edi ; no swap
   542 00000559 BB05000000              	mov	ebx, 5  ; user to system window transfer (active page)
   543 0000055E B81F000000              	mov	eax, 31 ; 'sysvideo'
   544 00000563 CD40                    	int	40h	; TRDOS 386 system call	
   545                                  
   546 00000565 5A                      	pop	edx
   547 00000566 59                      	pop	ecx
   548                                  	
   549                                  dscl_getch:
   550                                  	; Check keyboard buffer
   551 00000567 B411                    	mov	ah, 11h
   552 00000569 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   553                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   554 0000056B 74B9                    	jz	short dscl_rtc_p ; keyboard buffer empty
   555                                  
   556                                  dscl_getchar:
   557                                  	; Getchar by using keyboard interrupt
   558 0000056D B410                    	mov	ah, 10h
   559 0000056F CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   560                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   561 00000571 C3                      	retn
   562                                  		
   563                                  save_video_page:
   564                                  	; Save video page
   565                                  
   566                                  	; copy video page 0 to video page 7
   567 00000572 29DB                    	sub	ebx, ebx ; bl = 0 -> system to system
   568                                  			 ; bh = 0 -> 80*25 text mode 
   569 00000574 28C9                    	sub	cl, cl   ; source = video page 0
   570 00000576 B207                    	mov	dl, 7    ; destination = video page 7
   571 00000578 B81F000000              	mov	eax, 31  ; 'sysvideo'
   572 0000057D CD40                    	int	40h	 ; TRDOS 386 system call
   573                                  
   574 0000057F C3                      	retn  
   575                                  
   576                                  restore_video_page:
   577                                  	; copy video page 7 to video page 0
   578 00000580 29DB                    	sub	ebx, ebx ; bl = 0 -> system to system
   579                                  			 ; bh = 0 -> 80*25 text mode 
   580 00000582 B107                    	mov	cl, 7    ; source = video page 7
   581                                  
   582                                  restore_v_pg_x:
   583 00000584 28D2                    	sub	dl, dl   ; destination = video page 0
   584 00000586 B81F000000              	mov	eax, 31  ; 'sysvideo'
   585 0000058B CD40                    	int	40h	 ; TRDOS 386 system call  
   586                                  
   587 0000058D B302                    	mov	bl, 2	 ; system to user
   588                                  	;xor	dl, dl   ; video page 0
   589 0000058F B9[EC190000]            	mov	ecx, video_buffer ; user buffer
   590 00000594 B81F000000              	mov	eax, 31	 ; 'sysvideo'
   591 00000599 CD40                     	int	40h	 ; TRDOS 386 system call  
   592                                  	
   593 0000059B C3                      	retn
   594                                  	
   595                                  display_sector:
   596                                  	; display disk sector data (on video page 0)
   597                                  	;
   598                                  	; INPUT ->
   599                                  	;	ESI = sector buffer offset
   600                                  	; 	      (sector size: 512 bytes)
   601                                  	;	EAX = sector number
   602                                  	;	DL = drive number (0,1,2,3,4,5,6)
   603                                  	;	DH = portion control byte 
   604                                  	;		 (0= first half of the sector, 
   605                                  	;		 >0= second half of the sector) 
   606                                  	; OUTPUT ->
   607                                  	;	Video page 0 (0B8000h) will be filled
   608                                  	;	with sector data
   609                                  	;	(ESI points to byte 256 of the buffer
   610                                  	;	or end of the buffer)	
   611                                  	;
   612                                  	; Modified registers: eax, edx, ecx, ebx, esi, edi
   613                                  	;
   614                                  	;
   615                                  	;xor	ecx, ecx ; reset for cx loop counts
   616 0000059C C605[E0160000]01        	mov	byte [inds], 1 ; for ENTER key handling 
   617                                  	;
   618 000005A3 50                      	push	eax
   619 000005A4 52                      	push	edx
   620 000005A5 E820010000              	call	clear_frame
   621 000005AA 5A                      	pop	edx
   622 000005AB 58                      	pop	eax
   623                                  dsfh:
   624 000005AC 31DB                    	xor	ebx, ebx
   625 000005AE 08F6                    	or	dh, dh
   626 000005B0 7402                    	jz	short dsfh1
   627 000005B2 B310                    	mov	bl, 10h
   628                                  dsfh1:
   629 000005B4 881D[E1160000]          	mov	[paragr], bl	; Paragraph (16 bytes)
   630                                  	;
   631 000005BA 88D3                    	mov	bl, dl
   632 000005BC C0E302                  	shl	bl, 2	; *4
   633 000005BF 81C3[9E140000]          	add	ebx, drv_names
   634 000005C5 8B13                    	mov	edx, [ebx]
   635 000005C7 8915[BF140000]          	mov	[drv_name], edx
   636 000005CD E8BF000000              	call	dwordtohex
   637 000005D2 8915[CD140000]          	mov	[sector_num], edx
   638 000005D8 A3[D1140000]            	mov	[sector_num+4], eax
   639 000005DD B001                    	mov	al, 1
   640 000005DF B43F                    	mov	ah, 3Fh ; cyan background, white forecolor
   641 000005E1 BB[B6140000]            	mov	ebx, dpheader
   642 000005E6 E8CC000000              	call	print_line
   643 000005EB B015                    	mov	al, 21
   644                                  	;mov	ah, 3Fh ; cyan background, white forecolor
   645 000005ED BB[27150000]            	mov	ebx, dpfooter1
   646 000005F2 E8C0000000              	call	print_line
   647 000005F7 B016                    	mov	al, 22
   648                                  	;mov	ah, 3Fh ; cyan background, white forecolor
   649 000005F9 BB[71150000]            	mov	ebx, dpfooter2
   650 000005FE E8B4000000              	call	print_line
   651                                  ds1:
   652 00000603 B910000000              	mov	ecx, 16
   653                                  ds2:
   654 00000608 A0[E1160000]            	mov	al, [paragr]
   655 0000060D E841000000              	call	bytetohex
   656 00000612 66A3[DD140000]          	mov	[sdline_1], ax
   657                                  	;
   658 00000618 51                      	push	ecx
   659 00000619 B110                    	mov	cl, 16
   660 0000061B BF[E5140000]            	mov	edi, sdline_2
   661                                  ds3:
   662 00000620 AC                      	lodsb	
   663 00000621 E82D000000              	call	bytetohex
   664 00000626 66AB                    	stosw
   665 00000628 47                      	inc	edi
   666 00000629 E2F5                    	loop	ds3
   667 0000062B 83EE10                  	sub	esi, 16
   668 0000062E 47                      	inc	edi
   669 0000062F B110                    	mov	cl, 16
   670 00000631 F3A4                    	rep	movsb
   671 00000633 59                      	pop	ecx
   672 00000634 B013                    	mov	al, 19	; line (row) 3 to 24
   673 00000636 28C8                    	sub	al, cl
   674 00000638 B407                    	mov	ah, 07h ; Black background, light gray forecolor
   675 0000063A BB[D7140000]            	mov	ebx, sdline
   676 0000063F E85F000000              	call	print_line_80 ; 04/12/2014
   677 00000644 E205                    	loop	ds4
   678                                  	
   679                                  	;call	video_page_update
   680                                  	;retn
   681                                  
   682 00000646 E9B8000000              	jmp	video_page_update
   683                                  ds4:
   684 0000064B FE05[E1160000]          	inc	byte [paragr]
   685 00000651 EBB5                    	jmp	short ds2
   686                                  
   687                                  ; Convert binary number to hexadecimal string
   688                                  
   689                                  bytetohex:
   690                                  	; INPUT ->
   691                                  	; 	AL = byte (binary number)
   692                                  	; OUTPUT ->
   693                                  	;	AX = hexadecimal string
   694                                  	;
   695 00000653 53                      	push	ebx
   696 00000654 0FB6D8                  	movzx	ebx, al
   697 00000657 C0EB04                  	shr	bl, 4
   698 0000065A 8A9B[8C140000]          	mov	bl, [ebx+hexchrs] 	 	
   699 00000660 86D8                    	xchg	bl, al
   700 00000662 80E30F                  	and	bl, 0Fh
   701 00000665 8AA3[8C140000]          	mov	ah, [ebx+hexchrs] 
   702 0000066B 5B                      	pop	ebx	
   703 0000066C C3                      	retn
   704                                  
   705                                  wordtohex:
   706                                  	; INPUT ->
   707                                  	; 	AX = word (binary number)
   708                                  	; OUTPUT ->
   709                                  	;	EAX = hexadecimal string
   710                                  	;
   711 0000066D 53                      	push	ebx
   712 0000066E 86E0                    	xchg	ah, al
   713 00000670 6650                    	push	ax
   714 00000672 0FB6DC                  	movzx	ebx, ah
   715 00000675 C0EB04                  	shr	bl, 4
   716 00000678 8A83[8C140000]          	mov	al, [ebx+hexchrs] 	 	
   717 0000067E 88E3                    	mov	bl, ah
   718 00000680 80E30F                  	and	bl, 0Fh
   719 00000683 8AA3[8C140000]          	mov	ah, [ebx+hexchrs]
   720 00000689 C1E010                  	shl	eax, 16
   721 0000068C 6658                    	pop	ax
   722 0000068E 5B                      	pop	ebx
   723 0000068F EBC2                    	jmp	short bytetohex
   724                                  	;mov	bl, al
   725                                  	;shr	bl, 4
   726                                  	;mov	bl, [ebx+hexchrs] 	 	
   727                                  	;xchg	bl, al	 	
   728                                  	;and	bl, 0Fh
   729                                  	;mov	ah, [ebx+hexchrs] 
   730                                  	;pop	ebx	
   731                                  	;retn
   732                                  
   733                                  dwordtohex:
   734                                  	; INPUT ->
   735                                  	; 	EAX = dword (binary number)
   736                                  	; OUTPUT ->
   737                                  	;	EDX:EAX = hexadecimal string
   738                                  	;
   739 00000691 50                      	push	eax
   740 00000692 C1E810                  	shr	eax, 16
   741 00000695 E8D3FFFFFF              	call	wordtohex
   742 0000069A 89C2                    	mov	edx, eax
   743 0000069C 58                      	pop	eax
   744 0000069D E8CBFFFFFF              	call	wordtohex
   745 000006A2 C3                      	retn
   746                                  
   747                                  print_line_80:
   748                                  	; 04/12/2014
   749                                  	; al = line (0 to 24)
   750                                  	; ah = color attributes
   751                                  	; ebx = 80 chars string address	
   752 000006A3 E881000000              	call 	get_lpos
   753 000006A8 51                      	push	ecx
   754 000006A9 B950000000              	mov	ecx, 80
   755                                  pl80:
   756 000006AE 8A03                    	mov	al, [ebx]
   757 000006B0 43                      	inc	ebx
   758 000006B1 66AB                    	stosw
   759 000006B3 E2F9                    	loop	pl80
   760 000006B5 59                      	pop	ecx
   761 000006B6 C3                      	retn
   762                                  
   763                                  print_line:
   764                                  	; al = line (0 to 24)
   765                                  	; ah = color attributes	
   766                                  	; ebx = ASCIIZ string address
   767 000006B7 E86D000000              	call	get_lpos
   768 000006BC 56                      	push	esi
   769 000006BD 89DE                    	mov	esi, ebx
   770                                  prl1:
   771 000006BF AC                      	lodsb
   772 000006C0 20C0                    	and	al, al
   773 000006C2 7404                    	jz	short prl2
   774 000006C4 66AB                    	stosw
   775 000006C6 EBF7                    	jmp	short prl1
   776                                  prl2:
   777 000006C8 5E                      	pop	esi
   778 000006C9 C3                      	retn
   779                                  
   780                                  clear_frame:
   781 000006CA 30C0                    	xor	al, al ; Line 0
   782 000006CC E846000000              	call	clear_line
   783 000006D1 B001                    	mov	al, 1
   784 000006D3 B43F                    	mov	ah, 3Fh ; cyan background, white forecolor
   785 000006D5 E83F000000              	call	fill_color
   786 000006DA B001                    	mov	al, 1
   787                                  dscf0:	
   788 000006DC FEC0                    	inc	al
   789 000006DE 6650                    	push	ax
   790 000006E0 E832000000              	call	clear_line
   791 000006E5 6658                    	pop	ax
   792 000006E7 3C13                    	cmp	al, 19
   793 000006E9 72F1                    	jb	short dscf0
   794                                  	;inc	al ; line 20
   795 000006EB B43F                    	mov	ah, 3Fh
   796                                  dscf1:
   797 000006ED FEC0                    	inc	al
   798 000006EF 6650                    	push	ax
   799 000006F1 E823000000              	call	fill_color	  
   800 000006F6 6658                    	pop	ax
   801 000006F8 3C17                    	cmp	al, 23
   802 000006FA 72F1                    	jb	short dscf1
   803 000006FC FEC0                    	inc	al
   804 000006FE E814000000              	call	clear_line
   805                                  
   806                                  	;call	video_page_update
   807                                  	;retn
   808                                  
   809                                  video_page_update:
   810                                  	; copy video buffer content to video page 0
   811 00000703 BB01000000              	mov	ebx, 1	; BL = 1 = user to system
   812 00000708 B200                    	mov	dl, 0	; video page 0
   813 0000070A B9[EC190000]            	mov	ecx, video_buffer
   814 0000070F B81F000000              	mov	eax, 31 ; 'sysvideo'
   815 00000714 CD40                    	int	40h	; TRDOS 386 system call	
   816 00000716 C3                      	retn
   817                                  
   818                                  clear_line:
   819 00000717 30E4                    	xor	ah, ah ; blank
   820                                  fill_color:
   821                                  	; al = line (0 to 24)
   822                                  	; ah = color attributes
   823 00000719 E80B000000              	call	get_lpos
   824 0000071E B950000000              	mov	ecx, 80
   825 00000723 B020                    	mov	al, 20h ; space/blank
   826 00000725 F366AB                  	rep	stosw
   827 00000728 C3                      	retn
   828                                  
   829                                  get_lpos:  ; Get line position in video buffer
   830 00000729 6650                    	push	ax
   831 0000072B B4A0                    	mov	ah, 80*2
   832 0000072D F6E4                    	mul	ah
   833 0000072F 0FB7F8                  	movzx	edi, ax
   834 00000732 81C7[EC190000]          	add	edi, video_buffer
   835 00000738 6658                    	pop	ax
   836 0000073A C3                      	retn
   837                                  
   838                                  rtc_p:	
   839                                  	; Print Real Time Clock content
   840                                  	;
   841 0000073B B404                    	mov	ah, 4	; read the date
   842 0000073D CD35                    	int	35h	; TRDOS 386 date&time interrupt
   843                                  			; (IBM PC/AT ROMBIOS, INT 1Ah)
   844                                  	;mov	[date_day], dl
   845                                  	;mov	[date_month], dh
   846 0000073F 668915[E4190000]        	mov	[date_day], dx
   847                                  	;mov	[date_year], cl
   848                                  	;mov	[date_century], ch
   849 00000746 66890D[E6190000]        	mov	[date_year], cx
   850                                  	;
   851 0000074D B402                    	mov	ah, 2	; read the time
   852 0000074F CD35                    	int	35h	; TRDOS 386 date&time interrupt
   853 00000751 8835[E8190000]                  mov     [time_second], dh
   854                                          ;mov    [time_minute], cl
   855                                          ;mov    [time_hour], ch
   856 00000757 66890D[E9190000]                mov     [time_minute], cx
   857                                  	;
   858 0000075E A0[E7190000]            	mov	al, [date_century]
   859 00000763 E875000000              	call	bcd_to_ascii
   860 00000768 66A3[C2160000]          	mov	word [datestr+6], ax
   861 0000076E A0[E6190000]            	mov	al, byte [date_year]
   862 00000773 E865000000              	call	bcd_to_ascii
   863 00000778 66A3[C4160000]          	mov	word [datestr+8], ax
   864 0000077E A0[E5190000]            	mov	al, byte [date_month]
   865 00000783 E855000000              	call	bcd_to_ascii
   866 00000788 66A3[BF160000]          	mov	word [datestr+3], ax
   867 0000078E A0[E4190000]            	mov	al, byte [date_day]
   868 00000793 E845000000              	call	bcd_to_ascii
   869 00000798 66A3[BC160000]          	mov	word [datestr], ax
   870                                  	;
   871 0000079E A0[EA190000]                    mov     al, byte [time_hour]
   872 000007A3 E835000000              	call	bcd_to_ascii
   873 000007A8 66A3[C8160000]          	mov	word [timestr], ax
   874 000007AE A0[E9190000]                    mov     al, byte [time_minute]
   875 000007B3 E825000000              	call	bcd_to_ascii
   876 000007B8 66A3[CB160000]          	mov	word [timestr+3], ax
   877 000007BE A0[E8190000]                    mov     al, byte [time_second]
   878 000007C3 E815000000              	call	bcd_to_ascii
   879 000007C8 66A3[CE160000]          	mov	word [timestr+6], ax
   880                                  	;		
   881 000007CE BE[AA160000]            	mov	esi, rtc_msg ; message offset
   882                                  	;
   883                                  	;mov	edi, video_buffer + 0A0h + 050h ; Row 1, Column 40
   884                                  	;mov	ah, [edi+1]
   885                                  	;cmp	ah, 3Fh ; cyan (3) Background
   886                                  			; white (F) forecolor 
   887                                  			; (display disk sector frame)
   888                                  	;jne	short prtcmsg_ok	
   889                                  prtcmsg:
   890 000007D3 AC                      	lodsb
   891 000007D4 08C0                    	or	al, al
   892 000007D6 7404                    	jz	short prtcmsg_ok
   893 000007D8 AA                      	stosb
   894 000007D9 47                      	inc 	edi
   895 000007DA EBF7                    	jmp	short prtcmsg
   896                                  prtcmsg_ok:
   897 000007DC C3                      	retn
   898                                  
   899                                  bcd_to_ascii:
   900                                  	; INPUT ->
   901                                  	;	AL = Packed BCD number
   902                                  	; OUTPUT ->
   903                                  	;	AX = ASCII word/number
   904                                  	;
   905 000007DD D410                    	db	0D4h, 10h	; Undocumented inst. AAM
   906                                  				; AH = AL / 10h
   907                                  				; AL = AL MOD 10h
   908 000007DF 660D3030                	or	ax, '00'	; Make it ASCII based
   909                                  
   910 000007E3 86E0                            xchg	ah, al 
   911                                  	
   912 000007E5 C3                      	retn	
   913                                  
   914                                  inputbox:
   915                                  	; Show an input box for user/keyboard input
   916                                  	; INPUT ->
   917                                  	;	ESI = input structure address 
   918                                  	; OUTPUT ->
   919                                  	;	DX  = cursor position for input
   920                                  	;	input box will be displayed (on tty0)
   921                                  	;
   922                                  	; Modified registers: eax, ebx, ecx, edx, esi, edi
   923                                  
   924 000007E6 C605[E0160000]00        	mov	byte [inds], 0 ; for ENTER key handling
   925 000007ED 31C9                    	xor	ecx, ecx
   926 000007EF BB[EC190000]            	mov	ebx, video_buffer
   927 000007F4 B818500000              	mov	eax, 5018h ; 80, 24
   928 000007F9 668B16                  	mov	dx, [esi] ; box width (dl)
   929                                  			  ; box height (dh)
   930 000007FC 28F0                    	sub	al, dh
   931 000007FE D0E8                    	shr	al, 1
   932 00000800 A2[E3160000]            	mov	[ibcp+1], al ; row
   933 00000805 F6E4                    	mul	ah
   934 00000807 66D1E0                  	shl	ax, 1  ; char + attribute
   935 0000080A 01C3                    	add	ebx, eax
   936 0000080C B050                    	mov	al, 80
   937 0000080E 28D0                    	sub	al, dl
   938 00000810 D0E8                    	shr	al, 1 
   939 00000812 A2[E2160000]            	mov	[ibcp], al ; column
   940 00000817 D0E0                    	shl	al, 1  ; char + attribute
   941 00000819 28E4                    	sub	ah, ah
   942 0000081B 01C3                    	add	ebx, eax
   943 0000081D 8A6605                  	mov	ah, [esi+5] ; color attributes
   944 00000820 B020                    	mov	al, 20h	; space/blank
   945 00000822 88F1                    	mov	cl, dh ; height
   946                                  ib0:
   947 00000824 51                      	push	ecx
   948 00000825 88D1                    	mov	cl, dl
   949 00000827 89DF                    	mov	edi, ebx	
   950 00000829 F366AB                  	rep	stosw
   951 0000082C 59                      	pop	ecx
   952 0000082D 81C3A0000000            	add	ebx, 80*2 ; number of columns * 2
   953 00000833 E2EF                    	loop	ib0
   954                                  	;
   955 00000835 BF[EC190000]            	mov	edi, video_buffer
   956 0000083A A0[E3160000]            	mov	al, [ibcp+1] ; row position
   957 0000083F 024602                  	add	al, [esi+2] ; label offset (row)
   958 00000842 A2[E3160000]            	mov	[ibcp+1], al
   959 00000847 B4A0                    	mov	ah, 80*2
   960 00000849 F6E4                    	mul	ah
   961 0000084B 01C7                    	add	edi, eax
   962 0000084D A0[E2160000]            	mov	al, [ibcp] ; column position
   963 00000852 024603                  	add	al, [esi+3] ; label offset (column)
   964 00000855 A2[E2160000]            	mov	[ibcp], al
   965 0000085A 30E4                    	xor	ah, ah
   966 0000085C D0E0                    	shl	al, 1
   967 0000085E 01C7                    	add	edi, eax
   968 00000860 89F3                    	mov	ebx, esi
   969 00000862 83C606                  	add	esi, 6 ; Label offset
   970                                  ib2:
   971 00000865 AC                      	lodsb
   972 00000866 08C0                    	or	al, al
   973 00000868 7406                    	jz	short ib3
   974 0000086A AA                      	stosb
   975 0000086B 47                      	inc 	edi	
   976 0000086C FEC1                    	inc	cl
   977 0000086E EBF5                    	jmp	short ib2
   978                                  ib3:
   979 00000870 000D[E2160000]          	add	[ibcp], cl ; column position
   980 00000876 893D[D4160000]          	mov	[current_txtpos], edi
   981                                  	;
   982 0000087C 8A4B04                  	mov	cl, [ebx+4] ; input char count
   983 0000087F 08C9                    	or	cl, cl
   984 00000881 7407                    	jz	short ib5 ; message box (no input)	
   985 00000883 B020                    	mov	al, 20h
   986 00000885 B407                    	mov	ah, 07h ; black background
   987                                  			; light gray fore color	
   988                                  ib4:
   989 00000887 F366AB                  	rep	stosw
   990                                  ib5:	
   991 0000088A E874FEFFFF              	call	video_page_update
   992 0000088F 668B15[E2160000]        	mov	dx, [ibcp] ; cursor position
   993 00000896 C3                      	retn
   994                                  
   995                                  hide_cursor:
   996                                        	;CH = cursor start line (bits 0-4) 
   997                                  	;     and options (bits 5-7).
   998                                  	;CL = bottom cursor line (bits 0-4).
   999                                  	; when bit 5 of CH is set to 0, the cursor is visible. 
  1000                                  	; when bit 5 is 1, the cursor is not visible. 
  1001                                  	; hide blinking text cursor: 
  1002 00000897 51                              push	ecx
  1003 00000898 B520                    	mov 	ch, 32
  1004 0000089A 30FF                    	xor	bh, bh ; video page 0
  1005 0000089C EB0F                    	jmp	short hc_sc
  1006                                  
  1007                                  show_cursor:
  1008                                    	; dh = row
  1009                                  	; dl = column
  1010 0000089E 51                      	push	ecx
  1011 0000089F 668915[D8160000]        	mov	[cursor_posn], dx
  1012 000008A6 E8600D0000              	call	set_cposx
  1013                                  	;
  1014                                  	;show box-shaped blinking text cursor
  1015 000008AB B50D                    	mov	ch, 13
  1016                                  hc_sc:
  1017 000008AD B10F                            mov 	cl, 15
  1018 000008AF B401                            mov 	ah, 1
  1019 000008B1 CD31                            int 	31h
  1020 000008B3 59                      	pop	ecx
  1021 000008B4 C3                      	retn
  1022                                  
  1023                                  set_disk_parms:
  1024                                  	; 26/08/2020
  1025 000008B5 8A15[E5160000]          	mov	dl, [drv]
  1026 000008BB 80FA80                  	cmp	dl, 80h
  1027 000008BE 7210                    	jb	short set_disk_parms_fd ; floppy
  1028 000008C0 2401                    	and	al, 1  ; LBA ready ?
  1029 000008C2 7418                    	jz	short set_disk_parms_chs
  1030                                  set_disk_parms_lba:
  1031                                  	; Translated FDPT
  1032 000008C4 668B4309                	mov	ax, [ebx+9]  ; physical cylinders
  1033 000008C8 8A730B                  	mov	dh, [ebx+11] ; physical heads
  1034 000008CB 8A4B04                  	mov	cl, [ebx+4]  ; physical sectors per track 
  1035 000008CE EB15                    	jmp	short sdp0
  1036                                  set_disk_parms_fd:
  1037                                  	;mov	al, ch ; last cylinder (bits 0-7)
  1038                                  	;mov	ah, cl ; 
  1039                                  	;shr	ah, 6  ; last cylinder (bits 8-9)
  1040 000008D0 6640                    	inc	ax  ; convert max. cyl number to cyl count
  1041 000008D2 88E8                    	mov	al, ch
  1042 000008D4 FEC0                    	inc	al
  1043 000008D6 28E4                    	sub	ah, ah
  1044 000008D8 FEC6                    	inc	dh  ; convert last head to heads
  1045                                  	;and	cl, 63 ; sectors per track
  1046 000008DA EB09                    	jmp	short sdp0  
  1047                                  set_disk_parms_chs:
  1048                                  	; Standard FDPT
  1049 000008DC 668B03                  	mov	ax, [ebx]  ; physical cylinders
  1050 000008DF 8A7302                  	mov	dh, [ebx+2] ; physical heads
  1051 000008E2 8A4B0E                  	mov	cl, [ebx+14] ; physical sectors per track 
  1052                                  sdp0:
  1053 000008E5 0FB6DA                  	movzx   ebx, dl
  1054 000008E8 80FB80                  	cmp	bl, 80h
  1055 000008EB 7203                    	jb	short sdp1
  1056 000008ED 80EB7E                  	sub	bl, 7Eh
  1057                                  sdp1:	
  1058 000008F0 D0E3                    	shl	bl, 1
  1059 000008F2 81C3[EC160000]          	add	ebx, drv_cylinders
  1060 000008F8 668903                  	mov	[ebx], ax
  1061 000008FB 6650                    	push	ax ; ** cylinders
  1062 000008FD 81EB[EC160000]          	sub	ebx, drv_cylinders
  1063 00000903 81C3[F8160000]          	add	ebx, drv_heads
  1064 00000909 88F0                    	mov	al, dh ; heads
  1065 0000090B 30E4                    	xor	ah, ah
  1066 0000090D 668903                  	mov	[ebx], ax
  1067 00000910 81EB[F8160000]          	sub     ebx, drv_heads
  1068 00000916 81C3[04170000]          	add     ebx, drv_spt
  1069 0000091C 6683E13F                	and	cx, 3Fh  ; sectors (bits 0-6)
  1070 00000920 66890B                  	mov	[ebx], cx ; sectors per track
  1071 00000923 81EB[04170000]          	sub     ebx, drv_spt
  1072 00000929 66D1E3                  	shl	bx, 1
  1073 0000092C 81C3[10170000]          	add	ebx, drv_size ; disk size (in sectors)
  1074                                  	; LBA size = cylinders * heads * secpertrack
  1075 00000932 66F7E1                  	mul	cx 
  1076 00000935 6689C2                  	mov	dx, ax ; heads*spt					
  1077 00000938 6658                    	pop	ax ; ** cylinders
  1078 0000093A 803D[E5160000]80        	cmp	byte [drv], 80h
  1079 00000941 7202                    	jb	short sdp2
  1080 00000943 6648                    	dec	ax ; 1 cylinder reserved (!?)
  1081                                  sdp2:
  1082 00000945 66F7E2                  	mul	dx ; cylinders * (heads*spt)		
  1083 00000948 668903                  	mov	[ebx], ax
  1084 0000094B 66895302                	mov	[ebx+2], dx
  1085                                  	;
  1086 0000094F C3                      	retn	
  1087                                  
  1088                                  ;set_disk_parms
  1089                                  ;	movzx   ebx, byte [drv]
  1090                                  ;	cmp	bl, 80h
  1091                                  ;	jb	short sdp0
  1092                                  ;	sub	bl, 7Eh
  1093                                  ;sdp0:	
  1094                                  ;	;add	ebx, drv_status
  1095                                  ;	;mov     byte [ebx], 80h ; 'Present' flag
  1096                                  ;	;
  1097                                  ;	mov	al, ch ; last cylinder (bits 0-7)
  1098                                  ;	mov	ah, cl ; 
  1099                                  ;	shr	ah, 6  ; last cylinder (bits 8-9)
  1100                                  ;	;sub	ebx, drv_status
  1101                                  ;	shl	bl, 1
  1102                                  ;	add	ebx, drv_cylinders
  1103                                  ;	inc	ax  ; convert max. cyl number to cyl count		
  1104                                  ;	mov	[ebx], ax
  1105                                  ;	push	ax ; ** cylinders
  1106                                  ;	sub	ebx, drv_cylinders
  1107                                  ;	add	ebx, drv_heads
  1108                                  ;	mov	al, dh ; last head number
  1109                                  ;	xor	ah, ah
  1110                                  ;	inc	ax     ; heads 	
  1111                                  ;	mov	[ebx], ax
  1112                                  ;	sub     ebx, drv_heads
  1113                                  ;	add     ebx, drv_spt
  1114                                  ;	and	cx, 3Fh  ; sectors (bits 0-6)
  1115                                  ;	mov	[ebx], cx
  1116                                  ;	sub     ebx, drv_spt
  1117                                  ;	shl	bx, 1
  1118                                  ;	add	ebx, drv_size ; disk size (in sectors)
  1119                                  ;	; LBA size = cylinders * heads * secpertrack
  1120                                  ;	mul	cx 
  1121                                  ;	mov	dx, ax ; heads*spt					
  1122                                  ;	pop	ax ; ** cylinders
  1123                                  ;	cmp	byte [drv], 80h
  1124                                  ;	jb	short sdp1
  1125                                  ;	dec	ax ; 1 cylinder reserved (!?)
  1126                                  ;sdp1:
  1127                                  ;	mul	dx ; cylinders * (heads*spt)		
  1128                                  ;	mov	[ebx], ax
  1129                                  ;	mov	[ebx+2], dx
  1130                                  ;	;
  1131                                  ;	retn
  1132                                  
  1133                                  read_disk_sector:
  1134                                  	; EAX = sector number (LBA)
  1135                                  	;
  1136 00000950 0FB61D[9C140000]        	movzx	ebx, byte [ds_drv]
  1137 00000957 88DA                    	mov	dl, bl	
  1138 00000959 80FA02                  	cmp	dl, 2
  1139 0000095C 7203                    	jb	short rd0
  1140 0000095E 80C27E                  	add	dl, 7Eh  ; 80h, 81h, 82h, 83h
  1141                                  rd0:
  1142 00000961 89DE                    	mov	esi, ebx
  1143 00000963 8815[E5160000]          	mov	[drv], dl
  1144 00000969 81C3[E6160000]          	add	ebx, drv_status
  1145 0000096F 8A33                    	mov	dh, [ebx]
  1146                                  rd1:
  1147 00000971 80FEF0                  	cmp	dh, 0F0h
  1148 00000974 F5                      	cmc
  1149 00000975 7262                            jc      short rd_lba_fails
  1150                                  	;
  1151 00000977 89F3                    	mov	ebx, esi
  1152 00000979 C0E302                  	shl	bl, 2
  1153 0000097C 81C3[C8170000]          	add	ebx, ds_sec
  1154 00000982 8B03                    	mov	eax, [ebx]
  1155 00000984 81EB[C8170000]          	sub	ebx, ds_sec
  1156 0000098A 81C3[10170000]                  add     ebx, drv_size 
  1157 00000990 3B03                    	cmp	eax, [ebx] ; Last sector + 1 (number of secs.)
  1158 00000992 F5                      	cmc
  1159 00000993 7244                            jc      short rd_lba_fails
  1160                                  	;
  1161 00000995 F6C601                  	test	dh, 1 ; LBA ready ?
  1162 00000998 7440                            jz      short rd_chs
  1163                                  rd_lba:
  1164                                  	; LBA read (private function)
  1165                                  	;((Retro UNIX 386 v1 - DISK I/O Test))
  1166 0000099A 81C6[E6160000]          	add	esi, drv_status
  1167 000009A0 80268F                  	and	byte [esi], 8Fh ; clear error bits
  1168                                  	;
  1169 000009A3 89C1                    	mov	ecx, eax ; Logical Block/Sector Address
  1170 000009A5 C1EB10                  	shr	ebx, 16
  1171 000009A8 BB[E4170000]                    mov     ebx, sector_buffer
  1172 000009AD 8A15[E5160000]          	mov	dl, [drv]
  1173 000009B3 C605[E4160000]04        	mov	byte [retry_count], 4
  1174                                  rd_lba_retry:
  1175 000009BA B41B                    	mov	ah, 1Bh ; LBA read (private function)		
  1176 000009BC B001                    	mov	al, 1
  1177 000009BE CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1178 000009C0 7317                    	jnc	short rd_lba_ok
  1179                                  
  1180 000009C2 80FC80                  	cmp	ah, 80h ; time out ?
  1181 000009C5 7411                    	je	short rd_lba_rfails
  1182 000009C7 FE0D[E4160000]          	dec	byte [retry_count]
  1183 000009CD 7409                    	jz	short rd_lba_rfails
  1184                                  	
  1185 000009CF B40D                    	mov	ah, 0Dh ; Alternate reset
  1186 000009D1 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1187 000009D3 73E5                            jnc     short rd_lba_retry
  1188 000009D5 800EF0                  	or	byte [esi], 0F0h ; drive not ready !
  1189                                  rd_lba_rfails:
  1190 000009D8 F9                      	stc
  1191                                  rd_lba_fails:
  1192                                  rd_lba_ok:
  1193 000009D9 C3                      	retn
  1194                                  	;
  1195                                  	; CHS read (convert LBA address to CHS values)	;	
  1196                                  rd_chs:
  1197 000009DA D1E6                    	shl	esi, 1
  1198 000009DC 89F3                    	mov	ebx, esi
  1199 000009DE 31D2                    	xor	edx, edx ; 0
  1200 000009E0 29C9                    	sub	ecx, ecx 
  1201 000009E2 81C3[04170000]                  add     ebx, drv_spt
  1202 000009E8 668B0B                  	mov	cx, [ebx] ; sector per track
  1203                                                  ; EAX = sector address (LBA)
  1204 000009EB F7F1                    	div	ecx
  1205 000009ED 88D1                    	mov	cl, dl	; sector number - 1
  1206 000009EF FEC1                    	inc	cl	; sector number (1 based)
  1207 000009F1 6651                    	push	cx
  1208 000009F3 89F3                    	mov	ebx, esi
  1209 000009F5 81C3[F8160000]                  add     ebx, drv_heads
  1210 000009FB 668B0B                  	mov	cx, [ebx] ; heads
  1211 000009FE 31D2                    	xor	edx, edx
  1212                                  		; EAX = cylinders * heads + head
  1213 00000A00 F7F1                    	div	ecx
  1214 00000A02 6659                    	pop	cx     ; sector number
  1215 00000A04 88D6                    	mov	dh, dl ; head number
  1216 00000A06 8A15[E5160000]          	mov	dl, [drv]
  1217 00000A0C 88C5                    	mov	ch, al ; cylinder (bits 0-7)
  1218 00000A0E C0E406                  	shl	ah, 6
  1219 00000A11 08E1                    	or	cl, ah ; cylinder (bits 8-9)
  1220                                  		       ; sector (bits 0-7)
  1221 00000A13 BB[E4170000]                    mov     ebx, sector_buffer
  1222                                  		; CL = sector (bits 0-6)
  1223                                  		;      cylinder (bits 7-8 -> bits 8-9)
  1224                                  		; CH = cylinder (bits 0-7)
  1225                                  		; DH = head
  1226                                  		; DL = drive
  1227                                  
  1228 00000A18 D1EE                    	shr	esi, 1 ; drive index (byte alignment)
  1229 00000A1A 81C6[E6160000]          	add	esi, drv_status
  1230 00000A20 80268F                  	and	byte [esi], 8Fh ; clear error bits
  1231                                  	;
  1232 00000A23 C605[E4160000]04        	mov	byte [retry_count], 4
  1233                                  rd_retry:	
  1234 00000A2A B402                    	mov	ah, 02h ; read sectors
  1235 00000A2C B001                    	mov	al, 1 ; sector count	
  1236 00000A2E CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1237 00000A30 7320                    	jnc	short rd_ok
  1238 00000A32 80FC80                  	cmp	ah, 80h ; time out ?
  1239 00000A35 7408                    	je	short rd_rfails
  1240 00000A37 FE0D[E4160000]          	dec	byte [retry_count]
  1241 00000A3D 7502                    	jnz	short rd_reset
  1242                                  rd_rfails:
  1243 00000A3F F9                      	stc
  1244                                  rd_fails:
  1245 00000A40 C3                      	retn
  1246                                  rd_reset:
  1247 00000A41 28E4                    	sub	ah, ah
  1248 00000A43 80FA80                  	cmp	dl, 80h
  1249 00000A46 7202                    	jb	short rd_fd_reset
  1250 00000A48 B40D                    	mov	ah, 0Dh ; Alternate reset
  1251                                  rd_fd_reset:
  1252 00000A4A CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1253 00000A4C 73DC                            jnc     short rd_retry
  1254 00000A4E 800EF0                  	or	byte [esi], 0F0h ; drive not ready !
  1255 00000A51 F9                      	stc
  1256                                  rd_ok:
  1257 00000A52 C3                      	retn
  1258                                  
  1259                                  clear_screen:
  1260 00000A53 BF[EC190000]            	mov	edi, video_buffer
  1261 00000A58 B9D0070000              	mov	ecx, 80*25
  1262 00000A5D 66B82007                        mov     ax, 0720h ; light gray char space (blank)
  1263 00000A61 F366AB                  	rep	stosw
  1264                                  
  1265 00000A64 E89AFCFFFF              	call	video_page_update
  1266                                  
  1267 00000A69 6631D2                          xor     dx, dx    ; column 0, row 0
  1268 00000A6C E99A0B0000              	jmp	set_cposx ; set cursor position
  1269                                  
  1270                                  rfdp_err:
  1271 00000A71 E8DDFFFFFF              	call	clear_screen
  1272 00000A76 BE[91160000]            	mov	esi, drv_not_ready
  1273 00000A7B E919030000              	jmp	print_msg	
  1274                                  
  1275                                  dskprm:
  1276                                  	; DISPLAY DISK PARAMETERS TABLE
  1277                                  	;
  1278                                  	; INPUT -> DL = Disk/Drive #
  1279                                  	; 
  1280 00000A80 8815[E5160000]          	mov	byte [drv], dl  ; 0,1,80h,81h,82h,83h 
  1281                                  	;
  1282 00000A86 F6C280                  	test	dl, 80h
  1283 00000A89 7403                    	jz	short dskprm0
  1284 00000A8B 80EA7E                  	sub	dl, 7Eh ; hd0 = 2
  1285                                  dskprm0:
  1286 00000A8E 0FB6DA                  	movzx	ebx, dl
  1287 00000A91 81C3[E6160000]          	add	ebx, drv_status
  1288                                  
  1289 00000A97 803B80                  	cmp	byte [ebx], 80h  ; existing ?
  1290 00000A9A 72D5                    	jb	short rfdp_err
  1291                                  	;
  1292 00000A9C E8B2FFFFFF              	call	clear_screen	 ; clear video page 0	
  1293                                  	;
  1294 00000AA1 8A1D[E5160000]                  mov	bl, [drv]
  1295 00000AA7 F6C380                  	test	bl, 80h
  1296 00000AAA 0F85F7000000                    jnz     print_hdpt
  1297                                  
  1298 00000AB0 0FB6F3                  	movzx	esi, bl
  1299 00000AB3 80C330                  	add	bl, 30h	; '0'
  1300 00000AB6 881D[B50D0000]          	mov	byte [flpdnum], bl
  1301 00000ABC 81C6[A8160000]          	add	esi, fd0_type
  1302 00000AC2 8A06                    	mov	al, [esi]
  1303 00000AC4 A2[EC0D0000]                    mov     byte [flpdtype], al 
  1304                                                                     ; floppy disk drive type
  1305                                  				   ; (1=360K, 2=1.2M, 3=720K, 4=1.44M)
  1306                                  print_flpdpt:
  1307                                  	; Writing the Diskette Parameter Table on screen
  1308 00000AC9 C0E304                  	shl	bl, 4 ; * 16
  1309 00000ACC 0FB6F3                  	movzx	esi, bl
  1310 00000ACF 81C6[28170000]          	add	esi, fd0_dpt
  1311 00000AD5 AC                      	lodsb 	; bits 0-3: SRT step rate time
  1312                                  		; bits 4-7: head unload time
  1313 00000AD6 BF[360E0000]            	mov	edi, rSrtHdUnld
  1314 00000ADB E8AC000000              	call	write_hex
  1315 00000AE0 AC                      	lodsb 	; bit 0: 1=use DMA
  1316                                  		; bits 2-7: head load time
  1317 00000AE1 BF[7E0E0000]            	mov	edi, rDmaHdLd
  1318 00000AE6 E8A1000000              	call	write_hex
  1319 00000AEB AC                      	lodsb 	; 55-ms increments 
  1320                                  		; before turning disk motor off
  1321 00000AEC BF[C50E0000]            	mov	edi, bMotorOff
  1322 00000AF1 E896000000              	call	write_hex
  1323 00000AF6 AC                      	lodsb 	; sector size
  1324                                  		; (0=128, 1=256, 2=512, 3=1024)
  1325 00000AF7 BF[0A0F0000]            	mov	edi, bSectSize
  1326 00000AFC E88B000000              	call	write_hex
  1327 00000B01 AC                      	lodsb 	; EOT (last sector on a track)
  1328 00000B02 BF[360F0000]            	mov	edi, bLastTrack
  1329 00000B07 E880000000              	call	write_hex
  1330 00000B0C AC                      	lodsb 	; gap length 
  1331                                  		; for read/write operations
  1332 00000B0D BF[520F0000]            	mov	edi, bGapLen
  1333 00000B12 E875000000              	call	write_hex
  1334 00000B17 AC                      	lodsb 	; DTL (Data Transfer Length)
  1335                                  		; max transfer when length not set	
  1336 00000B18 BF[6E0F0000]            	mov	edi, bDTL
  1337 00000B1D E86A000000              	call	write_hex
  1338 00000B22 AC                      	lodsb 	; gap length for format operation
  1339 00000B23 BF[8A0F0000]            	mov	edi, bGapFmt
  1340 00000B28 E85F000000              	call	write_hex
  1341 00000B2D AC                      	lodsb 	; fill character for format 
  1342                                  		; (normally F6H)
  1343 00000B2E BF[A60F0000]            	mov	edi, bFillChar
  1344 00000B33 E854000000              	call	write_hex
  1345 00000B38 AC                      	lodsb 	; head-settle time
  1346                                  		; (in milliseconds)
  1347 00000B39 BF[D10F0000]            	mov	edi, bHdSettle
  1348 00000B3E E849000000              	call	write_hex
  1349 00000B43 AC                      	lodsb 	; motor-startup time
  1350                                  		; (in 1/8th-second intervals)
  1351 00000B44 BF[FA0F0000]            	mov	edi, bMotorOn
  1352 00000B49 E83E000000              	call	write_hex
  1353                                  	;
  1354                                  	; (extension, not in original bios function)
  1355 00000B4E AC                      	lodsb	; Max. track number
  1356 00000B4F BF[34100000]            	mov	edi, bMaxTrack
  1357 00000B54 E833000000              	call	write_hex
  1358 00000B59 AC                      	lodsb	; Data transfer rate
  1359 00000B5A BF[50100000]            	mov	edi, bDataRate
  1360 00000B5F E828000000              	call	write_hex
  1361                                  	;
  1362 00000B64 A0[E5160000]            	mov	al, [drv]
  1363 00000B69 0430                    	add	al, 30h ; '0'
  1364 00000B6B A2[B50D0000]                    mov     byte [flpdnum], al
  1365 00000B70 BE[AD0D0000]                    mov     esi, FLPDPT
  1366 00000B75 E81F020000              	call	print_msg
  1367 00000B7A C3                      	retn
  1368                                  
  1369                                  write_dhex:
  1370 00000B7B 88E3                    	mov	bl, ah
  1371 00000B7D C0EB04                          shr     bl, 4
  1372 00000B80 E813000000                      call    dhgd
  1373 00000B85 88E3                    	mov	bl, ah
  1374 00000B87 E80C000000              	call	dhgd
  1375                                  
  1376                                  write_hex:
  1377 00000B8C 88C3                    	mov	bl, al
  1378 00000B8E C0EB04                          shr     bl, 4
  1379 00000B91 E802000000              	call	dhgd
  1380 00000B96 88C3                    	mov	bl, al
  1381                                  	;call	dhgd
  1382                                  	;retn
  1383                                  dhgd:
  1384 00000B98 50                      	push	eax
  1385 00000B99 83E30F                  	and	ebx, 0Fh
  1386 00000B9C 81C3[8C140000]                  add     ebx, hex_digits
  1387 00000BA2 8A03                            mov     al, [ebx]
  1388 00000BA4 AA                      	stosb
  1389 00000BA5 58                      	pop	eax
  1390 00000BA6 C3                      	retn
  1391                                  
  1392                                  print_hdpt:
  1393                                  	;mov	bl, [drv]
  1394 00000BA7 80E303                  	and	bl, 3
  1395 00000BAA 88D8                    	mov	al, bl
  1396 00000BAC 0402                    	add	al, 2
  1397 00000BAE A2[E5160000]            	mov	[drv], al
  1398                                  	;
  1399 00000BB3 C0E305                  	shl	bl, 5 ; * 32
  1400 00000BB6 0FB6F3                  	movzx	esi, bl
  1401 00000BB9 81C6[48170000]          	add	esi, hd0_dpt  
  1402                                  	;
  1403 00000BBF 807E03A0                	cmp	byte [esi+3], 0A0h ; Translated table
  1404 00000BC3 0F84EB000000                    je      print_thdpt       ; indicator
  1405                                  	;
  1406                                  	; Writing Fixed Disk Parameter Table on screen
  1407 00000BC9 66AD                    	lodsw 	; Number of Cylinders
  1408 00000BCB BF[C3100000]            	mov	edi, cylnum
  1409 00000BD0 E8A6FFFFFF              	call	write_dhex
  1410 00000BD5 AC                      	lodsb	; Number of Heads
  1411 00000BD6 BF[E0100000]            	mov	edi, headnum
  1412 00000BDB E8ACFFFFFF              	call	write_hex
  1413 00000BE0 AC                      	lodsb	; Reserved
  1414 00000BE1 BF[FB100000]            	mov	edi, rsvd3
  1415 00000BE6 E8A1FFFFFF              	call	write_hex
  1416 00000BEB AC                      	lodsb	; Reserved
  1417 00000BEC BF[16110000]            	mov	edi, rsvd4
  1418 00000BF1 E896FFFFFF              	call	write_hex
  1419 00000BF6 66AD                    	lodsw	; Precompensation (Obsolete)
  1420 00000BF8 BF[31110000]            	mov	edi, pcompnum
  1421 00000BFD E879FFFFFF              	call	write_dhex
  1422 00000C02 AC                      	lodsb	; Reserved
  1423 00000C03 BF[4E110000]            	mov	edi, rsvd7
  1424 00000C08 E87FFFFFFF              	call	write_hex
  1425 00000C0D AC                      	lodsb	; Drive Control Byte
  1426 00000C0E BF[69110000]            	mov	edi, dcbnum
  1427 00000C13 E874FFFFFF              	call	write_hex
  1428 00000C18 66AD                    	lodsw	; Reserved
  1429 00000C1A BF[84110000]            	mov	edi, rsvd9
  1430 00000C1F E857FFFFFF              	call	write_dhex
  1431 00000C24 AC                      	lodsb	; Reserved
  1432 00000C25 BF[A1110000]            	mov	edi, rsvd11
  1433 00000C2A E85DFFFFFF              	call	write_hex
  1434 00000C2F 66AD                    	lodsw	; Landing Zone (Obsolete)
  1435 00000C31 BF[BC110000]            	mov	edi, lzonenum
  1436 00000C36 E840FFFFFF              	call	write_dhex
  1437 00000C3B AC                      	lodsb	; Sectors per Track
  1438 00000C3C BF[D9110000]            	mov	edi, psptnum
  1439 00000C41 E846FFFFFF              	call	write_hex
  1440 00000C46 AC                      	lodsb	; Reserved
  1441 00000C47 BF[F4110000]            	mov	edi, rsvd15
  1442 00000C4C E83BFFFFFF              	call	write_hex
  1443                                  	;
  1444                                  	; (extension, not in original bios function)
  1445 00000C51 66AD                    	lodsw	; I/O Port Base Address
  1446 00000C53 BF[11120000]            	mov	edi, bPortAddr
  1447 00000C58 E81EFFFFFF              	call	write_dhex
  1448                                  	; 06/01/2015
  1449 00000C5D 66AD                    	lodsw	; Control Port Address
  1450 00000C5F BF[2E120000]            	mov	edi, cPortAddr
  1451 00000C64 E812FFFFFF              	call	write_dhex
  1452 00000C69 AC                      	lodsb	; Head Register Upper Nibble 
  1453 00000C6A BF[4B120000]            	mov	edi, hregupnib
  1454 00000C6F E818FFFFFF              	call	write_hex
  1455                                  	;
  1456 00000C74 A0[E5160000]            	mov     al, [drv]
  1457 00000C79 88C3                    	mov	bl, al
  1458 00000C7B 0430                    	add	al, '0'
  1459 00000C7D A2[8B100000]                    mov     [dsknum], al
  1460                                  	;	      
  1461 00000C82 C0E302                  	shl	bl, 2
  1462 00000C85 0FB6F3                  	movzx	esi, bl
  1463 00000C88 81C6[10170000]                  add     esi, drv_size
  1464 00000C8E 668B4602                	mov	ax, [esi+2]
  1465 00000C92 BF[68120000]                    mov     edi, disksize
  1466 00000C97 E8DFFEFFFF              	call	write_dhex
  1467 00000C9C 668B06                  	mov	ax, [esi]
  1468 00000C9F BF[6C120000]            	mov	edi, disksize+4
  1469 00000CA4 E8D2FEFFFF              	call	write_dhex	
  1470                                  	;
  1471 00000CA9 BE[83100000]                    mov     esi, HDPT
  1472 00000CAE E8E6000000              	call	print_msg
  1473 00000CB3 C3                      	retn
  1474                                  
  1475                                  print_thdpt:
  1476                                  	; Writing the Translated FDPT on screen
  1477                                  	; (PHOENIX - EDD specification v1.1)
  1478 00000CB4 66AD                    	lodsw 	; Logical Numbers of Cylinders, Limit 1024
  1479 00000CB6 BF[C1120000]            	mov	edi, lcylnum
  1480 00000CBB E8BBFEFFFF              	call	write_dhex
  1481 00000CC0 AC                      	lodsb	; Logical Numbers of Heads, Limit 256
  1482 00000CC1 BF[DE120000]            	mov	edi, lheadnum
  1483 00000CC6 E8C1FEFFFF              	call	write_hex
  1484 00000CCB AC                      	lodsb	; A0h signature, indicates translated table
  1485 00000CCC BF[F9120000]            	mov	edi, tsignum
  1486 00000CD1 E8B6FEFFFF              	call	write_hex
  1487 00000CD6 AC                      	lodsb	; Physical Sectors per Track
  1488 00000CD7 BF[14130000]            	mov	edi, tpsptnum
  1489 00000CDC E8ABFEFFFF              	call	write_hex
  1490 00000CE1 66AD                    	lodsw	; Precompensation (Obsolete)
  1491 00000CE3 BF[2F130000]            	mov	edi, tpcompnum
  1492 00000CE8 E88EFEFFFF              	call	write_dhex
  1493 00000CED AC                      	lodsb	; Reserved
  1494 00000CEE BF[58130000]            	mov	edi, trsvd7
  1495 00000CF3 E894FEFFFF              	call	write_hex
  1496 00000CF8 AC                      	lodsb	; Drive Control Byte
  1497 00000CF9 BF[73130000]            	mov	edi, tdcbnum
  1498 00000CFE E889FEFFFF              	call	write_hex
  1499 00000D03 66AD                    	lodsw	; Physical Cylinders, limit 65536
  1500 00000D05 BF[8E130000]            	mov	edi, tpcylnum
  1501 00000D0A E86CFEFFFF              	call	write_dhex
  1502 00000D0F AC                      	lodsb	; Physical Heads, limit 16
  1503 00000D10 BF[AB130000]            	mov	edi, tpheadnum
  1504 00000D15 E872FEFFFF              	call	write_hex
  1505 00000D1A 66AD                    	lodsw	; Landing Zone (Obsolete)
  1506 00000D1C BF[C6130000]            	mov	edi, tlzonenum
  1507 00000D21 E855FEFFFF              	call	write_dhex
  1508 00000D26 AC                      	lodsb	; Logical Sectors per Track, Limit 63
  1509 00000D27 BF[EF130000]            	mov	edi, lsptnum
  1510 00000D2C E85BFEFFFF              	call	write_hex
  1511 00000D31 AC                      	lodsb	; Checksum for translated FDPT 
  1512 00000D32 BF[0A140000]            	mov	edi, checksum
  1513 00000D37 E850FEFFFF              	call	write_hex
  1514                                  	;
  1515                                  	; (extension, not in original bios function)
  1516 00000D3C 66AD                    	lodsw	; I/O Port Base Address
  1517 00000D3E BF[27140000]            	mov	edi, tbPortAddr
  1518 00000D43 E833FEFFFF              	call	write_dhex
  1519                                  	; 06/01/2015
  1520 00000D48 66AD                    	lodsw	; Control Port Address
  1521 00000D4A BF[44140000]            	mov	edi, tcPortAddr
  1522 00000D4F E827FEFFFF              	call	write_dhex
  1523 00000D54 AC                      	lodsb	; Head Register Upper Nibble 
  1524 00000D55 BF[61140000]            	mov	edi, thregupnib
  1525 00000D5A E82DFEFFFF              	call	write_hex
  1526                                  	;
  1527 00000D5F A0[E5160000]            	mov     al, [drv]
  1528 00000D64 88C3                    	mov	bl, al
  1529 00000D66 0430                    	add	al, '0'
  1530 00000D68 A2[7E120000]                    mov     [tdsknum], al
  1531                                  	;  
  1532 00000D6D C0E302                  	shl	bl, 2
  1533 00000D70 0FB6F3                  	movzx	esi, bl
  1534 00000D73 81C6[10170000]                  add     esi, drv_size
  1535 00000D79 668B4602                	mov	ax, [esi+2]
  1536 00000D7D BF[7E140000]            	mov	edi, tdisksize
  1537 00000D82 E8F4FDFFFF              	call	write_dhex
  1538 00000D87 668B06                  	mov	ax, [esi]
  1539 00000D8A BF[82140000]            	mov	edi, tdisksize+4
  1540 00000D8F E8E7FDFFFF              	call	write_dhex	
  1541                                  	;
  1542 00000D94 BE[76120000]            	mov     esi, THDPT
  1543                                  	;call	print_msg
  1544                                  	;retn
  1545                                  
  1546                                  print_msg:
  1547 00000D99 66BB0700                	mov	bx, 7
  1548 00000D9D B40E                            mov     ah, 0Eh
  1549                                  pmsg_loop:
  1550 00000D9F AC                      	lodsb
  1551 00000DA0 20C0                    	and	al, al
  1552 00000DA2 7404                    	jz	short pmsg_ok
  1553 00000DA4 CD31                    	int	31h	; TRDOS 386 video interrupt
  1554 00000DA6 EBF7                    	jmp	short pmsg_loop	
  1555                                  pmsg_ok:
  1556 00000DA8 B410                    	mov	ah, 10h ; Getchar
  1557 00000DAA CD32                    	int	32h	; TRDOS 386 keyboard interrupt
  1558 00000DAC C3                      	retn
  1559                                  ;
  1560                                  FLPDPT:
  1561 00000DAD 07                      	db 07h
  1562 00000DAE 0D0A                    	db 0Dh, 0Ah	
  1563 00000DB0 4469736B20              	db 'Disk '
  1564                                  flpdnum:
  1565 00000DB5 58202D20                	db 'X - '
  1566 00000DB9 4449534B4554544520-     	db 'DISKETTE PARAMETER TABLE'
  1566 00000DC2 504152414D45544552-
  1566 00000DCB 205441424C45       
  1567 00000DD1 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah
  1568 00000DD5 547970652020202020-     	db 'Type                 : '
  1568 00000DDE 202020202020202020-
  1568 00000DE7 2020203A20         
  1569                                  flpdtype:
  1570 00000DEC 58202020                	db 'X   '
  1571 00000DF0 5B2031203D20333630-     	db '[ 1 = 360K, 2 = 1.2M, 3 = 720K, 4 = 1.44M ]'
  1571 00000DF9 4B2C2032203D20312E-
  1571 00000E02 324D2C2033203D2037-
  1571 00000E0B 32304B2C2034203D20-
  1571 00000E14 312E34344D205D     
  1572 00000E1B 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1573 00000E1F 535254202D20486561-     	db 'SRT - Head Unld Time : '
  1573 00000E28 6420556E6C64205469-
  1573 00000E31 6D65203A20         
  1574                                  rSrtHdUnld:
  1575 00000E36 585868202862697473-     	db 'XXh (bits 0-3: SRT, bits 4-7: head unload time)'
  1575 00000E3F 20302D333A20535254-
  1575 00000E48 2C206269747320342D-
  1575 00000E51 373A20686561642075-
  1575 00000E5A 6E6C6F61642074696D-
  1575 00000E63 6529               
  1576 00000E65 0D0A                    	db 0Dh, 0Ah
  1577 00000E67 444D41202D20486561-     	db 'DMA - Head Load Time : '
  1577 00000E70 64204C6F6164205469-
  1577 00000E79 6D65203A20         
  1578                                  rDmaHdLd:
  1579 00000E7E 585868202862697420-     	db 'XXh (bit 0: 1 = DMA, bits 2-7: head load time)'
  1579 00000E87 303A2031203D20444D-
  1579 00000E90 412C20626974732032-
  1579 00000E99 2D373A206865616420-
  1579 00000EA2 6C6F61642074696D65-
  1579 00000EAB 29                 
  1580 00000EAC 0D0A                    	db 0Dh, 0Ah
  1581 00000EAE 4D6F746F72204F6666-     	db 'Motor Off Count      : '
  1581 00000EB7 20436F756E74202020-
  1581 00000EC0 2020203A20         
  1582                                  bMotorOff:
  1583 00000EC5 585868202877697468-     	db 'XXh (with 55ms icrements before turning off)'
  1583 00000ECE 2035356D7320696372-
  1583 00000ED7 656D656E7473206265-
  1583 00000EE0 666F7265207475726E-
  1583 00000EE9 696E67206F666629   
  1584 00000EF1 0D0A                    	db 0Dh, 0Ah
  1585 00000EF3 536563746F72205369-     	db 'Sector Size          : '
  1585 00000EFC 7A6520202020202020-
  1585 00000F05 2020203A20         
  1586                                  bSectSize:
  1587 00000F0A 585868202832203D20-     	db 'XXh (2 = 512 bytes)'
  1587 00000F13 353132206279746573-
  1587 00000F1C 29                 
  1588 00000F1D 0D0A                    	db 0Dh, 0Ah	
  1589 00000F1F 4C6173742053656374-     	db 'Last Sect on a Track : '
  1589 00000F28 206F6E206120547261-
  1589 00000F31 636B203A20         
  1590                                  bLastTrack:
  1591 00000F36 585868                  	db 'XXh'
  1592 00000F39 0D0A                    	db 0Dh, 0Ah
  1593 00000F3B 476170204C656E6774-     	db 'Gap Length  (R/W)    : '
  1593 00000F44 68202028522F572920-
  1593 00000F4D 2020203A20         
  1594                                  bGapLen:
  1595 00000F52 585868                  	db 'XXh'
  1596 00000F55 0D0A                    	db 0Dh, 0Ah
  1597 00000F57 44617461205472616E-     	db 'Data Transfer Length : '
  1597 00000F60 73666572204C656E67-
  1597 00000F69 7468203A20         
  1598                                  bDTL:
  1599 00000F6E 585868                  	db 'XXh'
  1600 00000F71 0D0A                    	db 0Dh, 0Ah		
  1601 00000F73 476170204C656E6774-     	db 'Gap Length (Format)  : '
  1601 00000F7C 682028466F726D6174-
  1601 00000F85 2920203A20         
  1602                                  bGapFmt:
  1603 00000F8A 585868                  	db 'XXh'
  1604 00000F8D 0D0A                    	db 0Dh, 0Ah
  1605 00000F8F 46696C6C2043686172-     	db 'Fill Char for format : '
  1605 00000F98 20666F7220666F726D-
  1605 00000FA1 6174203A20         
  1606                                  bFillChar:
  1607 00000FA6 58586820286E6F726D-     	db 'XXh (normally F6h)'
  1607 00000FAF 616C6C792046366829 
  1608 00000FB8 0D0A                    	db 0Dh, 0Ah
  1609 00000FBA 486561642053657474-     	db 'Head Settle Time     : '
  1609 00000FC3 6C652054696D652020-
  1609 00000FCC 2020203A20         
  1610                                  bHdSettle:
  1611 00000FD1 585868206D696C6C69-     	db 'XXh milliseconds'
  1611 00000FDA 7365636F6E6473     
  1612 00000FE1 0D0A                    	db 0Dh, 0Ah
  1613 00000FE3 4D6F746F7220537461-     	db 'Motor Startup Time   : '
  1613 00000FEC 727475702054696D65-
  1613 00000FF5 2020203A20         
  1614                                  bMotorOn:
  1615 00000FFA 5858682028696E2031-     	db 'XXh (in 1/8th second intervals)'
  1615 00001003 2F387468207365636F-
  1615 0000100C 6E6420696E74657276-
  1615 00001015 616C7329           
  1616 00001019 0D0A                    	db 0Dh, 0Ah
  1617                                  	; 19/12/2014
  1618 0000101B 0D0A                    	db 0Dh, 0Ah
  1619 0000101D 4D6178696D756D2054-     	db 'Maximum Track Number : '
  1619 00001026 7261636B204E756D62-
  1619 0000102F 6572203A20         
  1620                                  bMaxTrack:
  1621 00001034 585868                  	db 'XXh'
  1622 00001037 0D0A                    	db 0Dh, 0Ah
  1623 00001039 44617461205472616E-     	db 'Data Transfer Rate   : '
  1623 00001042 736665722052617465-
  1623 0000104B 2020203A20         
  1624                                  bDataRate:
  1625 00001050 585868202830306820-     	db 'XXh (00h = 500KBS, 40h = 300KBS, 80H = 250KBS)'
  1625 00001059 3D203530304B42532C-
  1625 00001062 20343068203D203330-
  1625 0000106B 304B42532C20383048-
  1625 00001074 203D203235304B4253-
  1625 0000107D 29                 
  1626 0000107E 0D0A                    	db 0Dh, 0Ah
  1627 00001080 0D0A00                  	db 0Dh, 0Ah, 0
  1628                                  
  1629                                  HDPT:
  1630 00001083 07                      	db 07h
  1631 00001084 0D0A                    	db 0Dh, 0Ah
  1632 00001086 4469736B20              	db 'Disk '
  1633                                  dsknum:
  1634 0000108B 58202D20                	db 'X - '	
  1635 0000108F 464958454420444953-     	db 'FIXED DISK PARAMETER TABLE'
  1635 00001098 4B20504152414D4554-
  1635 000010A1 4552205441424C45   
  1636 000010A9 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1637 000010AD 4E756D626572206F66-     	db 'Number of Cylinders : '
  1637 000010B6 2043796C696E646572-
  1637 000010BF 73203A20           
  1638                                  cylnum:
  1639 000010C3 5858585868              	db 'XXXXh'
  1640 000010C8 0D0A                    	db 0Dh, 0Ah
  1641 000010CA 4E756D626572206F66-     	db 'Number of Heads     : '
  1641 000010D3 204865616473202020-
  1641 000010DC 20203A20           
  1642                                  headnum:
  1643 000010E0 585868                  	db 'XXh'
  1644 000010E3 0D0A                    	db 0Dh, 0Ah
  1645 000010E5 526573657276656420-     	db 'Reserved            : '
  1645 000010EE 202020202020202020-
  1645 000010F7 20203A20           
  1646                                  rsvd3:
  1647 000010FB 585868                  	db 'XXh'
  1648 000010FE 0D0A                    	db 0Dh, 0Ah
  1649 00001100 526573657276656420-     	db 'Reserved            : '
  1649 00001109 202020202020202020-
  1649 00001112 20203A20           
  1650                                  rsvd4:
  1651 00001116 585868                  	db 'XXh'
  1652 00001119 0D0A                    	db 0Dh, 0Ah	
  1653 0000111B 507265636F6D70656E-     	db 'Precompensation     : '
  1653 00001124 736174696F6E202020-
  1653 0000112D 20203A20           
  1654                                  pcompnum:
  1655 00001131 5858585868              	db 'XXXXh'
  1656 00001136 0D0A                    	db 0Dh, 0Ah
  1657 00001138 526573657276656420-     	db 'Reserved            : '
  1657 00001141 202020202020202020-
  1657 0000114A 20203A20           
  1658                                  rsvd7:
  1659 0000114E 585868                  	db 'XXh'
  1660 00001151 0D0A                    	db 0Dh, 0Ah
  1661 00001153 447269766520436F6E-     	db 'Drive Control Byte  : '
  1661 0000115C 74726F6C2042797465-
  1661 00001165 20203A20           
  1662                                  dcbnum:
  1663 00001169 585868                  	db 'XXh'
  1664 0000116C 0D0A                    	db 0Dh, 0Ah		
  1665 0000116E 526573657276656420-     	db 'Reserved            : '
  1665 00001177 202020202020202020-
  1665 00001180 20203A20           
  1666                                  rsvd9:
  1667 00001184 5858585868              	db 'XXXXh'
  1668 00001189 0D0A                    	db 0Dh, 0Ah
  1669 0000118B 526573657276656420-     	db 'Reserved            : '
  1669 00001194 202020202020202020-
  1669 0000119D 20203A20           
  1670                                  rsvd11:
  1671 000011A1 585868                  	db 'XXh'
  1672 000011A4 0D0A                    	db 0Dh, 0Ah
  1673 000011A6 4C616E64696E67205A-     	db 'Landing Zone        : '
  1673 000011AF 6F6E65202020202020-
  1673 000011B8 20203A20           
  1674                                  lzonenum:
  1675 000011BC 5858585868              	db 'XXXXh'
  1676 000011C1 0D0A                    	db 0Dh, 0Ah
  1677 000011C3 536563746F72732070-     	db 'Sectors per Track   : '
  1677 000011CC 657220547261636B20-
  1677 000011D5 20203A20           
  1678                                  psptnum:
  1679 000011D9 585868                  	db 'XXh'
  1680 000011DC 0D0A                    	db 0Dh, 0Ah
  1681 000011DE 526573657276656420-     	db 'Reserved            : '
  1681 000011E7 202020202020202020-
  1681 000011F0 20203A20           
  1682                                  rsvd15:
  1683 000011F4 585868                  	db 'XXh'
  1684 000011F7 0D0A                    	db 0Dh, 0Ah
  1685 000011F9 0D0A                    	db 0Dh, 0Ah
  1686 000011FB 492F4F20506F727420-     	db 'I/O Port Base Addr  : '
  1686 00001204 426173652041646472-
  1686 0000120D 20203A20           
  1687                                  bPortAddr:
  1688 00001211 5858585868              	db 'XXXXh'
  1689 00001216 0D0A                    	db 0Dh, 0Ah
  1690 00001218 436F6E74726F6C2050-     	db 'Control Port Addr   : '
  1690 00001221 6F7274204164647220-
  1690 0000122A 20203A20           
  1691                                  cPortAddr:
  1692 0000122E 5858585868              	db 'XXXXh'
  1693 00001233 0D0A                    	db 0Dh, 0Ah
  1694 00001235 486561642052656720-     	db 'Head Reg Upp Nibb   : '
  1694 0000123E 557070204E69626220-
  1694 00001247 20203A20           
  1695                                  hregupnib:
  1696 0000124B 585868                  	db 'XXh'
  1697 0000124E 0D0A                    	db 0Dh, 0Ah
  1698 00001250 0D0A                    	db 0Dh, 0Ah
  1699 00001252 53697A652028696E20-     	db 'Size (in sectors)   : '
  1699 0000125B 736563746F72732920-
  1699 00001264 20203A20           
  1700                                  disksize:
  1701 00001268 585858585858585868      	db 'XXXXXXXXh'
  1702 00001271 0D0A                    	db 0Dh, 0Ah
  1703 00001273 0D0A00                  	db 0Dh, 0Ah, 0
  1704                                  
  1705                                  THDPT:
  1706 00001276 07                      	db 07h
  1707 00001277 0D0A                    	db 0Dh, 0Ah
  1708 00001279 4469736B20              	db 'Disk '
  1709                                  tdsknum:
  1710 0000127E 58202D20                	db 'X - '	
  1711 00001282 5452414E534C415445-     	db 'TRANSLATED FIXED DISK PARAMETER TABLE'
  1711 0000128B 442046495845442044-
  1711 00001294 49534B20504152414D-
  1711 0000129D 45544552205441424C-
  1711 000012A6 45                 
  1712 000012A7 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1713 000012AB 4C6F676963616C2043-     	db 'Logical Cylinders   : '
  1713 000012B4 796C696E6465727320-
  1713 000012BD 20203A20           
  1714                                  lcylnum:
  1715 000012C1 5858585868              	db 'XXXXh'
  1716 000012C6 0D0A                    	db 0Dh, 0Ah
  1717 000012C8 4C6F676963616C2048-     	db 'Logical Heads       : '
  1717 000012D1 656164732020202020-
  1717 000012DA 20203A20           
  1718                                  lheadnum:
  1719 000012DE 585868                  	db 'XXh'
  1720 000012E1 0D0A                    	db 0Dh, 0Ah
  1721 000012E3 5369676E6174757265-     	db 'Signature           : '
  1721 000012EC 202020202020202020-
  1721 000012F5 20203A20           
  1722                                  tsignum:
  1723 000012F9 585868                  	db 'XXh'
  1724 000012FC 0D0A                    	db 0Dh, 0Ah
  1725 000012FE 506879205365632070-     	db 'Phy Sec per Track   : '
  1725 00001307 657220547261636B20-
  1725 00001310 20203A20           
  1726                                  tpsptnum:
  1727 00001314 585868                  	db 'XXh'
  1728 00001317 0D0A                    	db 0Dh, 0Ah	
  1729 00001319 507265636F6D70656E-     	db 'Precompensation     : '
  1729 00001322 736174696F6E202020-
  1729 0000132B 20203A20           
  1730                                  tpcompnum:
  1731 0000132F 58585858682020284F-     	db 'XXXXh  (Obsolete)'
  1731 00001338 62736F6C65746529   
  1732 00001340 0D0A                    	db 0Dh, 0Ah
  1733 00001342 526573657276656420-     	db 'Reserved            : '
  1733 0000134B 202020202020202020-
  1733 00001354 20203A20           
  1734                                  trsvd7:
  1735 00001358 585868                  	db 'XXh'
  1736 0000135B 0D0A                    	db 0Dh, 0Ah
  1737 0000135D 447269766520436F6E-     	db 'Drive Control Byte  : '
  1737 00001366 74726F6C2042797465-
  1737 0000136F 20203A20           
  1738                                  tdcbnum:
  1739 00001373 585868                  	db 'XXh'
  1740 00001376 0D0A                    	db 0Dh, 0Ah		
  1741 00001378 506879736963616C20-     	db 'Physical Cylinders  : '
  1741 00001381 43796C696E64657273-
  1741 0000138A 20203A20           
  1742                                  tpcylnum:
  1743 0000138E 5858585868              	db 'XXXXh'
  1744 00001393 0D0A                    	db 0Dh, 0Ah
  1745 00001395 506879736963616C20-     	db 'Physical Heads      : '
  1745 0000139E 486561647320202020-
  1745 000013A7 20203A20           
  1746                                  tpheadnum:
  1747 000013AB 585868                  	db 'XXh'
  1748 000013AE 0D0A                    	db 0Dh, 0Ah
  1749 000013B0 4C616E64696E67205A-     	db 'Landing Zone        : '
  1749 000013B9 6F6E65202020202020-
  1749 000013C2 20203A20           
  1750                                  tlzonenum:
  1751 000013C6 58585858682020284F-     	db 'XXXXh  (Obsolete)'
  1751 000013CF 62736F6C65746529   
  1752 000013D7 0D0A                    	db 0Dh, 0Ah
  1753 000013D9 4C6F67696320536563-     	db 'Logic Sec per Trk   : '
  1753 000013E2 207065722054726B20-
  1753 000013EB 20203A20           
  1754                                  lsptnum:
  1755 000013EF 585868                  	db 'XXh'
  1756 000013F2 0D0A                    	db 0Dh, 0Ah
  1757 000013F4 436865636B73756D20-     	db 'Checksum            : '
  1757 000013FD 202020202020202020-
  1757 00001406 20203A20           
  1758                                  checksum:
  1759 0000140A 585868                  	db 'XXh'
  1760 0000140D 0D0A                    	db 0Dh, 0Ah
  1761 0000140F 0D0A                    	db 0Dh, 0Ah
  1762 00001411 492F4F20506F727420-     	db 'I/O Port Base Addr  : '
  1762 0000141A 426173652041646472-
  1762 00001423 20203A20           
  1763                                  tbPortAddr:
  1764 00001427 5858585868              	db 'XXXXh'
  1765 0000142C 0D0A                    	db 0Dh, 0Ah
  1766 0000142E 436F6E74726F6C2050-     	db 'Control Port Addr   : '
  1766 00001437 6F7274204164647220-
  1766 00001440 20203A20           
  1767                                  tcPortAddr:
  1768 00001444 5858585868              	db 'XXXXh'
  1769 00001449 0D0A                    	db 0Dh, 0Ah
  1770 0000144B 486561642052656720-     	db 'Head Reg Upp Nibb   : '
  1770 00001454 557070204E69626220-
  1770 0000145D 20203A20           
  1771                                  thregupnib:
  1772 00001461 585868                  	db 'XXh'
  1773 00001464 0D0A                    	db 0Dh, 0Ah
  1774 00001466 0D0A                    	db 0Dh, 0Ah
  1775 00001468 53697A652028696E20-     	db 'Size (in sectors)   : '
  1775 00001471 736563746F72732920-
  1775 0000147A 20203A20           
  1776                                  tdisksize:
  1777 0000147E 585858585858585868      	db 'XXXXXXXXh'
  1778 00001487 0D0A                    	db 0Dh, 0Ah
  1779 00001489 0D0A00                  	db 0Dh, 0Ah, 0
  1780                                  
  1781                                  hex_digits:
  1782                                  hexchrs:
  1783 0000148C 303132333435363738-     	db '0123456789ABCDEF'
  1783 00001495 39414243444546     
  1784                                  
  1785                                  ds_drv:
  1786 0000149C FF                      	db 0FFh ; Current drive (on display)
  1787 0000149D 00                       	db 0    ; Current half (0 or >0)
  1788                                  
  1789                                  drv_names:
  1790 0000149E 666430206664312068-     	db 'fd0 fd1 hd0 hd1 hd2 hd3 '
  1790 000014A7 643020686431206864-
  1790 000014B0 322068643320       
  1791                                  
  1792                                  dpheader:
  1793 000014B6 204472697665203A20      	db ' Drive : '
  1794                                  drv_name:
  1795 000014BF 3030302020              	db '000  '
  1796 000014C4 536563746F72203A20      	db  'Sector : '
  1797                                  sector_num:
  1798 000014CD 464646464646464668      	db  'FFFFFFFFh'
  1799 000014D6 00                              db 0
  1800                                  
  1801                                  sdline:
  1802 000014D7 204279746520            	db ' Byte '
  1803                                  sdline_1:
  1804 000014DD 30303068                	db '000h'
  1805 000014E1 202D2020                	db ' -  '
  1806                                  sdline_2:
  1807 000014E5 303020303020303020-     	db '00 00 00 00 00 00 00 00 '
  1807 000014EE 303020303020303020-
  1807 000014F7 303020303020       
  1808 000014FD 303020303020303020-     	db '00 00 00 00 00 00 00 00 '
  1808 00001506 303020303020303020-
  1808 0000150F 303020303020       
  1809 00001515 20                      	db ' '
  1810                                  sdline_3:
  1811 00001516 2E2E2E2E2E2E2E2E2E-     	db '................'
  1811 0000151F 2E2E2E2E2E2E2E     
  1812 00001526 20                      	db 20h
  1813                                  
  1814                                  dpfooter1:
  1815 00001527 204631203D20436861-     	db ' F1 = Change Drive  '
  1815 00001530 6E6765204472697665-
  1815 00001539 2020               
  1816 0000153B 486F6D65203D204669-     	db 'Home = First Sector '
  1816 00001544 72737420536563746F-
  1816 0000154D 7220               
  1817 0000154F 50675570203D205072-     	db 'PgUp = Previous Sector '
  1817 00001558 6576696F7573205365-
  1817 00001561 63746F7220         
  1818 00001566 455343203D20455849-     	db 'ESC = EXIT'
  1818 0000156F 54                 
  1819 00001570 00                      	db 0
  1820                                  dpfooter2:
  1821 00001571 204632203D20436861-     	db ' F2 = Change Sector '
  1821 0000157A 6E676520536563746F-
  1821 00001583 7220               
  1822 00001585 456E64203D204C6173-     	db 'End = Last Sector   '
  1822 0000158E 7420536563746F7220-
  1822 00001597 2020               
  1823 00001599 5067446F776E203D20-     	db 'PgDown = Next Sector   ' 
  1823 000015A2 4E6578742053656374-
  1823 000015AB 6F72202020         
  1824 000015B0 454E544552203D2050-     	db 'ENTER = Prv/Nxt'
  1824 000015B9 72762F4E7874       
  1825 000015BF 00                      	db 0
  1826                                  
  1827                                  F1_ib:
  1828 000015C0 10                      	db 16	; box width (columns)
  1829 000015C1 03                      	db 3	; box height (rows)
  1830 000015C2 01                      	db 1	; label offset (vertical)
  1831 000015C3 01                      	db 1	; label offset (horizontal)
  1832 000015C4 01                      	db 1	; text (input) size
  1833 000015C5 4E                      	db 4Eh	; box color
  1834 000015C6 44726976653A20          	db 'Drive: '  ; Label
  1835 000015CD 00                      	db 0
  1836                                  
  1837                                  F2_ib:
  1838 000015CE 14                      	db 20	; box width (columns)
  1839 000015CF 03                      	db 3	; box height (rows)
  1840 000015D0 01                      	db 1	; label offset (vertical)
  1841 000015D1 01                      	db 1	; label offset (horizontal)
  1842 000015D2 08                      	db 8	; text (input) size
  1843 000015D3 4E                      	db 4Eh	; box color
  1844 000015D4 536563746F72203A20      	db 'Sector : '  ; Label
  1845 000015DD 00                      	db 0
  1846                                  
  1847                                  dskr_err:
  1848 000015DE 21                      	db 33	; box width (columns)
  1849                                  	;db 17	
  1850 000015DF 03                      	db 3	; box height (rows)
  1851 000015E0 01                      	db 1	; label offset (vertical)
  1852 000015E1 01                      	db 1	; label offset (horizontal)
  1853 000015E2 00                      	db 0	; text (input) size
  1854 000015E3 4E                      	db 4Eh	; box color
  1855 000015E4 4472697665206E6F74-     	db 'Drive not ready or read error !'  ; Label
  1855 000015ED 207265616479206F72-
  1855 000015F6 207265616420657272-
  1855 000015FF 6F722021           
  1856                                  	;db ' Error : '
  1857                                  ;err_code_str:
  1858                                  ;	db '00h ! '	
  1859 00001603 00                      	db 0	
  1860                                  
  1861                                  ; Additional functions, variables/pointers for 
  1862                                  ; Real Mode adaption (out of unix386.s) variables/pointers
  1863                                  
  1864                                  set_cpos:
  1865 00001604 668B15[D8160000]        	mov	dx, [cursor_posn] ; dh = row, dl = column
  1866                                  set_cposx:
  1867                                  	; DX = cursor position
  1868 0000160B B402                    	mov	ah, 2		; Set cursor position
  1869 0000160D 30FF                    	xor	bh, bh		; for video page 0
  1870 0000160F CD31                    	int	31h		; TRDOS 386 video interrupt
  1871 00001611 C3                      	retn
  1872                                  
  1873                                  align 2
  1874                                  
  1875                                  prg_msg:
  1876 00001612 0D0A07                  	db 0Dh, 0Ah, 07h
  1877 00001615 4469736B2052656164-     	db 'Disk Read Utility - TRDOS 386 v2 Disk I/O and timer test.'
  1877 0000161E 205574696C69747920-
  1877 00001627 2D205452444F532033-
  1877 00001630 383620763220446973-
  1877 00001639 6B20492F4F20616E64-
  1877 00001642 2074696D6572207465-
  1877 0000164B 73742E             
  1878 0000164E 0D0A                    	db 0Dh, 0Ah	
  1879                                  	;db 'by Erdogan Tan  [07/07/2016]'
  1880 00001650 6279204572646F6761-     	db 'by Erdogan Tan  [26/08/2020]'   ; LBA disk (>8GB) bugfix
  1880 00001659 6E2054616E20205B32-
  1880 00001662 362F30382F32303230-
  1880 0000166B 5D                 
  1881 0000166C 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
  1882 00001670 28507265737320616E-             db '(Press any key to continue...)'
  1882 00001679 79206B657920746F20-
  1882 00001682 636F6E74696E75652E-
  1882 0000168B 2E2E29             
  1883 0000168E 0D0A00                  	db 0Dh, 0Ah, 0
  1884                                  
  1885                                  drv_not_ready:
  1886 00001691 070D0A                  	db 07h, 0Dh, 0Ah 
  1887 00001694 4472697665206E6F74-     	db 'Drive not ready !'
  1887 0000169D 2072656164792021   
  1888 000016A5 0D0A00                  	db 0Dh, 0Ah, 0
  1889                                  
  1890 000016A8 30                      fd0_type: db '0'
  1891 000016A9 30                      fd1_type: db '0'
  1892                                  
  1893                                  rtc_msg:
  1894 000016AA 5265616C2054696D65-     	db "Real Time Clock - "
  1894 000016B3 20436C6F636B202D20 
  1895                                  datestr:
  1896 000016BC 30302F30302F303030-     	db "00/00/0000"
  1896 000016C5 30                 
  1897 000016C6 2020                    	db "  "
  1898                                  timestr:	
  1899 000016C8 30303A30303A3030                db "00:00:00"
  1900                                  rtc_msg_end:
  1901 000016D0 00                      	db 0
  1902                                  
  1903                                  timer_event:
  1904 000016D1 00                      	db 0 
  1905                                  
  1906 000016D2 90<rept>                align 4 ; dword alignment
  1907                                  
  1908 000016D4 [EC190000]              current_txtpos: dd video_buffer
  1909                                  
  1910                                  bss_start:
  1911                                  
  1912                                  ABSOLUTE bss_start
  1913                                  
  1914 000016D8 <res 00000002>          cursor_posn: resw 1
  1915 000016DA <res 00000002>          cursor_shp:  resw 1
  1916 000016DC <res 00000002>          cursor_posb: resw 1 ; (cursor position backup, for video page 0)
  1917                                  
  1918 000016DE <res 00000001>          txtposoff:   resb 1 ; txtpos offset for sector number input	
  1919 000016DF <res 00000001>          dscmd:	     resb 1 ; 0 = change drive
  1920                                  	            ; 1 = change sector
  1921                                  	            ; 2 = display disk parameters
  1922                                  
  1923 000016E0 <res 00000001>          inds:	     resb 1 	 
  1924 000016E1 <res 00000001>          paragr:	     resb 1	 
  1925                                  
  1926 000016E2 <res 00000001>          ibcp:	     resb 1 ; input box - row position
  1927 000016E3 <res 00000001>          	     resb 1 ; input box - column position
  1928                                  
  1929 000016E4 <res 00000001>          retry_count: resb 1
  1930 000016E5 <res 00000001>          drv:	     resb 1  ; physical drive number (0, 1, 80h, 81h, 82h, 83h)
  1931                                  
  1932 000016E6 <res 00000002>          drv_status:  resb 2  ; fd0, fd1 (FFh = failure, 80h = existing)		
  1933 000016E8 <res 00000004>          	     resb 4  ; hd0, hd1 hd2, hd3 (FFh = failure)
  1934                                                      ;                   (80h - 87h = existing)
  1935                                                      ;                   (bit 0 = 1 : LBA ready)
  1936                                  
  1937 000016EC <res 0000000C>          drv_cylinders :	resw 6
  1938 000016F8 <res 0000000C>          drv_heads     :	resw 6
  1939 00001704 <res 0000000C>          drv_spt       :	resw 6
  1940                                  alignb 4
  1941 00001710 <res 00000018>          drv_size :	resd 6
  1942                                  
  1943 00001728 <res 00000010>          fd0_dpt: resb 16
  1944 00001738 <res 00000010>          fd1_dpt: resb 16
  1945 00001748 <res 00000020>          hd0_dpt: resb 32
  1946 00001768 <res 00000020>          hd1_dpt: resb 32
  1947 00001788 <res 00000020>          hd2_dpt: resb 32
  1948 000017A8 <res 00000020>          hd3_dpt: resb 32
  1949                                  
  1950                                  ds_sec:
  1951 000017C8 <res 00000004>          	resd 1 ; Current sector (on display), drv 0		
  1952 000017CC <res 00000004>          	resd 1 ; Current sector (on display), drv 1
  1953 000017D0 <res 00000004>          	resd 1 ; Current sector (on display), drv 2
  1954 000017D4 <res 00000004>          	resd 1 ; Current sector (on display), drv 3
  1955 000017D8 <res 00000004>          	resd 1 ; Current sector (on display), drv 4
  1956 000017DC <res 00000004>          	resd 1 ; Current sector (on display), drv 5
  1957                                  
  1958 000017E0 <res 00000004>          prev_sec: resd 1  ; previous sector (before reading)	
  1959                                  
  1960                                  sector_buffer:
  1961 000017E4 <res 00000200>          	resb 512
  1962                                  
  1963                                  date_day:
  1964 000019E4 <res 00000001>          	resb 1
  1965                                  date_month:
  1966 000019E5 <res 00000001>          	resb 1
  1967                                  date_year:
  1968 000019E6 <res 00000001>          	resb 1
  1969                                  date_century:
  1970 000019E7 <res 00000001>          	resb 1
  1971                                  
  1972                                  time_second:
  1973 000019E8 <res 00000001>          	resb 1
  1974                                  time_minute:
  1975 000019E9 <res 00000001>          	resb 1
  1976                                  time_hour:
  1977 000019EA <res 00000001>          	resb 1
  1978                                  	
  1979 000019EB <res 00000001>          	resb 1
  1980                                  
  1981                                  video_buffer:
  1982 000019EC <res 00000FA0>          	resb	4000 ; 80*25*2
  1983                                  
  1984                                  timer_event_number:
  1985 0000298C <res 00000001>          	resb 1
  1986                                  
  1987 0000298D <res 00000001>          hdc:	resb 1
  1988 0000298E <res 00000001>          fdc:	resb 1
  1989                                  
  1990                                  prev_drv:
  1991 0000298F <res 00000001>          	resb 1
  1992                                  
  1993                                  alignb 4
  1994                                  
  1995                                  bss_end:
  1996                                  	
  1997                                  _end:
