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