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