1 ; **************************************************************************** 2 ; df1.s (df386.s) - print free blocks - by Erdogan Tan - 30/06/2022 3 ; ---------------------------------------------------------------------------- 4 ; Retro UNIX 386 v1 (& v1.1) - file system (disk free blocks info) utility 5 ; 6 ; [ Last Modification: 30/06/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 ; Retro UNIX 386 v1 system call format: 82 ; sys systemcall (eax) , , 83 84 ;----------------------------------------------------------------- 85 ; code 86 ;----------------------------------------------------------------- 87 88 [BITS 32] ; 32-bit intructions (for 80386 protected mode) 89 90 [ORG 0] 91 92 START_CODE: 93 ; 30/06/2022 94 00000000 59 pop ecx ; ecx = number of arguments 95 ; 96 00000001 58 pop eax ; eax = argument 0 = executable file name 97 ; 98 ;dec ecx 99 00000002 FEC9 dec cl 100 00000004 7E4C jng short df_0 101 102 00000006 5E pop esi 103 104 00000007 66AD lodsw 105 106 00000009 663D6664 cmp ax, 'fd' 107 0000000D 7507 jne short df_2 108 0000000F 803E00 cmp byte [esi], 0 109 00000012 7654 jna short df_1 110 00000014 66AD lodsw 111 df_2: 112 00000016 3C30 cmp al, '0' 113 00000018 724E jb short df_1 114 0000001A 3C31 cmp al, '1' 115 0000001C 774A ja short df_1 116 0000001E 08E4 or ah, ah 117 00000020 7546 jnz short df_1 118 00000022 A2[D0020000] mov [fdname+7], al 119 120 sys _open, fdname, 0 ; open /dev/fd? for read 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000027 BB[C9020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000002C 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 00000031 B805000000 <1> mov eax, %1 78 00000036 CD30 <1> int 30h 121 00000038 734D jnc short df_3 122 123 df_err: 124 sys _write, 1, error_msg, size_emsg 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000003A BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000003F B9[36030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000044 BA0B000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000049 B804000000 <1> mov eax, %1 78 0000004E CD30 <1> int 30h 125 00000050 EB2C jmp short hang ; terminate 126 127 df_0: 128 ; print usage message on stdout 129 ;sys _write, 1, program_msg, size_pmsg 130 sys _msg, program_msg, size_pmsg, 0Fh 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000052 BB[4D020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000057 B93C000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 0000005C BA0F000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000061 B823000000 <1> mov eax, %1 78 00000066 CD30 <1> int 30h 131 df_1: 132 sys _write, 1, usage_msg, size_umsg 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000068 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000006D B9[8A020000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000072 BA3E000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000077 B804000000 <1> mov eax, %1 78 0000007C CD30 <1> int 30h 133 134 hang: 135 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 0000007E B801000000 <1> mov eax, %1 78 00000083 CD30 <1> int 30h 136 00000085 EBF7 jmp short hang 137 138 df_3: 139 00000087 A3[54030000] mov [fdfnum], eax 140 141 sys _read, eax, bsbuffer, 512 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000008C 89C3 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000008E B9[58030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000093 BA00020000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000098 B803000000 <1> mov eax, %1 78 0000009D CD30 <1> int 30h 142 0000009F 7220 jc short df_4 143 144 ; check Retro UNIX signature on boot sector 145 000000A1 813D[5A030000]5255- cmp dword [bsFSystemID], 'RUFS' 145 000000A9 4653 146 000000AB 7514 jne short df_4 147 ;cmp word [bsfdsign], 'fd' 148 ;jne short df_4 149 150 sys _read, [fdfnum], sbbuffer 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000000AD 8B1D[54030000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000000B3 B9[58050000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000000B8 B803000000 <1> mov eax, %1 78 000000BD CD30 <1> int 30h 151 000000BF 730C jnc short df_5 152 153 df_4: 154 ;sys _close, [fdfnum] 155 sys _close 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 000000C1 B806000000 <1> mov eax, %1 78 000000C6 CD30 <1> int 30h 156 000000C8 E96DFFFFFF jmp df_err 157 158 df_5: 159 ; write volume serial number (as hex string) 160 000000CD BE[5E030000] mov esi, bsVolSerial 161 000000D2 BF[58070000] mov edi, volserialstr 162 000000D7 B102 mov cl, 2 163 000000D9 88CD mov ch, cl ; 2 164 df_6: 165 000000DB AC lodsb 166 000000DC 88C3 mov bl, al 167 000000DE 80E30F and bl, 0Fh 168 000000E1 8AA3[42030000] mov ah, [ebx+hexchrs] 169 000000E7 C0E804 shr al, 4 170 000000EA 88C3 mov bl, al 171 000000EC 8A83[42030000] mov al, [ebx+hexchrs] 172 000000F2 50 push eax 173 000000F3 FEC9 dec cl 174 000000F5 75E4 jnz short df_6 175 000000F7 FECD dec ch 176 000000F9 7404 jz short df_7 177 000000FB B102 mov cl, 2 178 000000FD EBDC jmp short df_6 179 df_7: 180 000000FF 58 pop eax 181 00000100 66AB stosw 182 00000102 58 pop eax 183 00000103 66AB stosw 184 00000105 B02D mov al, '-' 185 00000107 AA stosb 186 00000108 58 pop eax 187 00000109 66AB stosw 188 0000010B 58 pop eax 189 0000010C 66AB stosw 190 191 0000010E B068 mov al, 'h' 192 00000110 AA stosb 193 194 00000111 66B80D0A mov ax, 0A0Dh ; CRLF 195 00000115 66AB stosw 196 197 ;xor al, al 198 ;stosb 199 200 sys _write, 1, nextline, 2 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000117 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000011C B9[C6020000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000121 BA02000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000126 B804000000 <1> mov eax, %1 78 0000012B CD30 <1> int 30h 201 202 ;mov ecx, fdname 203 ;mov dl, 8 204 ;sys _write 205 206 sys _msg, fdname, 8, 0Fh 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000012D BB[C9020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000132 B908000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000137 BA0F000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000013C B823000000 <1> mov eax, %1 78 00000141 CD30 <1> int 30h 207 208 ;mov ecx, volserialhdr 209 ;mov dl, size_vsnhdr 210 ;sys _write 211 212 sys _write, 1, volserialhdr, size_vsnhdr 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000143 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000148 B9[D2020000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 0000014D BA1B000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000152 B804000000 <1> mov eax, %1 78 00000157 CD30 <1> int 30h 213 214 00000159 B9[58070000] mov ecx, volserialstr 215 0000015E B20C mov dl, 12 ; xxxx-xxxxh, CR, LF 216 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 00000160 B804000000 <1> mov eax, %1 78 00000165 CD30 <1> int 30h 217 218 df_8: 219 sys _close, [fdfnum] 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000167 8B1D[54030000] <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 0000016D B806000000 <1> mov eax, %1 78 00000172 CD30 <1> int 30h 220 ; 221 222 00000174 BE[5A050000] mov esi, freeb 223 00000179 668B1D[58050000] mov bx, [nfree] 224 00000180 29FF sub edi, edi 225 00000182 31C9 xor ecx, ecx 226 ;xor edx, edx 227 00000184 28D2 sub dl, dl 228 00000186 53 push ebx 229 df_9: 230 00000187 AC lodsb 231 00000188 B108 mov cl, 8 232 df_10: 233 0000018A D0E8 shr al, 1 234 0000018C 7312 jnc short df_11 235 0000018E 42 inc edx 236 0000018F 09FF or edi, edi 237 00000191 750D jnz short df_11 238 ; save first free block number 239 00000193 89F7 mov edi, esi 240 00000195 81EF[5A050000] sub edi, freeb 241 0000019B C1E703 shl edi, 3 ; * 8 242 0000019E 29CF sub edi, ecx 243 df_11: 244 000001A0 E2E8 loop df_10 245 000001A2 4B dec ebx 246 000001A3 75E2 jnz short df_9 247 248 000001A5 58 pop eax 249 000001A6 57 push edi ; first free block 250 000001A7 52 push edx ; free blocks 251 252 000001A8 C1E003 shl eax, 3 ; number of blocks (volume size) 253 254 000001AB E874000000 call decimal_number 255 ; esi = start of decimal number string 256 ; edi = byte count of decimal number string 257 258 sys _write, 1, volszhdr, size_volsz 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000001B0 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000001B5 B9[EE020000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 000001BA BA17000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000001BF B804000000 <1> mov eax, %1 78 000001C4 CD30 <1> int 30h 259 260 ;sys _write, 1, esi, edi 261 262 000001C6 89F1 mov ecx, esi 263 000001C8 89FA mov edx, edi 264 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 000001CA B804000000 <1> mov eax, %1 78 000001CF CD30 <1> int 30h 265 266 000001D1 58 pop eax ; free blocks 267 268 000001D2 E84D000000 call decimal_number 269 270 sys _write, 1, fblkshdr, size_fblks 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000001D7 BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000001DC B9[06030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 000001E1 BA17000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000001E6 B804000000 <1> mov eax, %1 78 000001EB CD30 <1> int 30h 271 272 ;sys _write, 1, esi, edi 273 274 000001ED 89F1 mov ecx, esi 275 000001EF 89FA mov edx, edi 276 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 000001F1 B804000000 <1> mov eax, %1 78 000001F6 CD30 <1> int 30h 277 278 000001F8 58 pop eax ; first free block 279 280 000001F9 E826000000 call decimal_number 281 282 sys _write, 1, ffblkhdr, size_ffblk 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000001FE BB01000000 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000203 B9[1E030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000208 BA17000000 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000020D B804000000 <1> mov eax, %1 78 00000212 CD30 <1> int 30h 283 284 ;sys _write, 1, esi, edi 285 286 00000214 89F1 mov ecx, esi 287 00000216 89FA mov edx, edi 288 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 00000218 B804000000 <1> mov eax, %1 78 0000021D CD30 <1> int 30h 289 290 ;;sys _write, 1, nextline, 2 291 ;mov ecx, nextline 292 ;mov dl, 2 293 ;sys _write 294 295 0000021F E95AFEFFFF jmp hang ; terminate 296 297 ; ---------------------------------------------------------------- 298 299 decimal_number: 300 ; eax = binary number 301 302 00000224 29C9 sub ecx, ecx 303 304 00000226 BE[68070000] mov esi, num_str 305 0000022B 89F7 mov edi, esi 306 307 0000022D 51 push ecx ; 0 308 309 0000022E B10A mov cl, 10 310 dn_1: 311 00000230 29D2 sub edx, edx 312 00000232 F7F1 div ecx 313 00000234 80C230 add dl, '0' 314 00000237 52 push edx 315 00000238 21C0 and eax, eax 316 0000023A 75F4 jnz short dn_1 317 dn_2: 318 0000023C 58 pop eax 319 0000023D 21C0 and eax, eax 320 0000023F 7403 jz short dn_3 321 00000241 AA stosb 322 00000242 EBF8 jmp short dn_2 323 dn_3: 324 00000244 66B80D0A mov ax, 0A0Dh ; CRLF 325 00000248 66AB stosw 326 327 0000024A 29F7 sub edi, esi 328 0000024C C3 retn 329 330 ;----------------------------------------------------------------- 331 ; data - initialized data 332 ;----------------------------------------------------------------- 333 334 program_msg: 335 0000024D 0D0A db 0Dh, 0Ah 336 0000024F 526574726F20554E49- db 'Retro UNIX 386 v1 DF Utility by Erdogan TAN - 30/06/2022' 336 00000258 582033383620763120- 336 00000261 4446205574696C6974- 336 0000026A 79206279204572646F- 336 00000273 67616E2054414E202D- 336 0000027C 2033302F30362F3230- 336 00000285 3232 337 00000287 0D0A00 db 0Dh, 0Ah, 0 338 usage_msg: 339 0000028A 0D0A db 0Dh, 0Ah 340 0000028C 55736167653A206466- db 'Usage: df ' 340 00000295 203C6469736B3E 341 0000029C 0D0A db 0Dh, 0Ah 342 0000029E 0D0A db 0Dh, 0Ah 343 000002A0 4469736B204E616D65- db 'Disk Names: fd0, fd1, 0 (fd0), 1 (fd1)' 343 000002A9 733A206664302C2066- 343 000002B2 64312C203020286664- 343 000002BB 30292C203120286664- 343 000002C4 3129 344 ;db 0Dh, 0Ah 345 nextline: 346 000002C6 0D0A00 db 0Dh, 0Ah, 0 347 348 size_pmsg equ usage_msg-(program_msg+1) 349 350 fdname: 351 000002C9 2F6465762F66647800 db "/dev/fdx", 0 352 353 size_umsg equ fdname-(usage_msg+1) 354 355 volserialhdr: 356 000002D2 0D0A db 0Dh, 0Ah 357 000002D4 0D0A db 0Dh, 0Ah 358 000002D6 566F6C756D65205365- db "Volume Serial Number : " 358 000002DF 7269616C204E756D62- 358 000002E8 6572203A20 359 000002ED 00 db 0 360 361 size_vsnhdr equ volszhdr-(volserialhdr+1) 362 363 volszhdr: 364 ;;db 0Dh, 0Ah 365 ;db 0Dh, 0Ah 366 000002EE 566F6C756D65205369- db "Volume Size : " 366 000002F7 7A6520202020202020- 366 00000300 2020203A20 367 00000305 00 db 0 368 369 size_volsz equ fblkshdr-(volszhdr+1) 370 371 fblkshdr: 372 ;;db 0Dh, 0Ah 373 ;db 0Dh, 0Ah 374 00000306 4672656520426C6F63- db "Free Blocks : " 374 0000030F 6B7320202020202020- 374 00000318 2020203A20 375 0000031D 00 db 0 376 377 size_fblks equ ffblkhdr-(fblkshdr+1) 378 379 ffblkhdr: 380 ;;db 0Dh, 0Ah 381 ;db 0Dh, 0Ah 382 0000031E 466972737420467265- db "First Free Block : " 382 00000327 6520426C6F636B2020- 382 00000330 2020203A20 383 00000335 00 db 0 384 385 size_ffblk equ error_msg-(ffblkhdr+1) 386 387 error_msg: 388 00000336 0D0A db 0Dh, 0Ah 389 00000338 4572726F722021 db "Error !" 390 0000033F 0D0A00 db 0Dh, 0Ah, 0 391 392 hexchrs: 393 00000342 303132333435363738- db '0123456789ABCDEF', 0 393 0000034B 3941424344454600 394 395 size_emsg equ hexchrs-(error_msg+1) 396 397 ;----------------------------------------------------------------- 398 ; bss - uninitialized data 399 ;----------------------------------------------------------------- 400 401 00000353 90 align 4 402 403 bss_start: 404 405 ABSOLUTE bss_start 406 407 fdfnum: 408 00000354 ???????? resd 1 409 410 bsbuffer: 411 00000358 resb 512 412 413 bsFSystemID equ bsbuffer+2 414 bsVolSerial equ bsbuffer+6 415 ;bsfdsign equ bsbuffer+10 416 417 sbbuffer: 418 00000558 resb 512 419 420 nfree equ sbbuffer 421 freeb equ sbbuffer+2 422 423 volserialstr: 424 00000758 resb 16 ; xxxx-xxxxh, CRLF, 0 425 426 num_str: 427 00000768 resb 16 428 429 bss_end: 430 431 ;----------------------------------------------------------------- 432 ; 30/06/2022 433 ;----------------------------------------------------------------- 434 ; Original UNIX v2 - df (disk free blocks info) source code 435 ;----------------------------------------------------------------- 436 ; [ svntree-20081216.tar.gz - bin/df (archive date: 21-11-1972) ] 437 438 ;/ df -- find free space 439 ; 440 ; cmp (sp)+,$1 441 ; bgt 1f 442 ; mov $rf0,0f 443 ; jsr pc,df 444 ; mov $1,r0 445 ; sys write; plus; 1 446 ; mov $rk1,0f 447 ; jsr pc,df 448 ; mov $1,r0 449 ; sys write; plus; 1 450 ; mov $rk2,0f 451 ; jsr pc,df 452 ; mov $1,r0 453 ; sys write; plus; 1 454 ; mov $rk3,0f 455 ; jsr pc,df 456 ; mov $1,r0 457 ;2: 458 ; mov $1,r0 459 ; sys write; nl; 1 460 ; sys exit 461 ; 462 ;1: 463 ; tst (sp)+ 464 ; mov (sp)+,0f 465 ; jsr pc,df 466 ; br 2b 467 ; 468 ;df: 469 ; clr r3 470 ; sys 36. 471 ; sys open; 0:..; 0 472 ; bes 9f 473 ; sys read; nfree; 1024. 474 ; mov $freeb,r1 475 ; mov nfree,r2 476 ; asr r2 477 ;1: 478 ; mov $16.,r4 479 ; mov (r1)+,r5 480 ;2: 481 ; rol r5 482 ; adc r3 483 ; dec r4 484 ; bne 2b 485 ; dec r2 486 ; bgt 1b 487 ;9: 488 ; clr r2 489 ; dvd $10.,r2 490 ; mov r3,-(sp) 491 ; mov r2,r3 492 ; beq 2f 493 ; jsr pc,9b 494 ;2: 495 ; movb (sp)+,ch 496 ; add $'0,ch 497 ; mov $1,r0 498 ; sys write; ch; 1 499 ; rts pc 500 ; 501 ;rf0: 502 ;rk0: 503 ;rk1: 504 ;rk2: 505 ;rk3: 506 ;plus: <+> 507 ;nl: <\n> 508 ; .even 509 ; 510 ; .bss 511 ;ch: .=.+2 512 ;nfree: .=.+2 513 ;freeb: .=.+1022.