     1                                  ; ****************************************************************************
     2                                  ; FD2IMG.ASM (RD2IMG.COM) - Retro DOS v4 Floppy Disk Image Utility
     3                                  ;         (Reads floppy disk -all- sectors and writes to raw disk image file.)
     4                                  ; ****************************************************************************
     5                                  ; Last Update: 31/10/2023
     6                                  ; ----------------------------------------------------------------------------
     7                                  ; Beginning: 29/10/2023
     8                                  ; ----------------------------------------------------------------------------
     9                                  ; Assembler: NASM version 2.15
    10                                  ; ----------------------------------------------------------------------------
    11                                  ; Retro DOS Operating System Project by ERDOGAN TAN (Beginning: 04/02/2018)
    12                                  ; ----------------------------------------------------------------------------
    13                                  ; Derived from 'rfdimage.s'(RFDIMAGE.COM) source code by Erdogan Tan
    14                                  ; (25/10/2023)
    15                                  ; ****************************************************************************
    16                                  ; nasm fd2img.s -l fd2img.lst -o FD2IMG.COM
    17                                  
    18                                  ; DTA (PSP+80h= Offset 128)
    19                                  DTA_Attrib equ 149 ; PDP+21
    20                                  DTA_Time equ 150 ; PSP+22
    21                                  DTA_Date equ 152 ; PSP 24
    22                                  DTA_FileSize equ 154 ; PSP + 26
    23                                  DTA_FileName equ 158 ; PSP + 30
    24                                  
    25                                  [BITS 16]
    26                                  [ORG 100h]
    27                                  
    28 00000000 FA                      	cli
    29 00000001 FC                      	cld
    30 00000002 0E                      	push	cs
    31 00000003 17                      	pop	ss
    32 00000004 BCFEFF                  	mov	sp, 0FFFEh
    33 00000007 FB                      	sti
    34                                  
    35                                  ;-----------------------------------------------------------------
    36                                  ; get fd image file name
    37                                  ;-----------------------------------------------------------------
    38                                  
    39 00000008 BE8000                  	mov	si, 80h			; PSP command tail
    40 0000000B AC                       	lodsb
    41 0000000C 08C0                    	or	al, al 			; command tail length                            
    42 0000000E 7436                    	jz	short R_17		; jump if zero
    43 00000010 89C1                    	mov 	cx, ax
    44                                  R_01:
    45 00000012 49                      	dec	cx
    46 00000013 7431                    	jz	short R_17
    47                                  
    48 00000015 AC                      	lodsb
    49                                  
    50 00000016 3C20                    	cmp	al, ' '			; is it SPACE ?
    51 00000018 722C                    	jb	short R_17
    52 0000001A 74F6                    	je	short R_01
    53                                  
    54                                  	; check floppy disk name
    55                                  T_01:
    56 0000001C 3C41                    	cmp	al, 'A'
    57 0000001E 7226                    	jb	short R_17
    58 00000020 7414                    	je	short T_03
    59 00000022 3C42                    	cmp	al, 'B'
    60 00000024 7610                    	jna	short T_03
    61 00000026 3C5A                    	cmp	al, 'Z'
    62 00000028 761C                    	jna	short R_17
    63                                  	
    64 0000002A 3C61                    	cmp	al, 'a'			; a - z 
    65 0000002C 7218                    	jb	short R_17                  
    66 0000002E 7404                    	je	short T_02
    67 00000030 3C62                    	cmp	al, 'b'
    68 00000032 7718                    	ja	short T_05
    69                                  T_02:
    70 00000034 24DF                    	and	al, 0DFh		; to upper case
    71                                  T_03:
    72 00000036 2C41                    	sub	al, 'A'
    73 00000038 803C3A                  	cmp	byte [si], ':'
    74 0000003B 7504                    	jne	short T_04
    75                                  
    76 0000003D 49                      	dec	cx
    77 0000003E 7406                    	jz	short R_17
    78 00000040 46                      	inc	si
    79                                  T_04:
    80 00000041 803C20                  	cmp	byte [si], 20h
    81 00000044 7423                    	je	short T_06	
    82                                  	;jmp	short R_17 
    83                                  
    84                                  R_17:
    85 00000046 BE[4403]                	mov	si, RetroDOS_Welcome
    86                                  	;call	print_msg
    87 00000049 E9F900                  	jmp	R_16 ; Exit
    88                                  
    89                                  T_05:
    90 0000004C 3C66                    	cmp	al, 'f'
    91 0000004E 75F6                    	jne	short R_17
    92 00000050 49                      	dec	cx
    93 00000051 49                      	dec	cx
    94 00000052 7EF2                    	jng	short R_17
    95 00000054 AC                      	lodsb
    96 00000055 3C64                    	cmp	al, 'd'
    97 00000057 75ED                    	jne	short R_17
    98 00000059 AC                      	lodsb
    99                                  
   100                                  	; 30/10/2023
   101 0000005A 803C20                  	cmp	byte [si], 20h
   102 0000005D 75E7                    	jne	short R_17
   103 0000005F 46                      	inc	si
   104 00000060 49                      	dec	cx
   105                                  		
   106 00000061 2C30                    	sub	al, '0'
   107 00000063 7407                    	jz	short T_19
   108                                  
   109 00000065 3C01                    	cmp	al, 1
   110 00000067 75DD                    	jne	short R_17
   111                                  T_06:	
   112 00000069 A2[3503]                	mov	[drivenumber], al
   113                                  
   114                                  T_19:
   115                                  	; 30/10/2023
   116 0000006C AC                      	lodsb
   117 0000006D 3C20                    	cmp	al, 20h
   118 0000006F 7707                    	ja	short R_02
   119 00000071 72D3                    	jb	short R_17
   120                                  
   121 00000073 49                      	dec	cx
   122 00000074 75F6                    	jnz	short T_19
   123 00000076 EBCE                    	jmp	short R_17
   124                                  
   125                                  	; check fd image file name
   126                                  R_02:
   127 00000078 BF[C405]                       	mov	di, img_file_name
   128 0000007B AA                      	stosb
   129                                  R_03:
   130 0000007C 49                      	dec	cx
   131 0000007D 740C                    	jz	short R_27
   132                                  
   133 0000007F AC                      	lodsb
   134                                  	;cmp	al, 0Dh ; ENTER (CR) key
   135 00000080 3C20                    	cmp	al, 20h ; ' '
   136 00000082 760C                    	jna	short R_04
   137 00000084 AA                      	stosb
   138 00000085 81FF[0406]              	cmp	di, img_file_name + 64
   139 00000089 72F1                    	jb	short R_03
   140                                  R_27:
   141 0000008B 803C20                  	cmp	byte [si], 20h 
   142 0000008E 7765                    	ja	short R_11
   143                                  R_04:
   144 00000090 28C0                    	sub	al, al
   145 00000092 AA                      	stosb
   146                                  
   147                                  ;-----------------------------------------------------------------
   148                                  ; get drive parameters
   149                                  ;-----------------------------------------------------------------
   150                                  
   151                                  T_07:
   152 00000093 B408                    	mov	ah, 08h
   153 00000095 8A16[3503]              	mov	dl, [drivenumber]	; (0 or 1)
   154 00000099 CD13                    	int	13h			; return disk parameters
   155 0000009B 7306                    	jnc	short T_09
   156                                  T_08:
   157                                  	; Drive not ready error
   158 0000009D BE[C904]                	mov	si, msg_drv_not_ready_err
   159                                  	;call	print_msg
   160 000000A0 E9A200                  	jmp	R_16 
   161                                  T_09:
   162 000000A3 881E[3603]              	mov	[disktype], bl
   163                                  	
   164 000000A7 0E                      	push	cs
   165 000000A8 07                      	pop	es
   166                                  
   167                                  	; (this extra check may not be necessary)
   168 000000A9 20DB                    	and	bl, bl
   169 000000AB 74F0                    	jz	short T_08
   170 000000AD 80FB05                  	cmp	bl, 5
   171 000000B0 77EB                    	ja	short T_08
   172                                  
   173                                  	;---------------------------------------------------------
   174                                  
   175                                  	; read boot sector to test (disk is ready in drive)
   176 000000B2 B80102                  	mov	ax, 0201h		; read disk
   177 000000B5 BB[1A06]                	mov	bx, trackbuffer		; buffer
   178 000000B8 8A16[3503]              	mov	dl, [drivenumber]
   179 000000BC 30F6                    	xor	dh, dh			; head 0
   180 000000BE B90100                  	mov	cx, 1			; cylinder 0, sector 1 
   181 000000C1 CD13                    	int	13h
   182 000000C3 72D8                    	jc	short T_08
   183                                  
   184                                  T_10:
   185 000000C5 8B1E[3603]              	mov	bx, [disktype]	 ; bh = 0
   186 000000C9 81C3[3803]              	add	bx, SPT_table-1
   187 000000CD 8A07                    	mov	al, [bx]
   188 000000CF BB[1A06]                	mov	bx, trackbuffer
   189                                  T_11:
   190 000000D2 A2[3803]                	mov	[SPT], al
   191                                  	
   192                                  	; read track 0 (will return with error is SPT is wrong)	
   193 000000D5 B402                    	mov	ah, 02h
   194                                  	;mov	al, [SPT]
   195                                  	;mov	dl, [drivenumber]
   196                                  	;xor	dh, dh			; head 0
   197                                  	;mov	cx, 1			; cylinder 0, sector 1 
   198 000000D7 CD13                    	int	13h
   199 000000D9 731F                    	jnc	short R_10
   200                                  
   201                                  	; chance SPT and try again
   202 000000DB 8A26[3603]              	mov	ah, [disktype]
   203 000000DF FE0E[3603]              	dec	byte [disktype]
   204 000000E3 B012                    	mov	al, 18
   205 000000E5 80FC04                  	cmp	ah, 4
   206 000000E8 7407                    	je	short T_12  ; 18 -> 9 sectors per track
   207 000000EA 77E6                    	ja	short T_11  ; 36 -> 18 sectors per track
   208 000000EC 80FC02                  	cmp	ah, 2
   209 000000EF 75AC                    	jne	short T_08  
   210                                  	; 15 -> 9 sectors per track	
   211                                  T_12:
   212 000000F1 D1E8                    	shr	ax, 1 ; al = 9
   213 000000F3 EBDD                    	jmp	short T_11
   214                                  
   215                                  R_11:
   216 000000F5 BE[1704]                	mov	si, msg_inv_file_name
   217                                  	;call	print_msg
   218 000000F8 EB4B                    	jmp	short R_16
   219                                  
   220                                  ;-----------------------------------------------------------------
   221                                  ; Check image file path
   222                                  ;-----------------------------------------------------------------
   223                                  	
   224                                  R_10:
   225                                  	; 31/10/2023
   226 000000FA BA[C405]                	mov	dx, img_file_name
   227 000000FD B80043                  	mov	ax, 4300h ; get file attributes	
   228 00000100 CD21                    	int	21h
   229 00000102 7255                    	jc	short R_20
   230                                  
   231                                  ;-----------------------------------------------------------------
   232                                  ; Check image file attributes
   233                                  ;-----------------------------------------------------------------
   234                                  
   235                                  R_14:
   236 00000104 80E11F                  	and	cl, 1Fh ; directory, volume label, system, hidden, read only
   237 00000107 7561                    	jnz	short R_19
   238                                  
   239 00000109 E8B101                  	call	capitalize ; uppercase file name
   240                                  
   241                                  ;-----------------------------------------------------------------
   242                                  ; Overwrite question
   243                                  ;-----------------------------------------------------------------
   244                                  
   245 0000010C BE[A404]                	mov	si, msg_overwrite_question1
   246 0000010F E8CE01                  	call	print_msg
   247                                  
   248 00000112 BE[0606]                	mov	si, uc_FileName ; uppercase file name
   249                                  	
   250 00000115 803C00                  	cmp	byte [si], 0	; 0 = not converted due to invalid char
   251 00000118 7703                    	ja	short R_26	
   252 0000011A BE[C405]                	mov	si, img_file_name ; file name as written by user (default)
   253                                  R_26:
   254 0000011D E8C001                  	call	print_msg
   255 00000120 BE[C104]                	mov	si, msg_overwrite_question2
   256 00000123 E8BA01                  	call	print_msg
   257 00000126 BE[1405]                	mov	si, msg_yes_no
   258 00000129 E8B401                  	call	print_msg
   259                                  
   260                                  	; get answer
   261                                  R_15:
   262 0000012C 31C0                    	xor	ax, ax
   263 0000012E CD16                    	int	16h			; wait for keyboard command
   264 00000130 3C03                    	cmp	al, 'C'-40h
   265 00000132 7414                    	je	short R_12 ; Exit                   
   266 00000134 3C1B                    	cmp	al, 27
   267 00000136 7410                    	je	short R_12 ; Exit
   268 00000138 24DF                    	and	al, 0DFh
   269 0000013A 3C59                    	cmp	al, 'Y'			; Yes?
   270 0000013C 7415                    	je	short R_18		; write
   271 0000013E 3C4E                    	cmp	al, 'N'			; No?
   272 00000140 75EA                    	jne	short R_15      
   273                                  					; no write (exit)  
   274 00000142 BE[A205]                	mov	si, Msg_NO
   275                                  
   276                                  ;-----------------------------------------------------------------
   277                                  ; Nextline & Exit
   278                                  ;-----------------------------------------------------------------
   279                                  
   280                                  R_16:
   281 00000145 E89801                  	call	print_msg
   282                                  R_12:
   283 00000148 BE[AA05]                	mov	si, CRLF
   284 0000014B E89201                  	call	print_msg
   285 0000014E B8004C                  	mov	ax, 4C00h		; terminate
   286 00000151 CD21                    	int	21h
   287                                  
   288                                  R_18:
   289 00000153 BE[9D05]                	mov	si, Msg_YES
   290 00000156 E88701                  	call	print_msg
   291                                  
   292                                  ;-----------------------------------------------------------------
   293                                  ; Create image file
   294                                  ;-----------------------------------------------------------------
   295                                  
   296                                  R_20:
   297                                  	; 31/10/2023
   298 00000159 E8BE00                  	call	check_file_name
   299 0000015C 7297                    	jc	short R_11
   300                                  
   301                                  	; create a new fd image file
   302 0000015E BA[C405]                	mov	dx, img_file_name
   303 00000161 B90000                  	mov	cx, 0 ; File Attributes
   304 00000164 B43C                    	mov	ah, 3Ch ; MS-DOS Function = Create File
   305 00000166 CD21                    	int	21h
   306 00000168 730B                    	jnc	short R_28
   307                                  R_19:
   308 0000016A BE[3A04]                	mov	si, msg_permission_denied
   309                                  	;call	print_msg
   310 0000016D EBD6                    	jmp	short R_16
   311                                  
   312                                  ;-----------------------------------------------------------------
   313                                  ; read tracks and write into image file
   314                                  ;-----------------------------------------------------------------
   315                                  
   316                                  R_21:
   317 0000016F BE[AA05]                	mov	si, CRLF
   318 00000172 E86B01                  	call	print_msg
   319                                  
   320                                  ;-----------------------------------------------------------------
   321                                  ; Open image file for writing
   322                                  ;-----------------------------------------------------------------
   323                                  
   324                                  R_28:
   325                                  	; 30/10/2023
   326 00000175 B002                    	mov	al, 2 ; open for reading and writing
   327                                  	;mov	dx, img_file_name
   328 00000177 B43D                    	mov	ah, 3Dh ; open file
   329 00000179 CD21                    	int	21h
   330 0000017B 72ED                    	jc	short R_19 ; file open error
   331                                  T_13:
   332 0000017D A3[C205]                	mov	[img_file_handle], ax
   333                                  
   334 00000180 BE[3005]                	mov	si, msg_disk_type
   335 00000183 E85A01                  	call	print_msg
   336                                  
   337 00000186 B013                    	mov	al, disktypestrsize
   338 00000188 F626[3603]              	mul	byte [disktype]
   339 0000018C BE[2B05]                	mov	si, disktypestr-disktypestrsize
   340 0000018F 01C6                    	add	si, ax
   341 00000191 E84C01                  	call	print_msg
   342 00000194 BE[AA05]                	mov	si, CRLF
   343 00000197 E84601                  	call	print_msg
   344                                  	
   345                                  	; al = 0
   346 0000019A 8A26[3803]              	mov	ah, [SPT]
   347 0000019E D0E4                    	shl	ah, 1 ; ax = [SPT] * 512
   348 000001A0 A3[1806]                	mov	[tracksize], ax
   349 000001A3 B85000                  	mov	ax, 80
   350 000001A6 803E[3603]01            	cmp	byte [disktype], 1
   351 000001AB 7702                    	ja	short T_14
   352 000001AD D1E8                    	shr	ax, 1 ; mov al, 40
   353                                  T_14:
   354 000001AF A3[1606]                	mov	[numtracks], ax
   355                                  
   356                                  ;-----------------------------------------------------------------
   357                                  ; writing sectors
   358                                  ;-----------------------------------------------------------------
   359                                  
   360 000001B2 BE[1F05]                	mov	si, msg_writing
   361 000001B5 E82801                  	call	print_msg
   362                                  
   363 000001B8 B403                    	mov	ah, 3
   364                                  	;mov	bx, 7
   365 000001BA CD10                    	int	10h ; Return Cursor Position
   366                                  	; DL = Column, DH = Line
   367 000001BC 8916[1406]              	mov	[cursorpos], dx
   368                                  T_15:	
   369 000001C0 E84601                  	call	calculate_percentage
   370                                  
   371 000001C3 BE[4003]                	mov	si, percent_str
   372 000001C6 E81701                  	call	print_msg
   373                                  R_22:
   374                                  	;sub	al, al
   375 000001C9 8B1E[C205]              	mov	bx, [img_file_handle]
   376 000001CD 8B0E[1806]              	mov	cx, [tracksize] ; SPT*512
   377 000001D1 BA[1A06]                	mov	dx, trackbuffer ; buffer
   378 000001D4 B440                    	mov	ah, 40h ; write to file	
   379 000001D6 CD21                    	int	21h
   380 000001D8 7236                    	jc	short T_18
   381                                  
   382 000001DA 8036[3F03]01            	xor	byte [head], 1
   383 000001DF 7407                    	jz	short R_23
   384                                  
   385 000001E1 E80B01                  	call	read_track_h1
   386 000001E4 7217                    	jc	short R_24
   387 000001E6 EBE1                    	jmp	short R_22
   388                                  R_23:
   389 000001E8 8A2E[3E03]              	mov	ch, [track]
   390 000001EC FEC5                    	inc	ch
   391 000001EE 3A2E[1606]              	cmp	ch, [numtracks]
   392 000001F2 7321                    	jnb	short R_25
   393                                  	
   394 000001F4 882E[3E03]              	mov	[track], ch
   395                                  
   396 000001F8 E8F800                  	call	read_track_h2
   397 000001FB 7306                    	jnc	short T_17
   398                                  R_24:
   399 000001FD BE[DF04]                	mov	si, msg_disk_read_err
   400                                  	;call	print_msg
   401                                  T_16:
   402 00000200 E942FF                  	jmp	R_16
   403                                  
   404                                  T_17:
   405 00000203 8B16[1406]              	mov	dx, [cursorpos]
   406 00000207 B402                    	mov	ah, 2
   407 00000209 BB0700                  	mov	bx, 7
   408 0000020C CD10                    	int	10h  ; Set Cursor Position
   409 0000020E EBB0                    	jmp	short T_15
   410                                  
   411                                  T_18:
   412                                  	; image file writing error
   413 00000210 BE[F504]                	mov	si, msg_writing_err
   414                                  	;jmp	R_16
   415 00000213 EBEB                    	jmp	short T_16
   416                                  R_25:
   417 00000215 BE[A605]                	mov	si, Msg_OK
   418                                  	;jmp	R_16
   419 00000218 EBE6                    	jmp	short T_16
   420                                  
   421                                  ;-----------------------------------------------------------------
   422                                  ; Check File name
   423                                  ;-----------------------------------------------------------------
   424                                  
   425                                  	; 31/10/2023
   426                                  check_file_name:
   427 0000021A E86B00                  	call	skip_path
   428 0000021D 7237                    	jc	short cfn_4
   429                                  
   430                                  	; si = file name offset (after the last '\' or ':'
   431                                  	; bx = si
   432                                  	
   433 0000021F 31D2                    	xor	dx, dx
   434                                  	;xor	ah, ah
   435                                  cfn_1:	
   436 00000221 AC                      	lodsb
   437 00000222 20C0                    	and	al, al
   438 00000224 7438                    	jz	short cfn_6
   439                                  	;mov	ah, al ; the last char > 0
   440 00000226 FEC6                    	inc	dh
   441                                  
   442 00000228 E83D00                  	call	check_inv_fname_chars
   443 0000022B 7229                    	jc	short cfn_4
   444                                  
   445 0000022D 3C2E                    	cmp	al, '.'
   446 0000022F 7512                    	jne	short cfn_2
   447 00000231 08D2                    	or	dl, dl
   448 00000233 7520                    	jnz	short cfn_3 ; 2 dots	
   449 00000235 80FE02                  	cmp	dh, 2
   450 00000238 721C                    	jb	short cfn_4 ; the 1st char of fname is a dot
   451 0000023A 80FE09                  	cmp	dh, 9
   452 0000023D 7716                    	ja	short cfn_3 ; > 8 chars before dot
   453 0000023F 88F2                    	mov	dl, dh	; dot position
   454 00000241 EBDE                    	jmp	short cfn_1 
   455                                  cfn_2:
   456 00000243 88F1                    	mov	cl, dh
   457 00000245 08D2                    	or 	dl, dl
   458 00000247 740E                    	jz	short cfn_5 ; not a dot in fname chars
   459 00000249 80F90C                  	cmp	cl, 12
   460 0000024C 7707                    	ja	short cfn_3
   461 0000024E 28D1                    	sub	cl, dl
   462 00000250 80F903                  	cmp	cl, 3	    ; > 3 chars after dot	
   463 00000253 76CC                    	jna	short cfn_1
   464                                  cfn_3:
   465 00000255 F9                      	stc
   466                                  cfn_4:
   467 00000256 C3                      	retn
   468                                  cfn_5:
   469 00000257 80F908                  	cmp	cl, 8
   470 0000025A 76C5                    	jna	short cfn_1
   471 0000025C F9                      	stc
   472 0000025D C3                      	retn		
   473                                  cfn_6:
   474 0000025E 08F6                    	or	dh, dh
   475 00000260 74F3                    	jz	short cfn_3 ; not any char after the last '\'
   476                                  	; dh = count of file name chars
   477                                  	; dl = dot position (2 to 9)
   478 00000262 38D6                    	cmp	dh, dl
   479                                  	;cmp	ah, '.'
   480 00000264 74EF                    	je	short cfn_3 ; the last chr of fname is a dot	
   481                                  cifnc_retn:
   482 00000266 F8                      	clc
   483 00000267 C3                      	retn
   484                                  
   485                                  check_inv_fname_chars:
   486 00000268 BF[7402]                	mov	di, invalid_fname_chars
   487 0000026B B91400                  	mov	cx, sizeInvFnChars
   488 0000026E F2AE                    	repne	scasb
   489 00000270 E3F4                    	jcxz	cifnc_retn
   490 00000272 F9                      	stc
   491 00000273 C3                      	retn
   492                                  
   493                                  invalid_fname_chars:
   494 00000274 222728292A2B2C2F        	db 22h, 27h, 28h, 29h, 2Ah, 2Bh, 2Ch, 2Fh
   495 0000027C 3A3B3C3D3E3F40          	db 3Ah, 3Bh, 3Ch, 3Dh, 3Eh, 3Fh, 40h
   496 00000283 5B5C5D5E60              	db 5Bh, 5Ch, 5Dh, 5Eh, 60h
   497                                  sizeInvFnChars  equ ($ - invalid_fname_chars)
   498                                  
   499                                  skip_path:
   500 00000288 BE[C405]                	mov	si, img_file_name
   501 0000028B 31D2                    	xor	dx, dx
   502 0000028D 30C0                    	xor	al, al
   503                                  skp_1:
   504 0000028F 88C4                    	mov	ah, al
   505 00000291 89F3                    	mov	bx, si
   506                                  skp_2:
   507 00000293 AC                      	lodsb
   508 00000294 42                      	inc	dx
   509 00000295 3C3A                    	cmp	al, ':'
   510 00000297 7411                    	je	short skp_4
   511 00000299 3C5C                    	cmp	al, '\'
   512 0000029B 7414                    	je	short skp_5
   513 0000029D 20C0                    	and	al, al
   514 0000029F 7406                    	jz	short skp_3
   515 000002A1 E8C4FF                  	call	check_inv_fname_chars
   516 000002A4 73ED                    	jnc	short skp_2
   517 000002A6 C3                      	retn
   518                                  skp_3:
   519 000002A7 89DE                    	mov	si, bx
   520 000002A9 C3                      	retn
   521                                  skp_4:
   522 000002AA 80FA02                  	cmp	dl, 2
   523 000002AD 74E0                    	je	short skp_1
   524                                  	; not '?:'
   525 000002AF F9                      	stc
   526 000002B0 C3                      	retn
   527                                  skp_5:
   528 000002B1 43                      	inc	bx
   529 000002B2 43                      	inc	bx
   530 000002B3 39F3                    	cmp	bx, si
   531 000002B5 75D8                    	jne	short skp_1
   532 000002B7 38E0                    	cmp	al, ah
   533 000002B9 75D4                    	jne	short skp_1
   534                                  	; '\\'
   535 000002BB F9                      	stc
   536 000002BC C3                      	retn
   537                                  
   538                                  ;-----------------------------------------------------------------
   539                                  ; File name capitalization
   540                                  ;-----------------------------------------------------------------
   541                                  
   542                                  	; 31/10/2023
   543                                  capitalize:
   544                                  	; skip path at first	
   545                                  	;mov	si, img_file_name
   546 000002BD E8C8FF                  	call	skip_path
   547 000002C0 721A                    	jc	short R_08 ; invalid path name	
   548                                  			   ; (may be correct for dos/windows
   549                                  			   ; but contains invalid -defined- chars)	
   550                                  		; (it will be used without uppercase conversion)
   551                                  		; ((dos/windows 'create file' or 'open file' 
   552                                  		;   system call will return with error if it is 
   553                                  		;  invalid file and path name for dos/windows.))
   554                                   	
   555 000002C2 BF[0606]                	mov	di, uc_FileName
   556 000002C5 B90C00                  	mov	cx, 12
   557                                  R_05:
   558 000002C8 AC                      	lodsb
   559 000002C9 3C61                    	cmp	al, 'a'
   560 000002CB 7307                    	jnb	short R_07
   561 000002CD 20C0                    	and	al, al
   562 000002CF 740D                    	jz	short R_09
   563                                  R_06:
   564 000002D1 AA                      	stosb
   565 000002D2 EBF4                    	jmp	short R_05 		
   566                                  R_07:
   567 000002D4 3C7A                    	cmp	al, 'z'
   568 000002D6 77F9                    	ja	short R_06
   569 000002D8 24DF                    	and	al, 0DFh ; NOT 32
   570 000002DA EBF5                    	jmp	short R_06
   571                                  R_08:
   572 000002DC 30C0                    	xor	al, al ; 0
   573                                  R_09:
   574 000002DE AA                      	stosb
   575 000002DF C3                      	retn	
   576                                  	
   577                                  ;-----------------------------------------------------------------
   578                                  ; Print messages
   579                                  ;-----------------------------------------------------------------
   580                                  
   581                                  print_msg:
   582                                  
   583                                  print_msg_LOOP:
   584 000002E0 AC                      	lodsb                           ; Load byte at DS:SI to AL
   585 000002E1 20C0                    	and     al, al            
   586 000002E3 7409                    	jz      short print_msg_OK       
   587 000002E5 B40E                    	mov	ah, 0Eh			
   588 000002E7 BB0700                  	mov     bx, 07h             
   589 000002EA CD10                    	int	10h			; BIOS Service func ( ah ) = 0Eh
   590                                  					; Write char as TTY
   591                                  					; AL-char BH-page BL-color
   592 000002EC EBF2                    	jmp     short print_msg_LOOP           
   593                                  
   594                                  print_msg_OK:
   595 000002EE C3                      	retn
   596                                  
   597                                  ;-----------------------------------------------------------------
   598                                  ; read disk track
   599                                  ;-----------------------------------------------------------------
   600                                  
   601                                  read_track_h1:
   602 000002EF 8A2E[3E03]              	mov	ch, [track]
   603                                  read_track_h2:
   604                                  	; read track (will return with error if SPT is wrong)	
   605 000002F3 89D3                    	mov	bx, dx	; trackbuffer
   606 000002F5 B402                    	mov	ah, 02h
   607 000002F7 A0[3803]                	mov	al, [SPT]
   608 000002FA 8A16[3503]              	mov	dl, [drivenumber]
   609 000002FE 8A36[3F03]              	mov	dh, [head]		; head 0 or 1
   610                                  	; ch = cylinder/track
   611 00000302 B101                    	mov	cl, 1			; sector 1 
   612 00000304 CD13                    	int	13h
   613 00000306 B000                    	mov	al, 0
   614 00000308 C3                      	retn
   615                                  
   616                                  ;-----------------------------------------------------------------
   617                                  ; calculate and set writing percentage
   618                                  ;-----------------------------------------------------------------
   619                                  
   620                                  calculate_percentage:
   621 00000309 BF[4003]                	mov	di, percent_str
   622 0000030C A0[3E03]                	mov	al, [track]
   623 0000030F FEC0                    	inc	al
   624 00000311 8A0E[1606]              	mov	cl, [numtracks] ; 80 or 40
   625 00000315 38C8                    	cmp	al, cl
   626 00000317 7207                    	jb	short cperc_1
   627 00000319 B031                    	mov	al, '1'
   628 0000031B AA                      	stosb
   629 0000031C 31C0                    	xor	ax, ax
   630 0000031E EB0C                    	jmp	short cperc_2
   631                                  cperc_1:
   632 00000320 B464                    	mov	ah, 100
   633 00000322 F6E4                    	mul	ah
   634 00000324 F6F1                    	div	cl
   635                                  	; al = %
   636 00000326 30E4                    	xor	ah, ah
   637 00000328 B10A                    	mov	cl, 10
   638 0000032A F6F1                    	div	cl
   639                                  cperc_2:
   640 0000032C 053030                  	add	ax, '00' ; 3030h
   641 0000032F AB                      	stosw
   642 00000330 B82500                  	mov	ax, '%'
   643 00000333 AB                      	stosw
   644 00000334 C3                      	retn
   645                                  
   646                                  ;-----------------------------------------------------------------
   647                                  ;  Data
   648                                  ;-----------------------------------------------------------------
   649                                  
   650                                  	; 30/10/2023
   651                                  
   652                                  drivenumber:
   653 00000335 00                      	db	0
   654                                  disktype:
   655 00000336 0000                    	dw	0
   656                                  
   657 00000338 00                      SPT:	db	0
   658                                  SPT_table:
   659 00000339 090F091224              	db	9, 15, 9, 18, 36
   660                                  
   661 0000033E 00                      track:	db	0
   662 0000033F 00                      head:	db	0
   663                                  
   664                                  percent_str:
   665 00000340 30302500                	db	'00%', 0
   666                                  
   667                                  ;-----------------------------------------------------------------
   668                                  ;  Messages
   669                                  ;-----------------------------------------------------------------
   670                                  
   671                                  RetroDOS_Welcome:
   672 00000344 0D0A                    	db	0Dh, 0Ah
   673 00000346 466C6F707079204469-     	db	'Floppy Disk Image Utility (disk copy to img file)'
   673 0000034F 736B20496D61676520-
   673 00000358 5574696C6974792028-
   673 00000361 6469736B20636F7079-
   673 0000036A 20746F20696D672066-
   673 00000373 696C6529           
   674 00000377 0D0A                    	db	0Dh, 0Ah
   675 00000379 76312E302E32333130-     	db	"v1.0.231031  (c) Erdogan TAN 2023"
   675 00000382 333120202863292045-
   675 0000038B 72646F67616E205441-
   675 00000394 4E2032303233       
   676 0000039A 0D0A                    	db	0Dh,0Ah
   677 0000039C 0D0A                    	db	0Dh,0Ah
   678 0000039E 55736167653A206664-     	db	'Usage: fd2img <fd name> <image file name> '
   678 000003A7 32696D67203C666420-
   678 000003B0 6E616D653E203C696D-
   678 000003B9 6167652066696C6520-
   678 000003C2 6E616D653E20       
   679 000003C8 0D0A                    	db	0Dh, 0Ah
   680 000003CA 0D0A                    	db	0Dh, 0Ah
   681 000003CC 20204578616D706C65-     	db	'  Example: fd2img a: a.img '
   681 000003D5 3A20666432696D6720-
   681 000003DE 613A20612E696D6720 
   682 000003E7 0D0A                    	db	0Dh, 0Ah
   683 000003E9 0D0A                    	db	0Dh, 0Ah
   684 000003EB 4469736B206E616D65-     	db	'Disk names: A:, B: or fd0 (A:), fd1 (B:) ' 
   684 000003F4 733A20413A2C20423A-
   684 000003FD 206F72206664302028-
   684 00000406 413A292C2066643120-
   684 0000040F 28423A2920         
   685 00000414 0D0A                    	db	0Dh, 0Ah
   686 00000416 00                      	db	0
   687                                  
   688                                  msg_inv_file_name: 
   689 00000417 0D0A                    	db	0Dh, 0Ah
   690 00000419 496E76616C69642066-     	db	"Invalid file (or path) name ! "
   690 00000422 696C6520286F722070-
   690 0000042B 61746829206E616D65-
   690 00000434 202120             
   691 00000437 0D0A00                  	db	0Dh, 0Ah, 0
   692                                  
   693                                  msg_permission_denied: 
   694 0000043A 0D0A                    	db	0Dh, 0Ah
   695 0000043C 5065726D697373696F-     	db	"Permission denied ! (File open/create error) ! "
   695 00000445 6E2064656E69656420-
   695 0000044E 21202846696C65206F-
   695 00000457 70656E2F6372656174-
   695 00000460 65206572726F722920-
   695 00000469 2120               
   696 0000046B 0D0A                    	db	0Dh, 0Ah
   697 0000046D 284163636573732065-     	db	"(Access error or it is a directory or volume name) !"
   697 00000476 72726F72206F722069-
   697 0000047F 742069732061206469-
   697 00000488 726563746F7279206F-
   697 00000491 7220766F6C756D6520-
   697 0000049A 6E616D65292021     
   698 000004A1 0D0A00                  	db	0Dh, 0Ah, 0
   699                                  
   700                                  msg_overwrite_question1:
   701 000004A4 0D0A                    	db	0Dh, 0Ah
   702 000004A6 446F20796F75207761-     	db	'Do you want to overwrite '
   702 000004AF 6E7420746F206F7665-
   702 000004B8 72777269746520     
   703 000004BF 27                      	db	27h
   704 000004C0 00                      	db	0
   705                                  
   706                                  msg_overwrite_question2: 
   707 000004C1 27                      	db	27h
   708 000004C2 2066696C6520            	db	' file '
   709 000004C8 00                      	db	0
   710                                  
   711                                  msg_drv_not_ready_err: 
   712 000004C9 0D0A                    	db	0Dh, 0Ah
   713 000004CB 4472697665206E6F74-     	db	"Drive not ready !"
   713 000004D4 2072656164792021   
   714 000004DC 0D0A00                  	db	0Dh, 0Ah, 0
   715                                  
   716                                  msg_disk_read_err: 
   717 000004DF 0D0A                    	db	0Dh, 0Ah
   718 000004E1 4469736B2072656164-     	db	"Disk read error !"
   718 000004EA 206572726F722021   
   719 000004F2 0D0A00                  	db	0Dh, 0Ah, 0
   720                                  
   721                                  msg_writing_err:
   722 000004F5 0D0A                    	db	0Dh, 0Ah
   723 000004F7 496D6167652066696C-     	db	"Image file writing error !"
   723 00000500 652077726974696E67-
   723 00000509 206572726F722021   
   724 00000511 0D0A00                  	db	0Dh, 0Ah, 0	
   725                                  
   726                                  msg_yes_no:
   727 00000514 285965732F4E6F293F-     	db	'(Yes/No)? ', 0		
   727 0000051D 2000               
   728                                  
   729                                  msg_writing:
   730 0000051F 57726974696E672074-     	db	"Writing tracks: ", 0
   730 00000528 7261636B733A2000   
   731                                  
   732                                  msg_disk_type:
   733 00000530 0D0A                    	db	0Dh, 0Ah
   734 00000532 4469736B2054797065-     	db	'Disk Type: '
   734 0000053B 3A20               
   735 0000053D 00                      	db	0
   736                                  
   737                                  disktypestr:
   738 0000053E 31202D20352E323522-     	db	'1 - 5.25",  360 KB',0
   738 00000547 2C2020333630204B42-
   738 00000550 00                 
   739                                  disktypestrsize equ $ - disktypestr
   740 00000551 32202D20352E323522-     	db	'2 - 5.25", 1200 KB',0
   740 0000055A 2C2031323030204B42-
   740 00000563 00                 
   741 00000564 33202D20352E323522-      	db	'3 - 5.25",  720 KB',0
   741 0000056D 2C2020373230204B42-
   741 00000576 00                 
   742 00000577 34202D20332E35222C-     	db	'4 - 3.5",  1440 KB',0
   742 00000580 202031343430204B42-
   742 00000589 00                 
   743 0000058A 35202D20332E35222C-      	db	'5 - 3.5",  2880 KB',0	
   743 00000593 202032383830204B42-
   743 0000059C 00                 
   744                                  
   745                                  Msg_YES:
   746 0000059D 2059455300              	db	' YES', 0
   747                                  Msg_NO:
   748 000005A2 204E4F00                	db	' NO', 0
   749                                  
   750                                  Msg_OK:
   751 000005A6 204F4B2E                	db	' OK.'
   752                                  CRLF:
   753 000005AA 0D0A00                  	db	0Dh, 0Ah, 0
   754                                  
   755 000005AD 286329204572646F67-     	db	'(c) Erdogan TAN 2023'
   755 000005B6 616E2054414E203230-
   755 000005BF 3233               
   756                                  
   757                                  ;SizeOfFile equ $-100
   758                                  
   759                                  ;-----------------------------------------------------------------
   760                                  ; uninitialized data
   761                                  ;-----------------------------------------------------------------
   762                                  
   763                                  bss_start:
   764                                  
   765                                  ABSOLUTE bss_start
   766                                  
   767 000005C1 ??                      alignb 2
   768                                  
   769                                  img_file_handle:
   770 000005C2 ????                    	resw	1
   771                                  img_file_name:  
   772 000005C4 <res 42h>               	resb	66
   773                                  uc_FileName:	; 31/10/2023
   774 00000606 <res Eh>                	resb	14
   775                                  cursorpos:
   776 00000614 ????                    	resw	1
   777                                  numtracks:
   778 00000616 ????                    	resw	1
   779                                  tracksize:
   780 00000618 ????                    	resw	1
   781                                  trackbuffer:
   782 0000061A <res 4800h>             	resb	36*512
   783                                  
   784                                  end_bss:
