     1                                  ; ****************************************************************************
     2                                  ; chmod386.s (chmod1.s) - by Erdogan Tan - 29/04/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 386 v1 (v1.1 & v1.2) - chmod - change (file) mode
     5                                  ;
     6                                  ; [ Last Modification: 29/04/2022 ]
     7                                  ;
     8                                  ; Derived from (original) UNIX v2 (v1) 'chmod.s' source Code
     9                                  ; Ref:
    10                                  ; www.tuhs.org (https://minnie.tuhs.org)
    11                                  ; svntree-20081216.tar.gz
    12                                  ; ****************************************************************************
    13                                  ; [ unix72/src/cmd/chmod.s (archive date: 16-12-2008) ]
    14                                  
    15                                  ; UNIX v1 system calls
    16                                  _rele 	equ 0
    17                                  _exit 	equ 1
    18                                  _fork 	equ 2
    19                                  _read 	equ 3
    20                                  _write	equ 4
    21                                  _open	equ 5
    22                                  _close 	equ 6
    23                                  _wait 	equ 7
    24                                  _creat 	equ 8
    25                                  _link 	equ 9
    26                                  _unlink	equ 10
    27                                  _exec	equ 11
    28                                  _chdir	equ 12
    29                                  _time 	equ 13
    30                                  _mkdir 	equ 14
    31                                  _chmod	equ 15
    32                                  _chown	equ 16
    33                                  _break	equ 17
    34                                  _stat	equ 18
    35                                  _seek	equ 19
    36                                  _tell 	equ 20
    37                                  _mount	equ 21
    38                                  _umount	equ 22
    39                                  _setuid	equ 23
    40                                  _getuid	equ 24
    41                                  _stime	equ 25
    42                                  _quit	equ 26	
    43                                  _intr	equ 27
    44                                  _fstat	equ 28
    45                                  _emt 	equ 29
    46                                  _mdate 	equ 30
    47                                  _stty 	equ 31
    48                                  _gtty	equ 32
    49                                  _ilgins	equ 33
    50                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    51                                  _msg    equ 35 ; Retro UNIX 386 v1 feature only !
    52                                  
    53                                  ;;;
    54                                  ESCKey equ 1Bh
    55                                  EnterKey equ 0Dh
    56                                  
    57                                  %macro sys 1-4
    58                                      ; 03/09/2015	
    59                                      ; 13/04/2015
    60                                      ; Retro UNIX 386 v1 system call.		
    61                                      %if %0 >= 2   
    62                                  	mov ebx, %2
    63                                  	%if %0 >= 3    
    64                                  	    mov ecx, %3
    65                                  	    %if %0 = 4
    66                                  	       mov edx, %4   
    67                                  	    %endif
    68                                  	%endif
    69                                      %endif
    70                                      mov eax, %1
    71                                      int 30h	   
    72                                  %endmacro
    73                                  
    74                                  ; Retro UNIX 386 v1 system call format:
    75                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    76                                  
    77                                  [BITS 32] ; We need 32-bit intructions for protected mode
    78                                  
    79                                  [ORG 0] 
    80                                  
    81                                  START_CODE:
    82                                  	; 29/04/2022
    83                                  
    84                                  	;mov	sp,r5
    85                                  	;mov	(r5),r4
    86                                  	;cmp	r4,$3
    87                                  	;blt	chmerr
    88                                  	;add	$4,r5
    89                                  	;mov	(r5)+,r1
    90                                  	;clr	0f
    91                                  
    92 00000000 58                      	pop	eax ; eax = number of arguments
    93                                  
    94 00000001 89C2                    	mov	edx, eax ; *
    95                                  	
    96                                  	;cmp	eax, 3
    97 00000003 3C03                    	cmp	al, 3
    98 00000005 7237                    	jb	short chmerr
    99                                  
   100                                  	;xor	ecx, ecx
   101                                  
   102 00000007 58                      	pop	eax
   103                                  		; eax = argument 0 (file name: 'chmod')
   104 00000008 5E                      	pop	esi
   105                                  		; esi = argument 1 = mode (octal)
   106 00000009 B304                    	mov	bl, 4 ; '7','7','7',0
   107                                  ;1:
   108                                  chm_1:
   109                                  	;movb	(r1)+,r0
   110                                  	;beq	1f
   111                                  	;asl	0f
   112                                  	;asl	0f
   113                                  	;asl	0f
   114                                  	;bic	$!7,r0
   115                                  	;bis	r0,0f
   116                                  	;br	1b
   117                                  
   118 0000000B AC                      	lodsb
   119 0000000C 08C0                    	or	al, al
   120 0000000E 7415                    	jz	short chm_2
   121                                  	;;; 29/04/2022
   122 00000010 FECB                    	dec	bl
   123 00000012 742A                    	jz	short chmerr
   124                                  	;;; 29/04/2022
   125 00000014 3C37                    	cmp	al, '7'
   126 00000016 7726                    	ja	short chmerr	
   127 00000018 3C30                    	cmp	al, '0'
   128 0000001A 7222                    	jb	short chmerr
   129                                  	;;;
   130                                  	;shl	word [mode], 3 ; * 8
   131 0000001C C1E103                  	shl	ecx, 3
   132 0000001F 2407                    	and	al, 7
   133                                  	;or	byte [mode], al
   134 00000021 08C1                    	or	cl, al
   135 00000023 EBE6                    	jmp	short chm_1
   136                                  ;1:
   137                                  chm_2:		
   138                                  	;mov	(r5)+,0f-2
   139                                  	;sys	chmod; ..; 0:..
   140                                  	;bes	chmerr
   141                                  	;dec	r4
   142                                  	;cmp	r4,$3
   143                                  	;bge	1b
   144                                  	;sys	exit
   145                                  
   146 00000025 5E                      	pop	esi ; file name address
   147                                  	;sys	_chmod, esi, [mode] 
   148                                  	sys	_chmod, esi
    58                              <1> 
    59                              <1> 
    60                              <1> 
    61                              <1>  %if %0 >= 2
    62 00000026 89F3                <1>  mov ebx, %2
    63                              <1>  %if %0 >= 3
    64                              <1>  mov ecx, %3
    65                              <1>  %if %0 = 4
    66                              <1>  mov edx, %4
    67                              <1>  %endif
    68                              <1>  %endif
    69                              <1>  %endif
    70 00000028 B80F000000          <1>  mov eax, %1
    71 0000002D CD30                <1>  int 30h
   149 0000002F 720D                    	jc	short chmerr
   150                                  
   151 00000031 4A                      	dec	edx ; *
   152                                  	;cmp	edx, 3
   153 00000032 80FA03                  	cmp	dl, 3
   154 00000035 73EE                    	jnb	short chm_2
   155                                  exit:
   156                                  	sys	_exit
    58                              <1> 
    59                              <1> 
    60                              <1> 
    61                              <1>  %if %0 >= 2
    62                              <1>  mov ebx, %2
    63                              <1>  %if %0 >= 3
    64                              <1>  mov ecx, %3
    65                              <1>  %if %0 = 4
    66                              <1>  mov edx, %4
    67                              <1>  %endif
    68                              <1>  %endif
    69                              <1>  %endif
    70 00000037 B801000000          <1>  mov eax, %1
    71 0000003C CD30                <1>  int 30h
   157                                  
   158                                  chmerr:
   159                                  	;mov	$1,r0
   160                                  	;sys	write; 1f; 2
   161                                  	;sys	exit
   162                                  
   163                                  	sys	_write, 1, _1f, 4  ; ' ?' + CRLF
    58                              <1> 
    59                              <1> 
    60                              <1> 
    61                              <1>  %if %0 >= 2
    62 0000003E BB01000000          <1>  mov ebx, %2
    63                              <1>  %if %0 >= 3
    64 00000043 B9[56000000]        <1>  mov ecx, %3
    65                              <1>  %if %0 = 4
    66 00000048 BA04000000          <1>  mov edx, %4
    67                              <1>  %endif
    68                              <1>  %endif
    69                              <1>  %endif
    70 0000004D B804000000          <1>  mov eax, %1
    71 00000052 CD30                <1>  int 30h
   164                                  	;sys	_exit
   165 00000054 EBE1                    	jmp	short exit 
   166                                  
   167                                  ;-----------------------------------------------------------------
   168                                  ;  data - initialized data
   169                                  ;-----------------------------------------------------------------
   170                                  
   171                                  ;align 4
   172                                  
   173                                  ;1:
   174                                  _1f:	; <?\n>
   175                                  
   176 00000056 203F0D0A00              	db ' ?', 0Dh, 0Ah, 0	
   177                                  
   178                                  ;mode:	dd 0
   179                                  
   180                                  
   181                                  ; 29/04/2022
   182                                  
   183                                  ;-----------------------------------------------------------------
   184                                  ; Original UNIX v2 - /bin/chmod source code (chmod.s)
   185                                  ;		     in PDP-11 (unix) assembly language
   186                                  ;-----------------------------------------------------------------
   187                                  
   188                                  ;/ chmod - change mode
   189                                  ;
   190                                  ;chmode:
   191                                  ;	mov	sp,r5
   192                                  ;	mov	(r5),r4
   193                                  ;	cmp	r4,$3
   194                                  ;	blt	chmerr
   195                                  ;	add	$4,r5
   196                                  ;	mov	(r5)+,r1
   197                                  ;	clr	0f
   198                                  ;1:
   199                                  ;	movb	(r1)+,r0
   200                                  ;	beq	1f
   201                                  ;	asl	0f
   202                                  ;	asl	0f
   203                                  ;	asl	0f
   204                                  ;	bic	$!7,r0
   205                                  ;	bis	r0,0f
   206                                  ;	br	1b
   207                                  ;1:
   208                                  ;	mov	(r5)+,0f-2
   209                                  ;	sys	chmod; ..; 0:..
   210                                  ;	bes	chmerr
   211                                  ;	dec	r4
   212                                  ;	cmp	r4,$3
   213                                  ;	bge	1b
   214                                  ;	sys	exit
   215                                  ;
   216                                  ;chmerr:
   217                                  ;	mov	$1,r0
   218                                  ;	sys	write; 1f; 2
   219                                  ;	sys	exit
   220                                  ;
   221                                  ;1:	<?\n>
