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