     1                                  ; ****************************************************************************
     2                                  ; dsectpm2.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'dsectpm2.prg')
     3                                  ; ---------------------------------------------------------------------------
     4                                  ; DSECTPM2.PRG ! TEST program !
     5                                  ; 'Display Disk Sectors' by using TRDOS 386 disk and timer interrupts.
     6                                  ;
     7                                  ; 27/05/2016
     8                                  ;
     9                                  ; Derived from 'dsestrm2.s' source code for Retro UNIX 386 v1 'boot'
    10                                  ;
    11                                  ; [ Last Modification: 30/05/2016 ]
    12                                  ;
    13                                  ; ****************************************************************************
    14                                  ; dsectrm2.s (21/02/2015, Retro UNIX 386 v1, standalone program, real mode)
    15                                  ; dsectpm.s (28/02/2015, Retro UNIX 386 v1, standalone prog, protected mode)
    16                                  ; 
    17                                  ; Assembler: NASM 2.11
    18                                  
    19                                  ; display disk sector data [R etro Unix 386 v1 - test ]
    20                                  ; by Erdogan Tan [ Real Mode adaption (Standalone program), 21/02/2015 ]
    21                                  
    22                                  ESCKey	 equ 1Bh    ;27		
    23                                  ENTERKey equ 0Dh    ;13
    24                                  SPACEKey equ 20h    ;32
    25                                  BACKSPC	 equ 08h    ; 8
    26                                  DELKey	 equ 53E0h
    27                                  F1Key	 equ 3B00h
    28                                  F2Key	 equ 3C00h
    29                                  F3Key	 equ 3D00h
    30                                  HOMEKey  equ 47E0h
    31                                  ENDKey	 equ 4FE0h
    32                                  PgUpKey	 equ 49E0h
    33                                  PgDnKey  equ 51E0h 
    34                                  
    35                                  [BITS 32]
    36                                  	
    37                                  	; clear bss area
    38                                  
    39                                  	; ecx = 0
    40 00000000 B9B8120000              	mov	ecx, bss_end - bss_start
    41 00000005 66C1E902                	shr	cx, 2 ; dword count
    42 00000009 BF[60160000]            	mov	edi, bss_start
    43                                  	; eax = 0
    44                                  	; xor eax, eax
    45 0000000E F3AB                    	rep	stosd
    46                                  	
    47 00000010 BE[9A150000]                    mov     esi, prg_msg
    48 00000015 E8170D0000              	call	print_msg
    49                                  
    50                                  	; Filling disk parameters tables
    51                                  _fd0:
    52                                  	;xor	dl, dl ; fd0
    53                                  	;mov	[drv], dl
    54 0000001A BB[B0160000]            	mov	ebx, fd0_dpt
    55 0000001F B408                    	mov	ah, 08h	; return disk parameters
    56 00000021 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    57 00000023 724B                    	jc	short _hd0
    58 00000025 C605[6E160000]80        	mov	byte [drv_status], 80h
    59 0000002C 001D[30160000]          	add	[fd0_type], bl
    60 00000032 8815[17290000]          	mov	[fdc], dl
    61 00000038 E837080000              	call	set_disk_parms
    62 0000003D FE0D[17290000]          	dec	byte [fdc]
    63 00000043 742B                    	jz	short _hd0
    64                                  _fd1:
    65 00000045 B201                    	mov	dl, 1 ; fd1
    66 00000047 8815[6D160000]          	mov	[drv], dl
    67 0000004D BB[C0160000]            	mov	ebx, fd1_dpt
    68 00000052 B408                    	mov	ah, 08h	; return disk parameters
    69 00000054 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    70 00000056 7218                    	jc	short _hd0
    71 00000058 C605[6F160000]80        	mov	byte [drv_status+1], 80h
    72 0000005F 001D[31160000]          	add	[fd1_type], bl
    73 00000065 E80A080000              	call	set_disk_parms
    74 0000006A FE0D[17290000]                  dec     byte [fdc] ; = 0 
    75                                  _hd0:
    76 00000070 B280                    	mov	dl, 80h ; hd0
    77 00000072 8815[6D160000]          	mov	[drv], dl
    78 00000078 BB[D0160000]            	mov	ebx, hd0_dpt
    79 0000007D B408                    	mov	ah, 08h	; return disk parameters
    80 0000007F CD33                      	int	33h	; TRDOS 386 disk io interrupt
    81 00000081 7220                    	jc	short _hd1
    82 00000083 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
    83 00000086 C0E806                  	shr	al, 6 ; bit 6 = bit 0
    84 00000089 0480                    	add	al, 80h
    85 0000008B A2[70160000]            	mov	[drv_status+2], al
    86 00000090 E8DF070000              	call	set_disk_parms
    87 00000095 FECA                    	dec	dl  ; number of fixed disk drives - 1
    88 00000097 0F848B000000            	jz	sccps
    89 0000009D 8815[16290000]          	mov	[hdc], dl
    90                                  _hd1:
    91 000000A3 B281                    	mov	dl, 81h ; hd1
    92 000000A5 8815[6D160000]          	mov	[drv], dl
    93 000000AB BB[F0160000]            	mov	ebx, hd1_dpt
    94 000000B0 B408                    	mov	ah, 08h	; return disk parameters
    95 000000B2 CD33                      	int	33h	; TRDOS 386 disk io interrupt
    96 000000B4 721A                    	jc	short _hd2
    97 000000B6 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
    98 000000B9 C0E806                  	shr	al, 6 ; bit 6 = bit 0
    99 000000BC 0480                    	add	al, 80h
   100 000000BE A2[71160000]            	mov	[drv_status+3], al
   101 000000C3 E8AC070000              	call	set_disk_parms
   102 000000C8 FE0D[16290000]          	dec	byte [hdc]
   103 000000CE 7458                    	jz	short sccps
   104                                  _hd2:
   105 000000D0 B282                    	mov	dl, 82h ; hd2
   106 000000D2 8815[6D160000]          	mov	[drv], dl
   107 000000D8 BB[10170000]            	mov	ebx, hd2_dpt
   108 000000DD B408                    	mov	ah, 08h	; return disk parameters
   109 000000DF CD33                      	int	33h	; TRDOS 386 disk io interrupt
   110 000000E1 721A                    	jc	short _hd3
   111 000000E3 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
   112 000000E6 C0E806                  	shr	al, 6 ; bit 6 = bit 0
   113 000000E9 0480                    	add	al, 80h
   114 000000EB A2[72160000]            	mov	[drv_status+4], al
   115 000000F0 E87F070000              	call	set_disk_parms
   116 000000F5 FE0D[16290000]          	dec	byte [hdc]
   117 000000FB 742B                    	jz	short sccps
   118                                  _hd3:
   119 000000FD B283                    	mov	dl, 83h ; hd3
   120 000000FF 8815[6D160000]          	mov	[drv], dl
   121 00000105 BB[30170000]            	mov	ebx, hd3_dpt
   122 0000010A B408                    	mov	ah, 08h	; return disk parameters
   123 0000010C CD33                      	int	33h	; TRDOS 386 disk io interrupt
   124 0000010E 7218                    	jc	short sccps
   125 00000110 8A4314                  	mov	al, [ebx+16+4] ; device register, bit 6 = LBA bit
   126 00000113 C0E806                  	shr	al, 6 ; bit 6 = bit 0
   127 00000116 0480                    	add	al, 80h
   128 00000118 A2[73160000]            	mov	[drv_status+5], al
   129 0000011D E852070000              	call	set_disk_parms
   130 00000122 FE0D[16290000]          	dec	byte [hdc] ; = 0
   131                                  
   132                                  sccps:
   133                                  	; get cursor position
   134 00000128 31DB                    	xor	ebx, ebx ; bh = video page 0
   135 0000012A B403                    	mov	ah, 03h	; get cursor position and shape
   136 0000012C CD31                    	int	31h 	; TRDOS 386 video interrupt
   137                                  			; (IBM PC/AT ROMBIOS, INT 10h) 	
   138 0000012E 668915[60160000]        	mov	[cursor_posn], dx ; position
   139 00000135 66890D[62160000]        	mov	[cursor_shp], cx ; shape
   140                                  
   141                                  	; Save video page (before displaying sector)
   142                                  
   143                                  	; copy video page 0 to video page 6
   144                                  	;sub	ebx, ebx ; bl = 0 -> system to system
   145                                  			 ; bh = 0 -> 80*25 text mode 
   146 0000013C 28C9                    	sub	cl, cl   ; source = video page 0
   147 0000013E B206                    	mov	dl, 6    ; destination = video page 6
   148 00000140 B81F000000              	mov	eax, 31  ; 'sysvideo'
   149 00000145 CD40                    	int	40h	 ; TRDOS 386 system call  
   150                                  
   151                                  display_sectors:
   152 00000147 E80D070000              	call	hide_cursor
   153                                  	; Save cursor position
   154 0000014C 66A1[60160000]          	mov	ax, [cursor_posn] ; cursor pos. 
   155                                  				  ; for video page 0
   156 00000152 66A3[64160000]          	mov	[cursor_posb], ax
   157 00000158 E82F050000              	call	clear_frame
   158                                  
   159                                  	; start (Real Time Clock) timer function
   160 0000015D B3FF                            mov     bl, 0FFh ; signal return (response) byte
   161 0000015F B703                            mov     bh, 3    ; 1 second (rtc interrupt) 
   162                                  	;mov	ecx, 1
   163 00000161 B101                    	mov	cl, 1
   164 00000163 BA[14290000]            	mov	edx, timer_event ; signal return (response) address
   165 00000168 B821000000              	mov	eax, 33	; 'systimer'
   166 0000016D CD40                    	int	40h	; TRDOS 386 system call
   167 0000016F 7267                    	jc	short dscl_0
   168                                  
   169 00000171 A2[15290000]            	mov	[timer_event_number], al 
   170                                  
   171 00000176 EB60                    	jmp	short dscl_0
   172                                  
   173                                  dscl_esc:
   174 00000178 E8D3030000              	call	restore_video_page
   175                                  dscl_getc:
   176 0000017D 803D[14290000]00        	cmp	byte [timer_event], 0
   177 00000184 7622                    	jna	short dscl_getchar
   178                                  
   179                                  	; timer function
   180 00000186 C605[14290000]00        	mov	byte [timer_event], 0
   181                                  		
   182 0000018D BF[641A0000]            	mov	edi, video_buffer+0A0h+050h ; Row 1, Column 40
   183 00000192 807F013F                	cmp     byte [edi+1], 3Fh ; cyan (3) Background
   184                                  			; white (F) forecolor 
   185                                  			; (display disk sector frame)
   186 00000196 7510                    	jne	short dscl_getchar
   187                                  
   188                                  dscl_rtc_p:
   189 00000198 E860050000              	call	rtc_p
   190                                  
   191 0000019D E823050000                      call    video_page_update 
   192                                  
   193                                  	; Check keyboard buffer
   194 000001A2 B411                    	mov	ah, 11h
   195 000001A4 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   196                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   197 000001A6 74F0                    	jz	short dscl_rtc_p ; keyboard buffer empty
   198                                  
   199                                  dscl_getchar:
   200 000001A8 E890030000              	call	getch
   201                                  	;
   202 000001AD 3C1B                    	cmp	al, ESCKey
   203 000001AF 0F8449030000                    je      dscl_exit
   204 000001B5 C605[67160000]00        	mov	byte [dscmd], 0
   205 000001BC 663D003B                	cmp	ax, F1Key
   206 000001C0 7416                            je	short dscl_0
   207                                  	;
   208 000001C2 FE05[67160000]          	inc	byte [dscmd]
   209 000001C8 663D003D                	cmp	ax, F3Key
   210 000001CC 0F8578020000                    jne     dscl_5
   211 000001D2 FE05[67160000]          	inc	byte [dscmd] ; Display disk params.
   212                                  dscl_0:
   213 000001D8 E865030000              	call	save_video_page
   214 000001DD BE[58150000]            	mov	esi, F1_ib ; F1 (Change drive)
   215                                  			   ; Inputbox address
   216                                  dscl_ib:
   217 000001E2 E8C1050000              	call	inputbox
   218                                  		; cursor position in DX
   219 000001E7 E873060000              	call	show_cursor
   220                                  		; cursor blinks at current position
   221                                  dscl_3:
   222 000001EC E84C030000              	call	getch
   223 000001F1 3C1B                    	cmp	al, ESCKey
   224 000001F3 750A                    	jne	short dscl_27
   225 000001F5 E85F060000                      call    hide_cursor
   226 000001FA E979FFFFFF                      jmp     dscl_esc
   227                                  dscl_27:
   228 000001FF 3C20                    	cmp	al, SPACEKey
   229 00000201 743C                    	je	short dscl_4	
   230 00000203 3C0D                         	cmp	al, ENTERKey
   231 00000205 7438                    	je	short dscl_4
   232                                  	;
   233 00000207 31DB                    	xor	ebx, ebx
   234 00000209 803D[67160000]01            	cmp     byte [dscmd], 1
   235 00000210 7466                    	je	short dscl_12
   236                                  	;
   237 00000212 3C30                    	cmp	al, '0'
   238 00000214 72D6                    	jb	short dscl_3
   239 00000216 3C35                    	cmp	al, '5'
   240 00000218 77D2                    	ja	short dscl_3
   241 0000021A 8B3D[5C160000]          	mov	edi, [current_txtpos]
   242 00000220 AA                      	stosb
   243                                  	;
   244                                  	;xor	bh, bh  ; video page 0
   245 00000221 B40A                    	mov	ah, 0Ah ; write chr at current cursor pos.
   246 00000223 CD31                    	int	31h     ; TRDOS 386 video interrupt
   247                                  	;
   248 00000225 2C30                    	sub	al, '0'
   249 00000227 88C2                    	mov	dl, al
   250 00000229 30F6                    	xor	dh, dh
   251 0000022B 88C3                    	mov	bl, al
   252 0000022D C0E302                  	shl	bl, 2  ; *4
   253 00000230 81C3[50170000]          	add	ebx, ds_sec ; current_sector
   254 00000236 8B0B                    	mov	ecx, [ebx]
   255 00000238 BE[6C170000]                    mov     esi, sector_buffer
   256 0000023D EBAD                    	jmp	short dscl_3 
   257                                  dscl_4:
   258 0000023F 803D[68160000]00        	cmp	byte [inds],  0 ; display other half or not ?
   259 00000246 0F8718010000                    ja      dscl_oh         ; other half
   260 0000024C 51                      	push	ecx
   261                                  	; save regs (ESI, EAX, DX)
   262 0000024D E807060000              	call	hide_cursor
   263                                  	; restore regs (ESI, EAX, DX)
   264 00000252 58                      	pop	eax
   265                                  	;
   266 00000253 803D[67160000]01        	cmp     byte [dscmd], 1 ; Requested function ?
   267 0000025A 0F84C7000000                    je      dscl_17         ; Change sector (F2)
   268 00000260 0F8238010000                    jb      dscl_ns         ; Change drive (F1)
   269                                  
   270                                  	; Display disk parameters (dscmd = 2)
   271 00000266 80FA02                  	cmp	dl, 2
   272 00000269 7203                    	jb	short dscl_28
   273 0000026B 80C27E                  	add	dl, 7Eh
   274                                  dscl_28:
   275 0000026E E8A5070000              	call	dskprm
   276 00000273 E900FFFFFF                      jmp     dscl_esc
   277                                  dscl_12:
   278 00000278 663DE053                	cmp	ax, DELKey	; DEL key
   279 0000027C 7404                    	je	short dscl_bs
   280 0000027E 3C08                    	cmp	al, BACKSPC	; Backspace key
   281 00000280 7535                    	jne	short dscl_13
   282                                  dscl_bs:
   283 00000282 803D[66160000]00        	cmp	byte [txtposoff], 0
   284 00000289 0F865DFFFFFF                    jna     dscl_3
   285 0000028F FE0D[66160000]          	dec	byte [txtposoff]
   286 00000295 FE0D[60160000]          	dec	byte [cursor_posn]
   287 0000029B E8EC120000              	call	set_cpos
   288 000002A0 0FB61D[66160000]        	movzx	ebx, byte [txtposoff]
   289 000002A7 FE0D[66160000]          	dec	byte [txtposoff]
   290 000002AD FE0D[60160000]          	dec	byte [cursor_posn]
   291 000002B3 B020                    	mov	al, 20h
   292 000002B5 EB1B                            jmp     short dscl_14
   293                                  dscl_13:
   294 000002B7 8A1D[66160000]          	mov	bl, [txtposoff]
   295 000002BD 80FB08                  	cmp	bl, 8
   296 000002C0 0F8326FFFFFF                    jnb     dscl_3
   297                                  	;
   298 000002C6 3C30                    	cmp	al, '0'
   299 000002C8 0F821EFFFFFF                    jb      dscl_3
   300 000002CE 3C39                    	cmp	al, '9'
   301 000002D0 7735                    	ja	short dscl_15
   302                                  dscl_14:
   303 000002D2 D0E3                    	shl	bl, 1
   304 000002D4 8B35[5C160000]          	mov	esi, [current_txtpos]
   305 000002DA 01F3                    	add	ebx, esi
   306 000002DC 8803                    	mov	[ebx], al
   307                                  	;
   308 000002DE 30FF                    	xor	bh, bh  ; video page 0
   309 000002E0 B40A                    	mov	ah, 0Ah ; write chr at current cursor pos.
   310 000002E2 CD31                    	int	31h     ; TRDOS 386 video interrupt
   311                                  	;
   312 000002E4 803D[66160000]08        	cmp	byte [txtposoff], 8
   313 000002EB 0F8DFBFEFFFF            	jge	dscl_3 ; JGE !
   314 000002F1 FE05[66160000]          	inc	byte [txtposoff]
   315 000002F7 FE05[60160000]          	inc	byte [cursor_posn]
   316 000002FD E88A120000              	call	set_cpos
   317 00000302 E9E5FEFFFF                      jmp     dscl_3 
   318                                  dscl_15:
   319 00000307 3C41                    	cmp	al, 'A'
   320 00000309 0F82DDFEFFFF                    jb      dscl_3
   321 0000030F 3C46                    	cmp	al, 'F'
   322 00000311 76BF                            jna     short dscl_14
   323                                  dscl_16:
   324 00000313 3C61                    	cmp	al, 'a'
   325 00000315 0F82D1FEFFFF                    jb      dscl_3
   326 0000031B 3C66                    	cmp	al, 'f'
   327 0000031D 0F87C9FEFFFF                    ja      dscl_3
   328 00000323 2C20                    	sub	al, 'a' - 'A'
   329 00000325 EBAB                    	jmp	short dscl_14
   330                                  	;
   331                                  dscl_17:
   332 00000327 8B35[5C160000]          	mov	esi, [current_txtpos]
   333 0000032D 31C0                    	xor	eax, eax
   334 0000032F A2[66160000]            	mov	byte [txtposoff], al ; 0
   335 00000334 50                      	push	eax  ; sector value (reset)	
   336                                  dscl_18:
   337 00000335 66AD                    	lodsw
   338 00000337 3C30                    	cmp	al, '0'
   339 00000339 7219                    	jb	short dscl_22
   340                                  dscl_19: 
   341 0000033B 29C9                    	sub	ecx, ecx
   342 0000033D BB[24140000]            	mov	ebx, hexchrs
   343                                  dscl_20:
   344 00000342 3A03                    	cmp	al, [ebx]
   345 00000344 7405                    	je	short dscl_21
   346                                  	;cmp	cl, 15
   347                                  	;jnb	short dscl_22
   348 00000346 FEC1                    	inc	cl
   349 00000348 43                      	inc	ebx
   350 00000349 EBF7                    	jmp	short dscl_20
   351                                  dscl_21: 
   352 0000034B 58                      	pop	eax
   353 0000034C C1E004                  	shl	eax, 4	; * 16
   354 0000034F 01C8                    	add	eax, ecx
   355 00000351 50                      	push	eax
   356 00000352 EBE1                    	jmp	short dscl_18
   357                                  dscl_22:
   358 00000354 8A15[34140000]          	mov	dl, [ds_drv]
   359 0000035A 30F6                    	xor	dh, dh
   360 0000035C 58                      	pop	eax
   361 0000035D BE[6C170000]                    mov     esi, sector_buffer
   362 00000362 EB3A                            jmp     short dscl_ns
   363                                  dscl_oh:
   364 00000364 8A15[34140000]          	mov	dl, [ds_drv]
   365 0000036A 0FB6DA                  	movzx	ebx, dl
   366 0000036D C0E302                  	shl	bl, 2
   367 00000370 81C3[50170000]          	add	ebx, ds_sec
   368 00000376 8B03                    	mov	eax, [ebx]
   369 00000378 BE[6C170000]                    mov     esi, sector_buffer
   370                                  	;
   371 0000037D 8A35[35140000]          	mov	dh, [ds_drv+1]
   372 00000383 08F6                    	or	dh, dh
   373 00000385 7404                    	jz	short dscl_nh ; second half of sector (0->1)
   374 00000387 30F6                    	xor	dh, dh	      ; reset (0)	
   375 00000389 EB08                    	jmp	short dscl_nx
   376                                  dscl_nh:
   377 0000038B 81C600010000            	add	esi, 256
   378 00000391 FEC6                    	inc	dh
   379                                  dscl_nx:
   380 00000393 8835[35140000]          	mov	[ds_drv+1], dh
   381 00000399 E98B000000                      jmp     dscl_25
   382                                  dscl_ns:
   383 0000039E 8835[35140000]          	mov	[ds_drv+1], dh
   384 000003A4 0FB6DA                  	movzx	ebx, dl
   385 000003A7 C0E302                  	shl	bl, 2
   386 000003AA 81C3[50170000]          	add	ebx, ds_sec
   387 000003B0 3A15[34140000]          	cmp	dl, [ds_drv]
   388 000003B6 7504                    	jne	short dscl_23
   389 000003B8 3B03                    	cmp	eax, [ebx]
   390 000003BA 746D                    	je	dscl_25
   391                                  dscl_23:
   392 000003BC 8815[34140000]          	mov	[ds_drv], dl
   393                                  dscl_26:
   394 000003C2 8B0B                    	mov	ecx, [ebx]
   395 000003C4 890D[68170000]          	mov	[prev_sec], ecx
   396 000003CA 8903                    	mov	[ebx], eax
   397 000003CC E81D050000              	call	read_disk_sector
   398 000003D1 733C                    	jnc	short dscl_24
   399                                  dscl_rd_err:
   400                                  	;
   401 000003D3 88E0                    	mov	al, ah	; error code
   402 000003D5 66BF[8515]              	mov	di, err_code_str
   403 000003D9 E846070000              	call	write_hex
   404                                  	;
   405 000003DE BE[76150000]            	mov	esi, dskr_err ; drive not ready or read error
   406 000003E3 E8C0030000              	call	inputbox
   407 000003E8 E850010000              	call	getch
   408 000003ED E85E010000              	call	restore_video_page
   409 000003F2 29DB                    	sub	ebx, ebx
   410 000003F4 8A1D[34140000]          	mov	bl, [ds_drv]
   411 000003FA C0E302                  	shl	bl, 2
   412 000003FD 81C3[50170000]          	add	ebx, ds_sec
   413 00000403 A1[68170000]            	mov	eax, [prev_sec]
   414 00000408 8903                    	mov	[ebx], eax
   415 0000040A E96EFDFFFF              	jmp     dscl_getc
   416                                  dscl_24:
   417 0000040F 668B15[34140000]        	mov	dx, [ds_drv]
   418 00000416 0FB6DA                  	movzx	ebx, dl
   419 00000419 C0E302                  	shl	bl, 2
   420 0000041C 81C3[50170000]          	add	ebx, ds_sec
   421 00000422 8B03                    	mov	eax, [ebx]
   422 00000424 BE[6C170000]                    mov     esi, sector_buffer
   423                                  dscl_25:
   424 00000429 E830010000              	call	display_sector
   425 0000042E E80F010000              	call	save_video_page
   426 00000433 E945FDFFFF                      jmp     dscl_getc
   427                                  dscl_11:
   428 00000438 BE[6C170000]                    mov     esi, sector_buffer
   429 0000043D 8A15[34140000]          	mov	dl, [ds_drv]
   430 00000443 28F6                    	sub	dh, dh	 ; 0 = first half of sector
   431 00000445 E954FFFFFF                      jmp     dscl_ns 
   432                                  dscl_5:
   433 0000044A 663D003C                	cmp	ax, F2Key
   434 0000044E 7516                    	jne	short dscl_6
   435 00000450 E8ED000000              	call	save_video_page
   436 00000455 BE[66150000]            	mov	esi, F2_ib ; F2 (Change sector)
   437                                  		           ; Inputbox address
   438 0000045A C605[67160000]01        	mov	byte [dscmd], 1
   439 00000461 E97CFDFFFF                      jmp     dscl_ib
   440                                  dscl_6:	
   441 00000466 3C20                    	cmp	al, SPACEKey
   442 00000468 0F84F6FEFFFF                    je      dscl_oh
   443 0000046E 3C0D                         	cmp	al, ENTERKey
   444 00000470 0F84EEFEFFFF                    je      dscl_oh
   445                                  	;
   446 00000476 663DE047                	cmp	ax, HOMEKey
   447 0000047A 7504                    	jne	short dscl_7
   448 0000047C 31C0                    	xor	eax, eax
   449 0000047E EBB8                    	jmp	short dscl_11
   450                                  dscl_7:
   451 00000480 663DE04F                	cmp	ax, ENDKey
   452 00000484 7515                    	jne	short dscl_8
   453 00000486 0FB61D[34140000]        	movzx	ebx, byte [ds_drv]
   454 0000048D C0E302                  	shl	bl, 2
   455 00000490 81C3[98160000]                  add     ebx, drv_size
   456 00000496 8B03                    	mov	eax, [ebx]
   457 00000498 48                      	dec	eax
   458 00000499 EB9D                    	jmp	short dscl_11
   459                                  dscl_8:
   460 0000049B 663DE051                	cmp	ax, PgDnKey
   461 0000049F 753E                    	jne	short dscl_10
   462 000004A1 E810000000              	call	dscl_9
   463 000004A6 40                      	inc	eax
   464 000004A7 39C8                    	cmp	eax, ecx ; last sector
   465 000004A9 0F86EFFEFFFF            	jna	dscl_ns
   466 000004AF 31C0                    	xor	eax, eax
   467 000004B1 E90CFFFFFF              	jmp	dscl_26
   468                                  dscl_9:	
   469 000004B6 0FB615[34140000]        	movzx	edx, byte [ds_drv]
   470 000004BD 89D3                    	mov	ebx, edx
   471 000004BF C0E302                  	shl	bl, 2  ; *4
   472 000004C2 81C3[98160000]                  add     ebx, drv_size
   473 000004C8 8B0B                    	mov	ecx, [ebx]
   474 000004CA 49                      	dec	ecx
   475 000004CB 81EB[98160000]                  sub     ebx, drv_size
   476 000004D1 81C3[50170000]          	add	ebx, ds_sec ; current sector
   477 000004D7 8B03                    	mov	eax, [ebx]	
   478 000004D9 BE[6C170000]                    mov     esi, sector_buffer
   479 000004DE C3                              retn
   480                                  dscl_10:
   481 000004DF 663DE049                	cmp	ax, PgUpKey
   482 000004E3 0F8594FCFFFF            	jne	dscl_getc
   483 000004E9 E8C8FFFFFF              	call	dscl_9
   484 000004EE 48                      	dec	eax
   485 000004EF 39C8                    	cmp	eax, ecx ; last sector
   486 000004F1 0F86A7FEFFFF            	jna	dscl_ns
   487 000004F7 89C8                    	mov	eax, ecx
   488 000004F9 E9C4FEFFFF              	jmp	dscl_26
   489                                  
   490                                  dscl_exit:
   491                                  	;
   492                                  	; Stop timer event
   493 000004FE 0FB61D[15290000]        	movzx	ebx, byte [timer_event_number]
   494                                  		; bh = 0 -> stop timer event
   495                                  
   496 00000505 20DB                    	and	bl, bl
   497 00000507 7409                    	jz	short dscl_rvp
   498 00000509 B821000000              	mov	eax, 33	; 'systimer'
   499 0000050E CD40                    	int	40h	; TRDOS 386 system call
   500                                  
   501 00000510 28DB                    	sub	bl, bl
   502                                  dscl_rvp:
   503                                  	; Restore video page (before displaying sector)
   504                                  
   505                                  	; copy video page 6 to video page 0
   506                                  	;sub	ebx, ebx ; bl = 0 -> system to system
   507                                  			 ; bh = 0 -> 80*25 text mode 
   508 00000512 B106                    	mov	cl, 6    ; source = video page 6
   509 00000514 28D2                    	sub	dl, dl   ; destination = video page 0
   510 00000516 B81F000000              	mov	eax, 31  ; 'sysvideo'
   511 0000051B CD40                    	int	40h	 ; TRDOS 386 system call  
   512                                  
   513                                  	; Restore cursor position
   514 0000051D 668B15[64160000]        	mov	dx, [cursor_posb] 
   515                                  	;
   516                                  	; Set cursor position
   517                                  	;xor	bh, bh  ; Video page 0
   518 00000524 B402                    	mov	ah, 2	; set cursor position
   519 00000526 CD31                    	int	31h 	; TRDOS 386 video interrupt
   520                                  	
   521                                  	; Show standard blinking text cursor 
   522                                  	;mov 	ch, 13
   523                                          ;mov 	cl, 15
   524 00000528 668B0D[62160000]                mov 	cx, [cursor_shp]
   525 0000052F B401                    	mov	ah, 1	; set cursor type
   526 00000531 CD31                    	int	31h 	; TRDOS 386 video interrupt
   527                                  
   528                                  terminate:
   529 00000533 B801000000              	mov	eax, 1	; 'sysexit'
   530 00000538 CD40                    	int	40h	; TRDOS 386 system call
   531                                  haltsys:
   532 0000053A F4                      	hlt
   533 0000053B EBFD                    	jmp	short haltsys
   534                                  
   535                                  getch:
   536                                  	; Getchar by using keyboard interrupt
   537 0000053D B410                    	mov	ah, 10h
   538 0000053F CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   539                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   540 00000541 C3                      	retn
   541                                  		
   542                                  save_video_page:
   543                                  	; Save video page
   544                                  
   545                                  	; copy video page 0 to video page 7
   546 00000542 29DB                    	sub	ebx, ebx ; bl = 0 -> system to system
   547                                  			 ; bh = 0 -> 80*25 text mode 
   548 00000544 28C9                    	sub	cl, cl   ; source = video page 0
   549 00000546 B207                    	mov	dl, 7    ; destination = video page 7
   550 00000548 B81F000000              	mov	eax, 31  ; 'sysvideo'
   551 0000054D CD40                    	int	40h	 ; TRDOS 386 system call
   552 0000054F C3                      	retn  
   553                                  
   554                                  restore_video_page:
   555                                  	; copy video page 7 to video page 0
   556 00000550 29DB                    	sub	ebx, ebx ; bl = 0 -> system to system
   557                                  			 ; bh = 0 -> 80*25 text mode 
   558 00000552 B107                    	mov	cl, 7    ; source = video page 7
   559 00000554 28D2                    	sub	dl, dl   ; destination = video page 0
   560 00000556 B81F000000              	mov	eax, 31  ; 'sysvideo'
   561 0000055B CD40                    	int	40h	 ; TRDOS 386 system call  
   562 0000055D C3                      	retn
   563                                  	
   564                                  display_sector:
   565                                  	; display disk sector data (on video page 0)
   566                                  	;
   567                                  	; INPUT ->
   568                                  	;	ESI = sector buffer offset
   569                                  	; 	      (sector size: 512 bytes)
   570                                  	;	EAX = sector number
   571                                  	;	DL = drive number (0,1,2,3,4,5,6)
   572                                  	;	DH = portion control byte 
   573                                  	;		 (0= first half of the sector, 
   574                                  	;		 >0= second half of the sector) 
   575                                  	; OUTPUT ->
   576                                  	;	Video page 0 (0B8000h) will be filled
   577                                  	;	with sector data
   578                                  	;	(ESI points to byte 256 of the buffer
   579                                  	;	or end of the buffer)	
   580                                  	;
   581                                  	; Modified registers: eax, edx, ecx, ebx, esi, edi
   582                                  	;
   583                                  	;
   584                                  	;xor	ecx, ecx ; reset for cx loop counts
   585 0000055E C605[68160000]01        	mov	byte [inds], 1 ; for ENTER key handling 
   586                                  	;
   587 00000565 50                      	push	eax
   588 00000566 52                      	push	edx
   589 00000567 E820010000              	call	clear_frame
   590 0000056C 5A                      	pop	edx
   591 0000056D 58                      	pop	eax
   592                                  dsfh:
   593 0000056E 31DB                    	xor	ebx, ebx
   594 00000570 08F6                    	or	dh, dh
   595 00000572 7402                    	jz	short dsfh1
   596 00000574 B310                    	mov	bl, 10h
   597                                  dsfh1:
   598 00000576 881D[69160000]          	mov	[paragr], bl	; Paragraph (16 bytes)
   599                                  	;
   600 0000057C 88D3                    	mov	bl, dl
   601 0000057E C0E302                  	shl	bl, 2	; *4
   602 00000581 81C3[36140000]          	add	ebx, drv_names
   603 00000587 8B13                    	mov	edx, [ebx]
   604 00000589 8915[57140000]          	mov	[drv_name], edx
   605 0000058F E8BF000000              	call	dwordtohex
   606 00000594 8915[65140000]          	mov	[sector_num], edx
   607 0000059A A3[69140000]            	mov	[sector_num+4], eax
   608 0000059F B001                    	mov	al, 1
   609 000005A1 B43F                    	mov	ah, 3Fh ; cyan background, white forecolor
   610 000005A3 BB[4E140000]            	mov	ebx, dpheader
   611 000005A8 E8CC000000              	call	print_line
   612 000005AD B015                    	mov	al, 21
   613                                  	;mov	ah, 3Fh ; cyan background, white forecolor
   614 000005AF BB[BF140000]            	mov	ebx, dpfooter1
   615 000005B4 E8C0000000              	call	print_line
   616 000005B9 B016                    	mov	al, 22
   617                                  	;mov	ah, 3Fh ; cyan background, white forecolor
   618 000005BB BB[09150000]            	mov	ebx, dpfooter2
   619 000005C0 E8B4000000              	call	print_line
   620                                  ds1:
   621 000005C5 B910000000              	mov	ecx, 16
   622                                  ds2:
   623 000005CA A0[69160000]            	mov	al, [paragr]
   624 000005CF E841000000              	call	bytetohex
   625 000005D4 66A3[75140000]          	mov	[sdline_1], ax
   626                                  	;
   627 000005DA 51                      	push	ecx
   628 000005DB B110                    	mov	cl, 16
   629 000005DD BF[7D140000]            	mov	edi, sdline_2
   630                                  ds3:
   631 000005E2 AC                      	lodsb	
   632 000005E3 E82D000000              	call	bytetohex
   633 000005E8 66AB                    	stosw
   634 000005EA 47                      	inc	edi
   635 000005EB E2F5                    	loop	ds3
   636 000005ED 83EE10                  	sub	esi, 16
   637 000005F0 47                      	inc	edi
   638 000005F1 B110                    	mov	cl, 16
   639 000005F3 F3A4                    	rep	movsb
   640 000005F5 59                      	pop	ecx
   641 000005F6 B013                    	mov	al, 19	; line (row) 3 to 24
   642 000005F8 28C8                    	sub	al, cl
   643 000005FA B407                    	mov	ah, 07h ; Black background, light gray forecolor
   644 000005FC BB[6F140000]            	mov	ebx, sdline
   645 00000601 E85F000000              	call	print_line_80 ; 04/12/2014
   646 00000606 E205                    	loop	ds4
   647                                  	
   648                                  	;call	video_page_update
   649                                  	;retn
   650                                  
   651 00000608 E9B8000000              	jmp	video_page_update
   652                                  ds4:
   653 0000060D FE05[69160000]          	inc	byte [paragr]
   654 00000613 EBB5                    	jmp	short ds2
   655                                  
   656                                  ; Convert binary number to hexadecimal string
   657                                  
   658                                  bytetohex:
   659                                  	; INPUT ->
   660                                  	; 	AL = byte (binary number)
   661                                  	; OUTPUT ->
   662                                  	;	AX = hexadecimal string
   663                                  	;
   664 00000615 53                      	push	ebx
   665 00000616 0FB6D8                  	movzx	ebx, al
   666 00000619 C0EB04                  	shr	bl, 4
   667 0000061C 8A9B[24140000]          	mov	bl, [ebx+hexchrs] 	 	
   668 00000622 86D8                    	xchg	bl, al
   669 00000624 80E30F                  	and	bl, 0Fh
   670 00000627 8AA3[24140000]          	mov	ah, [ebx+hexchrs] 
   671 0000062D 5B                      	pop	ebx	
   672 0000062E C3                      	retn
   673                                  
   674                                  wordtohex:
   675                                  	; INPUT ->
   676                                  	; 	AX = word (binary number)
   677                                  	; OUTPUT ->
   678                                  	;	EAX = hexadecimal string
   679                                  	;
   680 0000062F 53                      	push	ebx
   681 00000630 86E0                    	xchg	ah, al
   682 00000632 6650                    	push	ax
   683 00000634 0FB6DC                  	movzx	ebx, ah
   684 00000637 C0EB04                  	shr	bl, 4
   685 0000063A 8A83[24140000]          	mov	al, [ebx+hexchrs] 	 	
   686 00000640 88E3                    	mov	bl, ah
   687 00000642 80E30F                  	and	bl, 0Fh
   688 00000645 8AA3[24140000]          	mov	ah, [ebx+hexchrs]
   689 0000064B C1E010                  	shl	eax, 16
   690 0000064E 6658                    	pop	ax
   691 00000650 5B                      	pop	ebx
   692 00000651 EBC2                    	jmp	short bytetohex
   693                                  	;mov	bl, al
   694                                  	;shr	bl, 4
   695                                  	;mov	bl, [ebx+hexchrs] 	 	
   696                                  	;xchg	bl, al	 	
   697                                  	;and	bl, 0Fh
   698                                  	;mov	ah, [ebx+hexchrs] 
   699                                  	;pop	ebx	
   700                                  	;retn
   701                                  
   702                                  dwordtohex:
   703                                  	; INPUT ->
   704                                  	; 	EAX = dword (binary number)
   705                                  	; OUTPUT ->
   706                                  	;	EDX:EAX = hexadecimal string
   707                                  	;
   708 00000653 50                      	push	eax
   709 00000654 C1E810                  	shr	eax, 16
   710 00000657 E8D3FFFFFF              	call	wordtohex
   711 0000065C 89C2                    	mov	edx, eax
   712 0000065E 58                      	pop	eax
   713 0000065F E8CBFFFFFF              	call	wordtohex
   714 00000664 C3                      	retn
   715                                  
   716                                  print_line_80:
   717                                  	; 04/12/2014
   718                                  	; al = line (0 to 24)
   719                                  	; ah = color attributes
   720                                  	; ebx = 80 chars string address	
   721 00000665 E881000000              	call 	get_lpos
   722 0000066A 51                      	push	ecx
   723 0000066B B950000000              	mov	ecx, 80
   724                                  pl80:
   725 00000670 8A03                    	mov	al, [ebx]
   726 00000672 43                      	inc	ebx
   727 00000673 66AB                    	stosw
   728 00000675 E2F9                    	loop	pl80
   729 00000677 59                      	pop	ecx
   730 00000678 C3                      	retn
   731                                  
   732                                  print_line:
   733                                  	; al = line (0 to 24)
   734                                  	; ah = color attributes	
   735                                  	; ebx = ASCIIZ string address
   736 00000679 E86D000000              	call	get_lpos
   737 0000067E 56                      	push	esi
   738 0000067F 89DE                    	mov	esi, ebx
   739                                  prl1:
   740 00000681 AC                      	lodsb
   741 00000682 20C0                    	and	al, al
   742 00000684 7404                    	jz	short prl2
   743 00000686 66AB                    	stosw
   744 00000688 EBF7                    	jmp	short prl1
   745                                  prl2:
   746 0000068A 5E                      	pop	esi
   747 0000068B C3                      	retn
   748                                  
   749                                  clear_frame:
   750 0000068C 30C0                    	xor	al, al ; Line 0
   751 0000068E E846000000              	call	clear_line
   752 00000693 B001                    	mov	al, 1
   753 00000695 B43F                    	mov	ah, 3Fh ; cyan background, white forecolor
   754 00000697 E83F000000              	call	fill_color
   755 0000069C B001                    	mov	al, 1
   756                                  dscf0:	
   757 0000069E FEC0                    	inc	al
   758 000006A0 6650                    	push	ax
   759 000006A2 E832000000              	call	clear_line
   760 000006A7 6658                    	pop	ax
   761 000006A9 3C13                    	cmp	al, 19
   762 000006AB 72F1                    	jb	short dscf0
   763                                  	;inc	al ; line 20
   764 000006AD B43F                    	mov	ah, 3Fh
   765                                  dscf1:
   766 000006AF FEC0                    	inc	al
   767 000006B1 6650                    	push	ax
   768 000006B3 E823000000              	call	fill_color	  
   769 000006B8 6658                    	pop	ax
   770 000006BA 3C17                    	cmp	al, 23
   771 000006BC 72F1                    	jb	short dscf1
   772 000006BE FEC0                    	inc	al
   773 000006C0 E814000000              	call	clear_line
   774                                  
   775                                  	;call	video_page_update
   776                                  	;retn
   777                                  
   778                                  video_page_update:
   779                                  	; copy video buffer content to video page 0
   780 000006C5 BB01000000              	mov	ebx, 1	; BL = 1 = user to system
   781 000006CA B200                    	mov	dl, 0	; video page 0
   782 000006CC B9[74190000]            	mov	ecx, video_buffer
   783 000006D1 B81F000000              	mov	eax, 31 ; 'sysvideo'
   784 000006D6 CD40                    	int	40h	; TRDOS 386 system call	
   785                                  
   786 000006D8 C3                      	retn
   787                                  
   788                                  clear_line:
   789 000006D9 30E4                    	xor	ah, ah ; blank
   790                                  fill_color:
   791                                  	; al = line (0 to 24)
   792                                  	; ah = color attributes
   793 000006DB E80B000000              	call	get_lpos
   794 000006E0 B950000000              	mov	ecx, 80
   795 000006E5 B020                    	mov	al, 20h ; space/blank
   796 000006E7 F366AB                  	rep	stosw
   797 000006EA C3                      	retn
   798                                  
   799                                  get_lpos:  ; Get line position in video buffer
   800 000006EB 6650                    	push	ax
   801 000006ED B4A0                    	mov	ah, 80*2
   802 000006EF F6E4                    	mul	ah
   803 000006F1 0FB7F8                  	movzx	edi, ax
   804 000006F4 81C7[74190000]          	add	edi, video_buffer
   805 000006FA 6658                    	pop	ax
   806 000006FC C3                      	retn
   807                                  
   808                                  rtc_p:	
   809                                  	; Print Real Time Clock content
   810                                  	;
   811 000006FD B404                    	mov	ah, 4	; read the date
   812 000006FF CD35                    	int	35h	; TRDOS 386 date&time interrupt
   813                                  			; (IBM PC/AT ROMBIOS, INT 1Ah)
   814                                  	;mov	[date_day], dl
   815                                  	;mov	[date_month], dh
   816 00000701 668915[6C190000]        	mov	[date_day], dx
   817                                  	;mov	[date_year], cl
   818                                  	;mov	[date_century], ch
   819 00000708 66890D[6E190000]        	mov	[date_year], cx
   820                                  	;
   821 0000070F B402                    	mov	ah, 2	; read the time
   822 00000711 CD35                    	int	35h	; TRDOS 386 date&time interrupt
   823 00000713 8835[70190000]                  mov     [time_second], dh
   824                                          ;mov    [time_minute], cl
   825                                          ;mov    [time_hour], ch
   826 00000719 66890D[71190000]                mov     [time_minute], cx
   827                                  	;
   828 00000720 A0[6F190000]            	mov	al, [date_century]
   829 00000725 E875000000              	call	bcd_to_ascii
   830 0000072A 66A3[4A160000]          	mov	word [datestr+6], ax
   831 00000730 A0[6E190000]            	mov	al, byte [date_year]
   832 00000735 E865000000              	call	bcd_to_ascii
   833 0000073A 66A3[4C160000]          	mov	word [datestr+8], ax
   834 00000740 A0[6D190000]            	mov	al, byte [date_month]
   835 00000745 E855000000              	call	bcd_to_ascii
   836 0000074A 66A3[47160000]          	mov	word [datestr+3], ax
   837 00000750 A0[6C190000]            	mov	al, byte [date_day]
   838 00000755 E845000000              	call	bcd_to_ascii
   839 0000075A 66A3[44160000]          	mov	word [datestr], ax
   840                                  	;
   841 00000760 A0[72190000]                    mov     al, byte [time_hour]
   842 00000765 E835000000              	call	bcd_to_ascii
   843 0000076A 66A3[50160000]          	mov	word [timestr], ax
   844 00000770 A0[71190000]                    mov     al, byte [time_minute]
   845 00000775 E825000000              	call	bcd_to_ascii
   846 0000077A 66A3[53160000]          	mov	word [timestr+3], ax
   847 00000780 A0[70190000]                    mov     al, byte [time_second]
   848 00000785 E815000000              	call	bcd_to_ascii
   849 0000078A 66A3[56160000]          	mov	word [timestr+6], ax
   850                                  	;		
   851 00000790 BE[32160000]            	mov	esi, rtc_msg ; message offset
   852                                  	;
   853                                  	;mov	edi, video_buffer+0A0h+050h ; Row 1, Column 40
   854                                  	;mov	ah, [edi+1]
   855                                  	;cmp	ah, 3Fh ; cyan (3) Background
   856                                  			; white (F) forecolor 
   857                                  			; (display disk sector frame)
   858                                  	;jne	short prtcmsg_ok	
   859                                  prtcmsg:
   860 00000795 AC                      	lodsb
   861 00000796 08C0                    	or	al, al
   862 00000798 7404                    	jz	short prtcmsg_ok
   863 0000079A AA                      	stosb
   864 0000079B 47                      	inc 	edi
   865 0000079C EBF7                    	jmp	short prtcmsg
   866                                  prtcmsg_ok:
   867 0000079E C3                      	retn
   868                                  
   869                                  bcd_to_ascii:
   870                                  	; INPUT ->
   871                                  	;	AL = Packed BCD number
   872                                  	; OUTPUT ->
   873                                  	;	AX = ASCII word/number
   874                                  	;
   875 0000079F D410                    	db	0D4h, 10h	; Undocumented inst. AAM
   876                                  				; AH = AL / 10h
   877                                  				; AL = AL MOD 10h
   878 000007A1 660D3030                	or	ax, '00'	; Make it ASCII based
   879                                  
   880 000007A5 86E0                            xchg	ah, al 
   881                                  	
   882 000007A7 C3                      	retn	
   883                                  
   884                                  inputbox:
   885                                  	; Show an input box for user/keyboard input
   886                                  	; INPUT ->
   887                                  	;	ESI = input structure address 
   888                                  	; OUTPUT ->
   889                                  	;	DX  = cursor position for input
   890                                  	;	input box will be displayed (on tty0)
   891                                  	;
   892                                  	; Modified registers: eax, ebx, ecx, edx, esi, edi
   893                                  
   894 000007A8 C605[68160000]00        	mov	byte [inds], 0 ; for ENTER key handling
   895 000007AF 31C9                    	xor	ecx, ecx
   896 000007B1 BB[74190000]            	mov	ebx, video_buffer
   897 000007B6 B818500000              	mov	eax, 5018h ; 80, 24
   898 000007BB 668B16                  	mov	dx, [esi] ; box width (dl)
   899                                  			  ; box height (dh)
   900 000007BE 28F0                    	sub	al, dh
   901 000007C0 D0E8                    	shr	al, 1
   902 000007C2 A2[6B160000]            	mov	[ibcp+1], al ; row
   903 000007C7 F6E4                    	mul	ah
   904 000007C9 66D1E0                  	shl	ax, 1  ; char + attribute
   905 000007CC 01C3                    	add	ebx, eax
   906 000007CE B050                    	mov	al, 80
   907 000007D0 28D0                    	sub	al, dl
   908 000007D2 D0E8                    	shr	al, 1 
   909 000007D4 A2[6A160000]            	mov	[ibcp], al ; column
   910 000007D9 D0E0                    	shl	al, 1  ; char + attribute
   911 000007DB 28E4                    	sub	ah, ah
   912 000007DD 01C3                    	add	ebx, eax
   913 000007DF 8A6605                  	mov	ah, [esi+5] ; color attributes
   914 000007E2 B020                    	mov	al, 20h	; space/blank
   915 000007E4 88F1                    	mov	cl, dh ; height
   916                                  ib0:
   917 000007E6 51                      	push	ecx
   918 000007E7 88D1                    	mov	cl, dl
   919 000007E9 89DF                    	mov	edi, ebx	
   920 000007EB F366AB                  	rep	stosw
   921 000007EE 59                      	pop	ecx
   922 000007EF 81C3A0000000            	add	ebx, 80*2 ; number of columns * 2
   923 000007F5 E2EF                    	loop	ib0
   924                                  	;
   925 000007F7 BF[74190000]            	mov	edi, video_buffer
   926 000007FC A0[6B160000]            	mov	al, [ibcp+1] ; row position
   927 00000801 024602                  	add	al, [esi+2] ; label offset (row)
   928 00000804 A2[6B160000]            	mov	[ibcp+1], al
   929 00000809 B4A0                    	mov	ah, 80*2
   930 0000080B F6E4                    	mul	ah
   931 0000080D 01C7                    	add	edi, eax
   932 0000080F A0[6A160000]            	mov	al, [ibcp] ; column position
   933 00000814 024603                  	add	al, [esi+3] ; label offset (column)
   934 00000817 A2[6A160000]            	mov	[ibcp], al
   935 0000081C 30E4                    	xor	ah, ah
   936 0000081E D0E0                    	shl	al, 1
   937 00000820 01C7                    	add	edi, eax
   938 00000822 89F3                    	mov	ebx, esi
   939 00000824 83C606                  	add	esi, 6 ; Label offset
   940                                  ib2:
   941 00000827 AC                      	lodsb
   942 00000828 08C0                    	or	al, al
   943 0000082A 7406                    	jz	short ib3
   944 0000082C AA                      	stosb
   945 0000082D 47                      	inc 	edi	
   946 0000082E FEC1                    	inc	cl
   947 00000830 EBF5                    	jmp	short ib2
   948                                  ib3:
   949 00000832 000D[6A160000]          	add	[ibcp], cl ; column position
   950 00000838 893D[5C160000]          	mov	[current_txtpos], edi
   951                                  	;
   952 0000083E 8A4B04                  	mov	cl, [ebx+4] ; input char count
   953 00000841 08C9                    	or	cl, cl
   954 00000843 7407                    	jz	short ib5 ; message box (no input)	
   955 00000845 B020                    	mov	al, 20h
   956 00000847 B407                    	mov	ah, 07h ; black background
   957                                  			; light gray fore color	
   958                                  ib4:
   959 00000849 F366AB                  	rep	stosw
   960                                  ib5:	
   961 0000084C E874FEFFFF              	call	video_page_update
   962 00000851 668B15[6A160000]        	mov	dx, [ibcp] ; cursor position
   963 00000858 C3                      	retn
   964                                  
   965                                  hide_cursor:
   966                                        	;CH = cursor start line (bits 0-4) 
   967                                  	;     and options (bits 5-7).
   968                                  	;CL = bottom cursor line (bits 0-4).
   969                                  	; when bit 5 of CH is set to 0, the cursor is visible. 
   970                                  	; when bit 5 is 1, the cursor is not visible. 
   971                                  	; hide blinking text cursor: 
   972 00000859 B520                            mov 	ch, 32
   973 0000085B 30FF                    	xor	bh, bh ; video page 0
   974 0000085D EB0E                    	jmp	short hc_sc
   975                                  
   976                                  show_cursor:
   977                                    	; dh = row
   978                                  	; dl = column
   979 0000085F 668915[60160000]        	mov	[cursor_posn], dx
   980 00000866 E8280D0000              	call	set_cposx
   981                                  	;
   982                                  	;show box-shaped blinking text cursor
   983 0000086B B50D                    	mov	ch, 13
   984                                  hc_sc:
   985 0000086D B10F                            mov 	cl, 15
   986 0000086F B401                            mov 	ah, 1
   987 00000871 CD31                            int 	31h
   988 00000873 C3                      	retn
   989                                  
   990                                  set_disk_parms:
   991 00000874 0FB61D[6D160000]                movzx   ebx, byte [drv]
   992 0000087B 80FB80                  	cmp	bl, 80h
   993 0000087E 7203                    	jb	short sdp0
   994 00000880 80EB7E                  	sub	bl, 7Eh
   995                                  sdp0:	
   996                                  	;add	ebx, drv_status
   997                                          ;mov     byte [ebx], 80h ; 'Present' flag
   998                                  	;
   999 00000883 88E8                    	mov	al, ch ; last cylinder (bits 0-7)
  1000 00000885 88CC                    	mov	ah, cl ; 
  1001 00000887 C0EC06                  	shr	ah, 6  ; last cylinder (bits 8-9)
  1002                                  	;sub	ebx, drv_status
  1003 0000088A D0E3                    	shl	bl, 1
  1004 0000088C 81C3[74160000]          	add	ebx, drv_cylinders
  1005 00000892 6640                    	inc	ax  ; convert max. cyl number to cyl count		
  1006 00000894 668903                  	mov	[ebx], ax
  1007 00000897 6650                    	push	ax ; ** cylinders
  1008 00000899 81EB[74160000]          	sub	ebx, drv_cylinders
  1009 0000089F 81C3[80160000]          	add	ebx, drv_heads
  1010 000008A5 88F0                    	mov	al, dh ; last head number
  1011 000008A7 30E4                    	xor	ah, ah
  1012 000008A9 6640                    	inc	ax     ; heads 	
  1013 000008AB 668903                  	mov	[ebx], ax
  1014 000008AE 81EB[80160000]                  sub     ebx, drv_heads
  1015 000008B4 81C3[8C160000]                  add     ebx, drv_spt
  1016 000008BA 6683E13F                	and	cx, 3Fh  ; sectors (bits 0-6)
  1017 000008BE 66890B                  	mov	[ebx], cx
  1018 000008C1 81EB[8C160000]                  sub     ebx, drv_spt
  1019 000008C7 66D1E3                  	shl	bx, 1
  1020 000008CA 81C3[98160000]          	add	ebx, drv_size ; disk size (in sectors)
  1021                                  	; LBA size = cylinders * heads * secpertrack
  1022 000008D0 66F7E1                  	mul	cx 
  1023 000008D3 6689C2                  	mov	dx, ax ; heads*spt					
  1024 000008D6 6658                    	pop	ax ; ** cylinders
  1025 000008D8 803D[6D160000]80        	cmp	byte [drv], 80h
  1026 000008DF 7202                    	jb	short sdp1
  1027 000008E1 6648                    	dec	ax ; 1 cylinder reserved (!?)
  1028                                  sdp1:
  1029 000008E3 66F7E2                  	mul	dx ; cylinders * (heads*spt)		
  1030 000008E6 668903                  	mov	[ebx], ax
  1031 000008E9 66895302                	mov	[ebx+2], dx
  1032                                  	;
  1033 000008ED C3                      	retn
  1034                                  
  1035                                  read_disk_sector:
  1036                                  	; EAX = sector number (LBA)
  1037                                  	;
  1038 000008EE 0FB61D[34140000]        	movzx	ebx, byte [ds_drv]
  1039 000008F5 88DA                    	mov	dl, bl	
  1040 000008F7 80FA02                  	cmp	dl, 2
  1041 000008FA 7203                    	jb	short rd0
  1042 000008FC 80C27E                  	add	dl, 7Eh  ; 80h, 81h, 82h, 83h
  1043                                  rd0:
  1044 000008FF 8815[6D160000]          	mov	[drv], dl
  1045 00000905 81C3[6E160000]          	add	ebx, drv_status
  1046 0000090B 8A33                    	mov	dh, [ebx]
  1047                                  rd1:
  1048 0000090D 80FEF0                  	cmp	dh, 0F0h
  1049 00000910 F5                      	cmc
  1050 00000911 726C                            jc      short rd_lba_fails
  1051                                  	;
  1052 00000913 0FB61D[34140000]        	movzx	ebx, byte [ds_drv]
  1053 0000091A 89DE                    	mov	esi, ebx
  1054 0000091C C0E302                  	shl	bl, 2
  1055 0000091F 81C3[50170000]          	add	ebx, ds_sec
  1056 00000925 8B03                    	mov	eax, [ebx]
  1057 00000927 81EB[50170000]          	sub	ebx, ds_sec
  1058 0000092D 81C3[98160000]                  add     ebx, drv_size 
  1059 00000933 3B03                    	cmp	eax, [ebx] ; Last sector + 1 (number of secs.)
  1060 00000935 F5                      	cmc
  1061 00000936 7247                            jc      short rd_lba_fails
  1062                                  	;
  1063 00000938 F6C601                  	test	dh, 1 ; LBA ready ?
  1064 0000093B 7443                            jz      short rd_chs
  1065                                  rd_lba:
  1066                                  	; LBA read (private function)
  1067                                  	;((Retro UNIX 386 v1 - DISK I/O Test))
  1068 0000093D 81C6[6E160000]          	add	esi, drv_status
  1069 00000943 80268F                  	and	byte [esi], 8Fh ; clear error bits
  1070                                  	;
  1071 00000946 89C3                    	mov	ebx, eax
  1072 00000948 6689D9                  	mov	cx, bx
  1073 0000094B C1EB10                  	shr	ebx, 16
  1074 0000094E BF[6C170000]                    mov     edi, sector_buffer
  1075 00000953 8A15[6D160000]          	mov	dl, [drv]
  1076 00000959 C605[6C160000]04        	mov	byte [retry_count], 4
  1077                                  rd_lba_retry:
  1078 00000960 B41B                    	mov	ah, 1Bh ; LBA read (private function)		
  1079 00000962 B001                    	mov	al, 1
  1080 00000964 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1081 00000966 7317                    	jnc	short rd_lba_ok
  1082                                  
  1083 00000968 80FC80                  	cmp	ah, 80h ; time out ?
  1084 0000096B 7411                    	je	short rd_lba_rfails
  1085 0000096D FE0D[6C160000]          	dec	byte [retry_count]
  1086 00000973 7409                    	jz	short rd_lba_rfails
  1087                                  	
  1088 00000975 B40D                    	mov	ah, 0Dh ; Alternate reset
  1089 00000977 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1090 00000979 73E5                            jnc     short rd_lba_retry
  1091 0000097B 800EF0                  	or	byte [esi], 0F0h ; drive not ready !
  1092                                  rd_lba_rfails:
  1093 0000097E F9                      	stc
  1094                                  rd_lba_fails:
  1095                                  rd_lba_ok:
  1096 0000097F C3                      	retn
  1097                                  	;
  1098                                  	; CHS read (convert LBA address to CHS values)	;	
  1099                                  rd_chs:
  1100 00000980 D1E6                    	shl	esi, 1
  1101 00000982 89F3                    	mov	ebx, esi
  1102 00000984 31D2                    	xor	edx, edx ; 0
  1103 00000986 29C9                    	sub	ecx, ecx 
  1104 00000988 81C3[8C160000]                  add     ebx, drv_spt
  1105 0000098E 668B0B                  	mov	cx, [ebx] ; sector per track
  1106                                                  ; EAX = sector address (LBA)
  1107 00000991 F7F1                    	div	ecx
  1108 00000993 88D1                    	mov	cl, dl	; sector number - 1
  1109 00000995 FEC1                    	inc	cl	; sector number (1 based)
  1110 00000997 6651                    	push	cx
  1111 00000999 89F3                    	mov	ebx, esi
  1112 0000099B 81C3[80160000]                  add     ebx, drv_heads
  1113 000009A1 668B0B                  	mov	cx, [ebx] ; heads
  1114 000009A4 31D2                    	xor	edx, edx
  1115                                  		; EAX = cylinders * heads + head
  1116 000009A6 F7F1                    	div	ecx
  1117 000009A8 6659                    	pop	cx     ; sector number
  1118 000009AA 88D6                    	mov	dh, dl ; head number
  1119 000009AC 8A15[6D160000]          	mov	dl, [drv]
  1120 000009B2 88C5                    	mov	ch, al ; cylinder (bits 0-7)
  1121 000009B4 C0E406                  	shl	ah, 6
  1122 000009B7 08E1                    	or	cl, ah ; cylinder (bits 8-9)
  1123                                  		       ; sector (bits 0-7)
  1124 000009B9 BB[6C170000]                    mov     ebx, sector_buffer
  1125                                  		; CL = sector (bits 0-6)
  1126                                  		;      cylinder (bits 7-8 -> bits 8-9)
  1127                                  		; CH = cylinder (bits 0-7)
  1128                                  		; DH = head
  1129                                  		; DL = drive
  1130                                  
  1131 000009BE D1EE                    	shr	esi, 1 ; drive index (byte alignment)
  1132 000009C0 81C6[6E160000]          	add	esi, drv_status
  1133 000009C6 80268F                  	and	byte [esi], 8Fh ; clear error bits
  1134                                  	;
  1135 000009C9 C605[6C160000]04        	mov	byte [retry_count], 4
  1136                                  rd_retry:	
  1137 000009D0 B402                    	mov	ah, 02h ; read sectors
  1138 000009D2 B001                    	mov	al, 1 ; sector count	
  1139 000009D4 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1140 000009D6 7320                    	jnc	short rd_ok
  1141 000009D8 80FC80                  	cmp	ah, 80h ; time out ?
  1142 000009DB 7408                    	je	short rd_rfails
  1143 000009DD FE0D[6C160000]          	dec	byte [retry_count]
  1144 000009E3 7502                    	jnz	short rd_reset
  1145                                  rd_rfails:
  1146 000009E5 F9                      	stc
  1147                                  rd_fails:
  1148 000009E6 C3                      	retn
  1149                                  rd_reset:
  1150 000009E7 28E4                    	sub	ah, ah
  1151 000009E9 80FA80                  	cmp	dl, 80h
  1152 000009EC 7202                    	jb	short rd_fd_reset
  1153 000009EE B40D                    	mov	ah, 0Dh ; Alternate reset
  1154                                  rd_fd_reset:
  1155 000009F0 CD33                    	int	33h	; TRDOS 386 disk io interrupt
  1156 000009F2 73DC                            jnc     short rd_retry
  1157 000009F4 800EF0                  	or	byte [esi], 0F0h ; drive not ready !
  1158 000009F7 F9                      	stc
  1159                                  rd_ok:
  1160 000009F8 C3                      	retn
  1161                                  
  1162                                  clear_screen:
  1163 000009F9 BF[74190000]            	mov	edi, video_buffer
  1164 000009FE B9D0070000              	mov	ecx, 80*25
  1165 00000A03 66B82007                        mov     ax, 0720h ; light gray char space (blank)
  1166 00000A07 F366AB                  	rep	stosw
  1167                                  
  1168 00000A0A E8B6FCFFFF              	call	video_page_update
  1169                                  
  1170 00000A0F 6631D2                          xor     dx, dx    ; column 0, row 0
  1171 00000A12 E97C0B0000              	jmp	set_cposx ; set cursor position
  1172                                  
  1173                                  rfdp_err:
  1174 00000A17 C3                      	retn
  1175                                  
  1176                                  dskprm:
  1177                                  	; DISPLAY DISK PARAMETERS TABLE
  1178                                  	;
  1179                                  	; INPUT -> DL = Disk/Drive #
  1180                                  	; 
  1181 00000A18 8815[6D160000]          	mov	byte [drv], dl  ; 0,1,80h,81h,82h,83h 
  1182                                  	;
  1183 00000A1E F6C280                  	test	dl, 80h
  1184 00000A21 7403                    	jz	short dskprm0
  1185 00000A23 80EA7E                  	sub	dl, 7Eh ; hd0 = 2
  1186                                  dskprm0:
  1187 00000A26 0FB6DA                  	movzx	ebx, dl
  1188 00000A29 81C3[6E160000]          	add	ebx, drv_status
  1189                                  
  1190 00000A2F 803B80                  	cmp	byte [ebx], 80h  ; existing ?
  1191 00000A32 72E3                    	jb	short rfdp_err
  1192                                  	;
  1193 00000A34 E8C0FFFFFF              	call	clear_screen	 ; clear video page 0	
  1194                                  	;
  1195 00000A39 8A1D[6D160000]                  mov	bl, [drv]
  1196 00000A3F F6C380                  	test	bl, 80h
  1197 00000A42 0F85F7000000                    jnz     print_hdpt
  1198                                  
  1199 00000A48 0FB6F3                  	movzx	esi, bl
  1200 00000A4B 80C330                  	add	bl, 30h	; '0'
  1201 00000A4E 881D[4D0D0000]          	mov	byte [flpdnum], bl
  1202 00000A54 81C6[30160000]          	add	esi, fd0_type
  1203 00000A5A 8A06                    	mov	al, [esi]
  1204 00000A5C A2[840D0000]                    mov     byte [flpdtype], al 
  1205                                                                     ; floppy disk drive type
  1206                                  				   ; (1=360K, 2=1.2M, 3=720K, 4=1.44M)
  1207                                  print_flpdpt:
  1208                                  	; Writing the Diskette Parameter Table on screen
  1209 00000A61 C0E304                  	shl	bl, 4 ; * 16
  1210 00000A64 0FB6F3                  	movzx	esi, bl
  1211 00000A67 81C6[B0160000]          	add	esi, fd0_dpt
  1212 00000A6D AC                      	lodsb 	; bits 0-3: SRT step rate time
  1213                                  		; bits 4-7: head unload time
  1214 00000A6E BF[CE0D0000]            	mov	edi, rSrtHdUnld
  1215 00000A73 E8AC000000              	call	write_hex
  1216 00000A78 AC                      	lodsb 	; bit 0: 1=use DMA
  1217                                  		; bits 2-7: head load time
  1218 00000A79 BF[160E0000]            	mov	edi, rDmaHdLd
  1219 00000A7E E8A1000000              	call	write_hex
  1220 00000A83 AC                      	lodsb 	; 55-ms increments 
  1221                                  		; before turning disk motor off
  1222 00000A84 BF[5D0E0000]            	mov	edi, bMotorOff
  1223 00000A89 E896000000              	call	write_hex
  1224 00000A8E AC                      	lodsb 	; sector size
  1225                                  		; (0=128, 1=256, 2=512, 3=1024)
  1226 00000A8F BF[A20E0000]            	mov	edi, bSectSize
  1227 00000A94 E88B000000              	call	write_hex
  1228 00000A99 AC                      	lodsb 	; EOT (last sector on a track)
  1229 00000A9A BF[CE0E0000]            	mov	edi, bLastTrack
  1230 00000A9F E880000000              	call	write_hex
  1231 00000AA4 AC                      	lodsb 	; gap length 
  1232                                  		; for read/write operations
  1233 00000AA5 BF[EA0E0000]            	mov	edi, bGapLen
  1234 00000AAA E875000000              	call	write_hex
  1235 00000AAF AC                      	lodsb 	; DTL (Data Transfer Length)
  1236                                  		; max transfer when length not set	
  1237 00000AB0 BF[060F0000]            	mov	edi, bDTL
  1238 00000AB5 E86A000000              	call	write_hex
  1239 00000ABA AC                      	lodsb 	; gap length for format operation
  1240 00000ABB BF[220F0000]            	mov	edi, bGapFmt
  1241 00000AC0 E85F000000              	call	write_hex
  1242 00000AC5 AC                      	lodsb 	; fill character for format 
  1243                                  		; (normally F6H)
  1244 00000AC6 BF[3E0F0000]            	mov	edi, bFillChar
  1245 00000ACB E854000000              	call	write_hex
  1246 00000AD0 AC                      	lodsb 	; head-settle time
  1247                                  		; (in milliseconds)
  1248 00000AD1 BF[690F0000]            	mov	edi, bHdSettle
  1249 00000AD6 E849000000              	call	write_hex
  1250 00000ADB AC                      	lodsb 	; motor-startup time
  1251                                  		; (in 1/8th-second intervals)
  1252 00000ADC BF[920F0000]            	mov	edi, bMotorOn
  1253 00000AE1 E83E000000              	call	write_hex
  1254                                  	;
  1255                                  	; (extension, not in original bios function)
  1256 00000AE6 AC                      	lodsb	; Max. track number
  1257 00000AE7 BF[CC0F0000]            	mov	edi, bMaxTrack
  1258 00000AEC E833000000              	call	write_hex
  1259 00000AF1 AC                      	lodsb	; Data transfer rate
  1260 00000AF2 BF[E80F0000]            	mov	edi, bDataRate
  1261 00000AF7 E828000000              	call	write_hex
  1262                                  	;
  1263 00000AFC A0[6D160000]            	mov	al, [drv]
  1264 00000B01 0430                    	add	al, 30h ; '0'
  1265 00000B03 A2[4D0D0000]                    mov     byte [flpdnum], al
  1266 00000B08 BE[450D0000]                    mov     esi, FLPDPT
  1267 00000B0D E81F020000              	call	print_msg
  1268 00000B12 C3                      	retn
  1269                                  
  1270                                  write_dhex:
  1271 00000B13 88E3                    	mov	bl, ah
  1272 00000B15 C0EB04                          shr     bl, 4
  1273 00000B18 E813000000                      call    dhgd
  1274 00000B1D 88E3                    	mov	bl, ah
  1275 00000B1F E80C000000              	call	dhgd
  1276                                  
  1277                                  write_hex:
  1278 00000B24 88C3                    	mov	bl, al
  1279 00000B26 C0EB04                          shr     bl, 4
  1280 00000B29 E802000000              	call	dhgd
  1281 00000B2E 88C3                    	mov	bl, al
  1282                                  	;call	dhgd
  1283                                  	;retn
  1284                                  dhgd:
  1285 00000B30 50                      	push	eax
  1286 00000B31 83E30F                  	and	ebx, 0Fh
  1287 00000B34 81C3[24140000]                  add     ebx, hex_digits
  1288 00000B3A 8A03                            mov     al, [ebx]
  1289 00000B3C AA                      	stosb
  1290 00000B3D 58                      	pop	eax
  1291 00000B3E C3                      	retn
  1292                                  
  1293                                  print_hdpt:
  1294                                  	;mov	bl, [drv]
  1295 00000B3F 80E303                  	and	bl, 3
  1296 00000B42 88D8                    	mov	al, bl
  1297 00000B44 0402                    	add	al, 2
  1298 00000B46 A2[34140000]            	mov	[ds_drv], al
  1299                                  	;
  1300 00000B4B C0E305                  	shl	bl, 5 ; * 32
  1301 00000B4E 0FB6F3                  	movzx	esi, bl
  1302 00000B51 81C6[D0160000]          	add	esi, hd0_dpt  
  1303                                  	;
  1304 00000B57 807E03A0                	cmp	byte [esi+3], 0A0h ; Translated table
  1305 00000B5B 0F84EB000000                    je      print_thdpt       ; indicator
  1306                                  	;
  1307                                  	; Writing Fixed Disk Parameter Table on screen
  1308 00000B61 66AD                    	lodsw 	; Number of Cylinders
  1309 00000B63 BF[5B100000]            	mov	edi, cylnum
  1310 00000B68 E8A6FFFFFF              	call	write_dhex
  1311 00000B6D AC                      	lodsb	; Number of Heads
  1312 00000B6E BF[78100000]            	mov	edi, headnum
  1313 00000B73 E8ACFFFFFF              	call	write_hex
  1314 00000B78 AC                      	lodsb	; Reserved
  1315 00000B79 BF[93100000]            	mov	edi, rsvd3
  1316 00000B7E E8A1FFFFFF              	call	write_hex
  1317 00000B83 AC                      	lodsb	; Reserved
  1318 00000B84 BF[AE100000]            	mov	edi, rsvd4
  1319 00000B89 E896FFFFFF              	call	write_hex
  1320 00000B8E 66AD                    	lodsw	; Precompensation (Obsolete)
  1321 00000B90 BF[C9100000]            	mov	edi, pcompnum
  1322 00000B95 E879FFFFFF              	call	write_dhex
  1323 00000B9A AC                      	lodsb	; Reserved
  1324 00000B9B BF[E6100000]            	mov	edi, rsvd7
  1325 00000BA0 E87FFFFFFF              	call	write_hex
  1326 00000BA5 AC                      	lodsb	; Drive Control Byte
  1327 00000BA6 BF[01110000]            	mov	edi, dcbnum
  1328 00000BAB E874FFFFFF              	call	write_hex
  1329 00000BB0 66AD                    	lodsw	; Reserved
  1330 00000BB2 BF[1C110000]            	mov	edi, rsvd9
  1331 00000BB7 E857FFFFFF              	call	write_dhex
  1332 00000BBC AC                      	lodsb	; Reserved
  1333 00000BBD BF[39110000]            	mov	edi, rsvd11
  1334 00000BC2 E85DFFFFFF              	call	write_hex
  1335 00000BC7 66AD                    	lodsw	; Landing Zone (Obsolete)
  1336 00000BC9 BF[54110000]            	mov	edi, lzonenum
  1337 00000BCE E840FFFFFF              	call	write_dhex
  1338 00000BD3 AC                      	lodsb	; Sectors per Track
  1339 00000BD4 BF[71110000]            	mov	edi, psptnum
  1340 00000BD9 E846FFFFFF              	call	write_hex
  1341 00000BDE AC                      	lodsb	; Reserved
  1342 00000BDF BF[8C110000]            	mov	edi, rsvd15
  1343 00000BE4 E83BFFFFFF              	call	write_hex
  1344                                  	;
  1345                                  	; (extension, not in original bios function)
  1346 00000BE9 66AD                    	lodsw	; I/O Port Base Address
  1347 00000BEB BF[A9110000]            	mov	edi, bPortAddr
  1348 00000BF0 E81EFFFFFF              	call	write_dhex
  1349                                  	; 06/01/2015
  1350 00000BF5 66AD                    	lodsw	; Control Port Address
  1351 00000BF7 BF[C6110000]            	mov	edi, cPortAddr
  1352 00000BFC E812FFFFFF              	call	write_dhex
  1353 00000C01 AC                      	lodsb	; Head Register Upper Nibble 
  1354 00000C02 BF[E3110000]            	mov	edi, hregupnib
  1355 00000C07 E818FFFFFF              	call	write_hex
  1356                                  	;
  1357 00000C0C A0[34140000]            	mov     al, [ds_drv]
  1358 00000C11 88C3                    	mov	bl, al
  1359 00000C13 0430                    	add	al, '0'
  1360 00000C15 A2[23100000]                    mov     [dsknum], al
  1361                                  	;	      
  1362 00000C1A C0E302                  	shl	bl, 2
  1363 00000C1D 0FB6F3                  	movzx	esi, bl
  1364 00000C20 81C6[98160000]                  add     esi, drv_size
  1365 00000C26 668B4602                	mov	ax, [esi+2]
  1366 00000C2A BF[00120000]                    mov     edi, disksize
  1367 00000C2F E8DFFEFFFF              	call	write_dhex
  1368 00000C34 668B06                  	mov	ax, [esi]
  1369 00000C37 BF[04120000]            	mov	edi, disksize+4
  1370 00000C3C E8D2FEFFFF              	call	write_dhex	
  1371                                  	;
  1372 00000C41 BE[1B100000]                    mov     esi, HDPT
  1373 00000C46 E8E6000000              	call	print_msg
  1374 00000C4B C3                      	retn
  1375                                  
  1376                                  print_thdpt:
  1377                                  	; Writing the Translated FDPT on screen
  1378                                  	; (PHOENIX - EDD specification v1.1)
  1379 00000C4C 66AD                    	lodsw 	; Logical Numbers of Cylinders, Limit 1024
  1380 00000C4E BF[59120000]            	mov	edi, lcylnum
  1381 00000C53 E8BBFEFFFF              	call	write_dhex
  1382 00000C58 AC                      	lodsb	; Logical Numbers of Heads, Limit 256
  1383 00000C59 BF[76120000]            	mov	edi, lheadnum
  1384 00000C5E E8C1FEFFFF              	call	write_hex
  1385 00000C63 AC                      	lodsb	; A0h signature, indicates translated table
  1386 00000C64 BF[91120000]            	mov	edi, tsignum
  1387 00000C69 E8B6FEFFFF              	call	write_hex
  1388 00000C6E AC                      	lodsb	; Physical Sectors per Track
  1389 00000C6F BF[AC120000]            	mov	edi, tpsptnum
  1390 00000C74 E8ABFEFFFF              	call	write_hex
  1391 00000C79 66AD                    	lodsw	; Precompensation (Obsolete)
  1392 00000C7B BF[C7120000]            	mov	edi, tpcompnum
  1393 00000C80 E88EFEFFFF              	call	write_dhex
  1394 00000C85 AC                      	lodsb	; Reserved
  1395 00000C86 BF[F0120000]            	mov	edi, trsvd7
  1396 00000C8B E894FEFFFF              	call	write_hex
  1397 00000C90 AC                      	lodsb	; Drive Control Byte
  1398 00000C91 BF[0B130000]            	mov	edi, tdcbnum
  1399 00000C96 E889FEFFFF              	call	write_hex
  1400 00000C9B 66AD                    	lodsw	; Physical Cylinders, limit 65536
  1401 00000C9D BF[26130000]            	mov	edi, tpcylnum
  1402 00000CA2 E86CFEFFFF              	call	write_dhex
  1403 00000CA7 AC                      	lodsb	; Physical Heads, limit 16
  1404 00000CA8 BF[43130000]            	mov	edi, tpheadnum
  1405 00000CAD E872FEFFFF              	call	write_hex
  1406 00000CB2 66AD                    	lodsw	; Landing Zone (Obsolete)
  1407 00000CB4 BF[5E130000]            	mov	edi, tlzonenum
  1408 00000CB9 E855FEFFFF              	call	write_dhex
  1409 00000CBE AC                      	lodsb	; Logical Sectors per Track, Limit 63
  1410 00000CBF BF[87130000]            	mov	edi, lsptnum
  1411 00000CC4 E85BFEFFFF              	call	write_hex
  1412 00000CC9 AC                      	lodsb	; Checksum for translated FDPT 
  1413 00000CCA BF[A2130000]            	mov	edi, checksum
  1414 00000CCF E850FEFFFF              	call	write_hex
  1415                                  	;
  1416                                  	; (extension, not in original bios function)
  1417 00000CD4 66AD                    	lodsw	; I/O Port Base Address
  1418 00000CD6 BF[BF130000]            	mov	edi, tbPortAddr
  1419 00000CDB E833FEFFFF              	call	write_dhex
  1420                                  	; 06/01/2015
  1421 00000CE0 66AD                    	lodsw	; Control Port Address
  1422 00000CE2 BF[DC130000]            	mov	edi, tcPortAddr
  1423 00000CE7 E827FEFFFF              	call	write_dhex
  1424 00000CEC AC                      	lodsb	; Head Register Upper Nibble 
  1425 00000CED BF[F9130000]            	mov	edi, thregupnib
  1426 00000CF2 E82DFEFFFF              	call	write_hex
  1427                                  	;
  1428 00000CF7 A0[34140000]            	mov     al, [ds_drv]
  1429 00000CFC 88C3                    	mov	bl, al
  1430 00000CFE 0430                    	add	al, '0'
  1431 00000D00 A2[16120000]                    mov     [tdsknum], al
  1432                                  	;  
  1433 00000D05 C0E302                  	shl	bl, 2
  1434 00000D08 0FB6F3                  	movzx	esi, bl
  1435 00000D0B 81C6[98160000]                  add     esi, drv_size
  1436 00000D11 668B4602                	mov	ax, [esi+2]
  1437 00000D15 BF[16140000]            	mov	edi, tdisksize
  1438 00000D1A E8F4FDFFFF              	call	write_dhex
  1439 00000D1F 668B06                  	mov	ax, [esi]
  1440 00000D22 BF[1A140000]            	mov	edi, tdisksize+4
  1441 00000D27 E8E7FDFFFF              	call	write_dhex	
  1442                                  	;
  1443 00000D2C BE[0E120000]            	mov     esi, THDPT
  1444                                  	;call	print_msg
  1445                                  	;retn
  1446                                  
  1447                                  print_msg:
  1448 00000D31 66BB0700                	mov	bx, 7
  1449 00000D35 B40E                            mov     ah, 0Eh
  1450                                  pmsg_loop:
  1451 00000D37 AC                      	lodsb
  1452 00000D38 20C0                    	and	al, al
  1453 00000D3A 7404                    	jz	short pmsg_ok
  1454 00000D3C CD31                    	int	31h	; TRDOS 386 video interrupt
  1455 00000D3E EBF7                    	jmp	short pmsg_loop	
  1456                                  pmsg_ok:
  1457 00000D40 B410                    	mov	ah, 10h ; Getchar
  1458 00000D42 CD32                    	int	32h	; TRDOS 386 keyboard interrupt
  1459 00000D44 C3                      	retn
  1460                                  ;
  1461                                  FLPDPT:
  1462 00000D45 07                      	db 07h
  1463 00000D46 0D0A                    	db 0Dh, 0Ah	
  1464 00000D48 4469736B20              	db 'Disk '
  1465                                  flpdnum:
  1466 00000D4D 58202D20                	db 'X - '
  1467 00000D51 4449534B4554544520-     	db 'DISKETTE PARAMETER TABLE'
  1467 00000D5A 504152414D45544552-
  1467 00000D63 205441424C45       
  1468 00000D69 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah
  1469 00000D6D 547970652020202020-     	db 'Type                 : '
  1469 00000D76 202020202020202020-
  1469 00000D7F 2020203A20         
  1470                                  flpdtype:
  1471 00000D84 58202020                	db 'X   '
  1472 00000D88 5B2031203D20333630-     	db '[ 1 = 360K, 2 = 1.2M, 3 = 720K, 4 = 1.44M ]'
  1472 00000D91 4B2C2032203D20312E-
  1472 00000D9A 324D2C2033203D2037-
  1472 00000DA3 32304B2C2034203D20-
  1472 00000DAC 312E34344D205D     
  1473 00000DB3 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1474 00000DB7 535254202D20486561-     	db 'SRT - Head Unld Time : '
  1474 00000DC0 6420556E6C64205469-
  1474 00000DC9 6D65203A20         
  1475                                  rSrtHdUnld:
  1476 00000DCE 585868202862697473-     	db 'XXh (bits 0-3: SRT, bits 4-7: head unload time)'
  1476 00000DD7 20302D333A20535254-
  1476 00000DE0 2C206269747320342D-
  1476 00000DE9 373A20686561642075-
  1476 00000DF2 6E6C6F61642074696D-
  1476 00000DFB 6529               
  1477 00000DFD 0D0A                    	db 0Dh, 0Ah
  1478 00000DFF 444D41202D20486561-     	db 'DMA - Head Load Time : '
  1478 00000E08 64204C6F6164205469-
  1478 00000E11 6D65203A20         
  1479                                  rDmaHdLd:
  1480 00000E16 585868202862697420-     	db 'XXh (bit 0: 1 = DMA, bits 2-7: head load time)'
  1480 00000E1F 303A2031203D20444D-
  1480 00000E28 412C20626974732032-
  1480 00000E31 2D373A206865616420-
  1480 00000E3A 6C6F61642074696D65-
  1480 00000E43 29                 
  1481 00000E44 0D0A                    	db 0Dh, 0Ah
  1482 00000E46 4D6F746F72204F6666-     	db 'Motor Off Count      : '
  1482 00000E4F 20436F756E74202020-
  1482 00000E58 2020203A20         
  1483                                  bMotorOff:
  1484 00000E5D 585868202877697468-     	db 'XXh (with 55ms icrements before turning off)'
  1484 00000E66 2035356D7320696372-
  1484 00000E6F 656D656E7473206265-
  1484 00000E78 666F7265207475726E-
  1484 00000E81 696E67206F666629   
  1485 00000E89 0D0A                    	db 0Dh, 0Ah
  1486 00000E8B 536563746F72205369-     	db 'Sector Size          : '
  1486 00000E94 7A6520202020202020-
  1486 00000E9D 2020203A20         
  1487                                  bSectSize:
  1488 00000EA2 585868202832203D20-     	db 'XXh (2 = 512 bytes)'
  1488 00000EAB 353132206279746573-
  1488 00000EB4 29                 
  1489 00000EB5 0D0A                    	db 0Dh, 0Ah	
  1490 00000EB7 4C6173742053656374-     	db 'Last Sect on a Track : '
  1490 00000EC0 206F6E206120547261-
  1490 00000EC9 636B203A20         
  1491                                  bLastTrack:
  1492 00000ECE 585868                  	db 'XXh'
  1493 00000ED1 0D0A                    	db 0Dh, 0Ah
  1494 00000ED3 476170204C656E6774-     	db 'Gap Length  (R/W)    : '
  1494 00000EDC 68202028522F572920-
  1494 00000EE5 2020203A20         
  1495                                  bGapLen:
  1496 00000EEA 585868                  	db 'XXh'
  1497 00000EED 0D0A                    	db 0Dh, 0Ah
  1498 00000EEF 44617461205472616E-     	db 'Data Transfer Length : '
  1498 00000EF8 73666572204C656E67-
  1498 00000F01 7468203A20         
  1499                                  bDTL:
  1500 00000F06 585868                  	db 'XXh'
  1501 00000F09 0D0A                    	db 0Dh, 0Ah		
  1502 00000F0B 476170204C656E6774-     	db 'Gap Length (Format)  : '
  1502 00000F14 682028466F726D6174-
  1502 00000F1D 2920203A20         
  1503                                  bGapFmt:
  1504 00000F22 585868                  	db 'XXh'
  1505 00000F25 0D0A                    	db 0Dh, 0Ah
  1506 00000F27 46696C6C2043686172-     	db 'Fill Char for format : '
  1506 00000F30 20666F7220666F726D-
  1506 00000F39 6174203A20         
  1507                                  bFillChar:
  1508 00000F3E 58586820286E6F726D-     	db 'XXh (normally F6h)'
  1508 00000F47 616C6C792046366829 
  1509 00000F50 0D0A                    	db 0Dh, 0Ah
  1510 00000F52 486561642053657474-     	db 'Head Settle Time     : '
  1510 00000F5B 6C652054696D652020-
  1510 00000F64 2020203A20         
  1511                                  bHdSettle:
  1512 00000F69 585868206D696C6C69-     	db 'XXh milliseconds'
  1512 00000F72 7365636F6E6473     
  1513 00000F79 0D0A                    	db 0Dh, 0Ah
  1514 00000F7B 4D6F746F7220537461-     	db 'Motor Startup Time   : '
  1514 00000F84 727475702054696D65-
  1514 00000F8D 2020203A20         
  1515                                  bMotorOn:
  1516 00000F92 5858682028696E2031-     	db 'XXh (in 1/8th second intervals)'
  1516 00000F9B 2F387468207365636F-
  1516 00000FA4 6E6420696E74657276-
  1516 00000FAD 616C7329           
  1517 00000FB1 0D0A                    	db 0Dh, 0Ah
  1518                                  	; 19/12/2014
  1519 00000FB3 0D0A                    	db 0Dh, 0Ah
  1520 00000FB5 4D6178696D756D2054-     	db 'Maximum Track Number : '
  1520 00000FBE 7261636B204E756D62-
  1520 00000FC7 6572203A20         
  1521                                  bMaxTrack:
  1522 00000FCC 585868                  	db 'XXh'
  1523 00000FCF 0D0A                    	db 0Dh, 0Ah
  1524 00000FD1 44617461205472616E-     	db 'Data Transfer Rate   : '
  1524 00000FDA 736665722052617465-
  1524 00000FE3 2020203A20         
  1525                                  bDataRate:
  1526 00000FE8 585868202830306820-     	db 'XXh (00h = 500KBS, 40h = 300KBS, 80H = 250KBS)'
  1526 00000FF1 3D203530304B42532C-
  1526 00000FFA 20343068203D203330-
  1526 00001003 304B42532C20383048-
  1526 0000100C 203D203235304B4253-
  1526 00001015 29                 
  1527 00001016 0D0A                    	db 0Dh, 0Ah
  1528 00001018 0D0A00                  	db 0Dh, 0Ah, 0
  1529                                  
  1530                                  HDPT:
  1531 0000101B 07                      	db 07h
  1532 0000101C 0D0A                    	db 0Dh, 0Ah
  1533 0000101E 4469736B20              	db 'Disk '
  1534                                  dsknum:
  1535 00001023 58202D20                	db 'X - '	
  1536 00001027 464958454420444953-     	db 'FIXED DISK PARAMETER TABLE'
  1536 00001030 4B20504152414D4554-
  1536 00001039 4552205441424C45   
  1537 00001041 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1538 00001045 4E756D626572206F66-     	db 'Number of Cylinders : '
  1538 0000104E 2043796C696E646572-
  1538 00001057 73203A20           
  1539                                  cylnum:
  1540 0000105B 5858585868              	db 'XXXXh'
  1541 00001060 0D0A                    	db 0Dh, 0Ah
  1542 00001062 4E756D626572206F66-     	db 'Number of Heads     : '
  1542 0000106B 204865616473202020-
  1542 00001074 20203A20           
  1543                                  headnum:
  1544 00001078 585868                  	db 'XXh'
  1545 0000107B 0D0A                    	db 0Dh, 0Ah
  1546 0000107D 526573657276656420-     	db 'Reserved            : '
  1546 00001086 202020202020202020-
  1546 0000108F 20203A20           
  1547                                  rsvd3:
  1548 00001093 585868                  	db 'XXh'
  1549 00001096 0D0A                    	db 0Dh, 0Ah
  1550 00001098 526573657276656420-     	db 'Reserved            : '
  1550 000010A1 202020202020202020-
  1550 000010AA 20203A20           
  1551                                  rsvd4:
  1552 000010AE 585868                  	db 'XXh'
  1553 000010B1 0D0A                    	db 0Dh, 0Ah	
  1554 000010B3 507265636F6D70656E-     	db 'Precompensation     : '
  1554 000010BC 736174696F6E202020-
  1554 000010C5 20203A20           
  1555                                  pcompnum:
  1556 000010C9 5858585868              	db 'XXXXh'
  1557 000010CE 0D0A                    	db 0Dh, 0Ah
  1558 000010D0 526573657276656420-     	db 'Reserved            : '
  1558 000010D9 202020202020202020-
  1558 000010E2 20203A20           
  1559                                  rsvd7:
  1560 000010E6 585868                  	db 'XXh'
  1561 000010E9 0D0A                    	db 0Dh, 0Ah
  1562 000010EB 447269766520436F6E-     	db 'Drive Control Byte  : '
  1562 000010F4 74726F6C2042797465-
  1562 000010FD 20203A20           
  1563                                  dcbnum:
  1564 00001101 585868                  	db 'XXh'
  1565 00001104 0D0A                    	db 0Dh, 0Ah		
  1566 00001106 526573657276656420-     	db 'Reserved            : '
  1566 0000110F 202020202020202020-
  1566 00001118 20203A20           
  1567                                  rsvd9:
  1568 0000111C 5858585868              	db 'XXXXh'
  1569 00001121 0D0A                    	db 0Dh, 0Ah
  1570 00001123 526573657276656420-     	db 'Reserved            : '
  1570 0000112C 202020202020202020-
  1570 00001135 20203A20           
  1571                                  rsvd11:
  1572 00001139 585868                  	db 'XXh'
  1573 0000113C 0D0A                    	db 0Dh, 0Ah
  1574 0000113E 4C616E64696E67205A-     	db 'Landing Zone        : '
  1574 00001147 6F6E65202020202020-
  1574 00001150 20203A20           
  1575                                  lzonenum:
  1576 00001154 5858585868              	db 'XXXXh'
  1577 00001159 0D0A                    	db 0Dh, 0Ah
  1578 0000115B 536563746F72732070-     	db 'Sectors per Track   : '
  1578 00001164 657220547261636B20-
  1578 0000116D 20203A20           
  1579                                  psptnum:
  1580 00001171 585868                  	db 'XXh'
  1581 00001174 0D0A                    	db 0Dh, 0Ah
  1582 00001176 526573657276656420-     	db 'Reserved            : '
  1582 0000117F 202020202020202020-
  1582 00001188 20203A20           
  1583                                  rsvd15:
  1584 0000118C 585868                  	db 'XXh'
  1585 0000118F 0D0A                    	db 0Dh, 0Ah
  1586 00001191 0D0A                    	db 0Dh, 0Ah
  1587 00001193 492F4F20506F727420-     	db 'I/O Port Base Addr  : '
  1587 0000119C 426173652041646472-
  1587 000011A5 20203A20           
  1588                                  bPortAddr:
  1589 000011A9 5858585868              	db 'XXXXh'
  1590 000011AE 0D0A                    	db 0Dh, 0Ah
  1591 000011B0 436F6E74726F6C2050-     	db 'Control Port Addr   : '
  1591 000011B9 6F7274204164647220-
  1591 000011C2 20203A20           
  1592                                  cPortAddr:
  1593 000011C6 5858585868              	db 'XXXXh'
  1594 000011CB 0D0A                    	db 0Dh, 0Ah
  1595 000011CD 486561642052656720-     	db 'Head Reg Upp Nibb   : '
  1595 000011D6 557070204E69626220-
  1595 000011DF 20203A20           
  1596                                  hregupnib:
  1597 000011E3 585868                  	db 'XXh'
  1598 000011E6 0D0A                    	db 0Dh, 0Ah
  1599 000011E8 0D0A                    	db 0Dh, 0Ah
  1600 000011EA 53697A652028696E20-     	db 'Size (in sectors)   : '
  1600 000011F3 736563746F72732920-
  1600 000011FC 20203A20           
  1601                                  disksize:
  1602 00001200 585858585858585868      	db 'XXXXXXXXh'
  1603 00001209 0D0A                    	db 0Dh, 0Ah
  1604 0000120B 0D0A00                  	db 0Dh, 0Ah, 0
  1605                                  
  1606                                  THDPT:
  1607 0000120E 07                      	db 07h
  1608 0000120F 0D0A                    	db 0Dh, 0Ah
  1609 00001211 4469736B20              	db 'Disk '
  1610                                  tdsknum:
  1611 00001216 58202D20                	db 'X - '	
  1612 0000121A 5452414E534C415445-     	db 'TRANSLATED FIXED DISK PARAMETER TABLE'
  1612 00001223 442046495845442044-
  1612 0000122C 49534B20504152414D-
  1612 00001235 45544552205441424C-
  1612 0000123E 45                 
  1613 0000123F 0D0A0D0A                	db 0Dh, 0Ah, 0DH, 0Ah 
  1614 00001243 4C6F676963616C2043-     	db 'Logical Cylinders   : '
  1614 0000124C 796C696E6465727320-
  1614 00001255 20203A20           
  1615                                  lcylnum:
  1616 00001259 5858585868              	db 'XXXXh'
  1617 0000125E 0D0A                    	db 0Dh, 0Ah
  1618 00001260 4C6F676963616C2048-     	db 'Logical Heads       : '
  1618 00001269 656164732020202020-
  1618 00001272 20203A20           
  1619                                  lheadnum:
  1620 00001276 585868                  	db 'XXh'
  1621 00001279 0D0A                    	db 0Dh, 0Ah
  1622 0000127B 5369676E6174757265-     	db 'Signature           : '
  1622 00001284 202020202020202020-
  1622 0000128D 20203A20           
  1623                                  tsignum:
  1624 00001291 585868                  	db 'XXh'
  1625 00001294 0D0A                    	db 0Dh, 0Ah
  1626 00001296 506879205365632070-     	db 'Phy Sec per Track   : '
  1626 0000129F 657220547261636B20-
  1626 000012A8 20203A20           
  1627                                  tpsptnum:
  1628 000012AC 585868                  	db 'XXh'
  1629 000012AF 0D0A                    	db 0Dh, 0Ah	
  1630 000012B1 507265636F6D70656E-     	db 'Precompensation     : '
  1630 000012BA 736174696F6E202020-
  1630 000012C3 20203A20           
  1631                                  tpcompnum:
  1632 000012C7 58585858682020284F-     	db 'XXXXh  (Obsolete)'
  1632 000012D0 62736F6C65746529   
  1633 000012D8 0D0A                    	db 0Dh, 0Ah
  1634 000012DA 526573657276656420-     	db 'Reserved            : '
  1634 000012E3 202020202020202020-
  1634 000012EC 20203A20           
  1635                                  trsvd7:
  1636 000012F0 585868                  	db 'XXh'
  1637 000012F3 0D0A                    	db 0Dh, 0Ah
  1638 000012F5 447269766520436F6E-     	db 'Drive Control Byte  : '
  1638 000012FE 74726F6C2042797465-
  1638 00001307 20203A20           
  1639                                  tdcbnum:
  1640 0000130B 585868                  	db 'XXh'
  1641 0000130E 0D0A                    	db 0Dh, 0Ah		
  1642 00001310 506879736963616C20-     	db 'Physical Cylinders  : '
  1642 00001319 43796C696E64657273-
  1642 00001322 20203A20           
  1643                                  tpcylnum:
  1644 00001326 5858585868              	db 'XXXXh'
  1645 0000132B 0D0A                    	db 0Dh, 0Ah
  1646 0000132D 506879736963616C20-     	db 'Physical Heads      : '
  1646 00001336 486561647320202020-
  1646 0000133F 20203A20           
  1647                                  tpheadnum:
  1648 00001343 585868                  	db 'XXh'
  1649 00001346 0D0A                    	db 0Dh, 0Ah
  1650 00001348 4C616E64696E67205A-     	db 'Landing Zone        : '
  1650 00001351 6F6E65202020202020-
  1650 0000135A 20203A20           
  1651                                  tlzonenum:
  1652 0000135E 58585858682020284F-     	db 'XXXXh  (Obsolete)'
  1652 00001367 62736F6C65746529   
  1653 0000136F 0D0A                    	db 0Dh, 0Ah
  1654 00001371 4C6F67696320536563-     	db 'Logic Sec per Trk   : '
  1654 0000137A 207065722054726B20-
  1654 00001383 20203A20           
  1655                                  lsptnum:
  1656 00001387 585868                  	db 'XXh'
  1657 0000138A 0D0A                    	db 0Dh, 0Ah
  1658 0000138C 436865636B73756D20-     	db 'Checksum            : '
  1658 00001395 202020202020202020-
  1658 0000139E 20203A20           
  1659                                  checksum:
  1660 000013A2 585868                  	db 'XXh'
  1661 000013A5 0D0A                    	db 0Dh, 0Ah
  1662 000013A7 0D0A                    	db 0Dh, 0Ah
  1663 000013A9 492F4F20506F727420-     	db 'I/O Port Base Addr  : '
  1663 000013B2 426173652041646472-
  1663 000013BB 20203A20           
  1664                                  tbPortAddr:
  1665 000013BF 5858585868              	db 'XXXXh'
  1666 000013C4 0D0A                    	db 0Dh, 0Ah
  1667 000013C6 436F6E74726F6C2050-     	db 'Control Port Addr   : '
  1667 000013CF 6F7274204164647220-
  1667 000013D8 20203A20           
  1668                                  tcPortAddr:
  1669 000013DC 5858585868              	db 'XXXXh'
  1670 000013E1 0D0A                    	db 0Dh, 0Ah
  1671 000013E3 486561642052656720-     	db 'Head Reg Upp Nibb   : '
  1671 000013EC 557070204E69626220-
  1671 000013F5 20203A20           
  1672                                  thregupnib:
  1673 000013F9 585868                  	db 'XXh'
  1674 000013FC 0D0A                    	db 0Dh, 0Ah
  1675 000013FE 0D0A                    	db 0Dh, 0Ah
  1676 00001400 53697A652028696E20-     	db 'Size (in sectors)   : '
  1676 00001409 736563746F72732920-
  1676 00001412 20203A20           
  1677                                  tdisksize:
  1678 00001416 585858585858585868      	db 'XXXXXXXXh'
  1679 0000141F 0D0A                    	db 0Dh, 0Ah
  1680 00001421 0D0A00                  	db 0Dh, 0Ah, 0
  1681                                  
  1682                                  hex_digits:
  1683                                  hexchrs:
  1684 00001424 303132333435363738-     	db '0123456789ABCDEF'
  1684 0000142D 39414243444546     
  1685                                  
  1686                                  ds_drv:
  1687 00001434 FF                      	db 0FFh ; Current drive (on display)
  1688 00001435 00                       	db 0    ; Current half (0 or >0)
  1689                                  
  1690                                  drv_names:
  1691 00001436 666430206664312068-     	db 'fd0 fd1 hd0 hd1 hd2 hd3 '
  1691 0000143F 643020686431206864-
  1691 00001448 322068643320       
  1692                                  
  1693                                  dpheader:
  1694 0000144E 204472697665203A20      	db ' Drive : '
  1695                                  drv_name:
  1696 00001457 3030302020              	db '000  '
  1697 0000145C 536563746F72203A20      	db  'Sector : '
  1698                                  sector_num:
  1699 00001465 464646464646464668      	db  'FFFFFFFFh'
  1700 0000146E 00                              db 0
  1701                                  
  1702                                  sdline:
  1703 0000146F 204279746520            	db ' Byte '
  1704                                  sdline_1:
  1705 00001475 30303068                	db '000h'
  1706 00001479 202D2020                	db ' -  '
  1707                                  sdline_2:
  1708 0000147D 303020303020303020-     	db '00 00 00 00 00 00 00 00 '
  1708 00001486 303020303020303020-
  1708 0000148F 303020303020       
  1709 00001495 303020303020303020-     	db '00 00 00 00 00 00 00 00 '
  1709 0000149E 303020303020303020-
  1709 000014A7 303020303020       
  1710 000014AD 20                      	db ' '
  1711                                  sdline_3:
  1712 000014AE 2E2E2E2E2E2E2E2E2E-     	db '................'
  1712 000014B7 2E2E2E2E2E2E2E     
  1713 000014BE 20                      	db 20h
  1714                                  
  1715                                  dpfooter1:
  1716 000014BF 204631203D20436861-     	db ' F1 = Change Drive  '
  1716 000014C8 6E6765204472697665-
  1716 000014D1 2020               
  1717 000014D3 486F6D65203D204669-     	db 'Home = First Sector '
  1717 000014DC 72737420536563746F-
  1717 000014E5 7220               
  1718 000014E7 50675570203D205072-     	db 'PgUp = Previous Sector '
  1718 000014F0 6576696F7573205365-
  1718 000014F9 63746F7220         
  1719 000014FE 455343203D20455849-     	db 'ESC = EXIT'
  1719 00001507 54                 
  1720 00001508 00                      	db 0
  1721                                  dpfooter2:
  1722 00001509 204632203D20436861-     	db ' F2 = Change Sector '
  1722 00001512 6E676520536563746F-
  1722 0000151B 7220               
  1723 0000151D 456E64203D204C6173-     	db 'End = Last Sector   '
  1723 00001526 7420536563746F7220-
  1723 0000152F 2020               
  1724 00001531 5067446F776E203D20-     	db 'PgDown = Next Sector   ' 
  1724 0000153A 4E6578742053656374-
  1724 00001543 6F72202020         
  1725 00001548 454E544552203D2050-     	db 'ENTER = Prv/Nxt'
  1725 00001551 72762F4E7874       
  1726 00001557 00                      	db 0
  1727                                  
  1728                                  F1_ib:
  1729 00001558 10                      	db 16	; box width (columns)
  1730 00001559 03                      	db 3	; box height (rows)
  1731 0000155A 01                      	db 1	; label offset (vertical)
  1732 0000155B 01                      	db 1	; label offset (horizontal)
  1733 0000155C 01                      	db 1	; text (input) size
  1734 0000155D 4E                      	db 4Eh	; box color
  1735 0000155E 44726976653A20          	db 'Drive: '  ; Label
  1736 00001565 00                      	db 0
  1737                                  
  1738                                  F2_ib:
  1739 00001566 14                      	db 20	; box width (columns)
  1740 00001567 03                      	db 3	; box height (rows)
  1741 00001568 01                      	db 1	; label offset (vertical)
  1742 00001569 01                      	db 1	; label offset (horizontal)
  1743 0000156A 08                      	db 8	; text (input) size
  1744 0000156B 4E                      	db 4Eh	; box color
  1745 0000156C 536563746F72203A20      	db 'Sector : '  ; Label
  1746 00001575 00                      	db 0
  1747                                  
  1748                                  dskr_err:
  1749                                  	;db 33	; box width (columns)
  1750 00001576 11                      	db 17	
  1751 00001577 03                      	db 3	; box height (rows)
  1752 00001578 01                      	db 1	; label offset (vertical)
  1753 00001579 01                      	db 1	; label offset (horizontal)
  1754 0000157A 00                      	db 0	; text (input) size
  1755 0000157B 4E                      	db 4Eh	; box color
  1756                                  	;db 'Drive not ready or read error !'  ; Label
  1757 0000157C 204572726F72203A20      	db ' Error : '
  1758                                  err_code_str:
  1759 00001585 303068202120            	db '00h ! '	
  1760 0000158B 00                      	db 0	
  1761                                  
  1762                                  ; Additional functions, variables/pointers for 
  1763                                  ; Real Mode adaption (out of unix386.s) variables/pointers
  1764                                  
  1765                                  set_cpos:
  1766 0000158C 668B15[60160000]        	mov	dx, [cursor_posn] ; dh = row, dl = column
  1767                                  set_cposx:
  1768                                  	; DX = cursor position
  1769 00001593 B402                    	mov	ah, 2		; Set cursor position
  1770 00001595 30FF                    	xor	bh, bh		; for video page 0
  1771 00001597 CD31                    	int	31h		; TRDOS 386 video interrupt
  1772 00001599 C3                      	retn
  1773                                  
  1774                                  align 2
  1775                                  
  1776                                  prg_msg:
  1777 0000159A 0D0A07                  	db 0Dh, 0Ah, 07h
  1778 0000159D 4469736B2052656164-     	db 'Disk Read Utility - TRDOS 386 v1 Disk I/O and timer test.'
  1778 000015A6 205574696C69747920-
  1778 000015AF 2D205452444F532033-
  1778 000015B8 383620763120446973-
  1778 000015C1 6B20492F4F20616E64-
  1778 000015CA 2074696D6572207465-
  1778 000015D3 73742E             
  1779 000015D6 0D0A                    	db 0Dh, 0Ah	
  1780 000015D8 6279204572646F6761-     	db 'by Erdogan Tan  [30/05/2016]'
  1780 000015E1 6E2054616E20205B33-
  1780 000015EA 302F30352F32303136-
  1780 000015F3 5D                 
  1781 000015F4 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
  1782 000015F8 28507265737320616E-             db '(Press any key to continue...)'
  1782 00001601 79206B657920746F20-
  1782 0000160A 636F6E74696E75652E-
  1782 00001613 2E2E29             
  1783 00001616 0D0A00                  	db 0Dh, 0Ah, 0
  1784                                  
  1785                                  drv_not_ready:
  1786 00001619 070D0A                  	db 07h, 0Dh, 0Ah 
  1787 0000161C 4472697665206E6F74-     	db 'Drive not ready !'
  1787 00001625 2072656164792021   
  1788 0000162D 0D0A00                  	db 0Dh, 0Ah, 0
  1789                                  
  1790 00001630 30                      fd0_type: db '0'
  1791 00001631 30                      fd1_type: db '0'
  1792                                  
  1793                                  rtc_msg:
  1794 00001632 5265616C2054696D65-     	db "Real Time Clock - "
  1794 0000163B 20436C6F636B202D20 
  1795                                  datestr:
  1796 00001644 30302F30302F303030-     	db "00/00/0000"
  1796 0000164D 30                 
  1797 0000164E 2020                    	db "  "
  1798                                  timestr:	
  1799 00001650 30303A30303A3030                db "00:00:00"
  1800 00001658 20                      	db " "
  1801 00001659 00                      	db 0 
  1802                                  
  1803 0000165A 90<rept>                align 4 ; dword alignment
  1804                                  
  1805 0000165C [74190000]              current_txtpos: dd video_buffer
  1806                                  
  1807                                  bss_start:
  1808                                  
  1809                                  ABSOLUTE bss_start
  1810                                  
  1811 00001660 <res 00000002>          cursor_posn: resw 1
  1812 00001662 <res 00000002>          cursor_shp:  resw 1
  1813 00001664 <res 00000002>          cursor_posb: resw 1 ; (cursor position backup, for video page 0)
  1814                                  
  1815 00001666 <res 00000001>          txtposoff:   resb 1 ; txtpos offset for sector number input	
  1816 00001667 <res 00000001>          dscmd:	     resb 1 ; 0 = change drive
  1817                                  	            ; 1 = change sector
  1818                                  	            ; 2 = display disk parameters
  1819                                  
  1820 00001668 <res 00000001>          inds:	     resb 1 	 
  1821 00001669 <res 00000001>          paragr:	     resb 1	 
  1822                                  
  1823 0000166A <res 00000001>          ibcp:	     resb 1 ; input box - row position
  1824 0000166B <res 00000001>          	     resb 1 ; input box - column position
  1825                                  
  1826 0000166C <res 00000001>          retry_count: resb 1
  1827 0000166D <res 00000001>          drv:	     resb 1  ; physical drive number (0, 1, 80h, 81h, 82h, 83h)
  1828                                  
  1829 0000166E <res 00000002>          drv_status:  resb 2  ; fd0, fd1 (FFh = failure, 80h = existing)		
  1830 00001670 <res 00000004>          	     resb 4  ; hd0, hd1 hd2, hd3 (FFh = failure)
  1831                                                      ;                   (80h - 87h = existing)
  1832                                                      ;                   (bit 0 = 1 : LBA ready)
  1833                                  
  1834 00001674 <res 0000000C>          drv_cylinders :	resw 6
  1835 00001680 <res 0000000C>          drv_heads     :	resw 6
  1836 0000168C <res 0000000C>          drv_spt       :	resw 6
  1837                                  alignb 4
  1838 00001698 <res 00000018>          drv_size :	resd 6
  1839                                  
  1840 000016B0 <res 00000010>          fd0_dpt: resb 16
  1841 000016C0 <res 00000010>          fd1_dpt: resb 16
  1842 000016D0 <res 00000020>          hd0_dpt: resb 32
  1843 000016F0 <res 00000020>          hd1_dpt: resb 32
  1844 00001710 <res 00000020>          hd2_dpt: resb 32
  1845 00001730 <res 00000020>          hd3_dpt: resb 32
  1846                                  
  1847                                  ds_sec:
  1848 00001750 <res 00000004>          	resd 1 ; Current sector (on display), drv 0		
  1849 00001754 <res 00000004>          	resd 1 ; Current sector (on display), drv 1
  1850 00001758 <res 00000004>          	resd 1 ; Current sector (on display), drv 2
  1851 0000175C <res 00000004>          	resd 1 ; Current sector (on display), drv 3
  1852 00001760 <res 00000004>          	resd 1 ; Current sector (on display), drv 4
  1853 00001764 <res 00000004>          	resd 1 ; Current sector (on display), drv 5
  1854                                  
  1855 00001768 <res 00000004>          prev_sec: resd 1  ; previous sector (before reading)	
  1856                                  
  1857                                  sector_buffer:
  1858 0000176C <res 00000200>          	resb 512
  1859                                  
  1860                                  date_day:
  1861 0000196C <res 00000001>          	resb 1
  1862                                  date_month:
  1863 0000196D <res 00000001>          	resb 1
  1864                                  date_year:
  1865 0000196E <res 00000001>          	resb 1
  1866                                  date_century:
  1867 0000196F <res 00000001>          	resb 1
  1868                                  
  1869                                  time_second:
  1870 00001970 <res 00000001>          	resb 1
  1871                                  time_minute:
  1872 00001971 <res 00000001>          	resb 1
  1873                                  time_hour:
  1874 00001972 <res 00000001>          	resb 1
  1875                                  	
  1876 00001973 <res 00000001>          	resb 1
  1877                                  
  1878                                  video_buffer:
  1879 00001974 <res 00000FA0>          	resb	4000 ; 80*25*2
  1880                                  
  1881                                  timer_event:
  1882 00002914 <res 00000001>          	resb 1
  1883                                  timer_event_number:
  1884 00002915 <res 00000001>          	resb 1
  1885                                  
  1886 00002916 <res 00000001>          hdc:	resb 1
  1887 00002917 <res 00000001>          fdc:	resb 1
  1888                                  
  1889                                  bss_end:
  1890                                  	
  1891                                  _end:
