     1                                  ; ****************************************************************************
     2                                  ; FDFORMAT.ASM (FDFORMAT.COM) - TRDOS 386 Floppy Disk Formatting Utility
     3                                  ; 						      (for MSDOS/WINDOWS)
     4                                  ; ----------------------------------------------------------------------------
     5                                  ; Only for 1.44MB (3.5") Floppy Disks
     6                                  ; ****************************************************************************
     7                                  ; Last Update: 30/10/2023  (Previous: 12/02/2018)
     8                                  ; ----------------------------------------------------------------------------
     9                                  ; Beginning: 23/11/2017
    10                                  ; ----------------------------------------------------------------------------
    11                                  ; Assembler: NASM version 2.15
    12                                  ; ----------------------------------------------------------------------------
    13                                  ; Turkish Rational DOS
    14                                  ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    15                                  ;
    16                                  ; Derived from TRDOS Operating System v2.0 (80386) source code by Erdogan Tan
    17                                  ; TRFDBOOT.S (TRFDBOOT.COM), 06/07/2016
    18                                  ;
    19                                  ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    20                                  ; FDFORMAT1.ASM (31/07/2011)
    21                                  ; ****************************************************************************
    22                                  ; nasm fdformat.asm -l fdformat.lst -o FDFORMAT.COM
    23                                  
    24                                  
    25                                  bsDriveNumber   equ TRDOS_FAT12_fd_bs + 36
    26                                  bsVolumeID      equ TRDOS_FAT12_fd_bs + 39
    27                                  bsVolumeLabel   equ TRDOS_FAT12_fd_bs + 43
    28                                  
    29                                  [BITS 16]
    30                                  [ORG 100h]
    31                                  
    32                                  	;cli
    33                                  	;cld
    34                                  	;push	cs
    35                                  	;pop	ss
    36                                  	;mov	sp, 0FFFEh
    37                                  	;sti
    38                                  
    39                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    40                                  ; see if drive specified
    41                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    42                                  
    43 00000000 BE8000                  	mov	si, 80h			; PSP command tail
    44 00000003 8A0C                    	mov	cl, [si]
    45 00000005 08C9                    	or	cl, cl                               
    46 00000007 7472                    	jz	short T_07		; jump if zero
    47                                  
    48                                  T_01:
    49 00000009 46                      	inc	si
    50                                  
    51 0000000A 8A04                    	mov	al, [si]
    52 0000000C 3C20                    	cmp	al, ' '			; is it SPACE ?
    53 0000000E 750A                    	jne	short T_03
    54                                  
    55 00000010 FEC9                    	dec	cl                                  
    56 00000012 75F5                    	jnz	short T_01                  
    57 00000014 EB65                    	jmp	short T_07
    58                                  
    59                                  T_02:
    60 00000016 0411                    	add	al, 'A'-'0'		; 0 based -> A based
    61 00000018 EB1A                    	jmp	short T_04
    62                                  
    63                                  T_03:
    64 0000001A 3C30                    	cmp	al, '0'			; 0 - 9
    65 0000001C 725D                    	jb	short T_07
    66 0000001E 3C39                    	cmp	al, '9'			; allow number for drive
    67 00000020 76F4                    	jna	short T_02
    68                                               
    69 00000022 3C41                    	cmp	al, 'A'
    70 00000024 7255                    	jb	short T_07
    71 00000026 3C5A                    	cmp	al, 'Z'			; A - Z
    72 00000028 760A                    	jna	short T_04                    
    73 0000002A 3C61                    	cmp	al, 'a'			; a - z 
    74 0000002C 724D                    	jb	short T_07                  
    75 0000002E 3C7A                    	cmp	al, 'z'                           
    76 00000030 7749                    	ja	short T_07                 
    77                                  
    78 00000032 2C20                    	sub	al, 'a'-'A'		; to upper case
    79                                  
    80                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    81                                  ; write drive letter
    82                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    83                                  
    84                                  T_04:
    85 00000034 A2[D203]                	mov	[TrDOS_Drive], al
    86                                  
    87                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    88                                  ; Check disk parameters
    89                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    90                                  
    91 00000037 2C41                    	sub	al, 'A'			; make it zero based 
    92 00000039 88C2                    	mov	dl, al                           
    93                                          ;mov	si, bsDriveNumber
    94                                  	;mov	[si], al
    95 0000003B A2[F608]                	mov	[bsDriveNumber], al
    96 0000003E B408                    	mov	ah, 08h
    97 00000040 CD13                    	int	13h			; return disk parameters
    98                                  	;jc	T_19
    99 00000042 7207                    	jc	short T_04_err
   100                                  
   101 00000044 0E                      	push	cs
   102 00000045 07                      	pop	es			; restore es
   103                                  
   104 00000046 80FB04                  	cmp	bl, 04			; Drive Type
   105                                    	;jb	T_19
   106 00000049 7303                    	jnb	short T_04_ok
   107                                  	; 28/10/2023
   108                                  T_04_err:
   109 0000004B E95501                  	jmp	T_19
   110                                  T_04_ok:
   111                                  
   112                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   113                                  ; Format question
   114                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   115                                  
   116 0000004E BE[8003]                	mov	si, Msg_DoYouWantToFormat
   117 00000051 E89801                  	call	print_msg
   118                                  
   119                                  T_05:
   120 00000054 31C0                    	xor	ax, ax
   121 00000056 CD16                    	int	16h			; wait for keyboard command
   122 00000058 3C03                    	cmp	al, 'C'-40h
   123 0000005A 7414                    	je	short T_06 ; Exit                   
   124 0000005C 3C1B                    	cmp	al, 27
   125 0000005E 7410                    	je	short T_06 ; Exit
   126 00000060 24DF                    	and	al, 0DFh
   127 00000062 3C59                    	cmp	al, 'Y'				; Yes?
   128 00000064 741D                    	je	short T_08			; write
   129 00000066 3C4E                    	cmp	al, 'N'				; No?
   130 00000068 75EA                    	jne	short T_05          
   131                                  						; no write (exit)  
   132 0000006A BE[7E04]                	mov	si, Msg_NO
   133 0000006D E87C01                  	call	print_msg 
   134                                  
   135                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   136                                  ; Nextline & Exit
   137                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   138                                  
   139                                  T_06:
   140 00000070 BE[7604]                	mov	si, CRLF
   141 00000073 E87601                  	call	print_msg
   142 00000076 B8004C                  	mov	ax, 4C00h		; terminate
   143 00000079 CD21                    	int	21h
   144                                  
   145                                  T_07:
   146 0000007B BE[0A03]                	mov	si, TrDOS_Welcome
   147 0000007E E86B01                  	call	print_msg
   148 00000081 EBED                    	jmp	short T_06 ; Exit
   149                                  
   150                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   151                                  ; writing root directory sectors
   152                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   153                                  
   154                                  T_08:
   155 00000083 BE[7904]                	mov	si, Msg_YES
   156 00000086 E86301                  	call	print_msg
   157                                  T_09:
   158 00000089 BE[7604]                	mov	si, CRLF
   159 0000008C E85D01                  	call	print_msg
   160                                  
   161 0000008F BE[FF03]                	mov	si, Msg_Writing_Root_Dir
   162 00000092 E85701                  	call	print_msg
   163                                  
   164 00000095 B81300                  	mov	ax, 19  ; Root Directory Address
   165 00000098 BB[B806]                	mov	bx, FDFORMAT_FATBUFFER_S9
   166                                  T_10:
   167 0000009B E85D01                  	call	write_fd_sector
   168                                  	;jc	T_19
   169 0000009E 7266                    	jc	short T_12_err
   170 000000A0 40                      	inc	AX
   171 000000A1 83F820                   	cmp	AX, 32
   172 000000A4 76F5                    	jna	short T_10
   173                                  
   174 000000A6 BE[7204]                	mov	si, Msg_OK
   175 000000A9 E84001                  	call	print_msg
   176                                  
   177                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   178                                  ; writing data sectors
   179                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   180                                  
   181 000000AC BE[2104]                	mov	si, Msg_Writing_Data_Sectors
   182 000000AF E83A01                  	call	print_msg
   183 000000B2 B403                    	mov	ah, 3
   184 000000B4 BB0700                  	mov	bx, 7
   185 000000B7 CD10                    	int	10h ; Return Cursor Position
   186                                  	; DL = Column, DH= Line
   187 000000B9 8916[3C04]              	mov	[Cursor_Pos], dx
   188 000000BD B82100                  	mov	ax, 33  ; First Data Sector
   189                                  T_11:
   190 000000C0 50                      	push	ax
   191 000000C1 40                      	inc	ax ; 1 based printing of 0 based sectors
   192 000000C2 BE[3A04]                	mov	si, Sector_Str + 3
   193 000000C5 E89401                  	call	bin_to_decimal
   194 000000C8 8B16[3C04]              	mov	dx, [Cursor_Pos]
   195 000000CC B402                    	mov	ah, 2
   196 000000CE CD10                    	int	10h  ; Set Cursor Position
   197 000000D0 E81901                  	call	print_msg
   198 000000D3 58                      	pop	ax
   199 000000D4 BB[B504]                	mov	bx, FDFORMAT_SECBUFFER
   200 000000D7 E82101                  	call	write_fd_sector
   201 000000DA 730A                    	jnc	short T_12
   202 000000DC 80E416                  	and	ah, 16h  ; Errors: 2h, 4h, 10h
   203                                  	;jz	T_19 ; Drive not ready msg
   204 000000DF 7425                    	jz	short T_12_err
   205                                  
   206                                  	; DX = LBA sector value
   207 000000E1 52                      	push	dx
   208 000000E2 E84601                  	call	mark_bad_cluster
   209 000000E5 58                      	pop	ax
   210                                  T_12:
   211 000000E6 BB0700                  	mov	bx, 7
   212 000000E9 40                      	inc	ax
   213 000000EA 3D400B                  	cmp	ax, 2880
   214 000000ED 72D1                    	jb	short T_11
   215                                  
   216 000000EF BE[6F04]                	mov	si, Msg_3dot_OK
   217 000000F2 E8F700                  	call	print_msg
   218                                  
   219                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   220                                  ; writing FAT sectors
   221                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   222                                  
   223 000000F5 BE[3E04]                	mov	si, Msg_Writing_FAT_Sectors
   224 000000F8 E8F100                  	call	print_msg
   225 000000FB B80100                  	mov	ax, 1  ; FAT Beginning Address
   226 000000FE BB[B506]                	mov	bx, FDFORMAT_FATBUFFER
   227 00000101 E8F700                  	call	write_fd_sector
   228                                  	;jc	T_19
   229 00000104 7303                    	jnc	short T_12_ok
   230                                  	; 28/10/2023
   231                                  T_12_err:
   232 00000106 E99A00                  	jmp	T_19
   233                                  T_12_ok:
   234 00000109 BB[B806]                	mov	bx, FDFORMAT_FATBUFFER_S9
   235                                  T_13:
   236 0000010C 40                      	inc	ax
   237 0000010D E8EB00                  	call	write_fd_sector
   238                                   	;jc	T_19
   239 00000110 72F4                    	jc	short T_12_err
   240 00000112 83F809                  	cmp	ax, 9
   241 00000115 72F5                    	jb	short T_13
   242 00000117 BB[B506]                	mov	bx, FDFORMAT_FATBUFFER
   243 0000011A 40                      	inc	ax
   244 0000011B E8DD00                  	call	write_fd_sector
   245                                  	;jc	T_19
   246 0000011E 72E6                    	jc	short T_12_err
   247 00000120 BB[B806]                	mov	bx, FDFORMAT_FATBUFFER_S9
   248                                  T_14:
   249 00000123 40                      	inc	ax 
   250 00000124 E8D400                          call	write_fd_sector
   251 00000127 727A                    	jc	short T_19
   252 00000129 83F812                  	cmp	ax, 18
   253 0000012C 72F5                    	jb	short T_14
   254                                  
   255 0000012E BE[7204]                	mov	si, Msg_OK
   256 00000131 E8B800                  	call	print_msg
   257                                  
   258 00000134 BE[6104]                	mov	si, Msg_Volume_Name
   259 00000137 E8B200                  	call	print_msg
   260 0000013A E83401                  	call	rw_char
   261 0000013D 7219                    	jc	short T_17
   262 0000013F 8A04                    	mov	al, [si]
   263 00000141 3C20                    	cmp	al, 20h
   264 00000143 7613                    	jna	short T_17
   265 00000145 BF[FD08]                	mov	di, bsVolumeLabel
   266 00000148 B90B00                  	mov	cx, 11
   267 0000014B 46                      	inc	si  
   268 0000014C EB06                    	jmp	short T_16  
   269                                  
   270                                  T_15:
   271 0000014E AC                      	lodsb
   272 0000014F 47                      	inc	di
   273 00000150 3C20                    	cmp	al, 20h
   274 00000152 7673                    	jna	short T_22
   275                                  T_16:
   276 00000154 8805                    	mov 	[di], al
   277 00000156 E2F6                    	loop	T_15
   278                                  
   279                                  T_17:
   280 00000158 BE[E003]                	mov	si, Msg_Writing_Boot_Sector
   281 0000015B E88E00                  	call	print_msg
   282                                  
   283 0000015E C606[D108]04            	mov	byte [RetryCount], 4
   284                                  T_18:
   285 00000163 BE[F908]                	mov	si, bsVolumeID
   286                                  
   287 00000166 31C0                    	xor	ax, ax
   288 00000168 CD1A                    	int	1Ah			; get time of day
   289 0000016A 8914                    	mov	[si], dx
   290 0000016C 894C02                  	mov	[si+2], cx		; set unique volume ID
   291                                  
   292 0000016F B402                    	mov	ah, 02h			; Return Current Time
   293 00000171 CD1A                    	int	1Ah
   294 00000173 86E9                    	xchg	ch, cl
   295 00000175 86F2                    	xchg	dh, dl
   296                                  
   297 00000177 01D1                    	add	cx, dx  
   298 00000179 014C02                  	add	[si+2], cx
   299                                                 
   300 0000017C B404                    	mov	ah, 04h			; Return Current Date
   301 0000017E CD1A                    	int	1Ah
   302 00000180 86E9                    	xchg	ch,cl
   303 00000182 86F2                    	xchg	dh,dl
   304                                  
   305 00000184 01D1                    	add	cx, dx  
   306 00000186 014C02                  	add	[si+2], cx
   307                                  
   308 00000189 B80103                  	mov	ax, 0301h		; write to disk
   309 0000018C BB[D208]                	mov	bx, TRDOS_FAT12_fd_bs	; location of boot code
   310                                  
   311 0000018F B90100                  	mov	cx, 1			; cylinder = 0
   312                                                       			; sector = 1
   313 00000192 B600                    	mov	dh, 0			; head = 0
   314 00000194 BE[F608]                	mov	si, bsDriveNumber
   315 00000197 8A14                    	mov	dl, byte [si]
   316 00000199 CD13                    	int	13h
   317 0000019B 7347                    	jnc	short T_24
   318 0000019D FE0E[D108]              	dec	byte [RetryCount]
   319 000001A1 75C0                    	jnz	short T_18
   320                                  
   321                                  T_19:
   322 000001A3 BE[8204]                	mov	si, Disk_NotReadyOrError
   323 000001A6 E84300                  	call	print_msg
   324                                  
   325                                  T_20:
   326 000001A9 31C0                    	xor	ax, ax
   327 000001AB CD16                    	int	16h			; wait for keyboard command
   328 000001AD 3C03                    	cmp	al, 'C'-40h
   329 000001AF 740E                    	je	short T_21 ; Exit                   
   330 000001B1 3C1B                    	cmp	al, 27
   331 000001B3 740A                     	je	short T_21 ; Exit
   332 000001B5 24DF                    	and	al, 0DFh
   333 000001B7 3C59                    	cmp	al, 'Y'
   334 000001B9 7414                    	je	short T_23		; Retry
   335 000001BB 3C4E                    	cmp	al, 'N'
   336 000001BD 75EA                    	jne	short short T_20
   337                                  
   338                                  T_21:					; Exit
   339 000001BF BE[7604]                	mov	si, CRLF
   340 000001C2 E82700                  	call	print_msg
   341                                  
   342 000001C5 CD20                    	int	20h
   343                                  
   344                                  T_22:
   345 000001C7 C60520                  	mov	byte [DI], 20h
   346 000001CA 47                      	inc	di
   347 000001CB E2FA                    	loop	T_22
   348 000001CD EB89                    	jmp	short T_17
   349                                  
   350                                  T_23:
   351 000001CF BE[F608]                	mov	si, bsDriveNumber
   352 000001D2 8A14                    	mov	dl, byte [si]
   353 000001D4 B408                    	mov	ah, 08h
   354 000001D6 CD13                    	int	13h			; return disk parameters
   355 000001D8 72C9                    	jc	short T_19
   356                                  
   357 000001DA 0E                      	push	cs
   358 000001DB 07                      	pop	es			; restore es
   359                                  
   360 000001DC 80FB04                  	cmp	bl, 04h			; Drive Type
   361 000001DF 72C2                    	jb	short T_19
   362                                  
   363 000001E1 E9A5FE                  	jmp	T_09
   364                                  
   365                                  T_24:
   366 000001E4 BE[7204]                	mov	si, Msg_OK
   367 000001E7 E80200                  	call	print_msg
   368 000001EA EBD3                    	jmp	short T_21
   369                                  
   370                                  print_msg:
   371                                  
   372                                  print_msg_LOOP:
   373 000001EC AC                      	lodsb                           ; Load byte at DS:SI to AL
   374 000001ED 20C0                    	and     al, al            
   375 000001EF 7409                    	jz      short print_msg_OK       
   376 000001F1 B40E                    	mov	ah, 0Eh			
   377 000001F3 BB0700                  	mov     bx, 07h             
   378 000001F6 CD10                    	int	10h			; BIOS Service func ( ah ) = 0Eh
   379                                  					; Write char as TTY
   380                                  					; AL-char BH-page BL-color
   381 000001F8 EBF2                    	jmp     short print_msg_LOOP           
   382                                  
   383                                  print_msg_OK:
   384 000001FA C3                      	retn
   385                                  
   386                                  write_fd_sector:
   387                                  	; Only for 1.44 MB FAT12 Floppy Disks
   388                                  	; INPUT -> AX = Logical Block Address
   389                                  	; ES:BX = Sector Buffer
   390                                  	; OUTPUT ->
   391                                  	; cf = 0 -> AX = Logical Block Address
   392                                  	; cf = 1 -> DX = Logical Block Address
   393                                  	; cf = 1 -> AH = Error Number
   394                                  	;
   395 000001FB B90400                  	mov	cx, 4  ; Retry Count
   396                                  loc_write_fdisk_chs:
   397 000001FE 50                      	push	ax                      ; Linear sector number
   398 000001FF 51                      	push	cx                      
   399 00000200 BA1200                  	mov	dx, 18                  ; Sectors per Track
   400 00000203 F6F2                    	div	dl
   401 00000205 88E1                    	mov	cl, ah                  ; Sector (zero based)
   402 00000207 FEC1                    	inc	cl                      ; To make it 1 based
   403 00000209 D0E8                    	shr	al, 1                   ; Convert Track to Cylinder
   404 0000020B 80D600                  	adc	dh, 0                   ; Head (0 or 1)
   405                                  	;mov	si, bsDriveNumber
   406                                  	;mov	dl, [si]
   407 0000020E 8A16[F608]              	mov	dl, [bsDriveNumber]
   408 00000212 88C5                    	mov	ch, al                   
   409 00000214 B80103                  	mov	ax, 0301h
   410 00000217 CD13                    	int	13h                     ; BIOS Service func ( ah ) = 3
   411                                                                          ; Write disk sectors
   412 00000219 8826[D20A]              	mov 	[Error_Code], ah
   413 0000021D 59                      	pop	cx
   414 0000021E 58                      	pop	ax
   415                                  
   416 0000021F 7309                    	jnc	short pass_write_fdisk_chs_error
   417 00000221 E2DB                    	loop	loc_write_fdisk_chs
   418 00000223 89C2                    	mov	dx, ax
   419 00000225 8A26[D20A]              	mov	ah, [Error_Code]
   420 00000229 F9                      	stc
   421                                  pass_write_fdisk_chs_error:
   422 0000022A C3                      	retn
   423                                  
   424                                  mark_bad_cluster:
   425                                  	; Only for FAT12 Floppy Disks (Full FAT Buffer)
   426                                  	; INPUT -> AX = Cluster/Sector Number
   427                                  	; OUTPUT -> 0FF7h = BAD Cluster Value
   428 0000022B BA0300                  	mov     dx, 3
   429 0000022E F7E2                    	mul     dx
   430 00000230 D1E8                    	shr     ax, 1 ; Divide by 2
   431 00000232 89C3                    	mov     bx, ax  ; FAT Buffer Byte Offset
   432 00000234 BAF70F                  	mov     dx, 0FF7h ; "BAD CLUSTER" sign
   433                                  loc_update_fat12_cell:
   434 00000237 8B87[B506]              	mov     ax, [FDFORMAT_FATBUFFER+BX]
   435 0000023B 7312                    	jnc     short uc_FAT12_nc_even
   436 0000023D 83E00F                  	and     ax, 0Fh
   437 00000240 D1E2                    	shl     dx, 1
   438 00000242 D1E2                    	shl     dx, 1
   439 00000244 D1E2                    	shl     dx, 1
   440 00000246 D1E2                    	shl     dx, 1
   441 00000248 09C2                    	or      dx, ax
   442 0000024A 8997[B506]              	mov     [FDFORMAT_FATBUFFER+bx], dx
   443 0000024E C3                      	retn
   444                                  uc_FAT12_nc_even:
   445 0000024F 2500F0                  	and     ax, 0F000h
   446 00000252 80E60F                  	and     dh, 0Fh
   447 00000255 09C2                    	or      dx, ax
   448 00000257 8997[B506]              	mov     [FDFORMAT_FATBUFFER+bx], dx
   449 0000025B C3                      	retn
   450                                  
   451                                  bin_to_decimal:
   452                                  	; INPUT: DS:SI = Target location
   453                                  	;        AX= Binary Number (Integer)
   454                                  	; OUTPUT: Decimal char at DS:SI
   455                                  	; SI decremented after every division
   456                                  	; till AX<10.
   457                                  	; CX, DX will be changed.
   458                                  	;
   459 0000025C B90A00                  	mov	cx, 10
   460                                  loc_btd_re_divide:
   461 0000025F 31D2                    	xor	dx, dx
   462 00000261 F7F1                    	div	cx
   463 00000263 80C230                  	add	dl,"0"
   464 00000266 8814                    	mov	[si], dl
   465 00000268 83F800                  	cmp	ax, 0
   466 0000026B 7603                    	jna	short pass_btd_re_divide
   467 0000026D 4E                      	dec	si
   468 0000026E EBEF                    	jmp	short loc_btd_re_divide
   469                                  pass_btd_re_divide:
   470 00000270 C3                      	retn
   471                                  
   472                                  rw_char:
   473                                  	; OUTPUT -> DS:SI = Entered String (ASCIIZ)
   474 00000271 BE[5504]                	mov     si, StrVolumeName
   475 00000274 BB0700                  	mov     bx, 7
   476 00000277 B403                    	mov     ah, 3
   477 00000279 CD10                    	int     10h
   478 0000027B 8916[3C04]              	mov     [Cursor_Pos], dx
   479                                  read_next_char:
   480 0000027F 30E4                    	xor     ah, ah
   481 00000281 CD16                    	int     16h
   482 00000283 20C0                    	and     al, al
   483 00000285 7439                    	jz      short loc_arrow    
   484 00000287 3CE0                    	cmp     al, 0E0h          
   485 00000289 7435                    	je      short loc_arrow
   486 0000028B 3C08                    	cmp     al, 8
   487 0000028D 753D                    	jne     short char_return
   488                                  loc_back:
   489 0000028F B403                    	mov     ah, 3
   490 00000291 CD10                    	int     10h
   491 00000293 3A16[3C04]              	cmp     dl, byte [Cursor_Pos]
   492 00000297 761F                    	jna     short loc_beep
   493                                  prev_column:
   494 00000299 FECA                    	dec     dl
   495                                  set_cursor_pos:
   496 0000029B B402                    	mov     ah, 2
   497 0000029D CD10                    	int     10h
   498 0000029F 88D3                    	mov     bl, dl
   499 000002A1 2A1E[3C04]              	sub     bl, byte [Cursor_Pos] 
   500 000002A5 B90100                  	mov     cx,1
   501 000002A8 B409                    	mov     ah, 9
   502 000002AA B020                    	mov     al, 20h
   503 000002AC 8800                    	mov     [si+bx], al
   504                                  loc_write_it:
   505 000002AE B307                    	mov     bl, 7
   506 000002B0 CD10                    	int     10h
   507 000002B2 8B16[3C04]              	mov     dx, [Cursor_Pos]
   508 000002B6 EBC7                    	jmp     short read_next_char
   509                                  loc_beep:
   510 000002B8 B40E                    	mov     ah, 0Eh
   511 000002BA B007                    	mov     al, 7
   512 000002BC CD10                    	int     10h
   513 000002BE EBBF                    	jmp     short read_next_char
   514                                  loc_arrow:    
   515 000002C0 80FC4B                  	cmp     ah, 4Bh
   516 000002C3 74CA                    	je      short loc_back
   517 000002C5 80FC53                  	cmp     ah, 53h
   518 000002C8 74C5                    	je      short loc_back
   519 000002CA EBB3                    	jmp     short read_next_char
   520                                  char_return:
   521 000002CC B403                    	mov     ah, 3
   522 000002CE CD10                    	int     10h
   523                                  check_char_type:
   524 000002D0 3C20                    	cmp     al, 20h
   525 000002D2 7230                    	jb      short loc_escape
   526 000002D4 88D4                    	mov     ah, dl
   527 000002D6 2A26[3C04]              	sub     ah, byte [Cursor_Pos] 
   528 000002DA 80FC0A                  	cmp     ah, 10
   529 000002DD 77D9                    	ja      short loc_beep
   530 000002DF 3C7A                    	cmp     al, "z"
   531 000002E1 779C                    	ja      short read_next_char
   532 000002E3 3C61                    	cmp     al, "a"
   533 000002E5 7202                    	jb      short pass_capitalize
   534 000002E7 24DF                    	and     al, 0DFh
   535                                  pass_capitalize:
   536 000002E9 88E3                    	mov     bl, ah  ; 30/07/2011
   537 000002EB 30E4                    	xor     ah, ah
   538 000002ED 8900                    	mov     [si+bx], ax
   539 000002EF B307                    	mov     bl, 7
   540 000002F1 B40E                    	mov     ah, 0Eh
   541 000002F3 CD10                    	int     10h
   542 000002F5 EB88                    	jmp     short read_next_char
   543                                  pass_escape:
   544 000002F7 3C0D                    	cmp     al, 0Dh
   545 000002F9 7584                    	jne     short read_next_char
   546 000002FB B40E                    	mov     ah, 0Eh
   547 000002FD CD10                    	int     10h
   548 000002FF B00A                    	mov     al, 0Ah
   549 00000301 CD10                    	int     10h
   550 00000303 C3                      	retn
   551                                  loc_escape:
   552 00000304 3C1B                    	cmp     al, 1Bh
   553 00000306 75EF                    	jne     short pass_escape
   554 00000308 F9                      	stc
   555 00000309 C3                      	retn
   556                                  
   557                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   558                                  ;  messages
   559                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   560                                  
   561                                  TrDOS_Welcome:
   562 0000030A 0D0A                    	db	0Dh, 0Ah
   563 0000030C 54522D444F5320312E-     	db	'TR-DOS 1.44 MB FAT12 Floppy Disk Format Utility'
   563 00000315 3434204D4220464154-
   563 0000031E 313220466C6F707079-
   563 00000327 204469736B20466F72-
   563 00000330 6D6174205574696C69-
   563 00000339 7479               
   564 0000033B 0D0A                    	db	0Dh, 0Ah
   565 0000033D 76332E302E32333130-     	db	"v3.0.231030  (c) Erdogan TAN 2005-2023"
   565 00000346 333020202863292045-
   565 0000034F 72646F67616E205441-
   565 00000358 4E20323030352D3230-
   565 00000361 3233               
   566 00000363 0D0A                    	db	0Dh,0Ah
   567 00000365 0D0A                    	db	0Dh,0Ah
   568 00000367 55736167653A206664-     	db	'Usage: fdformat [drive] '
   568 00000370 666F726D6174205B64-
   568 00000379 726976655D20       
   569 0000037F 00                      	db	0
   570                                  
   571                                  Msg_DoYouWantToFormat:
   572 00000380 07                      	db	07h
   573 00000381 0D0A                            db	0Dh, 0Ah
   574 00000383 5741524E494E4721        	db	'WARNING!'
   575 0000038B 0D0A                    	db	0Dh, 0Ah
   576 0000038D 416C6C206461746120-     	db	'All data on the drive will be erased.'
   576 00000396 6F6E20746865206472-
   576 0000039F 6976652077696C6C20-
   576 000003A8 626520657261736564-
   576 000003B1 2E                 
   577 000003B2 0D0A                    	db	0Dh, 0Ah
   578 000003B4 0D0A                    	db	0Dh, 0Ah
   579 000003B6 446F20796F75207761-     	db	'Do you want to format drive '
   579 000003BF 6E7420746F20666F72-
   579 000003C8 6D6174206472697665-
   579 000003D1 20                 
   580                                  TrDOS_Drive:
   581 000003D2 413A20285965732F4E-     	db	'A: (Yes/No)? ', 0
   581 000003DB 6F293F2000         
   582                                  
   583                                  Msg_Writing_Boot_Sector:
   584 000003E0 0D0A                    	db	0Dh, 0Ah
   585 000003E2 57726974696E672074-     	db	"Writing trdos boot sector...", 0
   585 000003EB 72646F7320626F6F74-
   585 000003F4 20736563746F722E2E-
   585 000003FD 2E00               
   586                                  
   587                                  Msg_Writing_Root_Dir:
   588 000003FF 57726974696E672072-     	db	"Writing root directory sectors...", 0
   588 00000408 6F6F74206469726563-
   588 00000411 746F72792073656374-
   588 0000041A 6F72732E2E2E00     
   589                                  
   590                                  Msg_Writing_Data_Sectors:
   591 00000421 57726974696E672064-     	db	"Writing data sector: ", 0
   591 0000042A 61746120736563746F-
   591 00000433 723A2000           
   592                                  
   593                                  Sector_Str:
   594 00000437 3030303000              	db	"0000", 0
   595                                  Cursor_Pos:
   596 0000043C 0000                    	dw	0
   597                                  
   598                                  Msg_Writing_FAT_Sectors:
   599 0000043E 57726974696E672046-     	db	"Writing FAT sectors...", 0
   599 00000447 415420736563746F72-
   599 00000450 732E2E2E00         
   600                                  
   601                                  StrVolumeName:
   602 00000455 00<rep Ch>              	times 	12 db  0
   603                                  
   604                                  Msg_Volume_Name:
   605 00000461 566F6C756D65204E61-     	db	"Volume Name: ", 0
   605 0000046A 6D653A2000         
   606                                  
   607                                  Msg_3dot_OK:
   608 0000046F 2E2E2E                  	db	"..."
   609                                  Msg_OK:
   610 00000472 204F4B2E                	db	' OK.'
   611                                  CRLF:
   612 00000476 0D0A00                  	db	0Dh, 0Ah, 0
   613                                  Msg_YES:
   614 00000479 2059455300              	db	' YES', 0
   615                                  Msg_NO:
   616 0000047E 204E4F00                	db	' NO', 0
   617                                  ;
   618                                  Disk_NotReadyOrError:
   619 00000482 0D0A                    	db	0Dh, 0Ah
   620 00000484 4469736B206572726F-     	db	'Disk error or drive not ready. Try again? (Y/N) '
   620 0000048D 72206F722064726976-
   620 00000496 65206E6F7420726561-
   620 0000049F 64792E205472792061-
   620 000004A8 6761696E3F2028592F-
   620 000004B1 4E2920             
   621 000004B4 00                      	db	0
   622                                  
   623                                  FDFORMAT_SECBUFFER:
   624 000004B5 F6<rep 200h>            	times	512 db 0F6h
   625                                  FDFORMAT_FATBUFFER:
   626 000006B5 F0                      	db	0F0h
   627 000006B6 FF                      	db	0FFh
   628 000006B7 FF                      	db	0FFh
   629                                  FDFORMAT_FATBUFFER_S9:
   630 000006B8 00<rep 200h>            	times	512 db 0
   631                                   
   632 000008B8 286329204572646F67-     	db	'(c) Erdogan TAN 1998-2023' ; 28/10/2023
   632 000008C1 616E2054414E203139-
   632 000008CA 39382D32303233     
   633                                  
   634                                  RetryCount:
   635 000008D1 00                      	db	0
   636                                  
   637                                  TRDOS_FAT12_fd_bs:
   638 000008D2 <bin 200h>              	incbin 'TRFDBS.BIN' ; 30/10/2023
   639                                  
   640                                  	; 28/10/2023
   641                                  Error_Code:
   642 00000AD2 00                      	db	0
