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