     1                                  ; ****************************************************************************
     2                                  ; rm386.s (rm2.s) - by Erdogan Tan - 25/04/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1.2 - remove -- remove (unlink/delete) file(s)
     5                                  ;
     6                                  ; [ Last Modification: 27/04/2022 ]
     7                                  ;
     8                                  ; Derived from (original) UNIX v7 (& v7 x86) 'rm.c' source Code
     9                                  ; Ref:
    10                                  ; www.tuhs.org (https://minnie.tuhs.org)
    11                                  ; v7.tar.gz
    12                                  ; ****************************************************************************
    13                                  ; [ v7.tar - usr/src/cmd/rm.c (archive date: 10-1-1979) ]
    14                                  ;
    15                                  ; Assembler: NASM v2.15
    16                                  ; ((nasm rm2.s -l rm2.txt -o rm2 -Z error.txt))
    17                                  ;
    18                                  ; rm2.s - 27/04/2022 - Retro UNIX 386 v1.2 (modified unix v7 inode)
    19                                  ; rm1.s - 27/04/2022 - Retro UNIX 386 v1.1
    20                                  ; rm0.s - 27/04/2022 - Retro UNIX 386 v1
    21                                  ; rm8086.s - Retro UNIX 8086 v1 (16 bit 'rm0.s') 
    22                                  
    23                                  ; 12/01/2022 (Retro UNIX 386 v1.2)
    24                                  ; 13/10/2015
    25                                  
    26                                  ; UNIX v1 system calls
    27                                  _rele 	equ 0
    28                                  _exit 	equ 1
    29                                  _fork 	equ 2
    30                                  _read 	equ 3
    31                                  _write	equ 4
    32                                  _open	equ 5
    33                                  _close 	equ 6
    34                                  _wait 	equ 7
    35                                  _creat 	equ 8
    36                                  _link 	equ 9
    37                                  _unlink	equ 10
    38                                  _exec	equ 11
    39                                  _chdir	equ 12
    40                                  _time 	equ 13
    41                                  _mkdir 	equ 14
    42                                  _chmod	equ 15
    43                                  _chown	equ 16
    44                                  _break	equ 17
    45                                  _stat	equ 18
    46                                  _seek	equ 19
    47                                  _tell 	equ 20
    48                                  _mount	equ 21
    49                                  _umount	equ 22
    50                                  _setuid	equ 23
    51                                  _getuid	equ 24
    52                                  _stime	equ 25
    53                                  _quit	equ 26	
    54                                  _intr	equ 27
    55                                  _fstat	equ 28
    56                                  _emt 	equ 29
    57                                  _mdate 	equ 30
    58                                  _stty 	equ 31
    59                                  _gtty	equ 32
    60                                  _ilgins	equ 33
    61                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    62                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    63                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    64                                  ; 12/01/2022 - Retro UNIX 386 v1.2
    65                                  ; Retro UNIX 386 v2 system calls
    66                                  _setgid	equ 37
    67                                  _getgid	equ 38
    68                                  _sysver	equ 39 ; (get) Retro Unix 386 version
    69                                  
    70                                  ;;;
    71                                  ESCKey equ 1Bh
    72                                  EnterKey equ 0Dh
    73                                  
    74                                  %macro sys 1-4
    75                                      ; 03/09/2015	
    76                                      ; 13/04/2015
    77                                      ; Retro UNIX 386 v1 system call.		
    78                                      %if %0 >= 2   
    79                                          mov ebx, %2
    80                                          %if %0 >= 3    
    81                                              mov ecx, %3
    82                                              ;%if %0 = 4
    83                                              %if	%0 >= 4 ; 11/03/2022
    84                                  		mov edx, %4   
    85                                              %endif
    86                                          %endif
    87                                      %endif
    88                                      mov eax, %1
    89                                      int 30h	   
    90                                  %endmacro
    91                                  
    92                                  ; Retro UNIX 386 v1 system call format:
    93                                  ; sys systemcall (eax), <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    94                                  
    95                                  ; 11/03/2022
    96                                  ; Note: Above 'sys' macro has limitation about register positions;
    97                                  ;	ebx, ecx, edx registers must not be used after their
    98                                  ;	positions in sys macro.
    99                                  ; for example:
   100                                  ;	'sys _write, 1, msg, ecx' is defective, because
   101                                  ;	 ecx will be used/assigned before edx in 'sys' macro.
   102                                  ; correct order may be:
   103                                  ;	'sys _write, 1, msg, eax ; (eax = byte count)
   104                                  
   105                                  ;struc stat
   106                                  ;	; Note: This is for Retro UNIX v1.1 'sysstat' output !!!
   107                                  ;	; (34 bytes)
   108                                  ;	.inode:  resw 1
   109                                  ;	.mode:	 resw 1
   110                                  ;	.nlinks: resb 1
   111                                  ;	.uid:	 resb 1
   112                                  ;	.size:	 resw 1
   113                                  ;	.dskptr: resw 8
   114                                  ;	.ctime:	 resd 1
   115                                  ;	.mtime:	 resd 1
   116                                  ;	.rsvd:   resw 1
   117                                  ;	.strucsize:
   118                                  ;endstruc   
   119                                  
   120                                  struc stat
   121                                  	; Note: This is for Retro UNIX v1.2 'sysstat' output !!!
   122                                  	; (66 bytes)
   123 00000000 ????                    	.inode:  resw 1
   124 00000002 ????                    	.mode:	 resw 1
   125 00000004 ????                    	.nlinks: resw 1
   126 00000006 ????                    	.uid:	 resw 1
   127 00000008 ??                      	.gid:	 resb 1
   128 00000009 ??                      	.size_h: resb 1
   129 0000000A ????????                	.size:	 resd 1
   130 0000000E <res 28h>               	.dskptr: resd 10
   131 00000036 ????????                	.atime:	 resd 1
   132 0000003A ????????                	.mtime:	 resd 1
   133 0000003E ????????                	.ctime:  resd 1
   134                                  	.strucsize:
   135                                  endstruc   
   136                                  
   137                                  ;S_IFMT   equ 0F000h ; /* type of file */
   138                                  ;S_IFDIR  equ 04000h ; /* directory */
   139                                  ;S_IFCHR  equ 02000h ; /* character special */
   140                                  ;S_IFBLK  equ 06000h ; /* block special */
   141                                  ;S_IFREG  equ 08000h ; /* regular */
   142                                  ;S_ISUID  equ 00800h ; /* set user id on execution */
   143                                  ;S_ISGID  equ 00400h ; /* set group id on execution */
   144                                  ;S_IREAD  equ 00100h ; /* read permission, owner */
   145                                  ;S_IWRITE equ 00080h ; /* write permission, owner */
   146                                  ;S_IEXEC  equ 00040h ; /* execute/search permission, owner */
   147                                  
   148                                  ; 27/04/2022 - Retro UNIX (386) v2 inode
   149                                  ; byte 1
   150                                  S_IFREG	 equ 80h ; Regular file flag (0 = device file)
   151                                  S_IFDIR  equ 40h ; Directory flag (for regular file)
   152                                  S_IFBLK	 equ 40h ; Block device flag (for device)
   153                                  S_IRSVD  equ 20h ; Reserved (for regular file) flag = 0
   154                                  S_IFCHR	 equ 20h ; Char special flag (for device) = 1
   155                                  S_IFLRG  equ 10h ; Large File flag
   156                                  S_ISUID  equ 08h ; Set User ID On Execution flag
   157                                  S_ISGID  equ 04h ; Set Group ID On Execution flag
   158                                  S_IREAD  equ 01h ; Owner's Read Permission flag
   159                                  ; byte 0
   160                                  S_IWRITE equ 80h ; Owner's Write Permission flag
   161                                  S_IEXEC	 equ 40h ; Owner's Execute Permission flag
   162                                  
   163                                  ; 24/04/2022
   164                                  ; 21/04/2022 - UNIX v1 inode
   165                                  ; byte 1
   166                                  ;S_ALLOC  equ 080h ; Allocated flag
   167                                  ;S_IFDIR  equ 040h ; Directory flag
   168                                  ;S_IFMDF  equ 020h ; File modified flag (always on)
   169                                  ;S_IFLRG  equ 010h ; Large File flag
   170                                  ;; byte 0
   171                                  ;S_ISUID  equ 020h ; Set User ID On Execution flag
   172                                  ;S_IEXEC  equ 010h ; Executable File flag
   173                                  ;S_IREAD  equ 008h ; Owner's Read Permission flag
   174                                  ;S_IWRITE equ 004h ; Owner's Write Permission flag
   175                                  
   176                                  BSIZE equ 512
   177                                  
   178                                  ;26/04/2022
   179                                  ; Directory entry size
   180                                  ;DIRSIZ	equ 10	; Retro UNIX 386 v1
   181                                  DIRSIZ equ 16	; Retro UNIX 386 v1.1 & v1.2 
   182                                  
   183                                  ;-----------------------------------------------------------------
   184                                  ;  text - code
   185                                  ;-----------------------------------------------------------------
   186                                  
   187                                  [BITS 32] ; 32-bit intructions (for 80386 protected mode)
   188                                  
   189                                  [ORG 0] 
   190                                  
   191                                  START_CODE:
   192                                  	; 27/04/2022
   193                                  	; 26/04/2022
   194                                  	; 25/04/2022
   195                                  	; main(argc, argv)
   196                                  
   197 00000000 58                      	pop	eax ; [esp] = argument count	
   198                                  	;mov	[argc], eax
   199 00000001 A2[15060000]            	mov	[argc], al
   200                                  	;dec	eax
   201 00000006 FEC8                    	dec	al
   202 00000008 7533                    	jnz	short rm_0 ; [argc] = 1
   203                                  
   204                                  	sys	_msg, program_msg, 255, 0Fh
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000000A BB[19060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000000F B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000014 BA0F000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000019 B823000000          <1>  mov eax, %1
    89 0000001E CD30                <1>  int 30h
   205                                  rm_usage:
   206                                     	; "Usage: rm [fri] file ..."
   207                                  	sys	_msg, usage_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000020 BB[50060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000025 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000002A BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000002F B823000000          <1>  mov eax, %1
    89 00000034 CD30                <1>  int 30h
   208                                  rm_exit:
   209                                  	sys	_exit	; sys exit
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000036 B801000000          <1>  mov eax, %1
    89 0000003B CD30                <1>  int 30h
   210                                  ;hlt:
   211                                  ;	nop
   212                                  ;	nop
   213                                  ;	jmp	short hlt
   214                                  
   215                                  rm_0:
   216                                  	;if (isatty(0) == 0)
   217                                  	;	fflg++;
   218                                  
   219                                  	; set '-f' flag if standard input is not a terminal
   220                                  	sys	_fstat, 0, stbuf
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000003D BB00000000          <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000042 B9[44070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000047 B81C000000          <1>  mov eax, %1
    89 0000004C CD30                <1>  int 30h
   221                                  	;jc	short rm_exit ; 27/04/2022
   222                                  
   223                                  	; 27/04/2022
   224                                  	; 25/04/2022
   225                                  	; Retro UNIX v2 inode:
   226                                  	;	 regular file flag is mode bit 15
   227                                  	;
   228 0000004E F605[47070000]80        	test	byte [stbuf+stat.mode+1], S_IFREG
   229 00000055 7406                    	jz	short rm_1 ; device file (terminal/console)
   230                                  
   231                                  	;inc	byte [fflg] 
   232                                  
   233                                  	; 25/04/2022
   234                                  	; Retro UNIX v1 inode:
   235                                  	;	regular file inode numbers are > 41
   236                                  	;
   237                                  	;cmp	word [stbuf+stat.inode], 41
   238                                  	;jna	short rm_1 ; device file (or root dir?)
   239                                  
   240                                  	; (if standard input is not a terminal)
   241                                  	; force removing (without question and 'y' answer)
   242 00000057 FE05[16060000]          	inc 	byte [fflg]
   243                                  rm_1: 
   244                                  	;if(argc>1 && argv[1][0]=='-') {
   245                                  	;	arg = *++argv;
   246                                  	;	argc--;
   247                                  	;
   248                                  
   249 0000005D 89E5                    	mov	ebp, esp ; 26/04/2022
   250 0000005F 5E                      	pop	esi ; argv[0] ; executable file name (='rm')
   251                                  	;mov	[argv], esp
   252 00000060 8B3424                  	mov	esi, [esp] ; 26/04/2022
   253                                  			; argv[1] ; option (if it is used)
   254 00000063 AC                      	lodsb
   255 00000064 3C2D                    	cmp	al, '-'
   256 00000066 754E                    	jne	short rm_2
   257 00000068 89E5                    	mov	ebp, esp ; 26/04/2022
   258 0000006A FE0D[15060000]          	dec	byte [argc] ; ARGC - 2
   259                                  rm_28:
   260 00000070 AC                      	lodsb
   261 00000071 A8FF                    	test	al, 0FFh
   262 00000073 7441                    	jz	short rm_2
   263                                  	
   264                                  	;while(*++arg != '\0')
   265                                  	;	switch(*arg) {
   266                                  	;	case 'f':
   267                                  	;		fflg++;
   268                                  	;		break;
   269                                  	;	case 'i':
   270                                  	;		iflg++;
   271                                  	;		break;
   272                                  	;	case 'r':
   273                                  	;		rflg++;
   274                                  	;		break;
   275                                  	;	default:
   276                                  	;		printf("rm: unknown option %s\n", *argv);
   277                                  	;		exit(1);
   278                                  	;	}
   279                                  
   280 00000075 3C66                    	cmp	al, 'f'
   281 00000077 742D                    	je	short rm_1_f
   282 00000079 3C69                    	cmp	al, 'i'
   283 0000007B 7431                    	je	short rm_1_i
   284 0000007D 3C72                    	cmp	al, 'r'
   285 0000007F 741D                    	je	short rm_1_r
   286                                  rm_1_uop:
   287                                  	; "rm: unknown option '-x'"
   288 00000081 A2[86060000]            	mov	[uop], al
   289                                  	sys	_msg, unk_op_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000086 BB[70060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000008B B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000090 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000095 B823000000          <1>  mov eax, %1
    89 0000009A CD30                <1>  int 30h
   290                                  	; (exit code not used in Retro UNIX 386 v1 & v1.1)
   291                                  	;sys	_exit, 1 ; (ebx = exit code = 1)
   292 0000009C EB98                    	jmp	short rm_exit	
   293                                  rm_1_r:
   294 0000009E FE05[18060000]          	inc	byte [rflg] ; rflg++;
   295                                  	;jmp	short rm_2
   296                                  	; 27/04/2022
   297 000000A4 EBCA                    	jmp	short rm_28 ; get next option char
   298                                  rm_1_f:
   299 000000A6 FE05[16060000]          	inc	byte [fflg] ; fflg++;
   300                                  	;jmp	short rm_2
   301                                  	; 27/04/2022
   302 000000AC EBC2                    	jmp	short rm_28 ; get next option char
   303                                  rm_1_i:
   304 000000AE FE05[17060000]          	inc	byte [iflg] ; iflg++
   305                                  	; 27/04/2022
   306 000000B4 EBBA                    	jmp	short rm_28 ; get next option char
   307                                  rm_2:
   308                                  	;while(--argc > 0) {
   309                                  	;	if(!strcmp(*++argv, "..")) {
   310                                  	;	  fprintf(stderr, "rm: cannot remove `..'\n");
   311                                  	;	  continue;
   312                                  	;	}
   313                                  	;	rm(*argv, fflg, rflg, iflg, 0);
   314                                  	;}
   315                                  
   316 000000B6 FE0D[15060000]          	dec	byte [argc]
   317 000000BC 7431                    	jz	short rm_4
   318                                  
   319                                  	;add	word ptr [argv], 4 ; ++argv	
   320                                  	;mov	esi, [argv]
   321 000000BE 83C504                  	add	ebp, 4 ; ++argv	
   322 000000C1 8B7500                  	mov	esi, [ebp]
   323 000000C4 66813E2E2E              	cmp	word [esi], '..' ; strcmp(*++argv, "..")
   324 000000C9 740E                    	je	short rm_3
   325                                  	; rm(*argv, fflg, rflg, iflg, 0);
   326 000000CB C605[86070000]00        	mov	byte [level], 0
   327 000000D2 E823000000              	call	remove_file
   328 000000D7 EBDD                    	jmp	short rm_2
   329                                  rm_3:
   330                                  	; "rm: cannot remove '..'"
   331                                  	sys	_msg, cnr_dotdot_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000000D9 BB[8A060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000000DE B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000000E3 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000000E8 B823000000          <1>  mov eax, %1
    89 000000ED CD30                <1>  int 30h
   332                                  rm_4:
   333                                  	; (exit code not used in Retro UNIX 386 v1 & v1.1)
   334                                  	;sys	_exit, [errcode]
   335                                  	sys	_exit
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000000EF B801000000          <1>  mov eax, %1
    89 000000F4 CD30                <1>  int 30h
   336                                  ;hang:
   337                                  ;	jmp	short hang
   338                                  
   339                                  _return:
   340                                  	; 27/04/2022
   341 000000F6 89EC                    	mov	esp, ebp ; add esp, 100
   342 000000F8 5D                      	pop	ebp 
   343                                  	
   344 000000F9 C3                      	retn
   345                                  	
   346                                  remove_file:	
   347                                  	; rm(arg, fflg, rflg, iflg, level)
   348                                  
   349                                  	; 27/04/2022
   350                                  	; 26/04/2022
   351                                  	; modified registers: eax, ebx, ecx, edx, edi
   352                                  
   353                                  	; INPUT:
   354                                  	;	   esi = *argv   ; [level] = 0 
   355                                  	;	or esi = namebuf ; [level] > 0 --
   356                                  	;	byte [fflg], [rflg], [iflg]
   357                                  	;	byte [level] = sub directory level
   358                                  
   359                                  	;if(stat(arg, &buf)) {
   360                                  	;	if (fflg==0) {
   361                                  	;	   printf("rm: %s nonexistent\n", arg);
   362                                  	;	   ++errcode;
   363                                  	;	}
   364                                  	;	return;
   365                                  	;}
   366                                  
   367                                  	; 27/04/2022
   368 000000FA 55                      	push	ebp
   369 000000FB 89E5                    	mov	ebp, esp
   370 000000FD 83EC64                  	sub	esp, 100 ; char name[100];
   371                                  	
   372                                  	sys	_stat, esi, stbuf
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000100 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000102 B9[44070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000107 B812000000          <1>  mov eax, %1
    89 0000010C CD30                <1>  int 30h
   373 0000010E 734A                    	jnc	short rm_5
   374                                  
   375 00000110 803D[16060000]00        	cmp	byte [fflg], 0
   376 00000117 77DD                    	ja	short _return
   377                                  
   378                                  	; "rm: <esi> non existent"
   379                                  	sys	_msg, rm_hdr_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000119 BB[A5060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000011E B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000123 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000128 B823000000          <1>  mov eax, %1
    89 0000012D CD30                <1>  int 30h
   380                                  	sys	_msg, esi, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000012F 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000131 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000136 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000013B B823000000          <1>  mov eax, %1
    89 00000140 CD30                <1>  int 30h
   381                                  	sys	_msg, nonex_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000142 BB[AC060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000147 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000014C BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000151 B823000000          <1>  mov eax, %1
    89 00000156 CD30                <1>  int 30h
   382                                  	
   383                                  	;inc	dword [errcode] ; ++errcode;
   384                                  
   385 00000158 EB9C                    	jmp	short _return
   386                                  rm_5:	 
   387                                  	;if ((buf.st_mode&S_IFMT) == S_IFDIR) {
   388                                  	;	if(rflg) {
   389                                  
   390                                  	; Retro UNIX 386 v2 inode
   391 0000015A A0[47070000]            	mov	al, [stbuf+stat.mode+1]
   392 0000015F 24C0                    	and	al, S_IFREG | S_IFDIR
   393 00000161 3CC0                    	cmp	al, S_IFREG | S_IFDIR
   394                                  	;jne	short rm_17
   395                                  	; 27/04/2022
   396 00000163 7405                    	je	short rm_24
   397 00000165 E9ED010000              	jmp	rm_17
   398                                  
   399                                  	; Retro UNIX 386 v1 (unix v1) inode
   400                                  	;test	byte [stbuf+stat.mode+1], S_IFDIR
   401                                  	;;jz	short rm_17
   402                                  	; 26/04/2022
   403                                  	;jnz	short rm_24
   404                                  	;jmp	rm_17
   405                                  rm_24:
   406                                  	; Directory ! ('-r' option is required)
   407                                  	
   408                                  	;if(rflg) { ...
   409                                  	;	....
   410                                  	;} 
   411                                  	;printf("rm: %s directory\n", arg);
   412                                  	;	++errcode;
   413                                  	;	return;	
   414                                  
   415 0000016A 803D[18060000]00        	cmp	byte [rflg], 0
   416                                  	;jna	short rm_9
   417                                  	; 26/04/2022
   418 00000171 7705                    	ja	short rm_25
   419 00000173 E907010000              	jmp	rm_9
   420                                  
   421                                  rm_25:
   422                                  	;if (access(arg, 02) < 0) {
   423                                  	;	if (fflg==0)
   424                                  	;	   printf("%s not changed\n", arg);
   425                                  	;	errcode++;
   426                                  	;	return;
   427                                  	;}
   428                                  
   429                                  	; dl = permission/mode value
   430                                  	;	(dl = 2 for Retro UNIX 386 v2 inode)
   431                                  	;	(dl = 1 for Retro UNIX 386 v1 inode)
   432                                  
   433                                  	;;mov	dl, 2
   434                                  	;mov	dl, 1
   435                                  
   436 00000178 E82E030000              	call	access
   437 0000017D 734D                    	jnc	short rm_7
   438                                  
   439 0000017F 803D[16060000]00        	cmp	byte [fflg], 0
   440 00000186 773F                    	ja	short rm_6
   441                                  
   442                                  	; esi = arg = *[argv]
   443                                  
   444                                  	; "<esi> not changed"
   445                                  	sys	_msg, nextline, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000188 BB[6D060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000018D B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000192 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000197 B823000000          <1>  mov eax, %1
    89 0000019C CD30                <1>  int 30h
   446                                  	sys	_msg, esi, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000019E 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000001A0 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001A5 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000001AA B823000000          <1>  mov eax, %1
    89 000001AF CD30                <1>  int 30h
   447                                  	sys	_msg, nchd_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000001B1 BB[BB060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000001B6 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001BB BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000001C0 B823000000          <1>  mov eax, %1
    89 000001C5 CD30                <1>  int 30h
   448                                  rm_6:
   449                                  	;inc	dword [errcode] ; ++errcode;
   450 000001C7 E92AFFFFFF              	jmp	_return ; return;
   451                                  rm_7:
   452                                  	;if(iflg && level!=0) {
   453                                  	;	printf("directory %s: ", arg);
   454                                  	;	    if(!yes())
   455                                  	;	    return;
   456                                  	;}
   457                                  
   458 000001CC 803D[17060000]00        	cmp	byte [iflg], 0
   459 000001D3 764F                    	jna	short rm_8
   460 000001D5 803D[86070000]00        	cmp	byte [level], 0
   461 000001DC 7646                    	jna	short rm_8
   462                                  
   463                                  	 ;"directory <ESI> : ? " 
   464                                  	sys	_msg, dir_hdr_msg, 255, 07h ; message row header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000001DE BB[CA060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000001E3 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001E8 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000001ED B823000000          <1>  mov eax, %1
    89 000001F2 CD30                <1>  int 30h
   465                                  	sys	_msg, esi, 255, 07h	; directory name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000001F4 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000001F6 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000001FB BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000200 B823000000          <1>  mov eax, %1
    89 00000205 CD30                <1>  int 30h
   466                                  	sys	_msg, qu_msg, 255, 07h	; question 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000207 BB[D7060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000020C B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000211 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000216 B823000000          <1>  mov eax, %1
    89 0000021B CD30                <1>  int 30h
   467                                  
   468                                  	; get user input (answer)
   469                                  	; and write it (as answer) via sysmsg system call
   470 0000021D E8AB020000              	call	ifyes
   471 00000222 72A3                    	jc	short rm_6 ; no
   472                                  	; yes
   473                                  rm_8:
   474                                  	;if((d=open(arg, 0)) < 0) {
   475                                  	;	printf("rm: %s: cannot read\n", arg);
   476                                  	;	exit(1);
   477                                  	;}
   478                                  	
   479                                  	sys	_open, esi, 0 ; open directory for read
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000224 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000226 B900000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000022B B805000000          <1>  mov eax, %1
    89 00000230 CD30                <1>  int 30h
   480                                  	;jnc	short rm_10
   481                                  	; 26/04/2022
   482 00000232 7205                    	jc	short rm_26
   483 00000234 E98A000000              	jmp	rm_10
   484                                  rm_26:
   485                                  	 ;"rm: <esi> : cannot read" 
   486                                  	sys	_msg, rm_hdr_msg, 255, 07h ; msg row header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000239 BB[A5060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000023E B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000243 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000248 B823000000          <1>  mov eax, %1
    89 0000024D CD30                <1>  int 30h
   487                                  	sys	_msg, esi, 255, 07h	; directory name
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000024F 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000251 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000256 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000025B B823000000          <1>  mov eax, %1
    89 00000260 CD30                <1>  int 30h
   488                                  	sys	_msg, cnr_msg, 255, 07h ; 'cannot read'
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000262 BB[E7060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000267 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000026C BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000271 B823000000          <1>  mov eax, %1
    89 00000276 CD30                <1>  int 30h
   489                                  
   490                                  	; (exit code not used in Retro UNIX 386 v1 & v1.1)
   491                                  	;sys	_exit, 1 ; (ebx = exit code = 1)
   492                                  	sys	_exit
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000278 B801000000          <1>  mov eax, %1
    89 0000027D CD30                <1>  int 30h
   493                                  ;here:
   494                                  ;	jmp	short here
   495                                  
   496                                  rm_9:
   497                                  	;printf("rm: %s directory\n", arg);
   498                                  	;	++errcode;
   499                                  	;	return;	
   500                                  
   501                                  	; "rm: <esi> directory"
   502                                  	sys	_msg, rm_hdr_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000027F BB[A5060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000284 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000289 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000028E B823000000          <1>  mov eax, %1
    89 00000293 CD30                <1>  int 30h
   503                                  	sys	_msg, esi, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000295 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000297 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000029C BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000002A1 B823000000          <1>  mov eax, %1
    89 000002A6 CD30                <1>  int 30h
   504                                  	sys	_msg, dir_msg, 255, 07h
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000002A8 BB[F7060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000002AD B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000002B2 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000002B7 B823000000          <1>  mov eax, %1
    89 000002BC CD30                <1>  int 30h
   505                                  
   506                                  	;inc	dword [errcode] ; ++errcode;
   507                                  
   508 000002BE E933FEFFFF              	jmp	_return ; return;
   509                                  
   510                                  rm_10:
   511                                  	;while(read(d, (char *)&direct, sizeof(direct)) == sizeof(direct)) {
   512                                  	;	if(direct.d_ino != 0 && !dotname(direct.d_name)) {
   513                                  	;	   sprintf(name, "%s/%.14s", arg, direct.d_name);
   514                                  	;	   rm(name, fflg, rflg, iflg, level+1);
   515                                  	;	}
   516                                  	;}
   517                                  	;
   518                                  	;close(d);
   519                                  	;errcode += rmdir(arg, iflg);
   520                                  	;return;
   521                                  
   522                                  	; 26/04/2022
   523 000002C3 A3[30070000]            	mov	[_d_], eax ; file (directory) descriptor
   524                                  rm_29:
   525                                  	sys	_read, [_d_], direct, DIRSIZ
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000002C8 8B1D[30070000]      <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000002CE B9[34070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000002D3 BA10000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000002D8 B803000000          <1>  mov eax, %1
    89 000002DD CD30                <1>  int 30h
   526 000002DF 725F                    	jc	short rm_15
   527 000002E1 83F810                  	cmp	eax, DIRSIZ  ; 16 (runix v1.1&v1.2) or 10 (runix v1)
   528 000002E4 725A                    	jb	short rm_15  ; (jne short rm_14)
   529                                  
   530                                  	; 27/04/2022
   531                                  	; if(direct.d_ino != 0 ..
   532 000002E6 66833D[34070000]00      	cmp	word [direct], 0 ; is inode number > 0 ?
   533 000002EE 76D8                    	jna	short rm_29  ; no ; read next direntry ; 27/04/2022
   534                                  	; yes  	
   535                                  	; && !dotname(direct.d_name))
   536 000002F0 BB[36070000]            	mov	ebx, direct+2
   537 000002F5 E825020000              	call	isdotname
   538 000002FA 74CC                    	jz	short rm_29  ; '.' or '..' 
   539                                  			     ; read next direntry ; 27/04/2022
   540                                  
   541                                  	; sprintf(name, "%s/%.14s", arg, direct.d_name);
   542                                  	; 27/04/2022
   543 000002FC 89E7                    	mov	edi, esp ; name ; 100 byte frame on stack
   544 000002FE 56                      	push	esi ; * ; save esi (arg, *argv)
   545                                  rm_11:
   546 000002FF AC                      	lodsb
   547 00000300 08C0                    	or	al, al
   548 00000302 7403                    	jz	short rm_12 ; (end of the path)
   549 00000304 AA                      	stosb
   550 00000305 EBF8                    	jmp	short rm_11
   551                                  rm_12:
   552                                  	; add file name to the path
   553 00000307 B02F                    	mov	al, '/'
   554 00000309 AA                      	stosb
   555                                  	;mov	ecx, 14 ; max. 14 byte file name
   556 0000030A B90E000000              	mov	ecx, DIRSIZ-2
   557 0000030F BE[36070000]            	mov	esi, direct+2 ; direct.d_name
   558                                  rm_13:
   559 00000314 AC                      	lodsb
   560 00000315 AA                      	stosb
   561 00000316 08C0                    	or	al, al
   562 00000318 7402                    	jz	short rm_14 ; end of the (full) path
   563 0000031A E2F8                    	loop	rm_13
   564                                  rm_14:
   565                                  	; rm(name, fflg, rflg, iflg, level+1);
   566                                  	; 27/04/2022
   567 0000031C 8D742404                	lea	esi, [esp+4] ; path name buffer (stack frame)
   568 00000320 FF35[30070000]          	push	dword [_d_] ; save file (dir) descriptor 
   569 00000326 FE05[86070000]          	inc	byte [level]
   570 0000032C E8C9FDFFFF              	call	remove_file ; ! call itself !
   571 00000331 FE0D[86070000]          	dec	byte [level] ; (this may not be necessary)
   572 00000337 8F05[30070000]          	pop	dword [_d_] ; restore file (dir) descriptor
   573 0000033D 5E                      	pop	esi ; *	; restore esi (arg, *argv)
   574 0000033E EB88                    	jmp	short rm_29
   575                                  rm_15:
   576                                  	sys	_close, [_d_] ; close(d);
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000340 8B1D[30070000]      <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000346 B806000000          <1>  mov eax, %1
    89 0000034B CD30                <1>  int 30h
   577                                  	; errcode += rmdir(arg, iflg);
   578                                  	; 27/04/2022
   579 0000034D E8E1010000              	call	rmdir
   580                                  	;jnc	short rm_16
   581                                  	;mov	byte [errcode], 1
   582                                  	;---- 
   583                                  	;NOTE:
   584                                  	; sysexit error code ((exit(errcode);)
   585                                  	; is not used by current Retro UNIX version
   586                                  	;----
   587                                  rm_16:	; 27/04/2022
   588 00000352 E99FFDFFFF              	jmp	_return ; return;
   589                                  
   590                                  rm_17:
   591                                  	;if(iflg) {
   592                                  	;	printf("%s: ", arg);
   593                                  	;	if(!yes())
   594                                  	;		return;
   595                                  	;}
   596                                  	;else if(!fflg) {
   597                                  	;	if (access(arg, 02)<0) {
   598                                  	;	   printf("rm: %s %o mode ", arg, buf.st_mode&0777);
   599                                  	;	   if(!yes())
   600                                  	;		return;
   601                                  	;	}
   602                                  	;}
   603                                  	;	
   604                                  	;if(unlink(arg) && (fflg==0 || iflg)) {
   605                                  	;	printf("rm: %s not removed\n", arg);
   606                                  	;	++errcode;
   607                                  	;}
   608                                  
   609                                  	; 26/04/2022
   610 00000357 803D[17060000]00        	cmp	byte [iflg], 0
   611                                  	;jna	short rm_20
   612 0000035E 7705                    	ja	short rm_27
   613 00000360 E9A2000000              	jmp	rm_20
   614                                  rm_27:
   615                                  	sys	_msg, nextline, 255, 07h ; next (new) line
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000365 BB[6D060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000036A B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000036F BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000374 B823000000          <1>  mov eax, %1
    89 00000379 CD30                <1>  int 30h
   616                                  	sys	_msg, esi, 255, 07h	; file name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000037B 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000037D B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000382 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000387 B823000000          <1>  mov eax, %1
    89 0000038C CD30                <1>  int 30h
   617                                  	sys	_msg, qu_msg, 255, 07h	; question
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000038E BB[D7060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000393 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000398 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000039D B823000000          <1>  mov eax, %1
    89 000003A2 CD30                <1>  int 30h
   618 000003A4 E824010000              	call	ifyes  ; question 	
   619 000003A9 72A7                    	jc	short rm_16 ; answer = no (not 'y')
   620                                  rm_18:
   621                                  	sys	_unlink, esi
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003AB 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003AD B80A000000          <1>  mov eax, %1
    89 000003B2 CD30                <1>  int 30h
   622 000003B4 739C                    	jnc	short rm_16
   623                                  	;
   624 000003B6 A0[16060000]            	mov	al, [fflg]
   625 000003BB 0A05[17060000]          	or	al, [iflg]
   626 000003C1 748F                    	jz	short rm_16
   627                                  	; "rm: <esi> not removed"
   628                                  	sys	_msg, rm_hdr_msg, 255, 07h ; header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003C3 BB[A5060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000003C8 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000003CD BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003D2 B823000000          <1>  mov eax, %1
    89 000003D7 CD30                <1>  int 30h
   629                                  	sys	_msg, esi, 255, 07h	; file name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003D9 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000003DB B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000003E0 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003E5 B823000000          <1>  mov eax, %1
    89 000003EA CD30                <1>  int 30h
   630                                  	sys	_msg, not_rmd_msg, 255, 07h ; 'not removed'
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000003EC BB[02070000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000003F1 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000003F6 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000003FB B823000000          <1>  mov eax, %1
    89 00000400 CD30                <1>  int 30h
   631                                  	;----
   632                                  	;Note:  Current Retro UNIX version
   633                                  	;	does not use error code return (to parent)
   634                                  	;----
   635                                  	;inc	byte [errcode]
   636                                  	; 27/04/2022
   637 00000402 E9EFFCFFFF              	jmp	_return ; return;
   638                                  rm_20:
   639 00000407 803D[16060000]00        	cmp	byte [fflg], 0
   640 0000040E 779B                    	ja	short rm_18
   641                                  	;
   642                                  	;if (access(arg, 02)<0) {
   643                                  	;   printf("rm: %s %o mode ", arg, buf.st_mode&0777);
   644                                  	;   if(!yes())
   645                                  	;	return;
   646                                  	;}
   647                                  	;
   648                                  	;;mov	dl, 2
   649                                  	;mov	dl, 1
   650 00000410 E896000000              	call	access
   651 00000415 7394                    	jnc	short rm_18
   652                                  	
   653                                  	; "rm: <esi> _octal_ mode"
   654 00000417 31C0                    	xor	eax, eax
   655 00000419 31DB                    	xor	ebx, ebx
   656 0000041B 89E1                    	mov	ecx, esp
   657 0000041D 66A1[46070000]          	mov	ax, [stbuf+stat.mode]
   658                                  	; 27/04/2022
   659 00000423 6625FF01                	and	ax, 1FFh ; Retro UNIX 386 v2 inode
   660                                  	;and	ax, 1Fh	 ; Retro UNIX 386 v1 inode
   661 00000427 B308                    	mov	bl, 8 ; divisor for octal number calculation
   662 00000429 BF[87070000]            	mov	edi, octal
   663                                  rm_21:
   664 0000042E 31D2                    	xor	edx, edx
   665 00000430 F7F3                    	div 	ebx
   666 00000432 52                      	push	edx
   667 00000433 09C0                    	or	eax, eax
   668 00000435 75F7                    	jnz	short rm_21
   669                                  rm_22:
   670 00000437 58                      	pop	eax
   671 00000438 0430                    	add	al, '0'
   672 0000043A AA                      	stosb
   673 0000043B 39E1                    	cmp	ecx, esp
   674 0000043D 77F8                    	ja	short rm_22
   675 0000043F 28C0                    	sub	al, al
   676 00000441 AA                      	stosb
   677                                  
   678                                  	sys	_msg, rm_hdr_msg, 255, 07h ; header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000442 BB[A5060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000447 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000044C BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000451 B823000000          <1>  mov eax, %1
    89 00000456 CD30                <1>  int 30h
   679                                  	sys	_msg, octal, 255, 07h	; octal mode
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000458 BB[87070000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000045D B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000462 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000467 B823000000          <1>  mov eax, %1
    89 0000046C CD30                <1>  int 30h
   680                                  	sys	_msg, mode_msg, 255, 07h ; ' mode '
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000046E BB[11070000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000473 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000478 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000047D B823000000          <1>  mov eax, %1
    89 00000482 CD30                <1>  int 30h
   681                                  	sys	_msg, que_msg, 255, 07h	; question
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000484 BB[D8060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000489 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000048E BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000493 B823000000          <1>  mov eax, %1
    89 00000498 CD30                <1>  int 30h
   682 0000049A E82E000000              	call	ifyes  ; question 	
   683 0000049F 7205                    	jc	short rm_23 ; answer = no (not 'y')
   684 000004A1 E905FFFFFF              	jmp	rm_18
   685                                  rm_23:	; 27/04/2022
   686 000004A6 E94BFCFFFF              	jmp	_return ; return;
   687                                  
   688                                  access:
   689                                  	; 27/04/2022
   690                                  	; 26/04/2022
   691                                  	; INPUT:
   692                                  	; 	dl = permission/mode value
   693                                  	;		(dl = 2 for Retro UNIX 386 v2 inode)
   694                                  	;		(dl = 1 for Retro UNIX 386 v1 inode)
   695                                  	;
   696                                  	;	stbuf = status (sysstat output) buffer
   697                                  	;
   698                                  	; OUTPUT:
   699                                  	;	cf = 0 -> ok
   700                                  	;	cf = 1 -> error (denied)
   701                                  
   702 000004AB B202                    	mov	dl, 2 ; retro unix v2 (write permit flag)
   703                                  	;mov	dl, 1 ; unix v1 (write permit flag)
   704                                  
   705 000004AD 8A0D[46070000]          	mov	cl, [stbuf+stat.mode] ; Retro UNIX 386 v1
   706                                  	;mov	cx, [stbuf+stat.mode] ; Retro UNIX 386 v2
   707                                  
   708                                  	; Retro UNIX 386 v1.2 (v2)
   709                                  	sys	_getuid	; get user ID of current user
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000004B3 B818000000          <1>  mov eax, %1
    89 000004B8 CD30                <1>  int 30h
   710                                  	;mov	[uid], ax ; ax = real user ID (<=255)
   711                                  	;sys	_getgid	; get group ID of current user
   712                                  	;mov	[gid], al ; al = real group ID (<=255)
   713                                  
   714                                  	; Retro UNIX 386 v1 (unix v1)
   715                                  	;sys	_getuid	; get user ID of current user
   716                                  	;mov	[uid], al ; al = user ID 
   717                                  
   718                                  	; dl = 2 -> write permission flag (retro unix v2)
   719                                  	; dl = 1 -> write permission flag (retro unix v1)
   720                                  
   721                                  	;mov	ax, [uid]
   722 000004BA 663B05[4A070000]        	cmp	ax, [stbuf+stat.uid] ; Retro UNIX v2 inode
   723                                  	;cmp	al, [stbuf+stat.uid] ; unix v1
   724 000004C1 7504                    	jne	short access_1
   725                                  
   726                                  	;; Retro UNIX 386 v1.2 note:
   727                                  	;; group permission flags will not be used for now!
   728                                  
   729 000004C3 66C1E906                	shr	cx, 6  ; Retro UNIX 386 v2 inode flags
   730                                  	; AL bit 1 -> write permission owner
   731                                  	
   732                                  	;shr	cl, 2  ; Retro UNIX 386 v1 inode flags
   733                                  	; AL bit 0 -> write permission owner
   734                                  access_1:
   735 000004C7 20D1                    	and	cl, dl
   736 000004C9 7501                    	jnz	short access_2
   737 000004CB F9                      	stc
   738                                  access_2:
   739 000004CC C3                      	retn
   740                                  
   741                                  ifyes:
   742                                  	; 26/04/2022
   743                                  	; check user input as yes or no
   744                                  	; write answer and return with carry if it is 'no'
   745                                  	sys	_read, 0, chr, 1 ; read standard input
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000004CD BB00000000          <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000004D2 B9[8B070000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000004D7 BA01000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000004DC B803000000          <1>  mov eax, %1
    89 000004E1 CD30                <1>  int 30h
   746 000004E3 A0[8B070000]            	mov	al, [chr]
   747 000004E8 3C79                    	cmp	al, 'y'
   748 000004EA 741C                    	je	short ifyes_yes
   749 000004EC 3C59                    	cmp	al, 'Y'
   750 000004EE 7418                    	je	short ifyes_yes
   751                                  	; another character means 'no'
   752                                  ifyes_no:
   753                                  	; write 'no'
   754                                  	sys	_msg, no_msg, 255, 07h	; 'no' answer
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000004F0 BB[E2060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000004F5 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000004FA BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000004FF B823000000          <1>  mov eax, %1
    89 00000504 CD30                <1>  int 30h
   755 00000506 F9                      	stc
   756 00000507 C3                      	retn	; return
   757                                  ifyes_yes:
   758                                  	; write 'yes'
   759                                  	sys	_msg, yes_msg, 255, 07h	; 'yes' answer
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000508 BB[DC060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000050D B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000512 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000517 B823000000          <1>  mov eax, %1
    89 0000051C CD30                <1>  int 30h
   760                                  	;clc
   761 0000051E C3                      	retn
   762                                  
   763                                  ;isdotname:
   764                                  	; 27/04/2022
   765                                  	; 26/04/2022
   766                                  	; check if file name is dot ('.') or dotdot ('..')
   767                                  	; (return: zf=1 if it is dot or dotdot)
   768                                  	;mov	ax, [direct+2]  ; 1st 2 chars of file name
   769                                  isdotname:
   770                                  	; ebx = file (or directory) name address
   771 0000051F 668B03                  	mov	ax, [ebx]
   772 00000522 3C2E                    	cmp	al, '.'
   773 00000524 750C                    	jne	short isdot_retn
   774 00000526 08E4                    	or	ah, ah ; 0 ?
   775 00000528 7408                    	jz	short isdot_retn ; '.'
   776 0000052A 38E0                    	cmp	al, ah ; '..' ?
   777                                  	; 27/04/2022
   778 0000052C 7504                    	jne	short isdot_retn
   779 0000052E 807B0200                	cmp	byte [ebx+2], 0
   780                                  	; zf = 1 if it is dotdot
   781                                  isdot_retn:
   782 00000532 C3                      	retn
   783                                  
   784                                  rmdir:
   785                                  	; 27/04/2022
   786                                  	; 26/04/2022
   787                                  	; INPUT:
   788                                  	;	esi = directory name address (*argv)
   789                                  	;	[iflg] = interactive option
   790                                  	;
   791                                  	; OUTPUT:
   792                                  	;	none
   793                                  
   794                                  	;rmdir(f, iflg)
   795                                  	;char *f;
   796                                  	;{
   797                                  	;	int status, i;
   798                                  	;
   799                                  	;	if(dotname(f))
   800                                  	;		return(0);
   801                                  	;	if(iflg) {
   802                                  	;		printf("%s: ", f);
   803                                  	;		if(!yes())
   804                                  	;			return(0);
   805                                  	;}
   806                                  	
   807 00000533 89F3                    	mov	ebx, esi
   808 00000535 E8E5FFFFFF              	call	isdotname
   809 0000053A 7464                    	jz	short rmdir_retn
   810                                  	
   811 0000053C 803D[17060000]01        	cmp	byte [iflg], 1
   812 00000543 7246                    	jb	short rmdir_1
   813                                  
   814                                  	sys	_msg, dir_hdr_msg, 255, 07h ; message row header
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 00000545 BB[CA060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000054A B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 0000054F BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000554 B823000000          <1>  mov eax, %1
    89 00000559 CD30                <1>  int 30h
   815                                  	sys	_msg, esi, 255, 07h	; directory name 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000055B 89F3                <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 0000055D B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000562 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000567 B823000000          <1>  mov eax, %1
    89 0000056C CD30                <1>  int 30h
   816                                  	sys	_msg, qu_msg, 255, 07h	; question
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 0000056E BB[D7060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 00000573 B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 00000578 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000057D B823000000          <1>  mov eax, %1
    89 00000582 CD30                <1>  int 30h
   817                                  	
   818 00000584 E844FFFFFF              	call	ifyes  ; question 	
   819 00000589 7215                    	jc	short rmdir_retn ; answer = no (not 'y')
   820                                  rmdir_1:
   821                                  	;while((i=fork()) == -1)
   822                                  	;	sleep(3);
   823                                  	;if(i) {
   824                                  	;	wait(&status);
   825                                  	;	return(status);
   826                                  	;}
   827                                  
   828 0000058B BB[A1050000]            	mov 	ebx, rmdir_2 ; ! Retro UNIX feature only !
   829                                  			; 'rmdir' child will continue from   
   830                                  	sys 	_fork
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000590 B802000000          <1>  mov eax, %1
    89 00000595 CD30                <1>  int 30h
   831 00000597 7207                    	jc 	short rmdir_retn
   832                                  
   833                                  	; parent process will continue to run from here 
   834                                  	; (from 'jc' after 'sys _fork')
   835                                  
   836                                  	; eax = child process ID
   837                                  
   838                                  	; ----
   839                                  	; Note: Current Retro Unix version does not use
   840                                  	;	status return -exit code from the child- 
   841                                  	; ----
   842                                  	
   843                                  	sys 	_wait	; wait untill the child exits
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 00000599 B807000000          <1>  mov eax, %1
    89 0000059E CD30                <1>  int 30h
   844                                  	;jc 	short rmdir_retn ; 27/04/2022
   845                                  
   846                                  	; eax = child process ID -which has been terminated-
   847                                  	; (ebx = status -may be used by retro unix later-)
   848                                  
   849                                  	; cf = 0 ; return(0)
   850                                  rmdir_retn:
   851                                  	; if cf = 0 -> return(0)
   852                                  	;    else (if cf = 1) -> return(1) 
   853                                  
   854 000005A0 C3                      	retn
   855                                  
   856                                  rmdir_2:
   857                                  	; child process will continue to run from here
   858                                  	
   859                                  	;execl("/bin/rmdir", "rmdir", f, 0);
   860                                  	;execl("/usr/bin/rmdir", "rmdir", f, 0);
   861                                  	;printf("rm: can't find rmdir\n");
   862                                  	;exit(1);
   863                                  
   864                                  	; run 'rmdir' utility/program
   865                                  	; (it will/must not return here)
   866                                  
   867                                  	; set directory address as /bin/rmdir argument 1
   868 000005A1 8935[ED050000]          	mov	[binrmdira1], esi
   869                                  	;; set directory addr as /usr/bin/rmdir argument 1
   870                                  	;mov	[usrbinrmdira1], esi ; ((*))
   871                                  
   872                                  	sys	_exec, binrmdir, binrmdirp
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000005A7 BB[FB050000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000005AC B9[E9050000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005B1 B80B000000          <1>  mov eax, %1
    89 000005B6 CD30                <1>  int 30h
   873                                  	sys	_exec, usrbinrmdir, usrbinrmdirp
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000005B8 BB[06060000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000005BD B9[E9050000]        <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005C2 B80B000000          <1>  mov eax, %1
    89 000005C7 CD30                <1>  int 30h
   874                                  
   875                                  	; ! error !
   876                                  	; if sysexec fails (would fail) to run 'rmdir'
   877                                  	; cpu will return here
   878                                  
   879                                  	; "rm: can't find rmdir"
   880                                  	sys	_msg, cnf_rd_msg, 255, 07h 
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79 000005C9 BB[17070000]        <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81 000005CE B9FF000000          <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84 000005D3 BA07000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005D8 B823000000          <1>  mov eax, %1
    89 000005DD CD30                <1>  int 30h
   881                                  
   882                                  	; ebx = exit code (if there is an error, it is > 0)  
   883                                  	;sys	_exit, 1
   884                                  	sys	_exit ; Current Retro UNIX version
    75                              <1> 
    76                              <1> 
    77                              <1> 
    78                              <1>  %if %0 >= 2
    79                              <1>  mov ebx, %2
    80                              <1>  %if %0 >= 3
    81                              <1>  mov ecx, %3
    82                              <1> 
    83                              <1>  %if %0 >= 4
    84                              <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 000005DF B801000000          <1>  mov eax, %1
    89 000005E4 CD30                <1>  int 30h
   885                                  		      ; does not use exit code from child		
   886                                  hangemhigh:
   887 000005E6 90                      	nop
   888 000005E7 EBFD                    	jmp	short hangemhigh
   889                                  
   890                                  ;-----------------------------------------------------------------
   891                                  ;  data - initialized data
   892                                  ;-----------------------------------------------------------------
   893                                  
   894                                  ; 26/04/202
   895                                  
   896                                  binrmdirp: 
   897                                  usrbinrmdirp:
   898                                  	;dd bindrmdir
   899 000005E9 [F5050000]              	dd _rmdir_
   900                                  binrmdira1:
   901                                  usrbinrmdira1: ; ((*))
   902 000005ED 00000000                	dd 0 
   903                                  binrmdira2:
   904                                  usrbinrmdira2: ; ((*))
   905 000005F1 00000000                	dd 0
   906                                  ;usrbinrmdirp: 
   907                                  ;	;dd usrbindrmdir
   908                                  ;	dd _rmdir_
   909                                  ;usrbinrmdira1:
   910                                  ;	dd 0 
   911                                  ;usrbinrmdira2:
   912                                  ;	dd 0
   913                                  
   914                                  _rmdir_:
   915 000005F5 726D64697200            	db 'rmdir', 0
   916                                  binrmdir:
   917 000005FB 2F62696E2F726D6469-     	db '/bin/rmdir', 0
   917 00000604 7200               
   918                                  usrbinrmdir:
   919 00000606 2F7573722F62696E2F-     	db '/usr/bin/rmdir', 0
   919 0000060F 726D64697200       
   920                                  
   921                                  ;argc:	dd 0
   922 00000615 00                      argc:	db 0 ; argument count
   923 00000616 00                      fflg:	db 0 ; -f (forced) option
   924 00000617 00                      iflg:	db 0 ; -i (interactive) option
   925 00000618 00                      rflg:	db 0 ; -r (recursive) option
   926                                  ;argv:	dd 0 ; argument pointer (for argv[1])
   927                                  ;errcode: dd 0 ; error code (will be returned by sysexit)
   928                                  ;uid:	dw 0 ; user id
   929                                  ;;gid:	db 0 ; group id	
   930                                  ; 26/04/2022
   931                                  ;nameptr: dd namebuf
   932                                  
   933                                  ; ----------------------------------------------------------------
   934                                  
   935                                  program_msg:
   936 00000619 0D0A                    	db 0Dh, 0Ah
   937 0000061B 526574726F20554E49-     	db "Retro UNIX 386 v1.2 RM by Erdogan TAN - 27/04/2022"
   937 00000624 58203338362076312E-
   937 0000062D 3220524D2062792045-
   937 00000636 72646F67616E205441-
   937 0000063F 4E202D2032372F3034-
   937 00000648 2F32303232         
   938 0000064D 0D0A00                  	db 0Dh, 0Ah, 0
   939                                  usage_msg:
   940 00000650 0D0A                    	db 0Dh, 0Ah
   941 00000652 55736167653A20726D-     	db "Usage: rm [ -fri ] file ..."
   941 0000065B 205B202D667269205D-
   941 00000664 2066696C65202E2E2E 
   942                                  nextline:
   943 0000066D 0D0A00                  	db 0Dh, 0Ah, 0
   944                                  
   945                                  unk_op_msg:
   946 00000670 0D0A                    	db 0Dh, 0Ah
   947 00000672 726D3A20756E6B6E6F-     	db "rm: unknown option -"
   947 0000067B 776E206F7074696F6E-
   947 00000684 202D               
   948 00000686 78                      uop:	db "x"
   949 00000687 0D0A00                  	db 0Dh, 0Ah, 0
   950                                  
   951                                  cnr_dotdot_msg:
   952 0000068A 0D0A                    	db 0Dh, 0Ah
   953 0000068C 726D3A2063616E6E6F-     	db "rm: cannot remove '..'"
   953 00000695 742072656D6F766520-
   953 0000069E 272E2E27           
   954 000006A2 0D0A00                  	db 0Dh, 0Ah, 0
   955                                  
   956                                  rm_hdr_msg:
   957 000006A5 0D0A                    	db 0Dh, 0Ah
   958 000006A7 726D3A20                	db "rm: "
   959 000006AB 00                      	db 0
   960                                  
   961                                  nonex_msg:
   962 000006AC 206E6F6E6578697374-     	db " nonexistent"
   962 000006B5 656E74             
   963 000006B8 0D0A00                  	db 0Dh, 0Ah, 0
   964                                  
   965                                  nchd_msg:
   966 000006BB 206E6F74206368616E-     	db " not changed"
   966 000006C4 676564             
   967 000006C7 0D0A00                  	db 0Dh, 0Ah, 0
   968                                  dir_hdr_msg:
   969 000006CA 0D0A                    	db 0Dh, 0Ah
   970 000006CC 6469726563746F7279-     	db "directory "
   970 000006D5 20                 
   971 000006D6 00                      	db 0
   972                                  
   973                                  qu_msg:
   974 000006D7 3A                      	db ":"
   975 000006D8 203F20                  que_msg: db " ? "
   976 000006DB 00                      	db 0 
   977                                  
   978                                  yes_msg:
   979 000006DC 796573                  	db "yes"
   980 000006DF 0D0A00                  	db 0Dh, 0Ah, 0
   981                                  no_msg:
   982 000006E2 6E6F                    	db "no"
   983 000006E4 0D0A00                  	db 0Dh, 0Ah, 0
   984                                  
   985                                  cnr_msg:
   986 000006E7 3A2063616E6E6F7420-     	db ": cannot read"
   986 000006F0 72656164           
   987 000006F4 0D0A00                  	db 0Dh, 0Ah, 0
   988                                  
   989                                  dir_msg:
   990 000006F7 206469726563746F72-     	db " directory"
   990 00000700 79                 
   991 00000701 00                      	db 0
   992                                  
   993                                  not_rmd_msg:
   994 00000702 206E6F742072656D6F-     	db " not removed"
   994 0000070B 766564             
   995 0000070E 0D0A00                  	db 0Dh, 0Ah, 0
   996                                  
   997                                  mode_msg:
   998 00000711 206D6F6465              	db " mode"
   999 00000716 00                      	db 0
  1000                                  
  1001                                  cnf_rd_msg:
  1002 00000717 0D0A                    	db 0Dh, 0Ah
  1003 00000719 726D3A2063616E2774-     	db "rm: can't find rmdir"
  1003 00000722 2066696E6420726D64-
  1003 0000072B 6972               
  1004 0000072D 0D0A00                  	db 0Dh, 0Ah, 0	
  1005                                  
  1006                                  ;-----------------------------------------------------------------
  1007                                  ;  bss - uninitialized data
  1008                                  ;-----------------------------------------------------------------
  1009                                  
  1010                                  align 2
  1011                                  
  1012                                  bss_start:
  1013                                  
  1014                                  ABSOLUTE bss_start
  1015                                  
  1016                                  ; 26/04/2022
  1017 00000730 ????                    _d_:	resw 1  ; Sub directory's file descriptor
  1018 00000732 ????                    	resw 1
  1019                                  ;struct direct direct;
  1020 00000734 <res 10h>               direct:	resb DIRSIZ ; Directory entry buffer
  1021                                  
  1022                                  ; 25/04/2022
  1023                                  ;;struct stat buf;
  1024 00000744 <res 42h>               stbuf: resb 66 ; for Retro UNIX 386 v1.2 (66 byte sysstat data)
  1025                                  ;stbuf: resb 34 ; for Retro UNIX 386 v1.1 (34 byte sysstat data)
  1026                                  
  1027                                  ; 26/04/2022
  1028 00000786 ??                      level:	resb 1 ; (sub directory level)
  1029 00000787 ????????                octal:	resb 4 ; (asciiz octal mode number string)
  1030 0000078B ??                      chr:	resb 1 ; (sysread character buffer)	
  1031                                  ; 27/04/2022
  1032                                  ;char name[100];
  1033                                  ;namebuf: resb 100	
  1034                                  
  1035                                  
  1036                                  ; 25/04/2022
  1037                                  ;-----------------------------------------------------------------
  1038                                  ; Original UNIX v7 - rm (utility) c source code (rm.c)
  1039                                  ;-----------------------------------------------------------------
  1040                                  ;/* UNIX V7 source code: see www.tuhs.org for details. */;
  1041                                  ;
  1042                                  ;int	errcode;
  1043                                  ;
  1044                                  ;#include <stdio.h>
  1045                                  ;#include <sys/types.h>
  1046                                  ;#include <sys/stat.h>
  1047                                  ;#include <sys/dir.h>
  1048                                  ;
  1049                                  ;char	*sprintf();
  1050                                  ;
  1051                                  ;main(argc, argv)
  1052                                  ;char *argv[];
  1053                                  ;{
  1054                                  ;	register char *arg;
  1055                                  ;	int fflg, iflg, rflg;
  1056                                  ;
  1057                                  ;	fflg = 0;
  1058                                  ;	if (isatty(0) == 0)
  1059                                  ;		fflg++;
  1060                                  ;	iflg = 0;
  1061                                  ;	rflg = 0;
  1062                                  ;	if(argc>1 && argv[1][0]=='-') {
  1063                                  ;		arg = *++argv;
  1064                                  ;		argc--;
  1065                                  ;		while(*++arg != '\0')
  1066                                  ;			switch(*arg) {
  1067                                  ;			case 'f':
  1068                                  ;				fflg++;
  1069                                  ;				break;
  1070                                  ;			case 'i':
  1071                                  ;				iflg++;
  1072                                  ;				break;
  1073                                  ;			case 'r':
  1074                                  ;				rflg++;
  1075                                  ;				break;
  1076                                  ;			default:
  1077                                  ;				printf("rm: unknown option %s\n", *argv);
  1078                                  ;				exit(1);
  1079                                  ;			}
  1080                                  ;	}
  1081                                  ;	while(--argc > 0) {
  1082                                  ;		if(!strcmp(*++argv, "..")) {
  1083                                  ;			fprintf(stderr, "rm: cannot remove `..'\n");
  1084                                  ;			continue;
  1085                                  ;		}
  1086                                  ;		rm(*argv, fflg, rflg, iflg, 0);
  1087                                  ;	}
  1088                                  ;
  1089                                  ;	exit(errcode);
  1090                                  ;}
  1091                                  ;
  1092                                  ;rm(arg, fflg, rflg, iflg, level)
  1093                                  ;char arg[];
  1094                                  ;{
  1095                                  ;	struct stat buf;
  1096                                  ;	struct direct direct;
  1097                                  ;	char name[100];
  1098                                  ;	int d;
  1099                                  ;
  1100                                  ;	if(stat(arg, &buf)) {
  1101                                  ;		if (fflg==0) {
  1102                                  ;			printf("rm: %s nonexistent\n", arg);
  1103                                  ;			++errcode;
  1104                                  ;		}
  1105                                  ;		return;
  1106                                  ;	}
  1107                                  ;	if ((buf.st_mode&S_IFMT) == S_IFDIR) {
  1108                                  ;		if(rflg) {
  1109                                  ;			if (access(arg, 02) < 0) {
  1110                                  ;				if (fflg==0)
  1111                                  ;					printf("%s not changed\n", arg);
  1112                                  ;				errcode++;
  1113                                  ;				return;
  1114                                  ;			}
  1115                                  ;			if(iflg && level!=0) {
  1116                                  ;				printf("directory %s: ", arg);
  1117                                  ;				if(!yes())
  1118                                  ;					return;
  1119                                  ;			}
  1120                                  ;			if((d=open(arg, 0)) < 0) {
  1121                                  ;				printf("rm: %s: cannot read\n", arg);
  1122                                  ;				exit(1);
  1123                                  ;			}
  1124                                  ;			while(read(d, (char *)&direct, sizeof(direct)) == sizeof(direct)) {
  1125                                  ;				if(direct.d_ino != 0 && !dotname(direct.d_name)) {
  1126                                  ;					sprintf(name, "%s/%.14s", arg, direct.d_name);
  1127                                  ;					rm(name, fflg, rflg, iflg, level+1);
  1128                                  ;				}
  1129                                  ;			}
  1130                                  ;			close(d);
  1131                                  ;			errcode += rmdir(arg, iflg);
  1132                                  ;			return;
  1133                                  ;		}
  1134                                  ;		printf("rm: %s directory\n", arg);
  1135                                  ;		++errcode;
  1136                                  ;		return;
  1137                                  ;	}
  1138                                  ;
  1139                                  ;	if(iflg) {
  1140                                  ;		printf("%s: ", arg);
  1141                                  ;		if(!yes())
  1142                                  ;			return;
  1143                                  ;	}
  1144                                  ;	else if(!fflg) {
  1145                                  ;		if (access(arg, 02)<0) {
  1146                                  ;			printf("rm: %s %o mode ", arg, buf.st_mode&0777);
  1147                                  ;			if(!yes())
  1148                                  ;				return;
  1149                                  ;		}
  1150                                  ;	}
  1151                                  ;	if(unlink(arg) && (fflg==0 || iflg)) {
  1152                                  ;		printf("rm: %s not removed\n", arg);
  1153                                  ;		++errcode;
  1154                                  ;	}
  1155                                  ;}
  1156                                  ;
  1157                                  ;dotname(s)
  1158                                  ;char *s;
  1159                                  ;{
  1160                                  ;	if(s[0] == '.')
  1161                                  ;		if(s[1] == '.')
  1162                                  ;			if(s[2] == '\0')
  1163                                  ;				return(1);
  1164                                  ;			else
  1165                                  ;				return(0);
  1166                                  ;		else if(s[1] == '\0')
  1167                                  ;			return(1);
  1168                                  ;	return(0);
  1169                                  ;}
  1170                                  ;
  1171                                  ;rmdir(f, iflg)
  1172                                  ;char *f;
  1173                                  ;{
  1174                                  ;	int status, i;
  1175                                  ;
  1176                                  ;	if(dotname(f))
  1177                                  ;		return(0);
  1178                                  ;	if(iflg) {
  1179                                  ;		printf("%s: ", f);
  1180                                  ;		if(!yes())
  1181                                  ;			return(0);
  1182                                  ;	}
  1183                                  ;	while((i=fork()) == -1)
  1184                                  ;		sleep(3);
  1185                                  ;	if(i) {
  1186                                  ;		wait(&status);
  1187                                  ;		return(status);
  1188                                  ;	}
  1189                                  ;	execl("/bin/rmdir", "rmdir", f, 0);
  1190                                  ;	execl("/usr/bin/rmdir", "rmdir", f, 0);
  1191                                  ;	printf("rm: can't find rmdir\n");
  1192                                  ;	exit(1);
  1193                                  ;}
  1194                                  ;
  1195                                  ;yes()
  1196                                  ;{
  1197                                  ;	int i, b;
  1198                                  ;
  1199                                  ;	i = b = getchar();
  1200                                  ;	while(b != '\n' && b != EOF)
  1201                                  ;		b = getchar();
  1202                                  ;	return(i == 'y');
  1203                                  ;}
