1 ; **************************************************************************** 2 ; df2.s (df386.s) - print free blocks - by Erdogan Tan - 30/06/2022 3 ; ---------------------------------------------------------------------------- 4 ; Retro UNIX 386 v1.2 - file system (disk free blocks info) utility 5 ; 6 ; [ Last Modification: 01/07/2022 ] 7 8 ; Derived from unix v2 '/bin/df' (PDP-11 assembly) source code 9 ; 10 ; **************************************************************************** 11 ; [ svntree-20081216.tar.gz - bin/df (archive date: 21-11-1972) ] 12 13 ; Assembler: NASM v2.15 14 ; ((nasm df1.s -l df1.txt -o df1 -Z error.txt)) 15 16 ; UNIX v1 system calls 17 _rele 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 _creat equ 8 26 _link equ 9 27 _unlink equ 10 28 _exec equ 11 29 _chdir equ 12 30 _time equ 13 31 _mkdir equ 14 32 _chmod equ 15 33 _chown equ 16 34 _break equ 17 35 _stat equ 18 36 _seek equ 19 37 _tell equ 20 38 _mount equ 21 39 _umount equ 22 40 _setuid equ 23 41 _getuid equ 24 42 _stime equ 25 43 _quit equ 26 44 _intr equ 27 45 _fstat equ 28 46 _emt equ 29 47 _mdate equ 30 48 _stty equ 31 49 _gtty equ 32 50 _ilgins equ 33 51 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 52 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 53 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 54 ; 12/01/2022 - Retro UNIX 386 v1.2 55 ; Retro UNIX 386 v2 system calls 56 _setgid equ 37 57 _getgid equ 38 58 _sysver equ 39 ; (get) Retro Unix 386 version 59 60 ;;; 61 ESCKey equ 1Bh 62 EnterKey equ 0Dh 63 64 %macro sys 1-4 65 ; 03/09/2015 66 ; 13/04/2015 67 ; Retro UNIX 386 v1 system call. 68 %if %0 >= 2 69 mov ebx, %2 70 %if %0 >= 3 71 mov ecx, %3 72 %if %0 = 4 73 mov edx, %4 74 %endif 75 %endif 76 %endif 77 mov eax, %1 78 int 30h 79 %endmacro 80 81 ; 01/07/2022 82 ; 10/01/2022 - Retro UNIX 386 v1.2 ('sysdefs.s') 83 84 struc SB ; SuperBlock 85 86 00000000 ???????? .Header: resd 1 87 .HiddenSects: 88 00000004 ???????? .BootSectAddr: resd 1 ; Hidden Sectors 89 .TotalSects: 90 00000008 ???????? .VolumeSize: resd 1 ; Entire Volume/Partition Size (includes ext. volume) 91 0000000C ???????? .Version: resd 1 92 00000010 ???????? .BlockSize: resd 1 93 00000014 ???????? .InodeCount: resd 1 94 00000018 ???????? .FreeMapAddr: resd 1 95 0000001C ???????? .FreeMapSize: resd 1 96 00000020 ???????? .InodeMapAddr: resd 1 97 00000024 ???????? .InodeMapSize: resd 1 98 00000028 ???????? .InodeTblAddr: resd 1 99 0000002C ???????? .InodeTblSize: resd 1 100 00000030 ???????? .FreeInodes: resd 1 101 00000034 ???????? .FirstFreeIno: resd 1 102 00000038 ???????? .FreeBlocks: resd 1 103 0000003C ???????? .FirstFreeBlk: resd 1 104 00000040 .BootSecParms: resb 19 ; v1 105 00000053 ?????????? .BSExtension: resb 5 ; v2 HDFS 106 00000058 ?? .Status: resb 1 ; 12/05/2021 (system modification status) (*) 107 00000059 ?? .Pdrv: resb 1 ; Physical disk number (index) ; 12/05/2021 (*) 108 0000005A ???? .Uno: resw 1 ; user/process number ; 12/05/2021 (*) 109 0000005C ???????? .ModifTime: resd 1 ; (last) modification time (*) 110 00000060 ???????? .ExtdVolTbl: resd 1 ; Extended Volume Start/Table Address 111 00000064 ???????? .ExtdVolSize: resd 1 ; Extended Volume (swap section etc.) Size 112 00000068 ?? .LBA_rw: resb 1 113 00000069 ?? .ClusterSize: resb 1 114 0000006A ?? .ReadOnly: resb 1 ; (SB will not be written to disk if bit 0 is 1) 115 0000006B ?? .Mounted: resb 1 116 0000006C ???????? .MountInode: resd 1 ; double word 117 00000070 ?? .DevMajor: resb 1 118 00000071 ?? .DevMinor: resb 1 119 00000072 ?? .LongName: resb 1 120 00000073 ?? .Direntry32: resb 1 121 ; 18/07/2021 122 00000074 ???????? .FileBuffer: resd 1 123 00000078 ???????? .ItabBuffer: resd 1 124 0000007C ???????? .ImapBuffer: resd 1 125 00000080 ???????? .FmapBuffer: resd 1 126 ; 15/07/2021 127 00000084 ???????? .LastInode: resd 1 128 ; 02/05/2021 129 00000088 ???????? .FmapIndex: resd 1 130 0000008C ???????? .ImapIndex: resd 1 131 00000090 ???????? .ItableIndex: resd 1 132 00000094 .Reserved: resb 508-148 ; 18/07/2021 133 000001FC ???????? .Footer: resd 1 134 135 endstruc 136 137 ; Retro UNIX 386 v1 system call format: 138 ; sys systemcall (eax) , , 139 140 ;----------------------------------------------------------------- 141 ; code 142 ;----------------------------------------------------------------- 143 144 [BITS 32] ; 32-bit intructions (for 80386 protected mode) 145 146 [ORG 0] 147 148 START_CODE: 149 ; 01/07/2022 150 ; 30/06/2022 151 00000000 59 pop ecx ; ecx = number of arguments 152 ; 153 00000001 58 pop eax ; eax = argument 0 = executable file name 154 ; 155 ;dec ecx 156 00000002 FEC9 dec cl 157 00000004 7E77 jng short df_4 158 159 00000006 5E pop esi 160 161 00000007 66AD lodsw 162 163 ; 01/07/2022 164 00000009 88C1 mov cl, al 165 ;cmp ax, 'fd' 166 0000000B 80FC64 cmp ah, 'd' 167 0000000E 7514 jne short df_1 168 00000010 3C66 cmp al, 'f' 169 00000012 7404 je short df_0 170 00000014 3C68 cmp al, 'h' 171 00000016 750C jne short df_1 172 df_0: 173 00000018 803E00 cmp byte [esi], 0 174 0000001B 7676 jna short df_5 175 0000001D A2[98030000] mov [fdname+5], al 176 00000022 66AD lodsw 177 df_1: 178 00000024 3C30 cmp al, '0' 179 00000026 726B jb short df_5 180 00000028 3C31 cmp al, '1' 181 0000002A 7609 jna short df_2 182 0000002C 80F968 cmp cl, 'h' ; /dev/hd? 183 0000002F 7538 jne short df_3 184 00000031 3C33 cmp al, '3' 185 00000033 775E ja short df_5 186 df_2: 187 00000035 08E4 or ah, ah 188 00000037 755A jnz short df_5 189 00000039 A2[9A030000] mov [fdname+7], al 190 191 sys _open, fdname, 0 ; open /dev/fd? for read 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000003E BB[93030000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000043 B900000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000048 B805000000 <1> mov eax, %1 78 0000004D CD30 <1> int 30h 192 0000004F 7361 jnc short df_6 193 df_err: 194 sys _write, 1, error_msg, size_emsg 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000051 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000056 B9[00040000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 0000005B BA0B000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000060 B804000000 <1> mov eax, %1 78 00000065 CD30 <1> int 30h 195 00000067 EB40 jmp short hang ; terminate 196 df_3: 197 00000069 80F966 cmp cl, 'f' 198 0000006C 7425 je short df_5 199 0000006E 3C35 cmp al, '5' 200 00000070 7721 ja short df_5 201 00000072 2C02 sub al, 2 202 00000074 C605[98030000]68 mov byte [fdname+5], 'h' ; /dev/hd? 203 0000007B EBB8 jmp short df_2 204 df_4: 205 ; print usage message on stdout 206 ;sys _write, 1, program_msg, size_pmsg 207 sys _msg, program_msg, size_pmsg, 0Fh 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000007D BB[CD020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000082 B936000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000087 BA0F000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000008C B823000000 <1> mov eax, %1 78 00000091 CD30 <1> int 30h 208 df_5: 209 sys _write, 1, usage_msg, size_umsg 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000093 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000098 B9[04030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 0000009D BA8E000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000000A2 B804000000 <1> mov eax, %1 78 000000A7 CD30 <1> int 30h 210 hang: 211 sys _exit 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000000A9 B801000000 <1> mov eax, %1 78 000000AE CD30 <1> int 30h 212 000000B0 EBF7 jmp short hang 213 214 df_6: 215 000000B2 A3[20040000] mov [fdfnum], eax 216 217 ; 01/07/2022 218 000000B7 803D[98030000]68 cmp byte byte [fdname+5], 'h' 219 000000BE 7572 jne short df_10 220 221 ; hard disk.. Read masterboot sector 222 sys _read, eax, bsbuffer, 512 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000000C0 89C3 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000000C2 B9[24040000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 000000C7 BA00020000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000000CC B803000000 <1> mov eax, %1 78 000000D1 CD30 <1> int 30h 223 000000D3 724B jc short df_9 224 225 000000D5 66813D[22060000]55- cmp word [bsbuffer+510], 0AA55h ; Valid MBR ? 225 000000DD AA 226 000000DE 7540 jne short df_9 ; no 227 228 ; check partition table for Retro UNIX v2 partition 229 000000E0 B104 mov cl, 4 230 000000E2 BB[E6050000] mov ebx, bsbuffer+1BEh+4 ; FS ID 231 df_7: 232 000000E7 803B71 cmp byte [ebx], 71h ; Retro UNIX v2 partition ID 233 000000EA 7409 je short df_8 234 000000EC FEC9 dec cl 235 000000EE 7430 jz short df_9 ; retro unix v2 partition not found 236 000000F0 83C310 add ebx, 16 237 000000F3 EBF2 jmp short df_7 ; check next partition entry 238 df_8: 239 000000F5 8B4304 mov eax, [ebx+4] ; start sector address 240 000000F8 8B5308 mov edx, [ebx+8] ; partition size (in sectors) 241 000000FB 01C2 add edx, eax 242 000000FD 7221 jc short df_9 243 ; max. (usable) size/address is 8388607 (sectors/blocks) 244 000000FF 81FA00008000 cmp edx, 8388608 ; 800000h 245 00000105 7319 jnb short df_9 246 ; eax = /dev/hd? seek position 247 00000107 C1E009 shl eax, 9 ; * 512 248 sys _seek, [fdfnum], eax, 0 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000010A 8B1D[20040000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000110 89C1 <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000112 BA00000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000117 B813000000 <1> mov eax, %1 78 0000011C CD30 <1> int 30h 249 0000011E 7312 jnc short df_10 250 df_9: 251 sys _close, [fdfnum] 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000120 8B1D[20040000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000126 B806000000 <1> mov eax, %1 78 0000012B CD30 <1> int 30h 252 0000012D E91FFFFFFF jmp df_err 253 df_10: 254 sys _read, [fdfnum], bsbuffer, 512 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000132 8B1D[20040000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000138 B9[24040000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 0000013D BA00020000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000142 B803000000 <1> mov eax, %1 78 00000147 CD30 <1> int 30h 255 00000149 72D5 jc short df_9 256 257 ; check Retro UNIX signature on boot sector 258 0000014B 813D[26040000]5255- cmp dword [bsFSystemID], 'RUFS' 258 00000153 4653 259 00000155 75C9 jne short df_9 260 ;cmp byte [bsfdsign+1], 'd' 261 ;jne short df_9 262 263 sys _read, [fdfnum], sbbuffer 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000157 8B1D[20040000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000015D B9[24060000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000162 B803000000 <1> mov eax, %1 78 00000167 CD30 <1> int 30h 264 00000169 72B5 jc short df_9 265 266 ; Valid superblock ? 267 0000016B 813D[24060000]7101- cmp dword [sbbuffer], 00A10171h 267 00000173 A100 268 ; retro unix v2 sb signature 269 00000175 75A9 jne short df_9 270 ; yes 271 272 ; write volume serial number (as hex string) 273 00000177 BE[2A040000] mov esi, bsVolSerial 274 0000017C BF[24080000] mov edi, volserialstr 275 00000181 B102 mov cl, 2 276 00000183 88CD mov ch, cl ; 2 277 df_11: 278 00000185 AC lodsb 279 00000186 88C3 mov bl, al 280 00000188 80E30F and bl, 0Fh 281 0000018B 8AA3[0C040000] mov ah, [ebx+hexchrs] 282 00000191 C0E804 shr al, 4 283 00000194 88C3 mov bl, al 284 00000196 8A83[0C040000] mov al, [ebx+hexchrs] 285 0000019C 50 push eax 286 0000019D FEC9 dec cl 287 0000019F 75E4 jnz short df_11 288 000001A1 FECD dec ch 289 000001A3 7404 jz short df_12 290 000001A5 B102 mov cl, 2 291 000001A7 EBDC jmp short df_11 292 df_12: 293 000001A9 58 pop eax 294 000001AA 66AB stosw 295 000001AC 58 pop eax 296 000001AD 66AB stosw 297 000001AF B02D mov al, '-' 298 000001B1 AA stosb 299 000001B2 58 pop eax 300 000001B3 66AB stosw 301 000001B5 58 pop eax 302 000001B6 66AB stosw 303 304 000001B8 B068 mov al, 'h' 305 000001BA AA stosb 306 307 000001BB 66B80D0A mov ax, 0A0Dh ; CRLF 308 000001BF 66AB stosw 309 310 ;xor al, al 311 ;stosb 312 313 sys _write, 1, nextline, 2 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000001C1 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000001C6 B9[90030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 000001CB BA02000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000001D0 B804000000 <1> mov eax, %1 78 000001D5 CD30 <1> int 30h 314 315 ;mov ecx, fdname 316 ;mov dl, 8 317 ;sys _write 318 319 sys _msg, fdname, 8, 0Fh 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000001D7 BB[93030000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000001DC B908000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 000001E1 BA0F000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000001E6 B823000000 <1> mov eax, %1 78 000001EB CD30 <1> int 30h 320 321 ;mov ecx, volserialhdr 322 ;mov dl, size_vsnhdr 323 ;sys _write 324 325 sys _write, 1, volserialhdr, size_vsnhdr 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000001ED BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000001F2 B9[9C030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 000001F7 BA1B000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000001FC B804000000 <1> mov eax, %1 78 00000201 CD30 <1> int 30h 326 327 00000203 B9[24080000] mov ecx, volserialstr 328 00000208 B20C mov dl, 12 ; xxxx-xxxxh, CR, LF 329 sys _write 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000020A B804000000 <1> mov eax, %1 78 0000020F CD30 <1> int 30h 330 331 df_13: 332 sys _close, [fdfnum] 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000211 8B1D[20040000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000217 B806000000 <1> mov eax, %1 78 0000021C CD30 <1> int 30h 333 ; 334 0000021E A1[2C060000] mov eax, [sbbuffer+SB.VolumeSize] ; fs size in blocks 335 336 00000223 E87C000000 call decimal_number 337 ; esi = start of decimal number string 338 ; edi = byte count of decimal number string 339 340 sys _write, 1, volszhdr, size_volsz 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000228 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000022D B9[B8030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000232 BA17000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000237 B804000000 <1> mov eax, %1 78 0000023C CD30 <1> int 30h 341 342 ;sys _write, 1, esi, edi 343 344 0000023E 89F1 mov ecx, esi 345 00000240 89FA mov edx, edi 346 sys _write 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000242 B804000000 <1> mov eax, %1 78 00000247 CD30 <1> int 30h 347 348 00000249 A1[5C060000] mov eax, [sbbuffer+SB.FreeBlocks] ; free blocks 349 350 0000024E E851000000 call decimal_number 351 352 sys _write, 1, fblkshdr, size_fblks 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000253 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000258 B9[D0030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 0000025D BA17000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000262 B804000000 <1> mov eax, %1 78 00000267 CD30 <1> int 30h 353 354 ;sys _write, 1, esi, edi 355 356 00000269 89F1 mov ecx, esi 357 0000026B 89FA mov edx, edi 358 sys _write 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000026D B804000000 <1> mov eax, %1 78 00000272 CD30 <1> int 30h 359 360 00000274 A1[60060000] mov eax, [sbbuffer+SB.FirstFreeBlk] ; first free block 361 362 00000279 E826000000 call decimal_number 363 364 sys _write, 1, ffblkhdr, size_ffblk 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000027E BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000283 B9[E8030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000288 BA17000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000028D B804000000 <1> mov eax, %1 78 00000292 CD30 <1> int 30h 365 366 ;sys _write, 1, esi, edi 367 368 00000294 89F1 mov ecx, esi 369 00000296 89FA mov edx, edi 370 sys _write 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000298 B804000000 <1> mov eax, %1 78 0000029D CD30 <1> int 30h 371 372 ;;sys _write, 1, nextline, 2 373 ;mov ecx, nextline 374 ;mov dl, 2 375 ;sys _write 376 377 0000029F E905FEFFFF jmp hang ; terminate 378 379 ; ---------------------------------------------------------------- 380 381 decimal_number: 382 ; eax = binary number 383 384 000002A4 29C9 sub ecx, ecx 385 386 000002A6 BE[34080000] mov esi, num_str 387 000002AB 89F7 mov edi, esi 388 389 000002AD 51 push ecx ; 0 390 391 000002AE B10A mov cl, 10 392 dn_1: 393 000002B0 29D2 sub edx, edx 394 000002B2 F7F1 div ecx 395 000002B4 80C230 add dl, '0' 396 000002B7 52 push edx 397 000002B8 21C0 and eax, eax 398 000002BA 75F4 jnz short dn_1 399 dn_2: 400 000002BC 58 pop eax 401 000002BD 21C0 and eax, eax 402 000002BF 7403 jz short dn_3 403 000002C1 AA stosb 404 000002C2 EBF8 jmp short dn_2 405 dn_3: 406 000002C4 66B80D0A mov ax, 0A0Dh ; CRLF 407 000002C8 66AB stosw 408 409 000002CA 29F7 sub edi, esi 410 000002CC C3 retn 411 412 ;----------------------------------------------------------------- 413 ; data - initialized data 414 ;----------------------------------------------------------------- 415 416 program_msg: 417 000002CD 0D0A db 0Dh, 0Ah 418 000002CF 526574726F20554E49- db 'Retro UNIX 386 v1.2 DF by Erdogan TAN - 01/07/2022' 418 000002D8 58203338362076312E- 418 000002E1 322044462062792045- 418 000002EA 72646F67616E205441- 418 000002F3 4E202D2030312F3037- 418 000002FC 2F32303232 419 00000301 0D0A00 db 0Dh, 0Ah, 0 420 usage_msg: 421 00000304 0D0A db 0Dh, 0Ah 422 00000306 55736167653A206466- db 'Usage: df ' 422 0000030F 203C6469736B3E 423 00000316 0D0A db 0Dh, 0Ah 424 00000318 0D0A db 0Dh, 0Ah 425 0000031A 4469736B204E616D65- db 'Disk Names: fd0, fd1, 0 (fd0), 1 (fd1)' 425 00000323 733A206664302C2066- 425 0000032C 64312C203020286664- 425 00000335 30292C203120286664- 425 0000033E 3129 426 00000340 0D0A db 0Dh, 0Ah 427 00000342 202020202020202020- db ' hd0, hd1, hd2, hd3' 427 0000034B 2020206864302C2068- 427 00000354 64312C206864322C20- 427 0000035D 686433 428 00000360 0D0A db 0Dh, 0Ah 429 00000362 202020202020202020- db ' 2 (hd0), 3 (hd1), 4 (hd2), 5 (hd3)' 429 0000036B 202020322028686430- 429 00000374 292C20332028686431- 429 0000037D 292C20342028686432- 429 00000386 292C20352028686433- 429 0000038F 29 430 ;db 0Dh, 0Ah 431 nextline: 432 00000390 0D0A00 db 0Dh, 0Ah, 0 433 434 size_pmsg equ usage_msg-(program_msg+1) 435 436 fdname: 437 00000393 2F6465762F66647800 db "/dev/fdx", 0 438 439 size_umsg equ fdname-(usage_msg+1) 440 441 volserialhdr: 442 0000039C 0D0A db 0Dh, 0Ah 443 0000039E 0D0A db 0Dh, 0Ah 444 000003A0 566F6C756D65205365- db "Volume Serial Number : " 444 000003A9 7269616C204E756D62- 444 000003B2 6572203A20 445 000003B7 00 db 0 446 447 size_vsnhdr equ volszhdr-(volserialhdr+1) 448 449 volszhdr: 450 ;;db 0Dh, 0Ah 451 ;db 0Dh, 0Ah 452 000003B8 566F6C756D65205369- db "Volume Size : " 452 000003C1 7A6520202020202020- 452 000003CA 2020203A20 453 000003CF 00 db 0 454 455 size_volsz equ fblkshdr-(volszhdr+1) 456 457 fblkshdr: 458 ;;db 0Dh, 0Ah 459 ;db 0Dh, 0Ah 460 000003D0 4672656520426C6F63- db "Free Blocks : " 460 000003D9 6B7320202020202020- 460 000003E2 2020203A20 461 000003E7 00 db 0 462 463 size_fblks equ ffblkhdr-(fblkshdr+1) 464 465 ffblkhdr: 466 ;;db 0Dh, 0Ah 467 ;db 0Dh, 0Ah 468 000003E8 466972737420467265- db "First Free Block : " 468 000003F1 6520426C6F636B2020- 468 000003FA 2020203A20 469 000003FF 00 db 0 470 471 size_ffblk equ error_msg-(ffblkhdr+1) 472 473 error_msg: 474 00000400 0D0A db 0Dh, 0Ah 475 00000402 4572726F722021 db "Error !" 476 00000409 0D0A00 db 0Dh, 0Ah, 0 477 478 hexchrs: 479 0000040C 303132333435363738- db '0123456789ABCDEF', 0 479 00000415 3941424344454600 480 481 size_emsg equ hexchrs-(error_msg+1) 482 483 ;----------------------------------------------------------------- 484 ; bss - uninitialized data 485 ;----------------------------------------------------------------- 486 487 0000041D 90 align 4 488 489 bss_start: 490 491 ABSOLUTE bss_start 492 493 fdfnum: 494 00000420 ???????? resd 1 495 496 bsbuffer: 497 00000424 resb 512 498 499 bsFSystemID equ bsbuffer+2 500 bsVolSerial equ bsbuffer+6 501 ;bsfdsign equ bsbuffer+10 502 503 sbbuffer: 504 00000624 resb 512 505 506 nfree equ sbbuffer 507 freeb equ sbbuffer+2 508 509 volserialstr: 510 00000824 resb 16 ; xxxx-xxxxh, CRLF, 0 511 512 num_str: 513 00000834 resb 16 514 515 bss_end: 516 517 ;----------------------------------------------------------------- 518 ; 30/06/2022 519 ;----------------------------------------------------------------- 520 ; Original UNIX v2 - df (disk free blocks info) source code 521 ;----------------------------------------------------------------- 522 ; [ svntree-20081216.tar.gz - bin/df (archive date: 21-11-1972) ] 523 524 ;/ df -- find free space 525 ; 526 ; cmp (sp)+,$1 527 ; bgt 1f 528 ; mov $rf0,0f 529 ; jsr pc,df 530 ; mov $1,r0 531 ; sys write; plus; 1 532 ; mov $rk1,0f 533 ; jsr pc,df 534 ; mov $1,r0 535 ; sys write; plus; 1 536 ; mov $rk2,0f 537 ; jsr pc,df 538 ; mov $1,r0 539 ; sys write; plus; 1 540 ; mov $rk3,0f 541 ; jsr pc,df 542 ; mov $1,r0 543 ;2: 544 ; mov $1,r0 545 ; sys write; nl; 1 546 ; sys exit 547 ; 548 ;1: 549 ; tst (sp)+ 550 ; mov (sp)+,0f 551 ; jsr pc,df 552 ; br 2b 553 ; 554 ;df: 555 ; clr r3 556 ; sys 36. 557 ; sys open; 0:..; 0 558 ; bes 9f 559 ; sys read; nfree; 1024. 560 ; mov $freeb,r1 561 ; mov nfree,r2 562 ; asr r2 563 ;1: 564 ; mov $16.,r4 565 ; mov (r1)+,r5 566 ;2: 567 ; rol r5 568 ; adc r3 569 ; dec r4 570 ; bne 2b 571 ; dec r2 572 ; bgt 1b 573 ;9: 574 ; clr r2 575 ; dvd $10.,r2 576 ; mov r3,-(sp) 577 ; mov r2,r3 578 ; beq 2f 579 ; jsr pc,9b 580 ;2: 581 ; movb (sp)+,ch 582 ; add $'0,ch 583 ; mov $1,r0 584 ; sys write; ch; 1 585 ; rts pc 586 ; 587 ;rf0: 588 ;rk0: 589 ;rk1: 590 ;rk2: 591 ;rk3: 592 ;plus: <+> 593 ;nl: <\n> 594 ; .even 595 ; 596 ; .bss 597 ;ch: .=.+2 598 ;nfree: .=.+2 599 ;freeb: .=.+1022.