     1                                  ; ****************************************************************************
     2                                  ; rmdir386.s (rmdir1.s) - by Erdogan Tan - 11/03/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1 - 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 rmdir1.s -l rmdir1.txt -o rmdir1 -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) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    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
   261                                  				; sys read; stbuf; 16.
   262                                  	;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
    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 BA0A000000          <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
   268 000000E2 7254                    	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 <res 28h>               name:	resb 40 ; name:	 .=.+40.      ; dir (path) name buffer	
   403 00000226 <res 28h>               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                                  ;
