     1                                  ; ****************************************************************************
     2                                  ; login386.s (login2.s) - Retro Unix 386 v1 - /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
    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 BA0A000000          <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
   527 0000046C 723E                    	jc	short er
   528 0000046E 83F80A                  	cmp	eax, 10
   529 00000471 7539                    	jne	short er
   530                                  	;mov	dx, [buf]	; inode number from sysfstat
   531                                  	;cmp	dx, si 		; same inode number ?
   532                                  	; 27/02/2022
   533 00000473 663B35[A0070000]        	cmp	si, [buf]	; same inode number ?
   534 0000047A 75DD                    	jne	short t1	; no, get next dir entry
   535                                  	;mov	dx, [buf+2]	; check (8 byte) file name
   536                                  	;cmp	dx, 'tt'	; 1st 2 chars
   537                                  	; 27/02/2022
   538 0000047C 66813D[A2070000]74-     	cmp	word [buf+2], 'tt' ; First 2 characters
   538 00000484 74                 
   539 00000485 7525                    	jne	short er	; not 'tt'
   540 00000487 668B15[A4070000]        	mov	dx, [buf+4]	; 2nd 2 chars
   541 0000048E 80FA79                  	cmp	dl, 'y'		; check the 3rd char
   542 00000491 7519                    	jne	short er	; not 'y'
   543                                  	;or	dh, dh
   544                                  	;jz	short er
   545 00000493 80FE30                  	cmp	dh, '0'		; < 'tty0'
   546 00000496 7214                    	jb	short er	; yes
   547 00000498 80FE39                  	cmp	dh, '9'		; > 'tty9'
   548 0000049B 770F                    	ja	short er	; yes
   549 0000049D 803D[A6070000]00        	cmp	byte [buf+6], 0
   550 000004A4 7506                    	jne	short er
   551 000004A6 8835[C2070000]          	mov	byte [ttyname], dh
   552                                  er:
   553                                  	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
   554                                  er1:
   555 000004B5 0FB605[C2070000]        	movzx	eax, byte [ttyname]
   556 000004BC 5A                      	pop	edx
   557 000004BD 5E                      	pop	esi
   558 000004BE 5F                      	pop	edi
   559 000004BF C3                      	retn
   560                                  
   561                                  ; open a file for use by get(c|w)
   562                                  ;
   563                                  fopen:
   564                                  	; eax = file name ofset
   565 000004C0 BF[500E0000]            	mov	edi, pbuf
   566                                  	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
   567 000004D3 7207                    	jc	short f1
   568 000004D5 66AB                    	stosw
   569 000004D7 31C0                    	xor	eax, eax ; 0
   570 000004D9 66AB                    	stosw
   571 000004DB C3                      	retn
   572                                  f1:
   573 000004DC 66B8FFFF                	mov	ax, 0FFFFh
   574 000004E0 66AB                    	stosw	
   575 000004E2 C3                      	retn
   576                                  
   577                                  ; get characters from input file
   578                                  ;
   579                                  getc:
   580 000004E3 56                      	push	esi
   581 000004E4 BE[500E0000]            	mov	esi, pbuf
   582                                  	; 16/02/2022
   583                                  	;mov	ax, [esi+2]
   584 000004E9 0FB74602                	movzx	eax, word [esi+2] ; char count
   585                                  	;and	ax, ax
   586 000004ED 21C0                    	and	eax, eax
   587 000004EF 751C                    	jnz	short gch1
   588                                  gch0:
   589 000004F1 0FB71E                  	movzx	ebx, word [esi]
   590 000004F4 B9[580E0000]            	mov	ecx, pbuf + 8 ; read buff. addr.
   591 000004F9 894E04                  	mov 	[esi+4], ecx ; char offset
   592                                  	;mov	[esi+2], ax ; 0
   593                                  	; 16/02/2022
   594 000004FC 29D2                    	sub	edx, edx
   595 000004FE B602                    	mov	dh, 2 
   596                                  	;mov 	edx, 512 
   597                                  	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
   598 00000507 7216                    	jc	short gch2
   599 00000509 09C0                    	or	eax, eax
   600 0000050B 7414                    	jz	short gch3
   601                                  gch1:
   602                                  	;dec	ax
   603                                  	; 16/02/2022
   604 0000050D 48                      	dec	eax
   605 0000050E 66894602                	mov	[esi+2], ax
   606 00000512 8B5E04                  	mov	ebx, [esi+4]
   607                                  	; 16/02/2022
   608                                  	;xor	eax, eax
   609 00000515 30E4                    	xor	ah, ah
   610 00000517 8A03                    	mov	al, [ebx]
   611 00000519 43                      	inc	ebx
   612 0000051A 895E04                  	mov	[esi+4], ebx
   613                                  	;xor	ah, ah
   614 0000051D 5E                      	pop	esi
   615 0000051E C3                      	retn 	
   616                                  gch2:
   617                                  	;xor	ax, ax
   618                                  	; 16/02/2022
   619 0000051F 31C0                    	xor	eax, eax
   620                                  gch3:
   621 00000521 5E                      	pop	esi
   622 00000522 F9                      	stc
   623 00000523 C3                      	retn
   624                                  
   625                                  ;/ crypt -- password incoding
   626                                  ;
   627                                  ;; Original Unix v5 (PDP-11) 'crypt'
   628                                  ;; code has been converted to 
   629                                  ;; Retro UNIX 8086 v1 'crypt' 
   630                                  ;; procedure in 'login.asm'
   631                                  ;; (by Erdogan Tan - 12/11/2013).
   632                                  ; 
   633                                  ;
   634                                  ;crypt:
   635                                  ;	mov	r1,-(sp)
   636                                  ;	mov	r2,-(sp)
   637                                  ;	mov	r3,-(sp)
   638                                  ;	mov	r4,-(sp)
   639                                  ;	mov	r5,-(sp)
   640                                  ;
   641                                  ;	mov	r0,r1
   642                                  ;	mov	$key,r0
   643                                  ;	movb	$004,(r0)+
   644                                  ;	movb	$034,(r0)+
   645                                  
   646                                  ; 14/10/2015 - 32 bit version (Retro UNIX 386 v1)
   647                                  
   648                                  crypt:
   649                                  	;mov	esi, passwd
   650 00000524 BF[C4070000]            	mov	edi, key
   651 00000529 B004                    	mov	al, 4
   652 0000052B AA                      	stosb
   653 0000052C B01C                    	mov	al, 28
   654 0000052E AA                      	stosb
   655                                  
   656                                  ;1:
   657                                  ;	cmp	r0,$key+64.
   658                                  ;	bhis	1f
   659                                  ;	movb	(r1)+,(r0)+
   660                                  ;	bne	1b
   661                                  ;1:
   662                                  ;	dec	r0
   663                                  
   664                                  cryp0:
   665 0000052F AC                      	lodsb
   666 00000530 AA                      	stosb
   667 00000531 20C0                    	and	al, al
   668 00000533 7408                    	jz	short cryp1
   669 00000535 81FF[04080000]          	cmp	edi, key + 64
   670 0000053B 72F2                    	jb	short cryp0
   671                                  cryp1:
   672 0000053D 4F                       	dec	edi
   673                                  ;/
   674                                  ;/
   675                                  ;/	fill out key space with clever junk
   676                                  ;/
   677                                  ;	mov	$key,r1
   678                                  ;1:
   679                                  ;	movb	-1(r0),r2
   680                                  ;	movb	(r1)+,r3
   681                                  ;	xor	r3,r2
   682                                  ;	movb	r2,(r0)+
   683                                  ;	cmp	r0,$key+128.
   684                                  ;	blo	1b
   685                                  
   686                                  
   687                                  ;/	fill out key space with clever junk
   688                                  
   689 0000053E BE[C4070000]            	mov	esi, key
   690                                  cryp2:
   691 00000543 8A5FFF                  	mov	bl, [edi-1]
   692 00000546 AC                      	lodsb
   693 00000547 30D8                    	xor	al, bl
   694 00000549 AA                      	stosb
   695 0000054A 81FF[44080000]          	cmp	edi, key + 128
   696 00000550 72F1                    	jb	short cryp2
   697                                  	;
   698                                  ;/
   699                                  ;/
   700                                  ;/	establish wheel codes and cage codes
   701                                  ;/
   702                                  ;	mov	$wheelcode,r4
   703                                  ;	mov	$cagecode,r5
   704                                  ;	mov	$256.,-(sp)
   705                                  ;2:
   706                                  ;	clr	r2
   707                                  ;	clr	(r4)
   708                                  ;	mov	$wheeldiv,r3
   709                                  ;3:
   710                                  ;	clr	r0
   711                                  ;	mov	(sp),r1
   712                                  ;	div	(r3)+,r0
   713                                  ;	add	r1,r2
   714                                  ;	bic	$40,r2
   715                                  ;	bis	shift(r2),(r4)
   716                                  ;	cmp	r3,$wheeldiv+6.
   717                                  ;	bhis	4f
   718                                  ;	bis	shift+4(r2),(r5)
   719                                  ;4:
   720                                  ;	cmp	r3,$wheeldiv+10.
   721                                  ;	blo	3b
   722                                  ;	sub	$2,(sp)
   723                                  ;	tst	(r4)+
   724                                  ;	tst	(r5)+
   725                                  ;	cmp	r4,$wheelcode+256.
   726                                  ;	blo	2b
   727                                  ;	tst	(sp)+
   728                                  ;/	
   729                                  
   730                                  ;/	establish wheel codes and cage codes
   731                                  
   732 00000552 BE[500C0000]            	mov	esi, wheelcode
   733 00000557 BF[500A0000]            	mov	edi, cagecode
   734 0000055C 66B80001                	mov	ax, 256
   735 00000560 6650                    	push	ax ; *
   736 00000562 89E5                    	mov	ebp, esp
   737                                  cryp3:
   738 00000564 6629D2                  	sub	dx, dx ; 0
   739 00000567 668916                  	mov	[esi], dx ; 0
   740 0000056A BB[52070000]            	mov	ebx, wheeldiv
   741                                  cryp4:
   742 0000056F 668B4500                	mov	ax, [ebp]	
   743 00000573 8A0B                    	mov 	cl, [ebx]
   744 00000575 F6F1                    	div	cl
   745 00000577 00E2                    	add	dl, ah
   746 00000579 43                      	inc	ebx
   747 0000057A 80E21F                  	and	dl, 01Fh
   748 0000057D 53                      	push	ebx
   749 0000057E BB[2E070000]            	mov	ebx, shift
   750 00000583 01D3                    	add	ebx, edx
   751 00000585 668B03                  	mov	ax, [ebx] 
   752 00000588 660906                  	or	[esi], ax
   753 0000058B 59                      	pop	ecx
   754 0000058C 81F9[55070000]          	cmp	ecx, wheeldiv + 3
   755 00000592 7309                    	jnb	short cryp5
   756 00000594 83C304                  	add	ebx, 4
   757 00000597 668B03                  	mov	ax, [ebx]
   758 0000059A 660907                  	or	[edi], ax 	 
   759                                  cryp5:
   760 0000059D 89CB                    	mov	ebx, ecx
   761 0000059F 81FB[57070000]          	cmp	ebx, wheeldiv + 5
   762 000005A5 72C8                    	jb	short cryp4
   763 000005A7 66836D0002              	sub	word [ebp], 2
   764 000005AC 66AD                    	lodsw
   765 000005AE 47                      	inc	edi
   766 000005AF 47                      	inc	edi
   767 000005B0 81FE[500D0000]          	cmp	esi, wheelcode + 256
   768 000005B6 72AC                    	jb	short cryp3
   769 000005B8 6658                    	pop	ax ; *
   770                                  
   771                                  ;	.data
   772                                  ;shift:	1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000
   773                                  ;	1;2
   774                                  ;wheeldiv: 32.; 18.; 10.; 6.; 4.
   775                                  ;	.bss
   776                                  ;cagecode: .=.+256.
   777                                  ;wheelcode: .=.+256.
   778                                  ;	.text
   779                                  ;/
   780                                  ;/
   781                                  ;/	make the internal settings of the machine
   782                                  ;/	both the lugs on the 128 cage bars and the lugs
   783                                  ;/	on the 16 wheels are set from the expanded key
   784                                  ;/
   785                                  ;	mov	$key,r0
   786                                  ;	mov	$cage,r2
   787                                  ;	mov	$wheel,r3
   788                                  ;1:
   789                                  ;	movb	(r0)+,r1
   790                                  ;	bic	$!177,r1
   791                                  ;	asl	r1
   792                                  ;	mov	cagecode(r1),(r2)+
   793                                  ;	mov	wheelcode(r1),(r3)+
   794                                  ;	cmp	r0,$key+128.
   795                                  ;	blo	1b
   796                                  
   797                                  ;/	make the internal settings of the machine
   798                                  ;/	both the lugs on the 128 cage bars and the lugs
   799                                  ;/	on the 16 wheels are set from the expanded key
   800                                  cryp6:
   801 000005BA BB[C4070000]                    mov     ebx, key
   802 000005BF BE[50080000]                    mov     esi, cage
   803 000005C4 BF[50090000]                    mov     edi, wheel
   804                                  cryp7:
   805 000005C9 8A0B                            mov     cl, [ebx]
   806 000005CB 43                              inc     ebx
   807 000005CC 83E17F                          and     ecx, 7Fh
   808 000005CF D0E1                    	shl	cl, 1
   809 000005D1 87CB                            xchg    ecx, ebx
   810 000005D3 668B83[500A0000]                mov     ax, [ebx+cagecode]
   811 000005DA 668906                          mov     [esi], ax
   812 000005DD 46                              inc     esi
   813 000005DE 46                              inc     esi
   814 000005DF 668B83[500C0000]                mov     ax, [ebx+wheelcode]
   815 000005E6 66AB                    	stosw
   816 000005E8 89CB                            mov     ebx, ecx
   817 000005EA 81FB[44080000]                  cmp     ebx, key + 128
   818 000005F0 72D7                    	jb	short cryp7
   819                                  
   820                                  ;/
   821                                  ;/
   822                                  ;/	now spin the cage against the wheel to produce output.
   823                                  ;/
   824                                  ;	mov	$word,r4
   825                                  ;	mov	$wheel+128.,r3
   826                                  ;3:
   827                                  ;	mov	-(r3),r2
   828                                  ;	mov	$cage,r0
   829                                  ;	clr	r5
   830                                  ;1:
   831                                  ;	bit	r2,(r0)+
   832                                  ;	beq	2f
   833                                  ;	incb	r5
   834                                  ;2:
   835                                  ;	cmp	r0,$cage+256.
   836                                  ;	blo	1b
   837                                  
   838                                  ;/
   839                                  ;/	now spin the cage against the wheel to produce output.
   840                                  ;/
   841                                  cryp8:
   842 000005F2 BF[44080000]                    mov     edi, _word
   843 000005F7 BB[D0090000]                    mov     ebx, wheel + 128
   844                                  cryp9:
   845 000005FC 4B                              dec     ebx
   846 000005FD 4B                              dec     ebx
   847 000005FE 668B13                          mov     dx, [ebx]
   848 00000601 BE[50080000]                    mov     esi, cage
   849 00000606 6629C9                  	sub	cx, cx ; 0
   850                                  cryp10:
   851 00000609 66AD                    	lodsw
   852 0000060B 6685D0                  	test	ax, dx
   853 0000060E 7402                    	jz	short cryp11
   854 00000610 FEC1                    	inc	cl
   855                                  cryp11:
   856 00000612 81FE[50090000]                  cmp     esi, cage + 256
   857 00000618 72EF                    	jb	short cryp10
   858                                  
   859                                  ;/
   860                                  ;/	we have a piece of output from current wheel
   861                                  ;/	it needs to be folded to remove lingering hopes of
   862                                  ;/	inverting the function
   863                                  ;/
   864                                  ;	mov	r4,-(sp)
   865                                  ;	clr	r4
   866                                  ;	div	$26.+26.+10.,r4
   867                                  ;	add	$'0,r5
   868                                  ;	cmp	r5,$'9
   869                                  ;	blos	1f
   870                                  ;	add	$'A-'9-1,r5
   871                                  ;	cmp	r5,$'Z
   872                                  ;	blos	1f
   873                                  ;	add	$'a-'Z-1,r5
   874                                  ;1:
   875                                  ;	mov	(sp)+,r4
   876                                  ;	movb	r5,(r4)+
   877                                  ;	cmp	r4,$word+8.
   878                                  ;	blo	3b
   879                                  ;/
   880                                  ;
   881                                  ;	mov	(sp)+,r5
   882                                  ;	mov	(sp)+,r4
   883                                  ;	mov	(sp)+,r3
   884                                  ;	mov	(sp)+,r2
   885                                  ;	mov	(sp)+,r1
   886                                  ;	mov	$word,r0
   887                                  ;	rts	pc
   888                                  ;	.bss
   889                                  ;key:	.=.+128.
   890                                  ;word:	.=.+32.
   891                                  ;cage:	.=.+256.
   892                                  ;wheel:	.=.+256.
   893                                  
   894                                  ;/
   895                                  ;/	we have a piece of output from current wheel
   896                                  ;/	it needs to be folded to remove lingering hopes of
   897                                  ;/	inverting the function
   898                                  ;/
   899 0000061A 6689C8                  	mov	ax, cx
   900 0000061D B23E                    	mov	dl, 26+26+10
   901 0000061F F6F2                    	div	dl
   902 00000621 88E0                    	mov	al, ah
   903 00000623 0430                    	add	al, '0'
   904 00000625 3C39                    	cmp	al, '9'
   905 00000627 7608                    	jna	short cryp12
   906 00000629 0407                    	add	al, 'A'-'9'-1
   907 0000062B 3C5A                    	cmp	al, 'Z'
   908 0000062D 7602                    	jna	short cryp12
   909 0000062F 0406                    	add	al, 'a'-'Z'-1
   910                                  cryp12:
   911 00000631 AA                      	stosb	
   912 00000632 81FF[4C080000]                  cmp     edi, _word + 8
   913 00000638 72C2                    	jb	short cryp9
   914 0000063A BE[44080000]                    mov     esi, _word
   915 0000063F C3                      	retn
   916                                  
   917                                  
   918                                  align 4
   919                                  shellp:
   920 00000640 [7C060000]              	dd mshell
   921 00000644 00000000                	dd 0
   922 00000648 2F746D702F75746D70      utmp:   db '/tmp/utmp'
   923 00000651 00                              db 0
   924 00000652 2F746D702F77746D70      wtmp:   db '/tmp/wtmp'
   925 0000065B 00                              db 0
   926 0000065C 2F62696E2F7368          shell:	db '/bin/sh'
   927 00000663 00                      	db 0
   928                                  shpl 	equ shell + 32 - shpad
   929 00000664 00<rep 18h>             shpad:  times shpl db 0
   930                                  
   931 0000067C 2D                      mshell: db '-'
   932 0000067D 00                      	db 0
   933 0000067E 2F6574632F6D6F7464      motd:   db '/etc/motd'
   934 00000687 00                              db 0
   935 00000688 6D61696C626F78          mailf:  db 'mailbox'
   936 0000068F 00                              db 0
   937                                  align 2
   938 00000690 2F6574632F70617373-     passwdf: db '/etc/passwd'
   938 00000699 7764               
   939 0000069B 00                              db 0
   940 0000069C 2F6465762F747479        ttyx:   db '/dev/tty' ; db '/dev/ttyx'
   941 000006A4 00                              db 0
   942                                  
   943 000006A5 2F64657600              dev:    db '/dev', 0
   944                                  
   945                                  align 2
   946 000006AA 0D0A4E616D653A2000      msgName:  db 0Dh, 0Ah, 'Name: ', 0
   947 000006B3 90                      align 2
   948 000006B4 0D0A50617373776F72-     msgPswd:  db 0Dh, 0Ah, 'Password: ', 0
   948 000006BD 643A2000           
   949 000006C1 90                      align 2
   950 000006C2 0D0A4C6F67696E2069-     msgIL:	  db 0Dh, 0Ah, 'Login incorrect !', 0
   950 000006CB 6E636F727265637420-
   950 000006D4 2100               
   951                                  ;align 2
   952 000006D6 0D0A4E6F205368656C-     msgNoSh:  db 0Dh, 0Ah, 'No Shell !'
   952 000006DF 6C2021             
   953 000006E2 0D0A00                  nextline: db 0Dh, 0Ah, 0
   954 000006E5 90                      align 2
   955                                  msgNoPswdf:
   956 000006E6 0D0A43616E2774206F-             db 0Dh, 0Ah, "Can't open password file !"
   956 000006EF 70656E207061737377-
   956 000006F8 6F72642066696C6520-
   956 00000701 21                 
   957 00000702 0D0A00                  	db 0Dh, 0Ah, 0
   958 00000705 90                      align 2
   959                                  msgNoDir:
   960 00000706 0D0A4E6F2064697265-     	db 0Dh, 0Ah, 'No directory !'
   960 0000070F 63746F72792021     
   961 00000716 0D0A00                  	db 0Dh, 0Ah, 0
   962 00000719 90                      align 2
   963                                  msgMail:
   964 0000071A 0D0A596F7520686176-     	db 0Dh, 0Ah, 'You have mail.'
   964 00000723 65206D61696C2E     
   965 0000072A 0D0A00                  	db 0Dh, 0Ah, 0
   966                                  
   967 0000072D 90                      align 2
   968 0000072E 010002000400080010-     shift:	dw 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
   968 00000737 002000400080000001-
   968 00000740 000200040008001000-
   968 00000749 2000400080         
   969 0000074E 01000200                	dw 1, 2
   970 00000752 20120A0604              wheeldiv: db 32, 18, 10, 6, 4
   971                                  
   972 00000757 90                      align 2	
   973 00000758 A101                    	dw 417 ; 01A1h
   974                                  
   975 0000075A 90<rep 2h>              align 4
   976                                  
   977                                  bss_start:
   978                                  
   979                                  ABSOLUTE bss_start
   980                                  
   981 0000075C ????????                s_off:	resd 1
   982                                  
   983 00000760 <res 10h>               uname: 	resb 16
   984 00000770 ????                    	resw 1
   985 00000772 ????????????????        passwd: resb 8
   986 0000077A ????                    	resw 1
   987 0000077C <res 20h>               dirbuf: resb 32
   988                                  ;shbuf: resb 32
   989                                  ;ttyb:  resb 6
   990 0000079C ????                    uid:    resw 1
   991 0000079E ????                    chr:	resw 1
   992                                  
   993 000007A0 <res 22h>               buf:	resb 34
   994 000007C2 ????                    ttyname: resw 1
   995                                  
   996 000007C4 <res 80h>               key:	resb 128
   997 00000844 <res Ah>                _word:	resb 10  ; resb 32
   998 0000084E ????                    	resb 2
   999 00000850 <res 100h>              cage:	resb 256
  1000 00000950 <res 100h>              wheel:	resb 256
  1001 00000A50 <res 200h>              cagecode:  resw 256
  1002 00000C50 <res 200h>              wheelcode: resw 256
  1003                                  
  1004                                  alignb 4
  1005                                  
  1006 00000E50 <res 208h>              pbuf:   resb 520
  1007                                  	
  1008                                  bss_end:
  1009                                  
  1010                                  _end:  ; end of login386.s (NASM 2.11) source code
  1011                                  
  1012                                  
  1013                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1014                                  ;; login.s
  1015                                  ;
  1016                                  ;/  login --  enter new user
  1017                                  ;
  1018                                  ;.globl	ttyn
  1019                                  ;.globl	crypt
  1020                                  ;.globl	fopen
  1021                                  ;.globl	getc
  1022                                  ;.globl	mesg
  1023                                  ;
  1024                                  ;	sys	quit; 0
  1025                                  ;	sys	intr; 0
  1026                                  ;	jsr	pc,ttyn
  1027                                  ;	movb	r0,ttyx+8.
  1028                                  ;	sub	$'0,r0
  1029                                  ;	cmp	r0,$'a-'0
  1030                                  ;	blo	1f
  1031                                  ;	sub	$'a-'0-10.,r0	/ map a-z into 10. on
  1032                                  ;1:
  1033                                  ;	asl	r0
  1034                                  ;	asl	r0
  1035                                  ;	asl	r0
  1036                                  ;	asl	r0
  1037                                  ;	mov	r0,offset
  1038                                  ;	mov	(sp)+,r5
  1039                                  ;	tst	(sp)+
  1040                                  ;	dec	r5
  1041                                  ;	ble	login
  1042                                  ;	mov	(sp)+,r4
  1043                                  ;	mov	$uname,r1
  1044                                  ;2:
  1045                                  ;	movb	(r4)+,(r1)+
  1046                                  ;	bne	2b
  1047                                  ;	dec	r5
  1048                                  ;	ble	login
  1049                                  ;	mov	(sp)+,r4
  1050                                  ;	mov	$passwd,r1
  1051                                  ;2:
  1052                                  ;	movb	(r4)+,(r1)+
  1053                                  ;	bne	2b
  1054                                  ;login:
  1055                                  ;	clrb	uname+8.
  1056                                  ;	mov	$passwdf,r0
  1057                                  ;	jsr	r5,fopen; pbuf
  1058                                  ;	bec	1f
  1059                                  ;	jsr	r5,mesg; <Can't open password file\n\0>; .even
  1060                                  ;	sys	exit
  1061                                  ;1:
  1062                                  ;	jsr	pc,guname
  1063                                  ;1:
  1064                                  ;	jsr	r5,compar; uname
  1065                                  ;		br .+4
  1066                                  ;	br	2f
  1067                                  ;3:
  1068                                  ;	jsr	r5,getc; pbuf
  1069                                  ;	bes	sorry
  1070                                  ;	cmp	r0,$'\n
  1071                                  ;	bne	3b
  1072                                  ;	br	1b
  1073                                  ;sorry:
  1074                                  ;	jsr	r5,mesg; <Login incorrect\n\0>; .even
  1075                                  ;	mov	pbuf,r0
  1076                                  ;	sys	close
  1077                                  ;	clr	uname
  1078                                  ;	clr	passwd
  1079                                  ;	br	login
  1080                                  ;2:
  1081                                  ;	jsr	r5,getc; pbuf
  1082                                  ;	cmp	r0,$':
  1083                                  ;	beq	2f
  1084                                  ;	mov	r0,-(sp)
  1085                                  ;	jsr	pc,gpasswd
  1086                                  ;	cmpb	(r0)+,(sp)+
  1087                                  ;	bne	sorry
  1088                                  ;	mov	r0,0f
  1089                                  ;	jsr	r5,compar; 0:..
  1090                                  ;		br sorry
  1091                                  ;2:
  1092                                  ;	clr	r1
  1093                                  ;2:
  1094                                  ;	jsr	r5,getc; pbuf
  1095                                  ;	cmp	r0,$':
  1096                                  ;	beq	2f
  1097                                  ;	mpy	$10.,r1
  1098                                  ;	sub	$'0,r0
  1099                                  ;	add	r0,r1
  1100                                  ;	br	2b
  1101                                  ;2:
  1102                                  ;	mov	r1,0f
  1103                                  ;	sys	chown; ttyx; 0:..
  1104                                  ;	mov	r1,uid
  1105                                  ;1:
  1106                                  ;	jsr	r5,getc; pbuf
  1107                                  ;	cmp	r0,$':
  1108                                  ;	bne	1b			/ skip ident field
  1109                                  ;	mov	$dirbuf,r1
  1110                                  ;1:
  1111                                  ;	jsr	r5,getc; pbuf
  1112                                  ;	cmpb	r0,$':
  1113                                  ;	beq	1f
  1114                                  ;	movb	r0,(r1)+
  1115                                  ;	br	1b
  1116                                  ;1:
  1117                                  ;	clrb	(r1)
  1118                                  ;	sys	chdir; dirbuf
  1119                                  ;	bec	1f
  1120                                  ;	jsr	r5,mesg; <No directory\n\0>; .even
  1121                                  ;	br	sorry
  1122                                  ;1:
  1123                                  ;	mov	$uname+8.,r1
  1124                                  ;1:
  1125                                  ;	tstb	-(r1)
  1126                                  ;	bne	1f
  1127                                  ;	movb	$' ,(r1)
  1128                                  ;	br	1b
  1129                                  ;1:
  1130                                  ;	cmpb	ttyx+8.,$'x
  1131                                  ;	beq	1f
  1132                                  ;	sys	open; utmp; 1
  1133                                  ;	bes	1f
  1134                                  ;	mov	r0,r2
  1135                                  ;	sys	seek; offset:..; 0
  1136                                  ;	movb	ttyx+8.,uname+8.
  1137                                  ;	sys	time
  1138                                  ;	mov	r0,uname+10.
  1139                                  ;	mov	r1,uname+12.
  1140                                  ;	mov	r2,r0
  1141                                  ;	sys	write; uname; 16.
  1142                                  ;	mov	r2,r0
  1143                                  ;	sys	close
  1144                                  ;1:
  1145                                  ;	cmpb	ttyx+8.,$'x
  1146                                  ;	beq	1f
  1147                                  ;	sys	open; wtmp; 1
  1148                                  ;	bes	1f
  1149                                  ;	mov	r0,r1
  1150                                  ;	sys	seek; 0; 2
  1151                                  ;	sys	write; uname; 16.
  1152                                  ;	mov	r1,r0
  1153                                  ;	sys	close
  1154                                  ;1:
  1155                                  ;	jsr	r5,getc; pbuf
  1156                                  ;	cmp	r0,$'\n
  1157                                  ;	beq	1f
  1158                                  ;	mov	$shell,r1
  1159                                  ;2:
  1160                                  ;	movb	r0,(r1)+
  1161                                  ;	jsr	r5,getc; pbuf
  1162                                  ;	cmp	r0,$'\n
  1163                                  ;	bne	2b
  1164                                  ;	clrb	(r1)
  1165                                  ;1:
  1166                                  ;	mov	pbuf,r0
  1167                                  ;	sys	close
  1168                                  ;	mov	$motd,r0
  1169                                  ;	jsr	r5,fopen; pbuf
  1170                                  ;	bes	1f
  1171                                  ;2:
  1172                                  ;	jsr	r5,getc; pbuf
  1173                                  ;	bes	1f
  1174                                  ;	mov	r0,uname
  1175                                  ;	mov	$1,r0
  1176                                  ;	sys	write; uname; 1
  1177                                  ;	br	2b
  1178                                  ;1:
  1179                                  ;	mov	pbuf,r0
  1180                                  ;	sys	close
  1181                                  ;	sys	stat; mailf; pbuf
  1182                                  ;	bes	1f
  1183                                  ;	tst	pbuf+6
  1184                                  ;	beq	1f
  1185                                  ;	jsr	r5,mesg; <You have mail\n\0>; .even
  1186                                  ;1:
  1187                                  ;	mov	uid,r0
  1188                                  ;	sys	setuid
  1189                                  ;	sys	exec; shell; shellp
  1190                                  ;	jsr	r5,mesg; <No Shell\n\0>; .even
  1191                                  ;	sys	exit
  1192                                  ;
  1193                                  ;gpasswd:
  1194                                  ;	mov	$passwd,r1
  1195                                  ;	tstb	(r1)
  1196                                  ;	bne	3f
  1197                                  ;	clr	r0
  1198                                  ;	sys	gtty; ttyb
  1199                                  ;	bic	$10,ttyb+4		/ turn off echo
  1200                                  ;	clr	r0
  1201                                  ;	sys	stty; ttyb
  1202                                  ;	jsr	r5,mesg; <Password: \0>; .even
  1203                                  ;2:
  1204                                  ;	jsr	pc,tgetc
  1205                                  ;	movb	r0,(r1)+
  1206                                  ;	beq	1f
  1207                                  ;	cmp	r1,$passwd+9.
  1208                                  ;	blo	2b
  1209                                  ;	dec	r1
  1210                                  ;	br	2b
  1211                                  ;1:
  1212                                  ;	bis	$10,ttyb+4		/ turn on echo
  1213                                  ;	clr	r0
  1214                                  ;	sys	stty; ttyb
  1215                                  ;	jsr	r5,mesg; <\n\0>; .even
  1216                                  ;3:
  1217                                  ;	mov	$passwd,r0
  1218                                  ;	jsr	pc,crypt
  1219                                  ;	clrb	8(r0)
  1220                                  ;	rts	pc
  1221                                  ;
  1222                                  ;guname:
  1223                                  ;	mov	$uname,r1
  1224                                  ;	tstb	(r1)
  1225                                  ;	bne	1f
  1226                                  ;	clr	(r1)+
  1227                                  ;	clr	(r1)+
  1228                                  ;	clr	(r1)+
  1229                                  ;	clr	(r1)+
  1230                                  ;	mov	$uname,r1
  1231                                  ;	jsr	r5,mesg; <Name: \0>; .even
  1232                                  ;2:
  1233                                  ;	jsr	pc,tgetc
  1234                                  ;	movb	r0,(r1)+
  1235                                  ;	beq	1f
  1236                                  ;	cmp	r1,$uname+9.
  1237                                  ;	blo	2b
  1238                                  ;	dec	r1
  1239                                  ;	br	2b
  1240                                  ;1:
  1241                                  ;	rts	pc
  1242                                  ;
  1243                                  ;compar:
  1244                                  ;	mov	(r5)+,r4
  1245                                  ;1:
  1246                                  ;	jsr	r5,getc; pbuf
  1247                                  ;	bes	2f
  1248                                  ;	cmpb	r0,(r4)+
  1249                                  ;	beq	1b
  1250                                  ;	cmp	r0,$':
  1251                                  ;	bne	1f
  1252                                  ;	tstb	-(r4)
  1253                                  ;	bne	1f
  1254                                  ;	tst	(r5)+
  1255                                  ;1:
  1256                                  ;	rts	r5
  1257                                  ;2:
  1258                                  ;	tst	(sp)+
  1259                                  ;	jmp	sorry
  1260                                  ;
  1261                                  ;tgetc:
  1262                                  ;	clr	r0
  1263                                  ;	sys	read; ch; 1
  1264                                  ;	tst	r0
  1265                                  ;	bne	1f
  1266                                  ;	sys	exit
  1267                                  ;1:
  1268                                  ;	mov	ch,r0
  1269                                  ;	cmp	r0,$'\n
  1270                                  ;	bne	1f
  1271                                  ;	clr	r0
  1272                                  ;1:
  1273                                  ;	rts	pc
  1274                                  ;
  1275                                  ;shellp:
  1276                                  ;	mshell
  1277                                  ;	0
  1278                                  ;utmp:	</tmp/utmp\0>
  1279                                  ;wtmp:	</tmp/wtmp\0>
  1280                                  ;shell:	</bin/sh\0>; .=shell+32.
  1281                                  ;mshell:<-\0>
  1282                                  ;motd:	</etc/motd\0>
  1283                                  ;mailf:	<mailbox\0>
  1284                                  ;passwdf:</etc/passwd\0>
  1285                                  ;ttyx:	</dev/ttyx\0>
  1286                                  ;.even
  1287                                  ;.bss
  1288                                  ;uname: .=.+16.
  1289                                  ;passwd:.=.+8.
  1290                                  ;dirbuf:.=.+32.
  1291                                  ;shbuf:	.=.+32.
  1292                                  ;ttyb:	.=.+6
  1293                                  ;uid:	.=.+2
  1294                                  ;ch:	.=.+2
  1295                                  ;pbuf:	.=.+518.
  1296                                  
  1297                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1298                                  ;; ttyn.s
  1299                                  ;
  1300                                  ;/ return name of current tty
  1301                                  ;
  1302                                  ;.globl	ttyn, _ttyn
  1303                                  ;
  1304                                  ;_ttyn:
  1305                                  ;	mov	2(sp),r0
  1306                                  ;	br	1f
  1307                                  ;ttyn:
  1308                                  ;	clr	r0
  1309                                  ;1:
  1310                                  ;	mov	$'x,name
  1311                                  ;	tst	-(sp)
  1312                                  ;	sys	fstat; buf
  1313                                  ;	bes	er1
  1314                                  ;	mov	buf+2,(sp)
  1315                                  ;	sys	open; dev; 0
  1316                                  ;	bes	er1
  1317                                  ;	mov	r0,r1
  1318                                  ;1:
  1319                                  ;	mov	r1,r0
  1320                                  ;	sys	read; buf; 16.
  1321                                  ;	bes	er
  1322                                  ;	cmp	r0,$16.
  1323                                  ;	bne	er
  1324                                  ;	mov	$buf,r0
  1325                                  ;	cmp	(r0)+,(sp)
  1326                                  ;	bne	1b
  1327                                  ;	cmp	(r0)+,$"tt
  1328                                  ;	bne	1b
  1329                                  ;	cmpb	(r0)+,$'y
  1330                                  ;	bne	1b
  1331                                  ;	tstb	(r0)+
  1332                                  ;	beq	1b
  1333                                  ;	cmpb	(r0),$'\0
  1334                                  ;	bne	1b
  1335                                  ;	movb	-(r0),name
  1336                                  ;
  1337                                  ;er:
  1338                                  ;	mov	r1,r0
  1339                                  ;	sys	close
  1340                                  ;
  1341                                  ;er1:
  1342                                  ;	tst	(sp)+
  1343                                  ;	movb	name,r0
  1344                                  ;	rts	pc
  1345                                  ;
  1346                                  ;.data
  1347                                  ;dev:	</dev\0>
  1348                                  ;.even
  1349                                  ;.bss
  1350                                  ;buf:	.=.+40.
  1351                                  ;name:	.=.+2
  1352                                  
  1353                                  
  1354                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1355                                  ;; get.s (unix v5)
  1356                                  ;
  1357                                  ; fopen -- open a file for use by get(c|w)
  1358                                  ;
  1359                                  ;fopen:
  1360                                  ;	mov	r1,-(sp)
  1361                                  ;	mov	(r5)+,r1
  1362                                  ;	mov	r0,0f
  1363                                  ;	sys	0; 9f
  1364                                  ;.data
  1365                                  ;9:
  1366                                  ;	sys	open; 0:..; 0
  1367                                  ;.text
  1368                                  ;	bes	1f
  1369                                  ;	mov	r0,(r1)+
  1370                                  ;	clr	(r1)+
  1371                                  ;	mov	(sp)+,r1
  1372                                  ;	rts	r5
  1373                                  ;1:
  1374                                  ;	mov	$-1,(r1)
  1375                                  ;	mov	(sp)+,r1
  1376                                  ;	sec
  1377                                  ;	rts	r5
  1378                                  ;
  1379                                  
  1380                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1381                                  ;; get.s (unix v5)
  1382                                  ;
  1383                                  ; getc -- get characters from input file
  1384                                  ;
  1385                                  ;getc:
  1386                                  ;	mov	r1,-(sp)
  1387                                  ;	mov	(r5)+,r1
  1388                                  ;	dec	2(r1)
  1389                                  ;	bge	1f
  1390                                  ;	mov	r1,r0
  1391                                  ;	add	$6,r0
  1392                                  ;	mov	r0,0f
  1393                                  ;	mov	r0,4(r1)
  1394                                  ;	mov	(r1),r0
  1395                                  ;	sys	0; 9f
  1396                                  ;.data
  1397                                  ;9:
  1398                                  ;	sys	read; 0:..; 512.
  1399                                  ;.text
  1400                                  ;	bes	2f
  1401                                  ;	tst	r0
  1402                                  ;	bne	3f
  1403                                  ;2:
  1404                                  ;	mov	(sp)+,r1
  1405                                  ;	sec
  1406                                  ;	rts	r5
  1407                                  ;3:
  1408                                  ;	dec	r0
  1409                                  ;	mov	r0,2(r1)
  1410                                  ;1:
  1411                                  ;	clr	r0
  1412                                  ;	bisb	*4(r1),r0
  1413                                  ;	inc	4(r1)
  1414                                  ;	mov	(sp)+,r1
  1415                                  ;	rts	r5
  1416                                  
  1417                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1418                                  ;; crypt.s (unix v5)
  1419                                  ;
  1420                                  ;/ crypt -- password incoding
  1421                                  ;
  1422                                  ;/	mov	$key,r0
  1423                                  ;/	jsr	pc,crypt
  1424                                  ;
  1425                                  ;.globl	crypt, word
  1426                                  ;
  1427                                  ;crypt:
  1428                                  ;	mov	r1,-(sp)
  1429                                  ;	mov	r2,-(sp)
  1430                                  ;	mov	r3,-(sp)
  1431                                  ;	mov	r4,-(sp)
  1432                                  ;	mov	r5,-(sp)
  1433                                  ;
  1434                                  ;	mov	r0,r1
  1435                                  ;	mov	$key,r0
  1436                                  ;	movb	$004,(r0)+
  1437                                  ;	movb	$034,(r0)+
  1438                                  ;1:
  1439                                  ;	cmp	r0,$key+64.
  1440                                  ;	bhis	1f
  1441                                  ;	movb	(r1)+,(r0)+
  1442                                  ;	bne	1b
  1443                                  ;1:
  1444                                  ;	dec	r0
  1445                                  ;/
  1446                                  ;/
  1447                                  ;/	fill out key space with clever junk
  1448                                  ;/
  1449                                  ;	mov	$key,r1
  1450                                  ;1:
  1451                                  ;	movb	-1(r0),r2
  1452                                  ;	movb	(r1)+,r3
  1453                                  ;	xor	r3,r2
  1454                                  ;	movb	r2,(r0)+
  1455                                  ;	cmp	r0,$key+128.
  1456                                  ;	blo	1b
  1457                                  ;/
  1458                                  ;/
  1459                                  ;/	establish wheel codes and cage codes
  1460                                  ;/
  1461                                  ;	mov	$wheelcode,r4
  1462                                  ;	mov	$cagecode,r5
  1463                                  ;	mov	$256.,-(sp)
  1464                                  ;2:
  1465                                  ;	clr	r2
  1466                                  ;	clr	(r4)
  1467                                  ;	mov	$wheeldiv,r3
  1468                                  ;3:
  1469                                  ;	clr	r0
  1470                                  ;	mov	(sp),r1
  1471                                  ;	div	(r3)+,r0
  1472                                  ;	add	r1,r2
  1473                                  ;	bic	$40,r2
  1474                                  ;	bis	shift(r2),(r4)
  1475                                  ;	cmp	r3,$wheeldiv+6.
  1476                                  ;	bhis	4f
  1477                                  ;	bis	shift+4(r2),(r5)
  1478                                  ;4:
  1479                                  ;	cmp	r3,$wheeldiv+10.
  1480                                  ;	blo	3b
  1481                                  ;	sub	$2,(sp)
  1482                                  ;	tst	(r4)+
  1483                                  ;	tst	(r5)+
  1484                                  ;	cmp	r4,$wheelcode+256.
  1485                                  ;	blo	2b
  1486                                  ;	tst	(sp)+
  1487                                  ;/
  1488                                  ;	.data
  1489                                  ;shift:	1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000
  1490                                  ;	1;2
  1491                                  ;wheeldiv: 32.; 18.; 10.; 6.; 4.
  1492                                  ;	.bss
  1493                                  ;cagecode: .=.+256.
  1494                                  ;wheelcode: .=.+256.
  1495                                  ;	.text
  1496                                  ;/
  1497                                  ;/
  1498                                  ;/	make the internal settings of the machine
  1499                                  ;/	both the lugs on the 128 cage bars and the lugs
  1500                                  ;/	on the 16 wheels are set from the expanded key
  1501                                  ;/
  1502                                  ;	mov	$key,r0
  1503                                  ;	mov	$cage,r2
  1504                                  ;	mov	$wheel,r3
  1505                                  ;1:
  1506                                  ;	movb	(r0)+,r1
  1507                                  ;	bic	$!177,r1
  1508                                  ;	asl	r1
  1509                                  ;	mov	cagecode(r1),(r2)+
  1510                                  ;	mov	wheelcode(r1),(r3)+
  1511                                  ;	cmp	r0,$key+128.
  1512                                  ;	blo	1b
  1513                                  ;/
  1514                                  ;/
  1515                                  ;/	now spin the cage against the wheel to produce output.
  1516                                  ;/
  1517                                  ;	mov	$word,r4
  1518                                  ;	mov	$wheel+128.,r3
  1519                                  ;3:
  1520                                  ;	mov	-(r3),r2
  1521                                  ;	mov	$cage,r0
  1522                                  ;	clr	r5
  1523                                  ;1:
  1524                                  ;	bit	r2,(r0)+
  1525                                  ;	beq	2f
  1526                                  ;	incb	r5
  1527                                  ;2:
  1528                                  ;	cmp	r0,$cage+256.
  1529                                  ;	blo	1b
  1530                                  ;/
  1531                                  ;/	we have a piece of output from current wheel
  1532                                  ;/	it needs to be folded to remove lingering hopes of
  1533                                  ;/	inverting the function
  1534                                  ;/
  1535                                  ;	mov	r4,-(sp)
  1536                                  ;	clr	r4
  1537                                  ;	div	$26.+26.+10.,r4
  1538                                  ;	add	$'0,r5
  1539                                  ;	cmp	r5,$'9
  1540                                  ;	blos	1f
  1541                                  ;	add	$'A-'9-1,r5
  1542                                  ;	cmp	r5,$'Z
  1543                                  ;	blos	1f
  1544                                  ;	add	$'a-'Z-1,r5
  1545                                  ;1:
  1546                                  ;	mov	(sp)+,r4
  1547                                  ;	movb	r5,(r4)+
  1548                                  ;	cmp	r4,$word+8.
  1549                                  ;	blo	3b
  1550                                  ;/
  1551                                  ;
  1552                                  ;	mov	(sp)+,r5
  1553                                  ;	mov	(sp)+,r4
  1554                                  ;	mov	(sp)+,r3
  1555                                  ;	mov	(sp)+,r2
  1556                                  ;	mov	(sp)+,r1
  1557                                  ;	mov	$word,r0
  1558                                  ;	rts	pc
  1559                                  ;	.bss
  1560                                  ;key:	.=.+128.
  1561                                  ;word:	.=.+32.
  1562                                  ;cage:	.=.+256.
  1563                                  ;wheel:	.=.+256.
