1 ; **************************************************************************** 2 ; login386.s (login1.s) - Retro Unix 386 v1.2 - /bin/login - enter new user 3 ; ---------------------------------------------------------------------------- 4 ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix) 5 ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013) 6 ; 7 ; [ Last Modification: 27/02/2022 ] 8 ; 9 ; Derived from 'login03.asm' source code file of 'Retro UNIX 8086 v1' 10 ; operating system project, /bin/login source code by Erdogan Tan 11 ; (07/11/2013-27/06/2014) 12 ; 13 ; Derived from 'login.s' file of original UNIX operating system 14 ; (v1.0 for PDP-11) 15 ; **************************************************************************** 16 ; LOGIN03.ASM (07/11/2013-27/06/2014, Retro UNIX 8086 v1, MASM 6.11, 16 bit) 17 ; login386.s (13/10/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit) 18 ; login0.s (17/11/2015) - Retro UNIX 386 v1 19 ; login1.s (24/01/2022-27/02/2022) - Retro UNIX 386 v1.2 20 ; login2.s (16/02/2022-27/02/2022) - Retro UNIX 386 v1 21 ; login3.s (27/02/2022) - Retro UNIX 386 v1.1 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 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 64 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 65 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 66 ; 12/01/2022 - Retro UNIX 386 v1.2 67 ; Retro UNIX 386 v2 system calls 68 _setgid equ 37 69 _getgid equ 38 70 _sysver equ 39 ; (get) Retro Unix 386 version 71 72 %macro sys 1-4 73 ; Retro UNIX 386 v1 system call. 74 %if %0 >= 2 75 mov ebx, %2 76 %if %0 >= 3 77 mov ecx, %3 78 %if %0 = 4 79 mov edx, %4 80 %endif 81 %endif 82 %endif 83 mov eax, %1 84 int 30h 85 %endmacro 86 87 ; Retro UNIX 386 v1 system call format: 88 ; sys systemcall (eax) , , 89 90 [BITS 32] ; 32-bit intructions (for 80386 protected mode) 91 92 [ORG 0] 93 94 START_CODE: 95 ; from 'sysexec' system calls 96 ; (stack pointer -esp- points to 97 ; to the head of arguments list which is 98 ; on top the stack, backward from 'ecore'.) 99 ; esp = offset argc (argument count) 100 ; 101 102 sys _quit, 0 73 <1> 74 <1> %if %0 >= 2 75 00000000 BB00000000 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000005 B81A000000 <1> mov eax, %1 84 0000000A CD30 <1> int 30h 103 sys _intr, 0 73 <1> 74 <1> %if %0 >= 2 75 0000000C BB00000000 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000011 B81B000000 <1> mov eax, %1 84 00000016 CD30 <1> int 30h 104 105 ; 24/01/2022 (bss section is cleaned by the kernel) 106 ;; Clear bss section (Clear uninitialized data area) 107 ;; 14/10/2015 (Retro UNIX 386 v1) 108 ;xor eax, eax ; 0 109 ;mov ecx, (bss_end - bss_start)/4 110 ;mov edi, bss_start 111 ;rep stosd 112 113 00000018 E8F2030000 call ttyn 114 ;eax = 000000??h 115 0000001D A2[94060000] mov [ttyx+8], al 116 00000022 3C78 cmp al, 'x' ; not found ? 117 00000024 740C je short S1 118 00000026 2C30 sub al, '0' 119 00000028 7408 jz short S1 120 ;shl ax, 4 121 ; 14/02/2022 122 0000002A C1E004 shl eax, 4 123 0000002D A3[5C070000] mov [s_off], eax ; (offset for sysseek) 124 S1: 125 00000032 5A pop edx ; argument count 126 00000033 58 pop eax ; pointer to argument 0 127 ; executable file name 128 00000034 4A dec edx ; dec dl 129 00000035 7E2C jng short login ; 16/11/2015 130 00000037 5E pop esi ; pointer to argument 1 131 ; user name 132 00000038 BF[60070000] mov edi, uname 133 0000003D 89FB mov ebx, edi 134 0000003F 83C308 add ebx, 8 135 S2: 136 00000042 AC lodsb 137 00000043 AA stosb 138 00000044 20C0 and al, al 139 00000046 7404 jz short S3 140 00000048 39DF cmp edi, ebx 141 0000004A 72F6 jb short S2 142 S3: 143 0000004C 4A dec edx 144 0000004D 7414 jz short login 145 0000004F 5E pop esi 146 00000050 BF[72070000] mov edi, passwd 147 S4: 148 00000055 AC lodsb 149 00000056 AA stosb 150 00000057 08C0 or al, al 151 00000059 7408 jz short login 152 0000005B 81FF[7A070000] cmp edi, passwd + 8 153 00000061 72F2 jb short S4 154 login: 155 00000063 C60300 mov byte [ebx], 0 ; uname + 8 156 00000066 B8[80060000] mov eax, passwdf 157 0000006B E83D040000 call fopen 158 00000070 7311 jnc short lg0 159 00000072 BE[D6060000] mov esi, msgNoPswdf 160 00000077 E879030000 call mesg 161 sys _exit 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 0000007C B801000000 <1> mov eax, %1 84 00000081 CD30 <1> int 30h 162 lg0: 163 00000083 E89C020000 call guname 164 lg1: 165 00000088 BE[60070000] mov esi, uname 166 0000008D E8E3020000 call compar 167 00000092 7412 je short lg3 ; zf = 1 --> match 168 lg2: 169 ;mov ebx, pbuf 170 00000094 E837040000 call getc 171 ;jc sorry 172 ; 24/01/2022 173 00000099 7212 jc short lg20 ; jmp sorry 174 0000009B 3C0D cmp al, 0Dh ; \n 175 0000009D 75F5 jne short lg2 176 0000009F E82C040000 call getc 177 ;jc short sorry 178 ;cmp al, 0Ah 179 ;jne short sorry 180 000000A4 EBE2 jmp short lg1 181 lg3: 182 ;mov ebx, pbuf 183 000000A6 E825040000 call getc 184 ;jc sorry 185 ; 24/01/2022 186 000000AB 7302 jnc short lg21 187 lg20: 188 000000AD EB7B jmp sorry 189 lg21: 190 000000AF 3C3A cmp al, ':' 191 000000B1 7415 je short lg4 192 ;push ax 193 ; 14/02/2022 194 000000B3 50 push eax 195 000000B4 E813020000 call gpasswd 196 ;mov esi, _word 197 000000B9 58 pop eax 198 ;pop ax 199 000000BA 8A26 mov ah, [esi] 200 000000BC 38E0 cmp al, ah 201 000000BE 756A jne short sorry 202 000000C0 46 inc esi 203 ; ESI = offset _word + 1 204 000000C1 E8AF020000 call compar 205 000000C6 7562 jne short sorry 206 lg4: 207 ; get UID 208 000000C8 31C9 xor ecx, ecx ; 0 209 ; 14/02/2022 210 000000CA 31D2 xor edx, edx 211 lg5: 212 ;push ecx 213 000000CC 52 push edx ; 14/02/2022 214 000000CD E8FE030000 call getc 215 ;jc short sorry ; 14/02/2022 216 000000D2 3C3A cmp al, ':' 217 000000D4 7417 je short lg6 218 ; 18/02/2022 219 ;mov cl, al 220 ;sub cl, '0' 221 000000D6 2C30 sub al, '0' 222 ; 223 ;xor ch, ch 224 ;pop edx 225 ;mov ax, 10 226 ;mul dx 227 ;add cx, ax 228 ; 14/02/2022 229 ;xor eax, eax 230 000000D8 5A pop edx 231 ; 18/02/2022 232 000000D9 09D2 or edx, edx 233 000000DB 7504 jnz short lg23 234 000000DD 88C2 mov dl, al 235 000000DF EBEB jmp short lg5 236 lg23: 237 000000E1 88C1 mov cl, al ; 18/02/2022 238 000000E3 B00A mov al, 10 239 000000E5 F7E2 mul edx 240 000000E7 88CA mov dl, cl 241 000000E9 01C2 add edx, eax 242 000000EB EBDF jmp short lg5 243 lg6: 244 000000ED 59 pop ecx ; UID 245 ; 14/02/2022 246 ;sys _chown, ttyx ; ecx = arg 2 247 000000EE 66890D[9C070000] mov [uid], cx 248 lg7: 249 000000F5 E8D6030000 call getc 250 ;jc short sorry ; 14/02/2022 251 000000FA 3C3A cmp al, ':' 252 000000FC 75F7 jne short lg7 ; / skip ident field 253 000000FE BF[7C070000] mov edi, dirbuf 254 lg8: 255 00000103 E8C8030000 call getc 256 00000108 3C3A cmp al, ':' 257 0000010A 7403 je short lg9 258 0000010C AA stosb 259 0000010D EBF4 jmp short lg8 260 lg9: 261 0000010F 30C0 xor al, al 262 00000111 AA stosb 263 sys _chdir, dirbuf 73 <1> 74 <1> %if %0 >= 2 75 00000112 BB[7C070000] <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000117 B80C000000 <1> mov eax, %1 84 0000011C CD30 <1> int 30h 264 0000011E 7333 jnc short lg10 265 00000120 BE[F6060000] mov esi, msgNoDir 266 00000125 E8CB020000 call mesg 267 ;jmp short sorry 268 269 sorry: 270 0000012A BE[B2060000] mov esi, msgIL 271 0000012F E8C1020000 call mesg 272 ; 14/10/2015 273 00000134 0FB71D[700E0000] movzx ebx, word [pbuf] 274 sys _close 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 0000013B B806000000 <1> mov eax, %1 84 00000140 CD30 <1> int 30h 275 ; 276 ; 24/01/2022 (BugFix) 277 ;xor ax, ax 278 ;mov [uname], ax 279 ;mov [passwd], ax 280 ; 18/02/2022 281 ;xor al, al 282 ;mov [uname], al 283 ;mov [passwd], al 284 ; 14/10/2015 285 00000142 BB[60070000] mov ebx, uname 286 ; 18/02/2022 287 ;mov byte [ebx], 0 288 00000147 C605[72070000]00 mov byte [passwd], 0 289 ; 290 0000014E E910FFFFFF jmp login 291 292 lg10: 293 00000153 BB[67070000] mov ebx, uname + 7 294 lg11: 295 00000158 803B00 cmp byte [ebx], 0 296 0000015B 7706 ja short lg12 297 0000015D C60320 mov byte [ebx], 20h 298 00000160 4B dec ebx 299 00000161 EBF5 jmp short lg11 300 lg12: 301 00000163 BE[94060000] mov esi, ttyx + 8 302 00000168 803E78 cmp byte [esi], 'x' 303 ;je short lg14 304 ; 14/02/2022 305 0000016B 7505 jne short lg22 306 0000016D E99D000000 jmp lg14 307 lg22: 308 sys _open, utmp, 1 73 <1> 74 <1> %if %0 >= 2 75 00000172 BB[38060000] <1> mov ebx, %2 76 <1> %if %0 >= 3 77 00000177 B901000000 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 0000017C B805000000 <1> mov eax, %1 84 00000181 CD30 <1> int 30h 309 00000183 7246 jc short lg13 310 00000185 89C7 mov edi, eax 311 00000187 A1[5C070000] mov eax, [s_off] 312 sys _seek, edi, eax, 0 73 <1> 74 <1> %if %0 >= 2 75 0000018C 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 0000018E 89C1 <1> mov ecx, %3 78 <1> %if %0 = 4 79 00000190 BA00000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000195 B813000000 <1> mov eax, %1 84 0000019A CD30 <1> int 30h 313 0000019C 8A06 mov al, [esi] 314 0000019E A2[68070000] mov [uname+8], al 315 sys _time 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000001A3 B80D000000 <1> mov eax, %1 84 000001A8 CD30 <1> int 30h 316 000001AA A3[6A070000] mov [uname+10], eax 317 sys _write, edi, uname, 16 73 <1> 74 <1> %if %0 >= 2 75 000001AF 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 000001B1 B9[60070000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 000001B6 BA10000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000001BB B804000000 <1> mov eax, %1 84 000001C0 CD30 <1> int 30h 318 sys _close, edi 73 <1> 74 <1> %if %0 >= 2 75 000001C2 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000001C4 B806000000 <1> mov eax, %1 84 000001C9 CD30 <1> int 30h 319 lg13: 320 ;cmp byte [esi], 'x' 321 ;je short lg14 322 sys _open, wtmp, 1 73 <1> 74 <1> %if %0 >= 2 75 000001CB BB[42060000] <1> mov ebx, %2 76 <1> %if %0 >= 3 77 000001D0 B901000000 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000001D5 B805000000 <1> mov eax, %1 84 000001DA CD30 <1> int 30h 323 000001DC 7231 jc short lg14 324 000001DE 89C7 mov edi, eax 325 sys _seek, edi, 0, 2 73 <1> 74 <1> %if %0 >= 2 75 000001E0 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 000001E2 B900000000 <1> mov ecx, %3 78 <1> %if %0 = 4 79 000001E7 BA02000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000001EC B813000000 <1> mov eax, %1 84 000001F1 CD30 <1> int 30h 326 sys _write, edi, uname, 16 73 <1> 74 <1> %if %0 >= 2 75 000001F3 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 000001F5 B9[60070000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 000001FA BA10000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000001FF B804000000 <1> mov eax, %1 84 00000204 CD30 <1> int 30h 327 sys _close, edi 73 <1> 74 <1> %if %0 >= 2 75 00000206 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000208 B806000000 <1> mov eax, %1 84 0000020D CD30 <1> int 30h 328 lg14: 329 0000020F E8BC020000 call getc 330 00000214 3C0D cmp al, 0Dh ; \n 331 ;je short lg16 332 ; 25/02/2022 333 00000216 7612 jna short lg16 334 00000218 BF[4C060000] mov edi, shell 335 lg15: 336 ; 25/02/2022 (BugFix) 337 ;mov al, ah ; (bug!) 338 ; 339 0000021D AA stosb 340 0000021E E8AD020000 call getc 341 00000223 3C0D cmp al, 0Dh ; \n 342 ;jne short lg15 343 ; 25/02/2022 344 00000225 77F6 ja short lg15 345 00000227 30C0 xor al, al ; 0 346 00000229 AA stosb 347 lg16: 348 0000022A 0FB71D[700E0000] movzx ebx, word [pbuf] 349 sys _close 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000231 B806000000 <1> mov eax, %1 84 00000236 CD30 <1> int 30h 350 00000238 B8[6E060000] mov eax, motd 351 0000023D E86B020000 call fopen 352 00000242 7224 jc short lg18 353 lg17: 354 00000244 E887020000 call getc 355 00000249 721D jc short lg18 356 0000024B A2[60070000] mov [uname], al 357 sys _write, 1, uname, 1 73 <1> 74 <1> %if %0 >= 2 75 00000250 BB01000000 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 00000255 B9[60070000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 0000025A BA01000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 0000025F B804000000 <1> mov eax, %1 84 00000264 CD30 <1> int 30h 358 00000266 EBDC jmp short lg17 359 lg18: 360 00000268 0FB71D[700E0000] movzx ebx, word [pbuf] 361 sys _close 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 0000026F B806000000 <1> mov eax, %1 84 00000274 CD30 <1> int 30h 362 sys _stat, mailf, pbuf 73 <1> 74 <1> %if %0 >= 2 75 00000276 BB[78060000] <1> mov ebx, %2 76 <1> %if %0 >= 3 77 0000027B B9[700E0000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000280 B812000000 <1> mov eax, %1 84 00000285 CD30 <1> int 30h 363 00000287 7213 jc short lg19 364 ;mov ax, [pbuf+6] ; file size 365 ;and ax, ax 366 ;jz short lg19 367 ; 14/02/2022 - Retro UNIX 386 v1.2 368 ; (Retro UNIX 386 v2 file system inode) 369 00000289 A1[7A0E0000] mov eax, [pbuf+10] ; file size 370 0000028E 21C0 and eax, eax 371 00000290 740A jz short lg19 372 00000292 BE[0A070000] mov esi, msgMail 373 00000297 E859010000 call mesg 374 lg19: 375 0000029C 0FB71D[9C070000] movzx ebx, word [uid] 376 sys _setuid 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000002A3 B817000000 <1> mov eax, %1 84 000002A8 CD30 <1> int 30h 377 sys _exec, shell, shellp 73 <1> 74 <1> %if %0 >= 2 75 000002AA BB[4C060000] <1> mov ebx, %2 76 <1> %if %0 >= 3 77 000002AF B9[30060000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000002B4 B80B000000 <1> mov eax, %1 84 000002B9 CD30 <1> int 30h 378 000002BB BE[C6060000] mov esi, msgNoSh 379 000002C0 E830010000 call mesg 380 sys _exit 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000002C5 B801000000 <1> mov eax, %1 84 000002CA CD30 <1> int 30h 381 382 gpasswd: 383 000002CC BF[72070000] mov edi, passwd 384 000002D1 803F01 cmp byte [edi], 1 385 000002D4 732E jnb short gp2 386 000002D6 BE[A4060000] mov esi, msgPswd 387 000002DB E815010000 call mesg 388 gp1: 389 000002E0 E8AC000000 call tgetc 390 000002E5 3C08 cmp al, 08h 391 000002E7 7425 je short gp3 392 000002E9 3C7F cmp al, 127 393 000002EB 7421 je short gp3 394 000002ED AA stosb 395 000002EE 20C0 and al, al 396 000002F0 7412 jz short gp2 397 000002F2 C605[9E070000]2A mov byte [chr], '*' 398 ; 16/02/2022 399 ;call tputc 400 000002F9 81FF[7B070000] cmp edi, passwd + 9 401 ;jb short gp1 402 000002FF 721C jb short gp4 ; 16/02/2022 403 00000301 4F dec edi 404 00000302 EBDC jmp short gp1 405 gp2: 406 00000304 BE[72070000] mov esi, passwd 407 ;call crypt 408 ;;mov esi, _word 409 ;retn 410 ; 14/02/2022 411 00000309 E903020000 jmp crypt 412 413 gp3: ; Backspace 414 ; (Retro UNIX 8086 v1 modification) 415 0000030E 81FF[72070000] cmp edi, passwd 416 00000314 76CA jna short gp1 417 ;mov byte [chr], 08h 418 00000316 E8A3000000 call tputbs 419 0000031B EBC3 jmp short gp1 420 gp4: 421 ; 16/02/2021 422 0000031D E8BC000000 call tputc 423 00000322 EBBC jmp short gp1 424 425 guname: 426 00000324 BF[60070000] mov edi, uname 427 00000329 803F01 cmp byte [edi], 1 428 0000032C 7330 jnb short gun2 429 0000032E 31C0 xor eax, eax ; mov eax, 0 430 00000330 AB stosd 431 00000331 AB stosd 432 00000332 BE[9A060000] mov esi, msgName 433 00000337 E8B9000000 call mesg 434 0000033C BF[60070000] mov edi, uname 435 gun1: 436 00000341 E84B000000 call tgetc 437 00000346 3C08 cmp al, 08h 438 00000348 7415 je short gun3 439 0000034A 3C7F cmp al, 127 440 0000034C 7411 je short gun3 441 0000034E AA stosb 442 0000034F 20C0 and al, al 443 00000351 740B jz short gun2 444 ; 16/02/2022 445 ;call tputc 446 00000353 81FF[69070000] cmp edi, uname + 9 447 ;jb short gun1 448 00000359 7213 jb short gun4 ; 16/02/2022 449 0000035B 4F dec edi 450 0000035C EBE3 jmp short gun1 451 gun2: 452 0000035E C3 retn 453 454 gun3: ; Backspace 455 ; (Retro UNIX 8086 v1 modification) 456 0000035F 81FF[60070000] cmp edi, uname 457 00000365 76DA jna short gun1 458 ;mov byte [chr], 08h 459 00000367 E852000000 call tputbs 460 0000036C EBD3 jmp short gun1 461 462 gun4: 463 ; 16/02/2022 464 0000036E E86B000000 call tputc 465 00000373 EBCC jmp short gun1 466 467 compar: 468 ; ESI = uname or _word 469 ; (encrypted passwd) 470 ;mov ebx, pbuf 471 cmp_0: 472 00000375 E856010000 call getc 473 0000037A 7306 jnc short cmp_1 474 0000037C 58 pop eax ; return address 475 0000037D E9A8FDFFFF jmp sorry 476 cmp_1: 477 00000382 88C4 mov ah, al 478 ; AH = character 479 00000384 AC lodsb 480 00000385 38E0 cmp al, ah 481 00000387 74EC je short cmp_0 482 00000389 20C0 and al, al 483 0000038B 7503 jnz short cmp_2 484 0000038D 80FC3A cmp ah, ':' 485 cmp_2: 486 ; ZF = 1 --> match 487 00000390 C3 retn 488 489 tgetc: 490 sys _read, 0, chr, 1 73 <1> 74 <1> %if %0 >= 2 75 00000391 BB00000000 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 00000396 B9[9E070000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 0000039B BA01000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000003A0 B803000000 <1> mov eax, %1 84 000003A5 CD30 <1> int 30h 491 ; 14/02/2022 492 000003A7 21C0 and eax, eax 493 ;and ax, ax 494 000003A9 7507 jnz short tgc1 495 sys _exit 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000003AB B801000000 <1> mov eax, %1 84 000003B0 CD30 <1> int 30h 496 tgc1: 497 000003B2 A0[9E070000] mov al, [chr] 498 000003B7 3C0D cmp al, 0Dh 499 000003B9 7502 jne short tgc2 500 000003BB 30C0 xor al, al 501 tgc2: 502 000003BD C3 retn 503 504 tputbs: 505 000003BE C605[9E070000]08 mov byte [chr], 08h 506 000003C5 4F dec edi 507 ; 16/02/2022 508 000003C6 E813000000 call tputc 509 000003CB C605[9E070000]20 mov byte [chr], 20h ; space/blank 510 000003D2 E807000000 call tputc 511 000003D7 C605[9E070000]08 mov byte [chr], 08h ; backspace 512 tputc: 513 sys _write, 1, chr, 1 73 <1> 74 <1> %if %0 >= 2 75 000003DE BB01000000 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 000003E3 B9[9E070000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 000003E8 BA01000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000003ED B804000000 <1> mov eax, %1 84 000003F2 CD30 <1> int 30h 514 000003F4 C3 retn 515 516 mesg: 517 000003F5 89F2 mov edx, esi 518 msg1: 519 000003F7 AC lodsb 520 000003F8 20C0 and al, al 521 000003FA 75FB jnz short msg1 522 000003FC 29D6 sub esi, edx 523 000003FE 87F2 xchg esi, edx 524 ; edx = string length 525 sys _write, 1, esi 73 <1> 74 <1> %if %0 >= 2 75 00000400 BB01000000 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 00000405 89F1 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000407 B804000000 <1> mov eax, %1 84 0000040C CD30 <1> int 30h 526 0000040E C3 retn 527 528 ; return name of current tty 529 ; 530 ttyn: 531 ; 24/01/2022 - Retro UNIX 386 v1.2 532 0000040F 57 push edi 533 00000410 56 push esi 534 00000411 52 push edx 535 00000412 C605[E2070000]78 mov byte [ttyname], 'x' 536 sys _fstat, 1, buf ; get tty file status 73 <1> 74 <1> %if %0 >= 2 75 00000419 BB01000000 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 0000041E B9[A0070000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000423 B81C000000 <1> mov eax, %1 84 00000428 CD30 <1> int 30h 537 ; file descriptor = 1 538 ; (standard output) 539 0000042A 7278 jc short er1 540 sys _open, dev, 0 ; open '/dev' file (dir) 73 <1> 74 <1> %if %0 >= 2 75 0000042C BB[95060000] <1> mov ebx, %2 76 <1> %if %0 >= 3 77 00000431 B900000000 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000436 B805000000 <1> mov eax, %1 84 0000043B CD30 <1> int 30h 541 0000043D 7265 jc short er1 542 ; 543 0000043F 668B35[A0070000] mov si, [buf] ; inode number 544 00000446 89C7 mov edi, eax ; file descriptor 545 t1: 546 ; 24/01/2022 547 sys _read, edi, buf, 16 ; retro unix 386 v1.1 73 <1> 74 <1> %if %0 >= 2 75 00000448 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 0000044A B9[A0070000] <1> mov ecx, %3 78 <1> %if %0 = 4 79 0000044F BA10000000 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 00000454 B803000000 <1> mov eax, %1 84 00000459 CD30 <1> int 30h 548 ; retro unix 386 v1.2 549 ;sys _read, edi, buf, 10 ; unix v1 dir entry ! 550 ; retro unix 8086/386 v1 551 0000045B 723E jc short er 552 0000045D 83F810 cmp eax, 16 ; retro unix 386 v1.1 & v1.2 553 ;cmp eax, 10 ; retro unix 8086/386 v1 554 00000460 7539 jne short er 555 ;mov dx, [buf] ; inode number from sysfstat 556 ;cmp dx, si ; same inode number ? 557 ; 27/02/2022 558 00000462 663B35[A0070000] cmp si, [buf] ; same inode number ? 559 00000469 75DD jne short t1 ; no, get next dir entry 560 ;mov dx, [buf+2] ; check (14 byte) file name 561 ;cmp dx, 'tt' ; 1st 2 chars 562 ; 27/02/2022 563 0000046B 66813D[A2070000]74- cmp word [buf+2], 'tt' ; First 2 characters 563 00000473 74 564 00000474 7525 jne short er ; not 'tt' 565 00000476 668B15[A4070000] mov dx, [buf+4] ; 2nd 2 chars 566 0000047D 80FA79 cmp dl, 'y' ; check the 3rd char 567 00000480 7519 jne short er ; not 'y' 568 ;or dh, dh 569 ;jz short er 570 00000482 80FE30 cmp dh, '0' ; < 'tty0' 571 00000485 7214 jb short er ; yes 572 00000487 80FE39 cmp dh, '9' ; > 'tty9' 573 0000048A 770F ja short er ; yes 574 0000048C 803D[A6070000]00 cmp byte [buf+6], 0 ; remain bytes of the name is 0 ? 575 00000493 7506 jne short er ; no (it is not tty0 .. tty9) 576 00000495 8835[E2070000] mov byte [ttyname], dh ; save tty name (last) char 577 er: 578 sys _close, edi ; close '/dev' file (dir) 73 <1> 74 <1> %if %0 >= 2 75 0000049B 89FB <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 0000049D B806000000 <1> mov eax, %1 84 000004A2 CD30 <1> int 30h 579 er1: 580 ;movzx eax, byte [ttyname] ; return (last) tty name char 581 ; 24/01/2022 582 ; eax <= 16 583 000004A4 A0[E2070000] mov al, [ttyname] ; '0' to '9' or 'x' 584 000004A9 5A pop edx 585 000004AA 5E pop esi 586 000004AB 5F pop edi 587 000004AC C3 retn 588 589 ; open a file for use by get(c|w) 590 ; 591 fopen: 592 ; eax = file name ofset 593 000004AD BF[700E0000] mov edi, pbuf 594 sys _open, eax, 0 73 <1> 74 <1> %if %0 >= 2 75 000004B2 89C3 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 000004B4 B900000000 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000004B9 B805000000 <1> mov eax, %1 84 000004BE CD30 <1> int 30h 595 000004C0 7207 jc short f1 596 000004C2 66AB stosw 597 000004C4 31C0 xor eax, eax ; 0 598 000004C6 66AB stosw 599 000004C8 C3 retn 600 f1: 601 000004C9 66B8FFFF mov ax, 0FFFFh 602 000004CD 66AB stosw 603 000004CF C3 retn 604 605 ; get characters from input file 606 ; 607 getc: 608 000004D0 56 push esi 609 000004D1 BE[700E0000] mov esi, pbuf 610 ; 14/02/2022 611 ;xor eax, eax 612 ;mov ax, [esi+2] ; char count 613 ; 16/02/2022 614 000004D6 0FB74602 movzx eax, word [esi+2] ; char count 615 ;and ax, ax 616 ; 14/02/2022 617 000004DA 21C0 and eax, eax 618 000004DC 751C jnz short gch1 619 gch0: 620 000004DE 0FB71E movzx ebx, word [esi] 621 000004E1 B9[780E0000] mov ecx, pbuf + 8 ; read buff. addr. 622 000004E6 894E04 mov [esi+4], ecx ; char offset 623 ;mov [esi+2], ax ; 0 624 ; 14/02/2022 625 000004E9 29D2 sub edx, edx 626 000004EB B602 mov dh, 2 627 ;mov edx, 512 628 sys _read ; sys _read, ebx, ecx, edx 73 <1> 74 <1> %if %0 >= 2 75 <1> mov ebx, %2 76 <1> %if %0 >= 3 77 <1> mov ecx, %3 78 <1> %if %0 = 4 79 <1> mov edx, %4 80 <1> %endif 81 <1> %endif 82 <1> %endif 83 000004ED B803000000 <1> mov eax, %1 84 000004F2 CD30 <1> int 30h 629 000004F4 7216 jc short gch2 630 000004F6 09C0 or eax, eax 631 000004F8 7414 jz short gch3 632 gch1: 633 ;dec ax 634 ; 14/02/2022 635 000004FA 48 dec eax 636 000004FB 66894602 mov [esi+2], ax 637 000004FF 8B5E04 mov ebx, [esi+4] 638 ; 14/02/2022 639 ;xor eax, eax 640 00000502 30E4 xor ah, ah 641 00000504 8A03 mov al, [ebx] 642 00000506 43 inc ebx 643 00000507 895E04 mov [esi+4], ebx 644 ;xor ah, ah 645 0000050A 5E pop esi 646 0000050B C3 retn 647 gch2: 648 ;xor ax, ax 649 ; 14/02/2022 650 0000050C 31C0 xor eax, eax 651 gch3: 652 0000050E 5E pop esi 653 0000050F F9 stc 654 00000510 C3 retn 655 656 ;/ crypt -- password incoding 657 ; 658 ;; Original Unix v5 (PDP-11) 'crypt' 659 ;; code has been converted to 660 ;; Retro UNIX 8086 v1 'crypt' 661 ;; procedure in 'login.asm' 662 ;; (by Erdogan Tan - 12/11/2013). 663 ; 664 ; 665 ;crypt: 666 ; mov r1,-(sp) 667 ; mov r2,-(sp) 668 ; mov r3,-(sp) 669 ; mov r4,-(sp) 670 ; mov r5,-(sp) 671 ; 672 ; mov r0,r1 673 ; mov $key,r0 674 ; movb $004,(r0)+ 675 ; movb $034,(r0)+ 676 677 ; 14/10/2015 - 32 bit version (Retro UNIX 386 v1) 678 679 crypt: 680 ;mov esi, passwd 681 00000511 BF[E4070000] mov edi, key 682 00000516 B004 mov al, 4 683 00000518 AA stosb 684 00000519 B01C mov al, 28 685 0000051B AA stosb 686 687 ;1: 688 ; cmp r0,$key+64. 689 ; bhis 1f 690 ; movb (r1)+,(r0)+ 691 ; bne 1b 692 ;1: 693 ; dec r0 694 695 cryp0: 696 0000051C AC lodsb 697 0000051D AA stosb 698 0000051E 20C0 and al, al 699 00000520 7408 jz short cryp1 700 00000522 81FF[24080000] cmp edi, key + 64 701 00000528 72F2 jb short cryp0 702 cryp1: 703 0000052A 4F dec edi 704 ;/ 705 ;/ 706 ;/ fill out key space with clever junk 707 ;/ 708 ; mov $key,r1 709 ;1: 710 ; movb -1(r0),r2 711 ; movb (r1)+,r3 712 ; xor r3,r2 713 ; movb r2,(r0)+ 714 ; cmp r0,$key+128. 715 ; blo 1b 716 717 718 ;/ fill out key space with clever junk 719 720 0000052B BE[E4070000] mov esi, key 721 cryp2: 722 00000530 8A5FFF mov bl, [edi-1] 723 00000533 AC lodsb 724 00000534 30D8 xor al, bl 725 00000536 AA stosb 726 00000537 81FF[64080000] cmp edi, key + 128 727 0000053D 72F1 jb short cryp2 728 ; 729 ;/ 730 ;/ 731 ;/ establish wheel codes and cage codes 732 ;/ 733 ; mov $wheelcode,r4 734 ; mov $cagecode,r5 735 ; mov $256.,-(sp) 736 ;2: 737 ; clr r2 738 ; clr (r4) 739 ; mov $wheeldiv,r3 740 ;3: 741 ; clr r0 742 ; mov (sp),r1 743 ; div (r3)+,r0 744 ; add r1,r2 745 ; bic $40,r2 746 ; bis shift(r2),(r4) 747 ; cmp r3,$wheeldiv+6. 748 ; bhis 4f 749 ; bis shift+4(r2),(r5) 750 ;4: 751 ; cmp r3,$wheeldiv+10. 752 ; blo 3b 753 ; sub $2,(sp) 754 ; tst (r4)+ 755 ; tst (r5)+ 756 ; cmp r4,$wheelcode+256. 757 ; blo 2b 758 ; tst (sp)+ 759 ;/ 760 761 ;/ establish wheel codes and cage codes 762 763 0000053F BE[700C0000] mov esi, wheelcode 764 00000544 BF[700A0000] mov edi, cagecode 765 00000549 66B80001 mov ax, 256 766 0000054D 6650 push ax ; * 767 0000054F 89E5 mov ebp, esp 768 cryp3: 769 00000551 6629D2 sub dx, dx ; 0 770 00000554 668916 mov [esi], dx ; 0 771 00000557 BB[42070000] mov ebx, wheeldiv 772 cryp4: 773 0000055C 668B4500 mov ax, [ebp] 774 00000560 8A0B mov cl, [ebx] 775 00000562 F6F1 div cl 776 00000564 00E2 add dl, ah 777 00000566 43 inc ebx 778 00000567 80E21F and dl, 01Fh 779 0000056A 53 push ebx 780 0000056B BB[1E070000] mov ebx, shift 781 00000570 01D3 add ebx, edx 782 00000572 668B03 mov ax, [ebx] 783 00000575 660906 or [esi], ax 784 00000578 59 pop ecx 785 00000579 81F9[45070000] cmp ecx, wheeldiv + 3 786 0000057F 7309 jnb short cryp5 787 00000581 83C304 add ebx, 4 788 00000584 668B03 mov ax, [ebx] 789 00000587 660907 or [edi], ax 790 cryp5: 791 0000058A 89CB mov ebx, ecx 792 0000058C 81FB[47070000] cmp ebx, wheeldiv + 5 793 00000592 72C8 jb short cryp4 794 00000594 66836D0002 sub word [ebp], 2 795 00000599 66AD lodsw 796 0000059B 47 inc edi 797 0000059C 47 inc edi 798 0000059D 81FE[700D0000] cmp esi, wheelcode + 256 799 000005A3 72AC jb short cryp3 800 000005A5 6658 pop ax ; * 801 802 ; .data 803 ;shift: 1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000 804 ; 1;2 805 ;wheeldiv: 32.; 18.; 10.; 6.; 4. 806 ; .bss 807 ;cagecode: .=.+256. 808 ;wheelcode: .=.+256. 809 ; .text 810 ;/ 811 ;/ 812 ;/ make the internal settings of the machine 813 ;/ both the lugs on the 128 cage bars and the lugs 814 ;/ on the 16 wheels are set from the expanded key 815 ;/ 816 ; mov $key,r0 817 ; mov $cage,r2 818 ; mov $wheel,r3 819 ;1: 820 ; movb (r0)+,r1 821 ; bic $!177,r1 822 ; asl r1 823 ; mov cagecode(r1),(r2)+ 824 ; mov wheelcode(r1),(r3)+ 825 ; cmp r0,$key+128. 826 ; blo 1b 827 828 ;/ make the internal settings of the machine 829 ;/ both the lugs on the 128 cage bars and the lugs 830 ;/ on the 16 wheels are set from the expanded key 831 cryp6: 832 000005A7 BB[E4070000] mov ebx, key 833 000005AC BE[70080000] mov esi, cage 834 000005B1 BF[70090000] mov edi, wheel 835 cryp7: 836 000005B6 8A0B mov cl, [ebx] 837 000005B8 43 inc ebx 838 000005B9 83E17F and ecx, 7Fh 839 000005BC D0E1 shl cl, 1 840 000005BE 87CB xchg ecx, ebx 841 000005C0 668B83[700A0000] mov ax, [ebx+cagecode] 842 000005C7 668906 mov [esi], ax 843 000005CA 46 inc esi 844 000005CB 46 inc esi 845 000005CC 668B83[700C0000] mov ax, [ebx+wheelcode] 846 000005D3 66AB stosw 847 000005D5 89CB mov ebx, ecx 848 000005D7 81FB[64080000] cmp ebx, key + 128 849 000005DD 72D7 jb short cryp7 850 ;/ 851 ;/ 852 ;/ now spin the cage against the wheel to produce output. 853 ;/ 854 ; mov $word,r4 855 ; mov $wheel+128.,r3 856 ;3: 857 ; mov -(r3),r2 858 ; mov $cage,r0 859 ; clr r5 860 ;1: 861 ; bit r2,(r0)+ 862 ; beq 2f 863 ; incb r5 864 ;2: 865 ; cmp r0,$cage+256. 866 ; blo 1b 867 868 ;/ 869 ;/ now spin the cage against the wheel to produce output. 870 ;/ 871 cryp8: 872 000005DF BF[64080000] mov edi, _word 873 000005E4 BB[F0090000] mov ebx, wheel + 128 874 cryp9: 875 000005E9 4B dec ebx 876 000005EA 4B dec ebx 877 000005EB 668B13 mov dx, [ebx] 878 000005EE BE[70080000] mov esi, cage 879 000005F3 6629C9 sub cx, cx ; 0 880 cryp10: 881 000005F6 66AD lodsw 882 000005F8 6685D0 test ax, dx 883 000005FB 7402 jz short cryp11 884 000005FD FEC1 inc cl 885 cryp11: 886 000005FF 81FE[70090000] cmp esi, cage + 256 887 00000605 72EF jb short cryp10 888 889 ;/ 890 ;/ we have a piece of output from current wheel 891 ;/ it needs to be folded to remove lingering hopes of 892 ;/ inverting the function 893 ;/ 894 ; mov r4,-(sp) 895 ; clr r4 896 ; div $26.+26.+10.,r4 897 ; add $'0,r5 898 ; cmp r5,$'9 899 ; blos 1f 900 ; add $'A-'9-1,r5 901 ; cmp r5,$'Z 902 ; blos 1f 903 ; add $'a-'Z-1,r5 904 ;1: 905 ; mov (sp)+,r4 906 ; movb r5,(r4)+ 907 ; cmp r4,$word+8. 908 ; blo 3b 909 ;/ 910 ; 911 ; mov (sp)+,r5 912 ; mov (sp)+,r4 913 ; mov (sp)+,r3 914 ; mov (sp)+,r2 915 ; mov (sp)+,r1 916 ; mov $word,r0 917 ; rts pc 918 ; .bss 919 ;key: .=.+128. 920 ;word: .=.+32. 921 ;cage: .=.+256. 922 ;wheel: .=.+256. 923 924 ;/ 925 ;/ we have a piece of output from current wheel 926 ;/ it needs to be folded to remove lingering hopes of 927 ;/ inverting the function 928 ;/ 929 00000607 6689C8 mov ax, cx 930 0000060A B23E mov dl, 26+26+10 931 0000060C F6F2 div dl 932 0000060E 88E0 mov al, ah 933 00000610 0430 add al, '0' 934 00000612 3C39 cmp al, '9' 935 00000614 7608 jna short cryp12 936 00000616 0407 add al, 'A'-'9'-1 937 00000618 3C5A cmp al, 'Z' 938 0000061A 7602 jna short cryp12 939 0000061C 0406 add al, 'a'-'Z'-1 940 cryp12: 941 0000061E AA stosb 942 0000061F 81FF[6C080000] cmp edi, _word + 8 943 00000625 72C2 jb short cryp9 944 00000627 BE[64080000] mov esi, _word 945 0000062C C3 retn 946 947 0000062D 90 align 4 948 shellp: 949 00000630 [6C060000] dd mshell 950 00000634 00000000 dd 0 951 00000638 2F746D702F75746D70 utmp: db '/tmp/utmp' 952 00000641 00 db 0 953 00000642 2F746D702F77746D70 wtmp: db '/tmp/wtmp' 954 0000064B 00 db 0 955 0000064C 2F62696E2F7368 shell: db '/bin/sh' 956 00000653 00 db 0 957 shpl equ shell + 32 - shpad 958 00000654 00 shpad: times shpl db 0 959 960 0000066C 2D mshell: db '-' 961 0000066D 00 db 0 962 0000066E 2F6574632F6D6F7464 motd: db '/etc/motd' 963 00000677 00 db 0 964 00000678 6D61696C626F78 mailf: db 'mailbox' 965 0000067F 00 db 0 966 align 2 967 00000680 2F6574632F70617373- passwdf: db '/etc/passwd' 967 00000689 7764 968 0000068B 00 db 0 969 0000068C 2F6465762F747479 ttyx: db '/dev/tty' ; db '/dev/ttyx' 970 00000694 00 db 0 971 972 00000695 2F64657600 dev: db '/dev', 0 973 974 align 2 975 0000069A 0D0A4E616D653A2000 msgName: db 0Dh, 0Ah, 'Name: ', 0 976 000006A3 90 align 2 977 000006A4 0D0A50617373776F72- msgPswd: db 0Dh, 0Ah, 'Password: ', 0 977 000006AD 643A2000 978 000006B1 90 align 2 979 000006B2 0D0A4C6F67696E2069- msgIL: db 0Dh, 0Ah, 'Login incorrect !', 0 979 000006BB 6E636F727265637420- 979 000006C4 2100 980 ;align 2 981 000006C6 0D0A4E6F205368656C- msgNoSh: db 0Dh, 0Ah, 'No Shell !' 981 000006CF 6C2021 982 000006D2 0D0A00 nextline: db 0Dh, 0Ah, 0 983 000006D5 90 align 2 984 msgNoPswdf: 985 000006D6 0D0A43616E2774206F- db 0Dh, 0Ah, "Can't open password file !" 985 000006DF 70656E207061737377- 985 000006E8 6F72642066696C6520- 985 000006F1 21 986 000006F2 0D0A00 db 0Dh, 0Ah, 0 987 000006F5 90 align 2 988 msgNoDir: 989 000006F6 0D0A4E6F2064697265- db 0Dh, 0Ah, 'No directory !' 989 000006FF 63746F72792021 990 00000706 0D0A00 db 0Dh, 0Ah, 0 991 00000709 90 align 2 992 msgMail: 993 0000070A 0D0A596F7520686176- db 0Dh, 0Ah, 'You have mail.' 993 00000713 65206D61696C2E 994 0000071A 0D0A00 db 0Dh, 0Ah, 0 995 996 0000071D 90 align 2 997 0000071E 010002000400080010- shift: dw 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 997 00000727 002000400080000001- 997 00000730 000200040008001000- 997 00000739 2000400080 998 0000073E 01000200 dw 1, 2 999 00000742 20120A0604 wheeldiv: db 32, 18, 10, 6, 4 1000 1001 00000747 90 align 2 1002 00000748 A101 dw 417 ; 01A1h 1003 1004 ; 15/02/2022 1005 msgErrorCode: 1006 0000074A 0D0A4572726F722043- db 0Dh, 0Ah, 'Error Code: ' 1006 00000753 6F64653A20 1007 error_code: 1008 00000758 3000 db '0', 0 1009 1010 0000075A 90 align 4 1011 1012 bss_start: 1013 1014 ABSOLUTE bss_start 1015 1016 0000075C ???????? s_off: resd 1 1017 1018 00000760 uname: resb 16 1019 00000770 ???? resw 1 1020 00000772 ???????????????? passwd: resb 8 1021 0000077A ???? resw 1 1022 0000077C dirbuf: resb 32 1023 ;shbuf: resb 32 1024 ;ttyb: resb 6 1025 0000079C ???? uid: resw 1 1026 0000079E ???? chr: resw 1 1027 1028 ;buf: resb 34 ; Retro UNIX 8086/386 v1 (32 byte inode, 32+2) 1029 ; 24/01/2022 1030 000007A0 buf: resb 66 ; Retro UNIX 386 v1.2 (64 byte inode, 64+2) 1031 000007E2 ???? ttyname: resw 1 1032 1033 000007E4 key: resb 128 1034 00000864 _word: resb 10 ; resb 32 1035 0000086E ???? resb 2 1036 00000870 cage: resb 256 1037 00000970 wheel: resb 256 1038 00000A70 cagecode: resw 256 1039 00000C70 wheelcode: resw 256 1040 1041 alignb 4 1042 1043 00000E70 pbuf: resb 520 1044 1045 bss_end: 1046 1047 _end: ; end of login386.s (NASM 2.11) source code 1048 1049 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1050 ;; login.s 1051 ; 1052 ;/ login -- enter new user 1053 ; 1054 ;.globl ttyn 1055 ;.globl crypt 1056 ;.globl fopen 1057 ;.globl getc 1058 ;.globl mesg 1059 ; 1060 ; sys quit; 0 1061 ; sys intr; 0 1062 ; jsr pc,ttyn 1063 ; movb r0,ttyx+8. 1064 ; sub $'0,r0 1065 ; cmp r0,$'a-'0 1066 ; blo 1f 1067 ; sub $'a-'0-10.,r0 / map a-z into 10. on 1068 ;1: 1069 ; asl r0 1070 ; asl r0 1071 ; asl r0 1072 ; asl r0 1073 ; mov r0,offset 1074 ; mov (sp)+,r5 1075 ; tst (sp)+ 1076 ; dec r5 1077 ; ble login 1078 ; mov (sp)+,r4 1079 ; mov $uname,r1 1080 ;2: 1081 ; movb (r4)+,(r1)+ 1082 ; bne 2b 1083 ; dec r5 1084 ; ble login 1085 ; mov (sp)+,r4 1086 ; mov $passwd,r1 1087 ;2: 1088 ; movb (r4)+,(r1)+ 1089 ; bne 2b 1090 ;login: 1091 ; clrb uname+8. 1092 ; mov $passwdf,r0 1093 ; jsr r5,fopen; pbuf 1094 ; bec 1f 1095 ; jsr r5,mesg; ; .even 1096 ; sys exit 1097 ;1: 1098 ; jsr pc,guname 1099 ;1: 1100 ; jsr r5,compar; uname 1101 ; br .+4 1102 ; br 2f 1103 ;3: 1104 ; jsr r5,getc; pbuf 1105 ; bes sorry 1106 ; cmp r0,$'\n 1107 ; bne 3b 1108 ; br 1b 1109 ;sorry: 1110 ; jsr r5,mesg; ; .even 1111 ; mov pbuf,r0 1112 ; sys close 1113 ; clr uname 1114 ; clr passwd 1115 ; br login 1116 ;2: 1117 ; jsr r5,getc; pbuf 1118 ; cmp r0,$': 1119 ; beq 2f 1120 ; mov r0,-(sp) 1121 ; jsr pc,gpasswd 1122 ; cmpb (r0)+,(sp)+ 1123 ; bne sorry 1124 ; mov r0,0f 1125 ; jsr r5,compar; 0:.. 1126 ; br sorry 1127 ;2: 1128 ; clr r1 1129 ;2: 1130 ; jsr r5,getc; pbuf 1131 ; cmp r0,$': 1132 ; beq 2f 1133 ; mpy $10.,r1 1134 ; sub $'0,r0 1135 ; add r0,r1 1136 ; br 2b 1137 ;2: 1138 ; mov r1,0f 1139 ; sys chown; ttyx; 0:.. 1140 ; mov r1,uid 1141 ;1: 1142 ; jsr r5,getc; pbuf 1143 ; cmp r0,$': 1144 ; bne 1b / skip ident field 1145 ; mov $dirbuf,r1 1146 ;1: 1147 ; jsr r5,getc; pbuf 1148 ; cmpb r0,$': 1149 ; beq 1f 1150 ; movb r0,(r1)+ 1151 ; br 1b 1152 ;1: 1153 ; clrb (r1) 1154 ; sys chdir; dirbuf 1155 ; bec 1f 1156 ; jsr r5,mesg; ; .even 1157 ; br sorry 1158 ;1: 1159 ; mov $uname+8.,r1 1160 ;1: 1161 ; tstb -(r1) 1162 ; bne 1f 1163 ; movb $' ,(r1) 1164 ; br 1b 1165 ;1: 1166 ; cmpb ttyx+8.,$'x 1167 ; beq 1f 1168 ; sys open; utmp; 1 1169 ; bes 1f 1170 ; mov r0,r2 1171 ; sys seek; offset:..; 0 1172 ; movb ttyx+8.,uname+8. 1173 ; sys time 1174 ; mov r0,uname+10. 1175 ; mov r1,uname+12. 1176 ; mov r2,r0 1177 ; sys write; uname; 16. 1178 ; mov r2,r0 1179 ; sys close 1180 ;1: 1181 ; cmpb ttyx+8.,$'x 1182 ; beq 1f 1183 ; sys open; wtmp; 1 1184 ; bes 1f 1185 ; mov r0,r1 1186 ; sys seek; 0; 2 1187 ; sys write; uname; 16. 1188 ; mov r1,r0 1189 ; sys close 1190 ;1: 1191 ; jsr r5,getc; pbuf 1192 ; cmp r0,$'\n 1193 ; beq 1f 1194 ; mov $shell,r1 1195 ;2: 1196 ; movb r0,(r1)+ 1197 ; jsr r5,getc; pbuf 1198 ; cmp r0,$'\n 1199 ; bne 2b 1200 ; clrb (r1) 1201 ;1: 1202 ; mov pbuf,r0 1203 ; sys close 1204 ; mov $motd,r0 1205 ; jsr r5,fopen; pbuf 1206 ; bes 1f 1207 ;2: 1208 ; jsr r5,getc; pbuf 1209 ; bes 1f 1210 ; mov r0,uname 1211 ; mov $1,r0 1212 ; sys write; uname; 1 1213 ; br 2b 1214 ;1: 1215 ; mov pbuf,r0 1216 ; sys close 1217 ; sys stat; mailf; pbuf 1218 ; bes 1f 1219 ; tst pbuf+6 1220 ; beq 1f 1221 ; jsr r5,mesg; ; .even 1222 ;1: 1223 ; mov uid,r0 1224 ; sys setuid 1225 ; sys exec; shell; shellp 1226 ; jsr r5,mesg; ; .even 1227 ; sys exit 1228 ; 1229 ;gpasswd: 1230 ; mov $passwd,r1 1231 ; tstb (r1) 1232 ; bne 3f 1233 ; clr r0 1234 ; sys gtty; ttyb 1235 ; bic $10,ttyb+4 / turn off echo 1236 ; clr r0 1237 ; sys stty; ttyb 1238 ; jsr r5,mesg; ; .even 1239 ;2: 1240 ; jsr pc,tgetc 1241 ; movb r0,(r1)+ 1242 ; beq 1f 1243 ; cmp r1,$passwd+9. 1244 ; blo 2b 1245 ; dec r1 1246 ; br 2b 1247 ;1: 1248 ; bis $10,ttyb+4 / turn on echo 1249 ; clr r0 1250 ; sys stty; ttyb 1251 ; jsr r5,mesg; <\n\0>; .even 1252 ;3: 1253 ; mov $passwd,r0 1254 ; jsr pc,crypt 1255 ; clrb 8(r0) 1256 ; rts pc 1257 ; 1258 ;guname: 1259 ; mov $uname,r1 1260 ; tstb (r1) 1261 ; bne 1f 1262 ; clr (r1)+ 1263 ; clr (r1)+ 1264 ; clr (r1)+ 1265 ; clr (r1)+ 1266 ; mov $uname,r1 1267 ; jsr r5,mesg; ; .even 1268 ;2: 1269 ; jsr pc,tgetc 1270 ; movb r0,(r1)+ 1271 ; beq 1f 1272 ; cmp r1,$uname+9. 1273 ; blo 2b 1274 ; dec r1 1275 ; br 2b 1276 ;1: 1277 ; rts pc 1278 ; 1279 ;compar: 1280 ; mov (r5)+,r4 1281 ;1: 1282 ; jsr r5,getc; pbuf 1283 ; bes 2f 1284 ; cmpb r0,(r4)+ 1285 ; beq 1b 1286 ; cmp r0,$': 1287 ; bne 1f 1288 ; tstb -(r4) 1289 ; bne 1f 1290 ; tst (r5)+ 1291 ;1: 1292 ; rts r5 1293 ;2: 1294 ; tst (sp)+ 1295 ; jmp sorry 1296 ; 1297 ;tgetc: 1298 ; clr r0 1299 ; sys read; ch; 1 1300 ; tst r0 1301 ; bne 1f 1302 ; sys exit 1303 ;1: 1304 ; mov ch,r0 1305 ; cmp r0,$'\n 1306 ; bne 1f 1307 ; clr r0 1308 ;1: 1309 ; rts pc 1310 ; 1311 ;shellp: 1312 ; mshell 1313 ; 0 1314 ;utmp: 1315 ;wtmp: 1316 ;shell: ; .=shell+32. 1317 ;mshell:<-\0> 1318 ;motd: 1319 ;mailf: 1320 ;passwdf: 1321 ;ttyx: 1322 ;.even 1323 ;.bss 1324 ;uname: .=.+16. 1325 ;passwd:.=.+8. 1326 ;dirbuf:.=.+32. 1327 ;shbuf: .=.+32. 1328 ;ttyb: .=.+6 1329 ;uid: .=.+2 1330 ;ch: .=.+2 1331 ;pbuf: .=.+518. 1332 1333 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1334 ;; ttyn.s (unix v5) 1335 ; 1336 ;/ return name of current tty 1337 ; 1338 ;.globl ttyn, _ttyn 1339 ; 1340 ;_ttyn: 1341 ; mov 2(sp),r0 1342 ; br 1f 1343 ;ttyn: 1344 ; clr r0 1345 ;1: 1346 ; mov $'x,name 1347 ; tst -(sp) 1348 ; sys fstat; buf 1349 ; bes er1 1350 ; mov buf+2,(sp) 1351 ; sys open; dev; 0 1352 ; bes er1 1353 ; mov r0,r1 1354 ;1: 1355 ; mov r1,r0 1356 ; sys read; buf; 16. 1357 ; bes er 1358 ; cmp r0,$16. 1359 ; bne er 1360 ; mov $buf,r0 1361 ; cmp (r0)+,(sp) 1362 ; bne 1b 1363 ; cmp (r0)+,$"tt 1364 ; bne 1b 1365 ; cmpb (r0)+,$'y 1366 ; bne 1b 1367 ; tstb (r0)+ 1368 ; beq 1b 1369 ; cmpb (r0),$'\0 1370 ; bne 1b 1371 ; movb -(r0),name 1372 ; 1373 ;er: 1374 ; mov r1,r0 1375 ; sys close 1376 ; 1377 ;er1: 1378 ; tst (sp)+ 1379 ; movb name,r0 1380 ; rts pc 1381 ; 1382 ;.data 1383 ;dev: 1384 ;.even 1385 ;.bss 1386 ;buf: .=.+40. 1387 ;name: .=.+2 1388 1389 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1390 ;; get.s (unix v5) 1391 ; 1392 ; fopen -- open a file for use by get(c|w) 1393 ; 1394 ;fopen: 1395 ; mov r1,-(sp) 1396 ; mov (r5)+,r1 1397 ; mov r0,0f 1398 ; sys 0; 9f 1399 ;.data 1400 ;9: 1401 ; sys open; 0:..; 0 1402 ;.text 1403 ; bes 1f 1404 ; mov r0,(r1)+ 1405 ; clr (r1)+ 1406 ; mov (sp)+,r1 1407 ; rts r5 1408 ;1: 1409 ; mov $-1,(r1) 1410 ; mov (sp)+,r1 1411 ; sec 1412 ; rts r5 1413 ; 1414 1415 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1416 ;; get.s (unix v5) 1417 ; 1418 ; getc -- get characters from input file 1419 ; 1420 ;getc: 1421 ; mov r1,-(sp) 1422 ; mov (r5)+,r1 1423 ; dec 2(r1) 1424 ; bge 1f 1425 ; mov r1,r0 1426 ; add $6,r0 1427 ; mov r0,0f 1428 ; mov r0,4(r1) 1429 ; mov (r1),r0 1430 ; sys 0; 9f 1431 ;.data 1432 ;9: 1433 ; sys read; 0:..; 512. 1434 ;.text 1435 ; bes 2f 1436 ; tst r0 1437 ; bne 3f 1438 ;2: 1439 ; mov (sp)+,r1 1440 ; sec 1441 ; rts r5 1442 ;3: 1443 ; dec r0 1444 ; mov r0,2(r1) 1445 ;1: 1446 ; clr r0 1447 ; bisb *4(r1),r0 1448 ; inc 4(r1) 1449 ; mov (sp)+,r1 1450 ; rts r5 1451 1452 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1453 ;; crypt.s (unix v5) 1454 ; 1455 ;/ crypt -- password incoding 1456 ; 1457 ;/ mov $key,r0 1458 ;/ jsr pc,crypt 1459 ; 1460 ;.globl crypt, word 1461 ; 1462 ;crypt: 1463 ; mov r1,-(sp) 1464 ; mov r2,-(sp) 1465 ; mov r3,-(sp) 1466 ; mov r4,-(sp) 1467 ; mov r5,-(sp) 1468 ; 1469 ; mov r0,r1 1470 ; mov $key,r0 1471 ; movb $004,(r0)+ 1472 ; movb $034,(r0)+ 1473 ;1: 1474 ; cmp r0,$key+64. 1475 ; bhis 1f 1476 ; movb (r1)+,(r0)+ 1477 ; bne 1b 1478 ;1: 1479 ; dec r0 1480 ;/ 1481 ;/ 1482 ;/ fill out key space with clever junk 1483 ;/ 1484 ; mov $key,r1 1485 ;1: 1486 ; movb -1(r0),r2 1487 ; movb (r1)+,r3 1488 ; xor r3,r2 1489 ; movb r2,(r0)+ 1490 ; cmp r0,$key+128. 1491 ; blo 1b 1492 ;/ 1493 ;/ 1494 ;/ establish wheel codes and cage codes 1495 ;/ 1496 ; mov $wheelcode,r4 1497 ; mov $cagecode,r5 1498 ; mov $256.,-(sp) 1499 ;2: 1500 ; clr r2 1501 ; clr (r4) 1502 ; mov $wheeldiv,r3 1503 ;3: 1504 ; clr r0 1505 ; mov (sp),r1 1506 ; div (r3)+,r0 1507 ; add r1,r2 1508 ; bic $40,r2 1509 ; bis shift(r2),(r4) 1510 ; cmp r3,$wheeldiv+6. 1511 ; bhis 4f 1512 ; bis shift+4(r2),(r5) 1513 ;4: 1514 ; cmp r3,$wheeldiv+10. 1515 ; blo 3b 1516 ; sub $2,(sp) 1517 ; tst (r4)+ 1518 ; tst (r5)+ 1519 ; cmp r4,$wheelcode+256. 1520 ; blo 2b 1521 ; tst (sp)+ 1522 ;/ 1523 ; .data 1524 ;shift: 1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000 1525 ; 1;2 1526 ;wheeldiv: 32.; 18.; 10.; 6.; 4. 1527 ; .bss 1528 ;cagecode: .=.+256. 1529 ;wheelcode: .=.+256. 1530 ; .text 1531 ;/ 1532 ;/ 1533 ;/ make the internal settings of the machine 1534 ;/ both the lugs on the 128 cage bars and the lugs 1535 ;/ on the 16 wheels are set from the expanded key 1536 ;/ 1537 ; mov $key,r0 1538 ; mov $cage,r2 1539 ; mov $wheel,r3 1540 ;1: 1541 ; movb (r0)+,r1 1542 ; bic $!177,r1 1543 ; asl r1 1544 ; mov cagecode(r1),(r2)+ 1545 ; mov wheelcode(r1),(r3)+ 1546 ; cmp r0,$key+128. 1547 ; blo 1b 1548 ;/ 1549 ;/ 1550 ;/ now spin the cage against the wheel to produce output. 1551 ;/ 1552 ; mov $word,r4 1553 ; mov $wheel+128.,r3 1554 ;3: 1555 ; mov -(r3),r2 1556 ; mov $cage,r0 1557 ; clr r5 1558 ;1: 1559 ; bit r2,(r0)+ 1560 ; beq 2f 1561 ; incb r5 1562 ;2: 1563 ; cmp r0,$cage+256. 1564 ; blo 1b 1565 ;/ 1566 ;/ we have a piece of output from current wheel 1567 ;/ it needs to be folded to remove lingering hopes of 1568 ;/ inverting the function 1569 ;/ 1570 ; mov r4,-(sp) 1571 ; clr r4 1572 ; div $26.+26.+10.,r4 1573 ; add $'0,r5 1574 ; cmp r5,$'9 1575 ; blos 1f 1576 ; add $'A-'9-1,r5 1577 ; cmp r5,$'Z 1578 ; blos 1f 1579 ; add $'a-'Z-1,r5 1580 ;1: 1581 ; mov (sp)+,r4 1582 ; movb r5,(r4)+ 1583 ; cmp r4,$word+8. 1584 ; blo 3b 1585 ;/ 1586 ; 1587 ; mov (sp)+,r5 1588 ; mov (sp)+,r4 1589 ; mov (sp)+,r3 1590 ; mov (sp)+,r2 1591 ; mov (sp)+,r1 1592 ; mov $word,r0 1593 ; rts pc 1594 ; .bss 1595 ;key: .=.+128. 1596 ;word: .=.+32. 1597 ;cage: .=.+256. 1598 ;wheel: .=.+256.