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) , , 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: ; 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: