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) , , 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 ' 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 drv: resb 1 341 342 00000421 alignb 4 343 344 00000424 disksz: resd 1 345 346 bss_end: 347 348 _end: