     1                                  ; ****************************************************************************
     2                                  ; disksize.s (TRDOS 386, TRDOS v2.0 - sample binary file)
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; DISKSIZE.PRG ! TEST program !
     5                                  ;
     6                                  ; 29/08/2020
     7                                  ;
     8                                  ; Derived from 'args386.s' & 'dsectpm3.s' source code for TRDOS 386 v2
     9                                  ;
    10                                  ; [ Last Modification: 29/08/2020 ]
    11                                  ;
    12                                  ; ****************************************************************************
    13                                  
    14                                  ; 14/07/2020 (lastdrv.s)
    15                                  ; 31/12/2017
    16                                  ; TRDOS 386 (v2.0) system calls
    17                                  _ver 	equ 0
    18                                  _exit 	equ 1
    19                                  _fork 	equ 2
    20                                  _read 	equ 3
    21                                  _write	equ 4
    22                                  _open	equ 5
    23                                  _close 	equ 6
    24                                  _wait 	equ 7
    25                                  _create	equ 8
    26                                  _rename	equ 9
    27                                  _delete	equ 10
    28                                  _exec	equ 11
    29                                  _chdir	equ 12
    30                                  _time 	equ 13
    31                                  _mkdir 	equ 14
    32                                  _chmod	equ 15
    33                                  _rmdir	equ 16
    34                                  _break	equ 17
    35                                  _drive	equ 18
    36                                  _seek	equ 19
    37                                  _tell 	equ 20
    38                                  _memory	equ 21
    39                                  _prompt	equ 22
    40                                  _path	equ 23
    41                                  _env	equ 24
    42                                  _stime	equ 25
    43                                  _quit	equ 26	
    44                                  _intr	equ 27
    45                                  _dir	equ 28
    46                                  _emt 	equ 29
    47                                  _ldrvt 	equ 30
    48                                  _video 	equ 31
    49                                  _audio	equ 32
    50                                  _timer	equ 33
    51                                  _sleep	equ 34
    52                                  _msg    equ 35
    53                                  _geterr	equ 36
    54                                  _fpstat	equ 37
    55                                  _pri	equ 38
    56                                  _rele	equ 39
    57                                  _fff	equ 40
    58                                  _fnf	equ 41
    59                                  _alloc	equ 42
    60                                  _dalloc equ 43
    61                                  _calbac equ 44
    62                                  _dma	equ 45	
    63                                  
    64                                  %macro sys 1-4
    65                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    66                                      ; 03/09/2015	
    67                                      ; 13/04/2015
    68                                      ; Retro UNIX 386 v1 system call.		
    69                                      %if %0 >= 2   
    70                                          mov ebx, %2
    71                                          %if %0 >= 3    
    72                                              mov ecx, %3
    73                                              %if %0 = 4
    74                                                 mov edx, %4   
    75                                              %endif
    76                                          %endif
    77                                      %endif
    78                                      mov eax, %1
    79                                      ;int 30h
    80                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    81                                  %endmacro
    82                                  
    83                                  
    84                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    85                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    86                                  
    87                                  ;========================================================================
    88                                  ; GET PYHSICAL DISK SIZE AND (VIRTUAL) CHS PARAMETERS
    89                                  ;========================================================================
    90                                  
    91                                  [BITS 32] ; We need 32-bit intructions for protected mode
    92                                  
    93                                  [ORG 0] 
    94                                  
    95                                  START_CODE:
    96                                  	;mov	esi, esp
    97                                  	;lodsd
    98 00000000 58                      	pop	eax
    99                                  	;and	eax, eax
   100                                  	;jz	short terminate
   101                                  	;cmp	eax, 2
   102                                  	;ja	short usage
   103 00000001 83F802                  	cmp	eax, 2 ; file name (argument 0) and argument 1
   104 00000004 7534                    	jne	short usage
   105 00000006 58                      	pop	eax ; pass argument 0 (file name)
   106                                  getarg:
   107                                  	;lodsd
   108                                  	;pop	eax
   109 00000007 5E                      	pop	esi
   110 00000008 66813E6664              	cmp	word [esi], 'fd'	
   111 0000000D 745B                    	je	short floppy_disk
   112 0000000F 66813E6864              	cmp	word [esi], 'hd'
   113 00000014 753C                    	jne	short invalidname
   114                                  hard_disk:
   115 00000016 66C705[72030000]68-     	mov	word [drvname], 'hd'
   115 0000001E 64                 
   116 0000001F 8A4602                  	mov	al, [esi+2]
   117 00000022 A2[74030000]            	mov	byte [drvname+2], al
   118 00000027 2C30                    	sub	al, '0'
   119 00000029 3C00                    	cmp	al, 0
   120 0000002B 7225                    	jb	short invalidname
   121 0000002D 3C03                    	cmp	al, 3 
   122 0000002F 7721                    	ja	short invalidname
   123 00000031 0480                    	add	al, 80h
   124                                  	; al = physical disk number (for bios)
   125 00000033 E8A0000000              	call	getdiskparms
   126 00000038 EB50                    	jmp	short writediskinfo
   127                                  usage:
   128                                  	sys	_msg, msgUsage, 255, 0Fh
   128                              <1> 
   128                              <1> 
   128                              <1> 
   128                              <1> 
   128                              <1>  %if %0 >= 2
   128 0000003A BB[A3010000]        <1>  mov ebx, %2
   128                              <1>  %if %0 >= 3
   128 0000003F B9FF000000          <1>  mov ecx, %3
   128                              <1>  %if %0 = 4
   128 00000044 BA0F000000          <1>  mov edx, %4
   128                              <1>  %endif
   128                              <1>  %endif
   128                              <1>  %endif
   128 00000049 B823000000          <1>  mov eax, %1
   128                              <1> 
   128 0000004E CD40                <1>  int 40h
   129 00000050 EB64                    	jmp	short terminate
   130                                  
   131                                  invalidname:
   132                                  	sys	_msg, msgInvalidName, 255, 0Fh
   132                              <1> 
   132                              <1> 
   132                              <1> 
   132                              <1> 
   132                              <1>  %if %0 >= 2
   132 00000052 BB[BB020000]        <1>  mov ebx, %2
   132                              <1>  %if %0 >= 3
   132 00000057 B9FF000000          <1>  mov ecx, %3
   132                              <1>  %if %0 = 4
   132 0000005C BA0F000000          <1>  mov edx, %4
   132                              <1>  %endif
   132                              <1>  %endif
   132                              <1>  %endif
   132 00000061 B823000000          <1>  mov eax, %1
   132                              <1> 
   132 00000066 CD40                <1>  int 40h
   133 00000068 EB4C                    	jmp	short terminate
   134                                  
   135                                  floppy_disk:
   136 0000006A 66C705[72030000]66-     	mov	word [drvname], 'fd'
   136 00000072 64                 
   137 00000073 8A4602                  	mov	al, [esi+2]
   138 00000076 A2[74030000]            	mov	byte [drvname+2], al
   139 0000007B 2C30                    	sub	al, '0'
   140 0000007D 3C00                    	cmp	al, 0
   141 0000007F 72D1                    	jb	short invalidname
   142 00000081 3C01                    	cmp	al, 1 
   143 00000083 77CD                    	ja	short invalidname
   144                                  	; al = physical disk number (for bios)
   145                                  
   146 00000085 E84E000000              	call	getdiskparms
   147                                  
   148                                  writediskinfo:
   149                                  	sys	_msg, msgDiskInfo, 255, 0Fh	
   149                              <1> 
   149                              <1> 
   149                              <1> 
   149                              <1> 
   149                              <1>  %if %0 >= 2
   149 0000008A BB[6F030000]        <1>  mov ebx, %2
   149                              <1>  %if %0 >= 3
   149 0000008F B9FF000000          <1>  mov ecx, %3
   149                              <1>  %if %0 = 4
   149 00000094 BA0F000000          <1>  mov edx, %4
   149                              <1>  %endif
   149                              <1>  %endif
   149                              <1>  %endif
   149 00000099 B823000000          <1>  mov eax, %1
   149                              <1> 
   149 0000009E CD40                <1>  int 40h
   150                                  
   151                                  	sys	_msg, nexline, 2, 07h
   151                              <1> 
   151                              <1> 
   151                              <1> 
   151                              <1> 
   151                              <1>  %if %0 >= 2
   151 000000A0 BB[5B030000]        <1>  mov ebx, %2
   151                              <1>  %if %0 >= 3
   151 000000A5 B902000000          <1>  mov ecx, %3
   151                              <1>  %if %0 = 4
   151 000000AA BA07000000          <1>  mov edx, %4
   151                              <1>  %endif
   151                              <1>  %endif
   151                              <1>  %endif
   151 000000AF B823000000          <1>  mov eax, %1
   151                              <1> 
   151 000000B4 CD40                <1>  int 40h
   152                                  
   153                                  terminate: 
   154                                  	sys	_exit
   154                              <1> 
   154                              <1> 
   154                              <1> 
   154                              <1> 
   154                              <1>  %if %0 >= 2
   154                              <1>  mov ebx, %2
   154                              <1>  %if %0 >= 3
   154                              <1>  mov ecx, %3
   154                              <1>  %if %0 = 4
   154                              <1>  mov edx, %4
   154                              <1>  %endif
   154                              <1>  %endif
   154                              <1>  %endif
   154 000000B6 B801000000          <1>  mov eax, %1
   154                              <1> 
   154 000000BB CD40                <1>  int 40h
   155                                  halt:
   156 000000BD EBFE                    	jmp	short halt
   157                                  
   158                                  drvnotrdy:
   159 000000BF 58                      	pop	eax ; pop return address
   160                                  		    ; to the caller
   161                                  		    			
   162                                  	sys	_msg, msgDrvNotRdy, 255, 0Fh
   162                              <1> 
   162                              <1> 
   162                              <1> 
   162                              <1> 
   162                              <1>  %if %0 >= 2
   162 000000C0 BB[69020000]        <1>  mov ebx, %2
   162                              <1>  %if %0 >= 3
   162 000000C5 B9FF000000          <1>  mov ecx, %3
   162                              <1>  %if %0 = 4
   162 000000CA BA0F000000          <1>  mov edx, %4
   162                              <1>  %endif
   162                              <1>  %endif
   162                              <1>  %endif
   162 000000CF B823000000          <1>  mov eax, %1
   162                              <1> 
   162 000000D4 CD40                <1>  int 40h
   163 000000D6 EBDE                    	jmp	short terminate
   164                                  
   165                                  getdiskparms:
   166 000000D8 88C2                    	mov	dl, al
   167 000000DA A2[20040000]            	mov	[drv], al
   168                                  
   169 000000DF 3C80                    	cmp	al, 80h
   170 000000E1 7216                    	jb	short gdp_fd	
   171                                  
   172 000000E3 66B80015                	mov	ax, 1500h ; ah = 15h, get disk size
   173 000000E7 CD33                    	int	33h
   174 000000E9 72D4                    	jc	short drvnotrdy
   175                                  	
   176 000000EB 668915[24040000]        	mov	[disksz], dx ; low word
   177 000000F2 66890D[26040000]        	mov	[disksz+2], cx ; high word
   178                                  
   179                                  gdp_fd:
   180 000000F9 8A15[20040000]          	mov	dl, [drv]
   181 000000FF 31DB                    	xor	ebx, ebx ; 0, do not use DPT buffer
   182 00000101 B408                    	mov	ah, 08h ; get disk parameters (logical)
   183 00000103 CD33                    	int	33h
   184 00000105 72B8                    	jc	short drvnotrdy
   185                                  
   186 00000107 88E8                    	mov	al, ch ; last cylinder (bits 0-7)
   187 00000109 88CC                    	mov	ah, cl ; 
   188 0000010B C0EC06                  	shr	ah, 6  ; last cylinder (bits 8-9)
   189 0000010E 6640                    	inc	ax  ; convert max. cyl number to cyl count
   190 00000110 FEC6                    	inc	dh  ; convert last head to heads
   191 00000112 6683E13F                	and	cx, 3Fh ; 6 bits for spt	
   192                                  
   193 00000116 51                      	push	ecx ; cl = sectors per track
   194 00000117 52                      	push	edx ; dh = heads
   195                                  	; ax = cylinders
   196                                  
   197 00000118 803D[20040000]80        	cmp	byte [drv], 80h
   198 0000011F 7319                    	jnb	short gdp_hd
   199                                  
   200 00000121 88F2                    	mov	dl, dh
   201 00000123 30F6                    	xor	dh, dh
   202                                  
   203                                  	; calculate floppy disk size
   204                                  	; ((1.44MB, 3.5" fd))
   205                                  	;	(dx = 2)
   206                                  	;	(cx = 18)
   207                                  	;	(ax = 80)
   208                                  	;	(size = 2880 sectors)
   209                                  
   210 00000125 50                      	push	eax
   211 00000126 66F7E2                  	mul	dx  ; ax = dx*ax, dx = 0
   212 00000129 66F7E1                  	mul	cx	
   213 0000012C 66A3[24040000]          	mov	[disksz], ax
   214 00000132 668915[26040000]        	mov	[disksz+2], dx ; = 0
   215 00000139 58                      	pop	eax
   216                                  
   217                                  gdp_hd:
   218                                  	; Writing CHS values on screen
   219                                  	
   220                                  	; ax = number of cylinders
   221 0000013A BF[E0030000]            	mov	edi, cylinders
   222 0000013F E833000000              	call	write_dhex
   223 00000144 5A                      	pop	edx	
   224 00000145 88F0                    	mov	al, dh
   225                                  	; al = number of heads
   226 00000147 BF[FD030000]            	mov	edi, heads
   227 0000014C E837000000              	call	write_hex
   228 00000151 58                      	pop	eax
   229                                  	; al = sectors per track
   230 00000152 BF[18040000]            	mov	edi, spt
   231 00000157 E82C000000              	call	write_hex
   232                                  	
   233 0000015C 66A1[26040000]          	mov	ax, [disksz+2]
   234 00000162 BF[BD030000]            	mov	edi, disksize
   235 00000167 E80B000000              	call	write_dhex
   236 0000016C 66A1[24040000]          	mov	ax, [disksz]
   237 00000172 BF[C1030000]            	mov	edi, disksize+4
   238                                  	;;call	write_dhex		 
   239                                  	;;retn
   240                                  	;jmp	write_dhex
   241                                  
   242                                  write_dhex:
   243 00000177 88E3                    	mov	bl, ah
   244 00000179 C0EB04                          shr     bl, 4
   245 0000017C E813000000                      call    dhgd
   246 00000181 88E3                    	mov	bl, ah
   247 00000183 E80C000000              	call	dhgd
   248                                  
   249                                  write_hex:
   250 00000188 88C3                    	mov	bl, al
   251 0000018A C0EB04                          shr     bl, 4
   252 0000018D E802000000              	call	dhgd
   253 00000192 88C3                    	mov	bl, al
   254                                  	;call	dhgd
   255                                  	;retn
   256                                  dhgd:
   257 00000194 50                      	push	eax
   258 00000195 83E30F                  	and	ebx, 0Fh
   259 00000198 81C3[5E030000]                  add     ebx, hex_digits
   260 0000019E 8A03                            mov     al, [ebx]
   261 000001A0 AA                      	stosb
   262 000001A1 58                      	pop	eax
   263 000001A2 C3                      	retn
   264                                  
   265                                  msgUsage:
   266 000001A3 0D0A                    	db 0Dh, 0Ah
   267 000001A5 5452444F5320333836-     	db 'TRDOS 386 v2 - Physical Disk Size and (virtual) CHS Parameters'
   267 000001AE 207632202D20506879-
   267 000001B7 736963616C20446973-
   267 000001C0 6B2053697A6520616E-
   267 000001C9 642028766972747561-
   267 000001D2 6C2920434853205061-
   267 000001DB 72616D6574657273   
   268 000001E3 0D0A                    	db 0Dh, 0Ah
   269 000001E5 746573742070726F67-     	db 'test program (v1) by Erdogan Tan - 29/08/2020'
   269 000001EE 72616D202876312920-
   269 000001F7 6279204572646F6761-
   269 00000200 6E2054616E202D2032-
   269 00000209 392F30382F32303230 
   270 00000212 0D0A                    	db 0Dh, 0Ah
   271 00000214 0D0A                    	db 0Dh, 0Ah
   272 00000216 55736167653A206469-     	db 'Usage: disksize <diskname>'
   272 0000021F 736B73697A65203C64-
   272 00000228 69736B6E616D653E   
   273 00000230 0D0A                    	db 0Dh, 0Ah
   274 00000232 0D0A                    	db 0Dh, 0Ah
   275 00000234 2876616C6964206469-     	db '(valid disk names: fd0, fd1, hd0, hd1, hd2, hd3)'
   275 0000023D 736B206E616D65733A-
   275 00000246 206664302C20666431-
   275 0000024F 2C206864302C206864-
   275 00000258 312C206864322C2068-
   275 00000261 643329             
   276 00000264 0D0A0D0A00              	db 0Dh, 0Ah, 0Dh, 0Ah, 0
   277                                  
   278                                  msgDrvNotRdy:
   279 00000269 0D0A                    	db 0Dh, 0Ah
   280 0000026B 4449534B204552524F-     	db 'DISK ERROR !', 0Dh, 0Ah
   280 00000274 5220210D0A         
   281 00000279 506879736963616C20-     	db 'Physical Disk Drive not ready or not valid for TRDOS 386 v2 !'
   281 00000282 4469736B2044726976-
   281 0000028B 65206E6F7420726561-
   281 00000294 6479206F72206E6F74-
   281 0000029D 2076616C696420666F-
   281 000002A6 72205452444F532033-
   281 000002AF 38362076322021     
   282 000002B6 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
   283 000002BA 00                      	db 0
   284                                  
   285                                  msgInvalidName:
   286 000002BB 0D0A                    	db 0Dh, 0Ah
   287 000002BD 496E76616C69642070-     	db "Invalid physical disk name !"
   287 000002C6 6879736963616C2064-
   287 000002CF 69736B206E616D6520-
   287 000002D8 21                 
   288 000002D9 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
   289 000002DD 56616C696420646973-     	db "Valid disk names:"
   289 000002E6 6B206E616D65733A   
   290 000002EE 0D0A                    	db 0Dh, 0Ah
   291 000002F0 20092766643027206F-     	db " 	'fd0' or 'fd1' (for floppy disks, A: or B:)"
   291 000002F9 722027666431272028-
   291 00000302 666F7220666C6F7070-
   291 0000030B 79206469736B732C20-
   291 00000314 413A206F7220423A29 
   292 0000031D 0D0A                    	db 0dh, 0Ah
   293 0000031F 09276864302720746F-     	db "	'hd0' to 'hd3' (for hard disks, 1 to 4, from C: to ..)"
   293 00000328 202768643327202866-
   293 00000331 6F7220686172642064-
   293 0000033A 69736B732C20312074-
   293 00000343 6F20342C2066726F6D-
   293 0000034C 20433A20746F202E2E-
   293 00000355 29                 
   294 00000356 0D0A0D0A00              	db 0Dh, 0Ah, 0Dh, 0Ah, 0
   295                                  
   296                                  nexline:
   297 0000035B 0D0A00                  	db 0Dh, 0Ah, 0
   298                                  
   299                                  
   300                                  hex_digits:
   301                                  hexchrs:
   302 0000035E 303132333435363738-     	db '0123456789ABCDEF'
   302 00000367 39414243444546     
   303                                  
   304 0000036E 00                      	db 0
   305                                  
   306                                  msgDiskInfo:
   307 0000036F 07                      	db 07h
   308 00000370 0D0A                    	db 0Dh, 0Ah
   309                                  drvname:
   310 00000372 585858                  	db 'XXX'
   311 00000375 202D20                  	db ' - '	
   312 00000378 506879736963616C20-     	db 'Physical disk size and CHS (logical) values'
   312 00000381 6469736B2073697A65-
   312 0000038A 20616E642043485320-
   312 00000393 286C6F676963616C29-
   312 0000039C 2076616C756573     
   313 000003A3 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
   314                                  
   315 000003A7 53697A652028696E20-     	db 'Size (in sectors)   : '
   315 000003B0 736563746F72732920-
   315 000003B9 20203A20           
   316                                  disksize:
   317 000003BD 585858585858585868      	db 'XXXXXXXXh'
   318 000003C6 0D0A                    	db 0Dh, 0Ah
   319 000003C8 0D0A                    	db 0Dh, 0Ah
   320                                  	
   321 000003CA 4E756D626572206F66-     	db 'Number of Cylinders : '
   321 000003D3 2043796C696E646572-
   321 000003DC 73203A20           
   322                                  cylinders:
   323 000003E0 5858585868              	db 'XXXXh'
   324 000003E5 0D0A                    	db 0Dh, 0Ah
   325 000003E7 4E756D626572206F66-     	db 'Number of Heads     : '
   325 000003F0 204865616473202020-
   325 000003F9 20203A20           
   326                                  heads:
   327 000003FD 585868                  	db 'XXh'
   328 00000400 0D0A                    	db 0Dh, 0Ah
   329 00000402 536563746F72732070-     	db 'Sectors per Track   : '
   329 0000040B 657220547261636B20-
   329 00000414 20203A20           
   330                                  spt:
   331 00000418 585868                  	db 'XXh'
   332 0000041B 0D0A                    	db 0Dh, 0Ah
   333 0000041D 0D0A                    	db 0Dh, 0Ah
   334 0000041F 00                      	db 0
   335                                  
   336                                  bss_start:
   337                                  
   338                                  ABSOLUTE bss_start
   339                                  
   340 00000420 <res 00000001>          drv:	resb 1
   341                                  
   342 00000421 <res 00000003>          alignb 4
   343                                  
   344 00000424 <res 00000004>          disksz:	resd 1
   345                                  
   346                                  bss_end:
   347                                  	
   348                                  _end:
