1 ; **************************************************************************** 2 ; rmdir386.s (rmdir3.s) - by Erdogan Tan - 11/03/2022 3 ; ---------------------------------------------------------------------------- 4 ; Retro UNIX 386 v1.2 - 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 rmdir3.s -l rmdir3.txt -o rmdir3 -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[AA010000] <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[0A020000] 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[02020000] mov [size], ecx ; mov r0,size 156 0000003E 81FF[0A020000] cmp edi, name ; cmp r2,$name 157 00000044 7447 je short error ; beq error 158 sys _stat, name, stbuf 76 <1> 77 <1> 78 <1> 79 <1> %if %0 >= 2 80 00000046 BB[0A020000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 0000004B B9[32020000] <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 7234 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 ;cmp word [stbuf], 41 ; is inode number > 41 ? 190 ;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 ;test byte [stbuf+3], 40h ; test directory flag 199 ;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 00000059 A0[35020000] mov al, [stbuf+3] ; high byte of mode word 210 0000005E B4C0 mov ah, 0C0h ; regular file (80h) & dir (40h) 211 00000060 20E0 and al, ah ; and al, 0C0h 212 ; bic $!60000,stbuf+4 213 00000062 30C4 xor ah, al ; cmp $40000,stbuf+4 214 00000064 7527 jnz short error ; bne error 215 216 ; check if the last char of dir name is a dot 217 00000066 807FFF2E cmp byte [edi-1], '.' ; cmpb -1(r2),$'. 218 0000006A 7541 jne short rm_3 ; bne 1f 219 ; '.' = current directory (can not be deleted) 220 0000006C 81FF[0B020000] cmp edi, name+1 ; cmp r2,$name+1 221 ;je short error ; beq error 222 00000072 7619 jna short error 223 ; '/.' = root directory (can not be deleted) 224 00000074 8A47FE mov al, [edi-2] 225 00000077 3C2F cmp al, '/' 226 ;cmp byte [edi-2], '/' ; cmpb -2(r2),$'/ 227 00000079 7412 je short error ; beq error 228 ; '..' = parent directory (can not be deleted) 229 0000007B 3C2E cmp al, '.' 230 ;cmp byte [edi-2], '.' ; cmpb -2(r2),$'. 231 0000007D 752E jne short rm_3 ; bne 1f 232 0000007F 81FF[0C020000] cmp edi, name+2 ; cmp r2,$name+2 233 ;je short error ; beq error 234 00000085 7606 jna short error 235 ; '/..' = parent directory (can not be deleted) 236 00000087 807FFD2F cmp byte [edi-3], '/' ; cmpb -3(r2),$'/ 237 ;je short error ; beq error 238 0000008B 7520 jne short rm_3 239 240 error: 241 0000008D 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 00000092 BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 00000097 B9[FC010000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 0000009C BA05000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 000000A1 B804000000 <1> mov eax, %1 90 000000A6 CD30 <1> int 30h 245 ; sys write; mes2; emes2-mes2 246 000000A8 E970FFFFFF 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 000000AD BB[0A020000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 000000B2 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 000000B7 B805000000 <1> mov eax, %1 90 000000BC CD30 <1> int 30h 251 000000BE 72CD jc short error ; bes error 252 ; save file descriptor/number 253 ;mov esi, eax ; mov r0,r1 254 000000C0 A3[06020000] 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 000000C5 8B1D[06020000] <1> mov ebx, %2 81 <1> %if %0 >= 3 82 000000CB B9[32020000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 000000D0 BA10000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 000000D5 B803000000 <1> mov eax, %1 90 000000DA CD30 <1> int 30h 261 ; sys read; stbuf; 16. 262 000000DC 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 000000DE 09C0 or eax, eax ; tst r0 272 000000E0 7450 jz short rm_5 ; beq 1f 273 ; check inode number and dir entry name 274 000000E2 A1[32020000] mov eax, [stbuf] ; 1st 4 byte of dir entry 275 000000E7 6621C0 and ax, ax ; empty (null/deleted) entry ? 276 ;cmp word [stbuf], 0 ; tst stbuf 277 000000EA 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 000000EC C1E810 shr eax, 16 285 000000EF 3C2E cmp al, '.' 286 ;cmp byte [stbuf+2], '.' 287 ; cmpb stbuf+2,$'. 288 000000F1 7519 jne short error1 ; bne error1 289 000000F3 08E4 or ah, ah 290 ;cmp byte [stbuf+3], 0 ; tstb stbuf+3 291 ;je short rm_4 ; beq 1b 292 000000F5 74CE jz short rm_4 293 000000F7 80FC2E cmp ah, '.' 294 000000FA 803D[35020000]2E cmp byte [stbuf+3], '.' 295 ; cmpb stbuf+3,$'. 296 00000101 7509 jne short error1 ; bne error1 297 00000103 803D[36020000]00 cmp byte [stbuf+4], 0 ; tstb stbuf+4 298 ;je short rm_4 ; beq 1b 299 0000010A 76B9 jna short rm_4 300 301 error1: 302 0000010C 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 00000111 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 00000113 B806000000 <1> mov eax, %1 90 00000118 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 0000011A BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 0000011F B9[E2010000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 00000124 BA1A000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 00000129 B804000000 <1> mov eax, %1 90 0000012E CD30 <1> int 30h 309 ; sys write; mes1; emes1-mes1 310 ;jmp _loop 311 ; br loop 312 00000130 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 00000132 B806000000 <1> mov eax, %1 90 00000137 CD30 <1> int 30h 318 00000139 B02F mov al, '/' 319 0000013B AA stosb ; movb $'/,(r2)+ 320 0000013C B02E mov al, '.' 321 0000013E AA stosb ; movb $'.,(r2)+ 322 0000013F AA stosb ; movb $'.,(r2)+ 323 ;sub al, al ; 0 324 ;mov [edi], al ; clrb (r2) 325 00000140 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 00000143 BB[0A020000] <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 00000148 B80A000000 <1> mov eax, %1 90 0000014D CD30 <1> int 30h 328 0000014F 4F dec edi 329 00000150 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 00000153 BB[0A020000] <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 00000158 B80A000000 <1> mov eax, %1 90 0000015D CD30 <1> int 30h 332 0000015F 4F dec edi 333 00000160 4F dec edi 334 00000161 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 00000164 BB[0A020000] <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 00000169 B80A000000 <1> mov eax, %1 90 0000016E CD30 <1> int 30h 338 ; ((cf=1 -> permission denied error or another error.)) 339 00000170 7205 jc short rm_7 340 rm_6: 341 00000172 E9A6FEFFFF jmp _loop ; br loop 342 rm_7: 343 00000177 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 0000017C BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 00000181 B9[DF010000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 00000186 BA02000000 <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 0000018B B804000000 <1> mov eax, %1 90 00000190 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 00000192 BB01000000 <1> mov ebx, %2 81 <1> %if %0 >= 3 82 00000197 B9[0A020000] <1> mov ecx, %3 83 <1> 84 <1> %if %0 >= 4 85 0000019C 8B15[02020000] <1> mov edx, %4 86 <1> %endif 87 <1> %endif 88 <1> %endif 89 000001A2 B804000000 <1> mov eax, %1 90 000001A7 CD30 <1> int 30h 360 ; sys write; name; size:.. 361 000001A9 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 000001AA 0D0A db 0Dh, 0Ah 377 000001AC 526574726F20554E49- db 'Retro UNIX 386 v2 RMDIR by Erdogan TAN - 12/03/2022' 377 000001B5 582033383620763220- 377 000001BE 524D44495220627920- 377 000001C7 4572646F67616E2054- 377 000001D0 414E202D2031322F30- 377 000001D9 332F32303232 378 nl: 379 000001DF 0D0A00 db 0Dh, 0Ah, 0 380 mes1: 381 000001E2 202D2D206469726563- db ' -- directory not empty', 0Dh, 0Ah, 0 381 000001EB 746F7279206E6F7420- 381 000001F4 656D7074790D0A00 382 ; < -- directory not empty\n> 383 emes1: 384 mes2: 385 000001FC 203F0D0A00 db ' ?', 0Dh, 0Ah, 0 ; < ?\n> 386 emes2: 387 ; .even 388 389 ;----------------------------------------------------------------- 390 ; bss - uninitialized data 391 ;----------------------------------------------------------------- 392 393 00000201 90 align 2 394 395 bss_start: 396 397 ABSOLUTE bss_start 398 399 00000202 ???????? size: resd 1 ; directory (path) name size (byte count) 400 00000206 ???????? fd: resd 1 ; file descriptor/num (of the dir to be deleted) 401 402 0000020A name: resb 40 ; name: .=.+40. ; dir (path) name buffer 403 ;stbuf: resb 40 ; stbuf: .=.+40. ; sysstat output buffer 404 00000232 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 ;