1 ; **************************************************************************** 2 ; rmdir386.s (rmdir2.s) - by Erdogan Tan - 11/03/2022 3 ; ---------------------------------------------------------------------------- 4 ; Retro UNIX 386 v1.1 - rmdir -- unlink directory 5 ; 6 ; [ Last Modification: 12/03/2022 ] 7 ; 8 ; Derived from (original) UNIX v5 'rmdir.s' (PDP-11 assembly) source Code 9 ; Ref: 10 ; www.tuhs.org (https://minnie.tuhs.org/cgi-bin/utree.pl?file=V5) 11 ; v5root.tar.gz 12 ; **************************************************************************** 13 ; [ v5root.tar - usr/source/s2/rmdir.s (directory archive date: 27-11-1974) ] 14 ; 15 ; Assembler: NASM v2.15 16 ; ((nasm rmdir2.s -l rmdir2.txt -o rmdir2 -Z error.txt)) 17 18 ; rmdir1.s - 12/03/2022 - Retro UNIX 386 v1.0 (unix v1 inode, 8 byte names) 19 ; rmdir2.s - 12/03/2022 - Retro UNIX 386 v1.1 (unix v1 inode, 14 byte names) 20 ; rmdir3.s - 12/03/2022 - Retro UNIX 386 v1.2 (& v2) (modified unix v7 inode) 21 22 ; 12/01/2022 (Retro UNIX 386 v1.2) 23 ; 13/10/2015 24 25 ; UNIX v1 system calls 26 _rele equ 0 27 _exit equ 1 28 _fork equ 2 29 _read equ 3 30 _write equ 4 31 _open equ 5 32 _close equ 6 33 _wait equ 7 34 _creat equ 8 35 _link equ 9 36 _unlink equ 10 37 _exec equ 11 38 _chdir equ 12 39 _time equ 13 40 _mkdir equ 14 41 _chmod equ 15 42 _chown equ 16 43 _break equ 17 44 _stat equ 18 45 _seek equ 19 46 _tell equ 20 47 _mount equ 21 48 _umount equ 22 49 _setuid equ 23 50 _getuid equ 24 51 _stime equ 25 52 _quit equ 26 53 _intr equ 27 54 _fstat equ 28 55 _emt equ 29 56 _mdate equ 30 57 _stty equ 31 58 _gtty equ 32 59 _ilgins equ 33 60 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 61 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 62 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 63 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 64 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 65 ; 12/01/2022 - Retro UNIX 386 v1.2 66 ; Retro UNIX 386 v2 system calls 67 _setgid equ 37 68 _getgid equ 38 69 _sysver equ 39 ; (get) Retro Unix 386 version 70 71 ;;; 72 ESCKey equ 1Bh 73 EnterKey equ 0Dh 74 75 %macro sys 1-4 76 ; 03/09/2015 77 ; 13/04/2015 78 ; Retro UNIX 386 v1 system call. 79 %if %0 >= 2 80 mov ebx, %2 81 %if %0 >= 3 82 mov ecx, %3 83 ;%if %0 = 4 84 %if %0 >= 4 ; 11/03/2022 85 mov edx, %4 86 %endif 87 %endif 88 %endif 89 mov eax, %1 90 int 30h 91 %endmacro 92 93 ; Retro UNIX 386 v1 system call format: 94 ; sys systemcall (eax) , , 95 96 ; 11/03/2022 97 ; Note: Above 'sys' macro has limitation about register positions; 98 ; ebx, ecx, edx registers must not be used after their 99 ; positions in sys macro. 100 ; for example: 101 ; 'sys _write, 1, msg, ecx' is defective, because 102 ; ecx will be used/assigned before edx in 'sys' macro. 103 ; correct order may be: 104 ; 'sys _write, 1, msg, eax ; (eax = byte count) 105 106 ;----------------------------------------------------------------- 107 ; text - code 108 ;----------------------------------------------------------------- 109 110 [BITS 32] ; 32-bit intructions (for 80386 protected mode) 111 112 [ORG 0] 113 114 START_CODE: 115 00000000 5D pop ebp ; mov (sp)+,r5 116 00000001 58 pop eax ; tst (sp)+ 117 ; ebp = argument count 118 ; eax = pointer to argument 1 (executable file name) 119 120 ; temporary - 12/03/2022 121 ; print test message (if argument count = 1) 122 00000002 89E8 mov eax, ebp 123 00000004 48 dec eax 124 00000005 7516 jnz short _loop 125 126 sys _msg, test_msg, 255, 0Fh 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000007 BB[B0010000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 0000000C B9FF000000 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 00000011 BA0F000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 00000016 B823000000 <1> mov eax, %1 90 0000001B CD30 <1> int 30h 127 128 _loop: ; loop: 129 0000001D 4D dec ebp ; dec r5 130 ;;jle done ; ble done 131 ;jg short rm_1 132 0000001E 7507 jnz short rm_1 133 done: 134 sys _exit ; sys exit 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 00000020 B801000000 <1> mov eax, %1 90 00000025 CD30 <1> int 30h 135 ;hang: 136 ; nop 137 ; nop 138 ; jmp short hang 139 140 rm_1: 141 00000027 5E pop esi ; mov (sp)+,r1 142 ; esi = ptr to (next) argument 143 00000028 BF[FE010000] mov edi, name ; mov $name,r2 144 ; edi = dir name (path) addr 145 0000002D 29C9 sub ecx, ecx ; clr r0 146 147 rm_2: ; 1: 148 0000002F 41 inc ecx ; inc r0 149 00000030 AC lodsb ; movb (r1)+,(r2)+ 150 00000031 AA stosb 151 00000032 08C0 or al, al 152 00000034 75F9 jnz short rm_2 ; bne 1b 153 00000036 4F dec edi ; dec r2 154 00000037 49 dec ecx ; dec r0 155 00000038 890D[F6010000] mov [size], ecx ; mov r0,size 156 0000003E 81FF[FE010000] cmp edi, name ; cmp r2,$name 157 00000044 744D je short error ; beq error 158 sys _stat, name, stbuf 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000046 BB[FE010000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 0000004B B9[26020000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 00000050 B812000000 <1> mov eax, %1 90 00000055 CD30 <1> int 30h 159 ; sys stat; name; stbuf 160 00000057 723A jc short error ; bes error 161 162 ; -- unix v5-v7 inode -- 163 ; clear mode bits except bit13 & bit14 (unix v5 inode) 164 ; bit15 = IALLOC : allocated flag 165 ; bit14 = IFDIR : directory flag 166 ; bit13 = IFCHR : (char) device/special flag 167 ; bit14|bit13 = IFBLK : block device flag 168 169 ; bic $!60000,stbuf+4 170 ; and word [stbuf+4], ~6000h 171 172 ; -- unix v5-v7 inode -- 173 ; check if it is directory, jump to error if not 174 ; cmp $40000,stbuf+4 175 ; cmp word [stbuf+4], 4000h 176 ; bne error 177 ; jne short error 178 179 ; -- Retro UNIX 8086/386 v1 & v1.1 inode -- 180 ; 181 ; Note: a regular file's inode number must be > 40 182 ; ((otherwise it is device file)) 183 ; mode/flag word: 184 ; bit 15 = allocated flag (must be 1) 185 ; bit 14 = directory flag 186 ; 187 ; Root directory inode number = 41 188 189 00000059 66833D[26020000]29 cmp word [stbuf], 41 ; is inode number > 41 ? 190 00000061 7630 jna short error ; (no, it can not be removed!) 191 ; 192 ;mov al, [stbuf+3] ; high byte of mode word 193 ;mov ah, 0C0h ; allocated (80h) & directory (40h) 194 ;and al, ah ; and al, 0C0h 195 ;xor ah, al ; cmp $40000,stbuf+4 196 ;jnz short error ; bne error 197 ; 198 00000063 F605[29020000]40 test byte [stbuf+3], 40h ; test directory flag 199 0000006A 7427 jz short error ; (not a directory!) 200 201 ; -- Retro UNIX 386 v1.2 -- 202 ; 203 ; bit 15 = regular file flag (must be 1) 204 ; bit 14 = directory flag 205 ; bit 13 = reserved flag (or char special) 206 ; 207 ; (bit14&bit15 must be 1) 208 209 ;mov al, [stbuf+3] ; high byte of mode word 210 ;mov ah, 0C0h ; regular file (80h) & dir (40h) 211 ;and al, ah ; and al, 0C0h 212 ; ; bic $!60000,stbuf+4 213 ;xor ah, al ; cmp $40000,stbuf+4 214 ;jnz short error ; bne error 215 216 ; check if the last char of dir name is a dot 217 0000006C 807FFF2E cmp byte [edi-1], '.' ; cmpb -1(r2),$'. 218 00000070 7541 jne short rm_3 ; bne 1f 219 ; '.' = current directory (can not be deleted) 220 00000072 81FF[FF010000] cmp edi, name+1 ; cmp r2,$name+1 221 ;je short error ; beq error 222 00000078 7619 jna short error 223 ; '/.' = root directory (can not be deleted) 224 0000007A 8A47FE mov al, [edi-2] 225 0000007D 3C2F cmp al, '/' 226 ;cmp byte [edi-2], '/' ; cmpb -2(r2),$'/ 227 0000007F 7412 je short error ; beq error 228 ; '..' = parent directory (can not be deleted) 229 00000081 3C2E cmp al, '.' 230 ;cmp byte [edi-2], '.' ; cmpb -2(r2),$'. 231 00000083 752E jne short rm_3 ; bne 1f 232 00000085 81FF[00020000] cmp edi, name+2 ; cmp r2,$name+2 233 ;je short error ; beq error 234 0000008B 7606 jna short error 235 ; '/..' = parent directory (can not be deleted) 236 0000008D 807FFD2F cmp byte [edi-3], '/' ; cmpb -3(r2),$'/ 237 ;je short error ; beq error 238 00000091 7520 jne short rm_3 239 240 error: 241 00000093 E8EA000000 call prname ; jsr pc,prname 242 ;mov eax, 1 ; mov $1,r0 243 ;sys _write, eax, mes2, emes2-mes2 244 sys _write, 1, mes2, emes2-mes2 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000098 BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 0000009D B9[F0010000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 000000A2 BA05000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 000000A7 B804000000 <1> mov eax, %1 90 000000AC CD30 <1> int 30h 245 ; sys write; mes2; emes2-mes2 246 000000AE E96AFFFFFF jmp _loop ; br loop 247 248 rm_3: ; 1: 249 ; open file -directory- for read 250 sys _open, name, 0 ; sys open; name; 0 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 000000B3 BB[FE010000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 000000B8 B900000000 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 000000BD B805000000 <1> mov eax, %1 90 000000C2 CD30 <1> int 30h 251 000000C4 72CD jc short error ; bes error 252 ; save file descriptor/number 253 ;mov esi, eax ; mov r0,r1 254 000000C6 A3[FA010000] mov [fd], eax 255 rm_4: ; 1: 256 ;mov eax, esi ; mov r1,r0 257 ; -- Retro UNIX 386 v1.1 & v1.2 -- 258 ; read 16 bytes (read directory entry) 259 ;sys _read, eax, stbuf, 16 260 sys _read, [fd], stbuf, 16 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 000000CB 8B1D[FA010000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 000000D1 B9[26020000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 000000D6 BA10000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 000000DB B803000000 <1> mov eax, %1 90 000000E0 CD30 <1> int 30h 261 ; sys read; stbuf; 16. 262 000000E2 7254 jc short rm_5 ; bes 1f 263 264 ; -- Retro UNIX 386 v1.0 -- 265 ; read 10 bytes (read directory entry) 266 ;;sys _read, eax, stbuf, 10 267 ;sys _read, [fd], stbuf, 10 268 ;jc short rm_5 269 270 ; check read count (eof) 271 000000E4 09C0 or eax, eax ; tst r0 272 000000E6 7450 jz short rm_5 ; beq 1f 273 ; check inode number and dir entry name 274 000000E8 A1[26020000] mov eax, [stbuf] ; 1st 4 byte of dir entry 275 000000ED 6621C0 and ax, ax ; empty (null/deleted) entry ? 276 ;cmp word [stbuf], 0 ; tst stbuf 277 000000F0 74D9 jz short rm_4 ; yes ; beq 1b 278 ;je short rm_4 279 ; 280 ; First 2 dir entries are '.' and '..' 281 ; If there is another directory entry, 282 ; that means the directory is not empty. 283 ; 284 000000F2 C1E810 shr eax, 16 285 000000F5 3C2E cmp al, '.' 286 ;cmp byte [stbuf+2], '.' 287 ; cmpb stbuf+2,$'. 288 000000F7 7519 jne short error1 ; bne error1 289 000000F9 08E4 or ah, ah 290 ;cmp byte [stbuf+3], 0 ; tstb stbuf+3 291 ;je short rm_4 ; beq 1b 292 000000FB 74CE jz short rm_4 293 000000FD 80FC2E cmp ah, '.' 294 00000100 803D[29020000]2E cmp byte [stbuf+3], '.' 295 ; cmpb stbuf+3,$'. 296 00000107 7509 jne short error1 ; bne error1 297 00000109 803D[2A020000]00 cmp byte [stbuf+4], 0 ; tstb stbuf+4 298 ;je short rm_4 ; beq 1b 299 00000110 76B9 jna short rm_4 300 301 error1: 302 00000112 E86B000000 call prname ; jsr pc,prname 303 ;mov ebx, eax ; mov r1,r0 304 ;sys _close ; sys close 305 sys _close, eax 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000117 89C3 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 00000119 B806000000 <1> mov eax, %1 90 0000011E CD30 <1> int 30h 306 ;mov eax, 1 ; mov $1,r0 307 ;sys _write, eax, mes1, emes1-mes1 308 sys _write, 1, mes1, emes1-mes1 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000120 BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 00000125 B9[D6010000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 0000012A BA1A000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 0000012F B804000000 <1> mov eax, %1 90 00000134 CD30 <1> int 30h 309 ; sys write; mes1; emes1-mes1 310 ;jmp _loop 311 ; br loop 312 00000136 EB40 jmp short rm_6 ; jmp _loop 313 314 rm_5: ; 1: 315 ;mov ebx, esi ; mov r1,r0 316 ; ebx = file number 317 sys _close ; sys close 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 00000138 B806000000 <1> mov eax, %1 90 0000013D CD30 <1> int 30h 318 0000013F B02F mov al, '/' 319 00000141 AA stosb ; movb $'/,(r2)+ 320 00000142 B02E mov al, '.' 321 00000144 AA stosb ; movb $'.,(r2)+ 322 00000145 AA stosb ; movb $'.,(r2)+ 323 ;sub al, al ; 0 324 ;mov [edi], al ; clrb (r2) 325 00000146 C60700 mov byte [edi], 0 326 ; delete '..' (2nd, dotdot) entry of the directory 327 sys _unlink, name ; sys unlink; name 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000149 BB[FE010000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 0000014E B80A000000 <1> mov eax, %1 90 00000153 CD30 <1> int 30h 328 00000155 4F dec edi 329 00000156 C60700 mov byte [edi], 0 ; clrb -(r2) 330 ; delete '.' (1st, dot) entry of the directory 331 sys _unlink, name ; sys unlink; name 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000159 BB[FE010000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 0000015E B80A000000 <1> mov eax, %1 90 00000163 CD30 <1> int 30h 332 00000165 4F dec edi 333 00000166 4F dec edi 334 00000167 C60700 mov byte [edi], 0 ; clrb -2(r2) 335 ; delete the directory's itself 336 ; (as a dir entry of it's parent diry) 337 sys _unlink, name ; sys unlink; name 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 0000016A BB[FE010000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 0000016F B80A000000 <1> mov eax, %1 90 00000174 CD30 <1> int 30h 338 ; ((cf=1 -> permission denied error or another error.)) 339 00000176 7205 jc short rm_7 340 rm_6: 341 00000178 E9A0FEFFFF jmp _loop ; br loop 342 rm_7: 343 0000017D E911FFFFFF jmp error 344 345 ;error: 346 ; call prname ; jsr pc,prname 347 ; ;mov eax, 1 ; mov $1,r0 348 ; ;sys _write, eax, mes2, emes2-mes2 349 ; sys _write, 1, mes2, emes2-mes2 350 ; ; sys write; mes2; emes2-mes2 351 ; ;jmp _loop ; br loop 352 ; jmp short rm_6 ; jmp _loop 353 354 prname: 355 sys _write, 1, nl, 2 ; next line (CRLF) 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000182 BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 00000187 B9[D3010000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 0000018C BA02000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 00000191 B804000000 <1> mov eax, %1 90 00000196 CD30 <1> int 30h 356 357 ;mov eax, 1 ; mov $1,r0 358 ;sys _write, eax, name, [size] 359 sys _write, 1, name, [size] 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000198 BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 0000019D B9[FE010000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 000001A2 8B15[F6010000] <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 000001A8 B804000000 <1> mov eax, %1 90 000001AD CD30 <1> int 30h 360 ; sys write; name; size:.. 361 000001AF C3 retn ; rts pc 362 363 ;done: 364 ; sys _exit ; sys exit 365 366 ;----------------------------------------------------------------- 367 ; data - initialized data 368 ;----------------------------------------------------------------- 369 370 ;size: dd 0 ; directory (path) name size (byte count) 371 ;fd: dd 0 ; file descriptor/num (of the dir to be deleted) 372 373 ; ---------------------------------------------------------------- 374 375 test_msg: 376 000001B0 0D0A db 0Dh, 0Ah 377 000001B2 524D44495220627920- db 'RMDIR by Erdogan TAN - 12/03/2022' 377 000001BB 4572646F67616E2054- 377 000001C4 414E202D2031322F30- 377 000001CD 332F32303232 378 nl: 379 000001D3 0D0A00 db 0Dh, 0Ah, 0 380 mes1: 381 000001D6 202D2D206469726563- db ' -- directory not empty', 0Dh, 0Ah, 0 381 000001DF 746F7279206E6F7420- 381 000001E8 656D7074790D0A00 382 ; < -- directory not empty\n> 383 emes1: 384 mes2: 385 000001F0 203F0D0A00 db ' ?', 0Dh, 0Ah, 0 ; < ?\n> 386 emes2: 387 ; .even 388 389 ;----------------------------------------------------------------- 390 ; bss - uninitialized data 391 ;----------------------------------------------------------------- 392 393 000001F5 90 align 2 394 395 bss_start: 396 397 ABSOLUTE bss_start 398 399 000001F6 ???????? size: resd 1 ; directory (path) name size (byte count) 400 000001FA ???????? fd: resd 1 ; file descriptor/num (of the dir to be deleted) 401 402 000001FE name: resb 40 ; name: .=.+40. ; dir (path) name buffer 403 00000226 stbuf: resb 40 ; stbuf: .=.+40. ; sysstat output buffer 404 ;stbuf: resb 66 ; Retro UNIX 386 v1.2 ; (66 byte sysstat data) 405 406 ; 12/03/2022 407 ;----------------------------------------------------------------- 408 ; Original UNIX v5 - rmdir (utility) source code (rmdir.s) 409 ; in PDP-11 (unix) assembly language 410 ;----------------------------------------------------------------- 411 ;/ rmdir -- unlink directory 412 ; 413 ; mov (sp)+,r5 414 ; tst (sp)+ 415 ; 416 ;loop: 417 ; dec r5 418 ; ble done 419 ; mov (sp)+,r1 420 ; mov $name,r2 421 ; clr r0 422 ;1: 423 ; inc r0 424 ; movb (r1)+,(r2)+ 425 ; bne 1b 426 ; dec r2 427 ; dec r0 428 ; mov r0,size 429 ; cmp r2,$name 430 ; beq error 431 ; sys stat; name; stbuf 432 ; bes error 433 ; bic $!60000,stbuf+4 434 ; cmp $40000,stbuf+4 435 ; bne error 436 ; cmpb -1(r2),$'. 437 ; bne 1f 438 ; cmp r2,$name+1 439 ; beq error 440 ; cmpb -2(r2),$'/ 441 ; beq error 442 ; cmpb -2(r2),$'. 443 ; bne 1f 444 ; cmp r2,$name+2 445 ; beq error 446 ; cmpb -3(r2),$'/ 447 ; beq error 448 ;1: 449 ; sys open; name; 0 450 ; bes error 451 ; mov r0,r1 452 ;1: 453 ; mov r1,r0 454 ; sys read; stbuf; 16. 455 ; bes 1f 456 ; tst r0 457 ; beq 1f 458 ; tst stbuf 459 ; beq 1b 460 ; cmpb stbuf+2,$'. 461 ; bne error1 462 ; tstb stbuf+3 463 ; beq 1b 464 ; cmpb stbuf+3,$'. 465 ; bne error1 466 ; tstb stbuf+4 467 ; beq 1b 468 ; 469 ;error1: 470 ; jsr pc,prname 471 ; mov r1,r0 472 ; sys close 473 ; mov $1,r0 474 ; sys write; mes1; emes1-mes1 475 ; br loop 476 ; 477 ;1: 478 ; mov r1,r0 479 ; sys close 480 ; movb $'/,(r2)+ 481 ; movb $'.,(r2)+ 482 ; movb $'.,(r2)+ 483 ; clrb (r2) 484 ; sys unlink; name 485 ; clrb -(r2) 486 ; sys unlink; name 487 ; clrb -2(r2) 488 ; sys unlink; name 489 ; br loop 490 ; 491 ;error: 492 ; jsr pc,prname 493 ; mov $1,r0 494 ; sys write; mes2; emes2-mes2 495 ; br loop 496 ; 497 ;prname: 498 ; mov $1,r0 499 ; sys write; name; size:.. 500 ; rts pc 501 ; 502 ;done: 503 ; sys exit 504 ; 505 ;mes1: 506 ; < -- directory not empty\n> 507 ;emes1: 508 ;mes2: 509 ; < ?\n> 510 ;emes2: 511 ; .even 512 ; 513 ;.bss 514 ;name: .=.+40. 515 ;stbuf: .=.+40. 516 ;