     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) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    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<rep 3h>              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<rep 18h>             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<rep 2h>              align 4
  1011                                  
  1012                                  bss_start:
  1013                                  
  1014                                  ABSOLUTE bss_start
  1015                                  
  1016 0000075C ????????                s_off:	resd 1
  1017                                  
  1018 00000760 <res 10h>               uname: 	resb 16
  1019 00000770 ????                    	resw 1
  1020 00000772 ????????????????        passwd: resb 8
  1021 0000077A ????                    	resw 1
  1022 0000077C <res 20h>               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 <res 42h>               buf:	resb 66   ; Retro UNIX 386 v1.2 (64 byte inode, 64+2)
  1031 000007E2 ????                    ttyname: resw 1
  1032                                  
  1033 000007E4 <res 80h>               key:	resb 128
  1034 00000864 <res Ah>                _word:	resb 10  ; resb 32
  1035 0000086E ????                    	resb 2
  1036 00000870 <res 100h>              cage:	resb 256
  1037 00000970 <res 100h>              wheel:	resb 256
  1038 00000A70 <res 200h>              cagecode:  resw 256
  1039 00000C70 <res 200h>              wheelcode: resw 256
  1040                                  
  1041                                  alignb 4
  1042                                  
  1043 00000E70 <res 208h>              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; <Can't open password file\n\0>; .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; <Login incorrect\n\0>; .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; <No directory\n\0>; .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; <You have mail\n\0>; .even
  1222                                  ;1:
  1223                                  ;	mov	uid,r0
  1224                                  ;	sys	setuid
  1225                                  ;	sys	exec; shell; shellp
  1226                                  ;	jsr	r5,mesg; <No Shell\n\0>; .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; <Password: \0>; .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; <Name: \0>; .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:	</tmp/utmp\0>
  1315                                  ;wtmp:	</tmp/wtmp\0>
  1316                                  ;shell:	</bin/sh\0>; .=shell+32.
  1317                                  ;mshell:<-\0>
  1318                                  ;motd:	</etc/motd\0>
  1319                                  ;mailf:	<mailbox\0>
  1320                                  ;passwdf:</etc/passwd\0>
  1321                                  ;ttyx:	</dev/ttyx\0>
  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:	</dev\0>
  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.
