     1                                  ; ****************************************************************************
     2                                  ; login386.s (login0.s) - Retro Unix 386 v1 - /bin/login
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
     5                                  ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
     6                                  ;
     7                                  ; [ Last Modification: 17/11/2015 ]
     8                                  ;
     9                                  ; Derived from 'login03.asm' source code file of 'Retro UNIX 8086 v1'
    10                                  ; operating system project, /bin/login source code by Erdogan Tan
    11                                  ; (07/11/2013-27/06/2014)
    12                                  ;
    13                                  ; Derived from 'login.s' file of original UNIX operating system
    14                                  ; (v1.0 for PDP-11)
    15                                  ; ****************************************************************************
    16                                  ; login386.s (13/10/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit version)
    17                                  ; LOGIN03.ASM, 07/11/2013 - 27/06/2014 (Retro UNIX 8086 v1, MASM 6.11) 
    18                                  
    19                                  ; 13/10/2015
    20                                  
    21                                  ; Assembler: NASM 2.11
    22                                  ; UNIX v1 system calls
    23                                  _rele 	equ 0
    24                                  _exit 	equ 1
    25                                  _fork 	equ 2
    26                                  _read 	equ 3
    27                                  _write	equ 4
    28                                  _open	equ 5
    29                                  _close 	equ 6
    30                                  _wait 	equ 7
    31                                  _creat 	equ 8
    32                                  _link 	equ 9
    33                                  _unlink	equ 10
    34                                  _exec	equ 11
    35                                  _chdir	equ 12
    36                                  _time 	equ 13
    37                                  _mkdir 	equ 14
    38                                  _chmod	equ 15
    39                                  _chown	equ 16
    40                                  _break	equ 17
    41                                  _stat	equ 18
    42                                  _seek	equ 19
    43                                  _tell 	equ 20
    44                                  _mount	equ 21
    45                                  _umount	equ 22
    46                                  _setuid	equ 23
    47                                  _getuid	equ 24
    48                                  _stime	equ 25
    49                                  _quit	equ 26	
    50                                  _intr	equ 27
    51                                  _fstat	equ 28
    52                                  _emt 	equ 29
    53                                  _mdate 	equ 30
    54                                  _stty 	equ 31
    55                                  _gtty	equ 32
    56                                  _ilgins	equ 33
    57                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    58                                  _msg	equ 35 ; Retro UNIX 386 v1 feature only !
    59                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    60                                  
    61                                  %macro sys 1-4
    62                                      ; Retro UNIX 386 v1 system call.		
    63                                      %if %0 >= 2   
    64                                          mov ebx, %2
    65                                          %if %0 >= 3    
    66                                              mov ecx, %3
    67                                              %if %0 = 4
    68                                                 mov edx, %4   
    69                                              %endif
    70                                          %endif
    71                                      %endif
    72                                      mov eax, %1
    73                                      int 30h	   
    74                                  %endmacro
    75                                  
    76                                  ; Retro UNIX 386 v1 system call format:
    77                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    78                                  
    79                                  [BITS 32] ; We need 32-bit intructions for protected mode
    80                                  
    81                                  [ORG 0] 
    82                                  
    83                                  START_CODE:
    84                                  	; from 'sysexec' system calls
    85                                  	;  (stack pointer -esp- points to 
    86                                  	; to the head of arguments list which is 
    87                                  	; on top the stack, backward from 'ecore'.) 
    88                                  	; esp = offset argc (argument count)
    89                                  	;
    90                                  
    91                                  	sys 	_quit, 0
    92                              <1> 
    93                              <1>  %if %0 >= 2
    94 00000000 BB00000000          <1>  mov ebx, %2
    95                              <1>  %if %0 >= 3
    96                              <1>  mov ecx, %3
    97                              <1>  %if %0 = 4
    98                              <1>  mov edx, %4
    99                              <1>  %endif
   100                              <1>  %endif
   101                              <1>  %endif
   102 00000005 B81A000000          <1>  mov eax, %1
   103 0000000A CD30                <1>  int 30h
   104                                  	sys 	_intr, 0
   105                              <1> 
   106                              <1>  %if %0 >= 2
   107 0000000C BB00000000          <1>  mov ebx, %2
   108                              <1>  %if %0 >= 3
   109                              <1>  mov ecx, %3
   110                              <1>  %if %0 = 4
   111                              <1>  mov edx, %4
   112                              <1>  %endif
   113                              <1>  %endif
   114                              <1>  %endif
   115 00000011 B81B000000          <1>  mov eax, %1
   116 00000016 CD30                <1>  int 30h
   117                                  
   118                                  	; Clear bss section (Clear uninitialized data area) 
   119                                  	; 14/10/2015 (Retro UNIX 386 v1)
   120 00000018 31C0                    	xor  eax, eax ; 0
   121 0000001A B93F020000              	mov  ecx, (bss_end - bss_start)/4
   122 0000001F BF[64070000]            	mov  edi, bss_start	
   123 00000024 F3AB                    	rep  stosd  
   124                                  
   125 00000026 E8F2030000              	call 	ttyn
   126                                  	;eax = 000000??h
   127 0000002B A2[AC060000]            	mov	[ttyx+8], al
   128 00000030 3C78                    	cmp	al, 'x'
   129 00000032 740D                    	je	short S1
   130 00000034 2C30                    	sub	al, '0'
   131 00000036 7409                    	jz	short S1
   132 00000038 66C1E004                	shl	ax, 4
   133 0000003C A3[64070000]            	mov	[s_off], eax
   134                                  S1:
   135 00000041 5A                      	pop	edx ; argument count
   136 00000042 58                      	pop	eax ; pointer to argument 0
   137                                  		   ; executable file name	
   138 00000043 4A                      	dec	edx ; dec dl
   139 00000044 7E2C                    	jng	short login ; 16/11/2015
   140 00000046 5E                      	pop	esi ; pointer to argument 1
   141                                  		    ; user name
   142 00000047 BF[68070000]            	mov	edi, uname
   143 0000004C 89FB                    	mov	ebx, edi
   144 0000004E 83C308                  	add	ebx, 8
   145                                  S2:
   146 00000051 AC                      	lodsb
   147 00000052 AA                      	stosb
   148 00000053 20C0                    	and 	al, al
   149 00000055 7404                    	jz 	short S3
   150 00000057 39DF                    	cmp	edi, ebx
   151 00000059 72F6                    	jb	short S2
   152                                  S3:
   153 0000005B 4A                      	dec	edx
   154 0000005C 7414                    	jz	short login
   155 0000005E 5E                      	pop	esi
   156 0000005F BF[7A070000]            	mov	edi, passwd	
   157                                  S4:
   158 00000064 AC                      	lodsb
   159 00000065 AA                      	stosb
   160 00000066 08C0                    	or 	al, al
   161 00000068 7408                    	jz 	short login
   162 0000006A 81FF[82070000]          	cmp	edi, passwd + 8
   163 00000070 72F2                    	jb	short S4	
   164                                  login:
   165 00000072 C60300                  	mov	byte [ebx], 0 ;  uname + 8
   166 00000075 B8[98060000]            	mov	eax, passwdf
   167 0000007A E844040000              	call	fopen
   168 0000007F 7311                    	jnc	short lg0
   169 00000081 BE[EE060000]            	mov	esi, msgNoPswdf
   170 00000086 E878030000              	call	mesg
   171                                  	sys	_exit
   172                              <1> 
   173                              <1>  %if %0 >= 2
   174                              <1>  mov ebx, %2
   175                              <1>  %if %0 >= 3
   176                              <1>  mov ecx, %3
   177                              <1>  %if %0 = 4
   178                              <1>  mov edx, %4
   179                              <1>  %endif
   180                              <1>  %endif
   181                              <1>  %endif
   182 0000008B B801000000          <1>  mov eax, %1
   183 00000090 CD30                <1>  int 30h
   184                                  lg0:
   185 00000092 E8B4020000              	call 	guname
   186                                  lg1:
   187 00000097 BE[68070000]            	mov	esi, uname
   188 0000009C E8F9020000              	call	compar
   189 000000A1 7416                    	je	short lg3 ; zf = 1 --> match
   190                                  lg2:
   191                                  	;mov	ebx, pbuf
   192 000000A3 E83E040000              	call	getc
   193 000000A8 0F829A000000                    jc      sorry
   194 000000AE 3C0D                    	cmp	al, 0Dh ; \n
   195 000000B0 75F1                    	jne	short lg2
   196 000000B2 E82F040000              	call	getc
   197                                  	;jc	short sorry
   198                                  	;cmp	al, 0Ah
   199                                  	;jne	short sorry
   200 000000B7 EBDE                    	jmp	short lg1
   201                                  lg3:
   202 000000B9 E828040000              	call 	getc
   203 000000BE 0F8284000000                    jc      sorry
   204 000000C4 3C3A                    	cmp	al, ':'
   205 000000C6 7417                    	je	short lg4
   206 000000C8 6650                    	push	ax	
   207 000000CA E825020000              	call	gpasswd
   208                                  	;mov	esi, _word
   209 000000CF 6658                    	pop	ax	
   210 000000D1 8A26                    	mov	ah, [esi]
   211 000000D3 38E0                    	cmp	al, ah
   212 000000D5 7571                    	jne	short sorry
   213 000000D7 46                      	inc	esi
   214                                  	; ESI = offset _word + 1 
   215 000000D8 E8BD020000              	call	compar
   216 000000DD 7569                    	jne	short sorry
   217                                  lg4:
   218                                  	; get UID
   219 000000DF 31C9                    	xor	ecx, ecx ; 0
   220                                  lg5:
   221 000000E1 51                      	push	ecx
   222 000000E2 E8FF030000              	call	getc
   223 000000E7 3C3A                    	cmp	al, ':'
   224 000000E9 7414                    	je	short lg6
   225 000000EB 88C1                    	mov	cl, al
   226 000000ED 80E930                  	sub 	cl, '0'
   227 000000F0 30ED                    	xor	ch, ch
   228 000000F2 5A                      	pop	edx
   229 000000F3 66B80A00                	mov	ax, 10
   230 000000F7 66F7E2                  	mul	dx
   231 000000FA 6601C1                  	add	cx, ax	
   232 000000FD EBE2                    	jmp	short lg5
   233                                  lg6:
   234 000000FF 59                      	pop	ecx ; UID	
   235                                  	sys	_chown, ttyx ; ecx = arg 2
   236                              <1> 
   237                              <1>  %if %0 >= 2
   238 00000100 BB[A4060000]        <1>  mov ebx, %2
   239                              <1>  %if %0 >= 3
   240                              <1>  mov ecx, %3
   241                              <1>  %if %0 = 4
   242                              <1>  mov edx, %4
   243                              <1>  %endif
   244                              <1>  %endif
   245                              <1>  %endif
   246 00000105 B810000000          <1>  mov eax, %1
   247 0000010A CD30                <1>  int 30h
   248 0000010C 66890D[A4070000]        	mov	[uid], cx
   249                                  lg7:
   250 00000113 E8CE030000              	call	getc
   251 00000118 3C3A                    	cmp	al, ':'
   252 0000011A 75F7                    	jne	short lg7    ; / skip ident field
   253 0000011C BF[84070000]            	mov	edi, dirbuf
   254                                  lg8:
   255 00000121 E8C0030000              	call	getc
   256 00000126 3C3A                    	cmp	al, ':'
   257 00000128 7403                    	je	short lg9
   258 0000012A AA                      	stosb
   259 0000012B EBF4                    	jmp	short lg8  	
   260                                  lg9:
   261 0000012D 30C0                    	xor	al, al
   262 0000012F AA                      	stosb
   263                                  	sys	_chdir, dirbuf
   264                              <1> 
   265                              <1>  %if %0 >= 2
   266 00000130 BB[84070000]        <1>  mov ebx, %2
   267                              <1>  %if %0 >= 3
   268                              <1>  mov ecx, %3
   269                              <1>  %if %0 = 4
   270                              <1>  mov edx, %4
   271                              <1>  %endif
   272                              <1>  %endif
   273                              <1>  %endif
   274 00000135 B80C000000          <1>  mov eax, %1
   275 0000013A CD30                <1>  int 30h
   276 0000013C 733A                    	jnc	short lg10
   277 0000013E BE[0E070000]            	mov	esi, msgNoDir
   278 00000143 E8BB020000              	call	mesg
   279                                          ;jmp     short sorry
   280                                  sorry:
   281 00000148 BE[CA060000]            	mov	esi, msgIL
   282 0000014D E8B1020000              	call	mesg
   283                                  	; 14/10/2015
   284 00000152 0FB71D[580E0000]        	movzx 	ebx, word [pbuf]
   285                                  	sys	_close
   286                              <1> 
   287                              <1>  %if %0 >= 2
   288                              <1>  mov ebx, %2
   289                              <1>  %if %0 >= 3
   290                              <1>  mov ecx, %3
   291                              <1>  %if %0 = 4
   292                              <1>  mov edx, %4
   293                              <1>  %endif
   294                              <1>  %endif
   295                              <1>  %endif
   296 00000159 B806000000          <1>  mov eax, %1
   297 0000015E CD30                <1>  int 30h
   298                                  	;
   299 00000160 30C0                    	xor	al, al
   300                                  	;mov	[uname], al
   301 00000162 A2[7A070000]            	mov	[passwd], al
   302 00000167 30C0                    	xor	al, al
   303                                  	;mov	[uname], al
   304 00000169 A2[7A070000]            	mov	[passwd], al
   305                                  	; 14/10/2015
   306 0000016E BB[68070000]            	mov 	ebx, uname
   307 00000173 E9FAFEFFFF                      jmp     login
   308                                  
   309                                  lg10:
   310 00000178 BB[6F070000]            	mov	ebx, uname + 7
   311                                  lg11:
   312 0000017D 803B00                  	cmp	byte [ebx], 0
   313 00000180 7706                    	ja	short lg12
   314 00000182 C60320                  	mov	byte [ebx], 20h
   315 00000185 4B                      	dec 	ebx
   316 00000186 EBF5                    	jmp	short lg11
   317                                  lg12:
   318 00000188 BE[AC060000]            	mov	esi, ttyx + 8
   319 0000018D 803E78                  	cmp	byte [esi], 'x'
   320 00000190 0F849D000000                    je      lg14
   321                                  	sys	_open, utmp, 1
   322                              <1> 
   323                              <1>  %if %0 >= 2
   324 00000196 BB[50060000]        <1>  mov ebx, %2
   325                              <1>  %if %0 >= 3
   326 0000019B B901000000          <1>  mov ecx, %3
   327                              <1>  %if %0 = 4
   328                              <1>  mov edx, %4
   329                              <1>  %endif
   330                              <1>  %endif
   331                              <1>  %endif
   332 000001A0 B805000000          <1>  mov eax, %1
   333 000001A5 CD30                <1>  int 30h
   334 000001A7 7246                    	jc	short lg13
   335 000001A9 89C7                            mov     edi, eax
   336 000001AB A1[64070000]                    mov     eax, [s_off]
   337                                          sys     _seek, edi, eax, 0
   338                              <1> 
   339                              <1>  %if %0 >= 2
   340 000001B0 89FB                <1>  mov ebx, %2
   341                              <1>  %if %0 >= 3
   342 000001B2 89C1                <1>  mov ecx, %3
   343                              <1>  %if %0 = 4
   344 000001B4 BA00000000          <1>  mov edx, %4
   345                              <1>  %endif
   346                              <1>  %endif
   347                              <1>  %endif
   348 000001B9 B813000000          <1>  mov eax, %1
   349 000001BE CD30                <1>  int 30h
   350 000001C0 8A06                    	mov	al, [esi]
   351 000001C2 A2[70070000]            	mov	[uname+8], al
   352                                  	sys	_time
   353                              <1> 
   354                              <1>  %if %0 >= 2
   355                              <1>  mov ebx, %2
   356                              <1>  %if %0 >= 3
   357                              <1>  mov ecx, %3
   358                              <1>  %if %0 = 4
   359                              <1>  mov edx, %4
   360                              <1>  %endif
   361                              <1>  %endif
   362                              <1>  %endif
   363 000001C7 B80D000000          <1>  mov eax, %1
   364 000001CC CD30                <1>  int 30h
   365 000001CE A3[72070000]            	mov 	[uname+10], eax
   366                                  	sys	_write, edi, uname, 16
   367                              <1> 
   368                              <1>  %if %0 >= 2
   369 000001D3 89FB                <1>  mov ebx, %2
   370                              <1>  %if %0 >= 3
   371 000001D5 B9[68070000]        <1>  mov ecx, %3
   372                              <1>  %if %0 = 4
   373 000001DA BA10000000          <1>  mov edx, %4
   374                              <1>  %endif
   375                              <1>  %endif
   376                              <1>  %endif
   377 000001DF B804000000          <1>  mov eax, %1
   378 000001E4 CD30                <1>  int 30h
   379                                  	sys	_close, edi  	
   380                              <1> 
   381                              <1>  %if %0 >= 2
   382 000001E6 89FB                <1>  mov ebx, %2
   383                              <1>  %if %0 >= 3
   384                              <1>  mov ecx, %3
   385                              <1>  %if %0 = 4
   386                              <1>  mov edx, %4
   387                              <1>  %endif
   388                              <1>  %endif
   389                              <1>  %endif
   390 000001E8 B806000000          <1>  mov eax, %1
   391 000001ED CD30                <1>  int 30h
   392                                  lg13:
   393                                  	;cmp	byte [esi], 'x'
   394                                  	;je	short lg14
   395                                  	sys	_open, wtmp, 1
   396                              <1> 
   397                              <1>  %if %0 >= 2
   398 000001EF BB[5A060000]        <1>  mov ebx, %2
   399                              <1>  %if %0 >= 3
   400 000001F4 B901000000          <1>  mov ecx, %3
   401                              <1>  %if %0 = 4
   402                              <1>  mov edx, %4
   403                              <1>  %endif
   404                              <1>  %endif
   405                              <1>  %endif
   406 000001F9 B805000000          <1>  mov eax, %1
   407 000001FE CD30                <1>  int 30h
   408 00000200 7231                    	jc	short lg14
   409 00000202 89C7                    	mov	edi, eax
   410                                  	sys	_seek, edi, 0, 2
   411                              <1> 
   412                              <1>  %if %0 >= 2
   413 00000204 89FB                <1>  mov ebx, %2
   414                              <1>  %if %0 >= 3
   415 00000206 B900000000          <1>  mov ecx, %3
   416                              <1>  %if %0 = 4
   417 0000020B BA02000000          <1>  mov edx, %4
   418                              <1>  %endif
   419                              <1>  %endif
   420                              <1>  %endif
   421 00000210 B813000000          <1>  mov eax, %1
   422 00000215 CD30                <1>  int 30h
   423                                  	sys	_write, edi, uname, 16
   424                              <1> 
   425                              <1>  %if %0 >= 2
   426 00000217 89FB                <1>  mov ebx, %2
   427                              <1>  %if %0 >= 3
   428 00000219 B9[68070000]        <1>  mov ecx, %3
   429                              <1>  %if %0 = 4
   430 0000021E BA10000000          <1>  mov edx, %4
   431                              <1>  %endif
   432                              <1>  %endif
   433                              <1>  %endif
   434 00000223 B804000000          <1>  mov eax, %1
   435 00000228 CD30                <1>  int 30h
   436                                  	sys	_close, edi 
   437                              <1> 
   438                              <1>  %if %0 >= 2
   439 0000022A 89FB                <1>  mov ebx, %2
   440                              <1>  %if %0 >= 3
   441                              <1>  mov ecx, %3
   442                              <1>  %if %0 = 4
   443                              <1>  mov edx, %4
   444                              <1>  %endif
   445                              <1>  %endif
   446                              <1>  %endif
   447 0000022C B806000000          <1>  mov eax, %1
   448 00000231 CD30                <1>  int 30h
   449                                  lg14:
   450 00000233 E8AE020000              	call	getc
   451 00000238 3C0D                    	cmp	al, 0Dh ; \n
   452 0000023A 7414                    	je	short lg16
   453 0000023C BF[64060000]            	mov	edi, shell
   454                                  lg15:
   455 00000241 88E0                    	mov	al, ah
   456 00000243 AA                      	stosb
   457 00000244 E89D020000              	call	getc
   458 00000249 3C0D                    	cmp	al, 0Dh	; \n
   459 0000024B 75F4                    	jne	short lg15
   460 0000024D 30C0                    	xor	al, al ; 0
   461 0000024F AA                      	stosb
   462                                  lg16:
   463 00000250 0FB71D[580E0000]        	movzx	ebx, word [pbuf]
   464                                  	sys	_close
   465                              <1> 
   466                              <1>  %if %0 >= 2
   467                              <1>  mov ebx, %2
   468                              <1>  %if %0 >= 3
   469                              <1>  mov ecx, %3
   470                              <1>  %if %0 = 4
   471                              <1>  mov edx, %4
   472                              <1>  %endif
   473                              <1>  %endif
   474                              <1>  %endif
   475 00000257 B806000000          <1>  mov eax, %1
   476 0000025C CD30                <1>  int 30h
   477 0000025E B8[86060000]            	mov	eax, motd
   478 00000263 E85B020000              	call	fopen
   479 00000268 7224                    	jc	short lg18
   480                                  lg17:
   481 0000026A E877020000              	call	getc
   482 0000026F 721D                    	jc	short lg18
   483 00000271 A2[68070000]            	mov	[uname], al
   484                                  	sys	_write, 1, uname, 1
   485                              <1> 
   486                              <1>  %if %0 >= 2
   487 00000276 BB01000000          <1>  mov ebx, %2
   488                              <1>  %if %0 >= 3
   489 0000027B B9[68070000]        <1>  mov ecx, %3
   490                              <1>  %if %0 = 4
   491 00000280 BA01000000          <1>  mov edx, %4
   492                              <1>  %endif
   493                              <1>  %endif
   494                              <1>  %endif
   495 00000285 B804000000          <1>  mov eax, %1
   496 0000028A CD30                <1>  int 30h
   497 0000028C EBDC                    	jmp	short lg17
   498                                  lg18:
   499 0000028E 0FB71D[580E0000]        	movzx	ebx, word [pbuf]
   500                                  	sys	_close
   501                              <1> 
   502                              <1>  %if %0 >= 2
   503                              <1>  mov ebx, %2
   504                              <1>  %if %0 >= 3
   505                              <1>  mov ecx, %3
   506                              <1>  %if %0 = 4
   507                              <1>  mov edx, %4
   508                              <1>  %endif
   509                              <1>  %endif
   510                              <1>  %endif
   511 00000295 B806000000          <1>  mov eax, %1
   512 0000029A CD30                <1>  int 30h
   513                                  	sys	_stat, mailf, pbuf
   514                              <1> 
   515                              <1>  %if %0 >= 2
   516 0000029C BB[90060000]        <1>  mov ebx, %2
   517                              <1>  %if %0 >= 3
   518 000002A1 B9[580E0000]        <1>  mov ecx, %3
   519                              <1>  %if %0 = 4
   520                              <1>  mov edx, %4
   521                              <1>  %endif
   522                              <1>  %endif
   523                              <1>  %endif
   524 000002A6 B812000000          <1>  mov eax, %1
   525 000002AB CD30                <1>  int 30h
   526 000002AD 7215                    	jc	short lg19
   527 000002AF 66A1[5E0E0000]          	mov	ax, [pbuf+6] ; file size 
   528 000002B5 6621C0                  	and	ax, ax
   529 000002B8 740A                    	jz	short lg19
   530 000002BA BE[22070000]            	mov	esi, msgMail
   531 000002BF E83F010000              	call 	mesg
   532                                  lg19:
   533 000002C4 0FB71D[A4070000]        	movzx	ebx, word [uid]
   534                                  	sys	_setuid
   535                              <1> 
   536                              <1>  %if %0 >= 2
   537                              <1>  mov ebx, %2
   538                              <1>  %if %0 >= 3
   539                              <1>  mov ecx, %3
   540                              <1>  %if %0 = 4
   541                              <1>  mov edx, %4
   542                              <1>  %endif
   543                              <1>  %endif
   544                              <1>  %endif
   545 000002CB B817000000          <1>  mov eax, %1
   546 000002D0 CD30                <1>  int 30h
   547                                  	sys     _exec, shell, shellp
   548                              <1> 
   549                              <1>  %if %0 >= 2
   550 000002D2 BB[64060000]        <1>  mov ebx, %2
   551                              <1>  %if %0 >= 3
   552 000002D7 B9[48060000]        <1>  mov ecx, %3
   553                              <1>  %if %0 = 4
   554                              <1>  mov edx, %4
   555                              <1>  %endif
   556                              <1>  %endif
   557                              <1>  %endif
   558 000002DC B80B000000          <1>  mov eax, %1
   559 000002E1 CD30                <1>  int 30h
   560 000002E3 BE[DE060000]            	mov	esi, msgNoSh
   561 000002E8 E816010000              	call 	mesg
   562                                          sys     _exit
   563                              <1> 
   564                              <1>  %if %0 >= 2
   565                              <1>  mov ebx, %2
   566                              <1>  %if %0 >= 3
   567                              <1>  mov ecx, %3
   568                              <1>  %if %0 = 4
   569                              <1>  mov edx, %4
   570                              <1>  %endif
   571                              <1>  %endif
   572                              <1>  %endif
   573 000002ED B801000000          <1>  mov eax, %1
   574 000002F2 CD30                <1>  int 30h
   575                                  
   576                                  gpasswd:
   577 000002F4 BF[7A070000]            	mov	edi, passwd
   578 000002F9 803F01                  	cmp	byte [edi], 1
   579 000002FC 7333                    	jnb	short gp2
   580 000002FE BE[BC060000]            	mov	esi, msgPswd
   581 00000303 E8FB000000              	call	mesg
   582                                  gp1:
   583 00000308 E8A9000000              	call 	tgetc
   584 0000030D 3C08                    	cmp	al, 08h
   585 0000030F 742B                    	je	short gp3
   586 00000311 3C7F                    	cmp	al, 127
   587 00000313 7427                    	je	short gp3
   588 00000315 AA                      	stosb
   589 00000316 20C0                    	and	al, al
   590 00000318 7417                    	jz	short gp2
   591 0000031A C605[A6070000]2A        	mov	byte [chr], '*'
   592 00000321 E8C6000000              	call 	tputc	
   593 00000326 81FF[83070000]          	cmp	edi, passwd + 9
   594 0000032C 72DA                    	jb	short gp1
   595 0000032E 4F                      	dec	edi
   596 0000032F EBD7                    	jmp	short gp1
   597                                  gp2:
   598 00000331 BE[7A070000]            	mov	esi, passwd
   599 00000336 E8F0010000              	call	crypt
   600                                  	;mov	esi, _word
   601 0000033B C3                      	retn
   602                                  
   603                                  gp3:	; Backspace 
   604                                  	; (Retro UNIX 8086 v1 modification)
   605 0000033C 81FF[7A070000]          	cmp	edi, passwd
   606 00000342 76C4                    	jna	short gp1
   607                                  	;mov 	byte [chr], 08h
   608 00000344 E89B000000              	call	tputbs
   609 00000349 EBBD                    	jmp	short gp1
   610                                  
   611                                  guname:
   612 0000034B BF[68070000]            	mov	edi, uname
   613 00000350 803F01                  	cmp	byte [edi], 1
   614 00000353 7335                    	jnb	short gun2
   615 00000355 31C0                    	xor	eax, eax ; mov eax, 0
   616 00000357 AB                      	stosd
   617 00000358 AB                      	stosd
   618 00000359 BE[B2060000]            	mov	esi, msgName
   619 0000035E E8A0000000              	call	mesg
   620 00000363 BF[68070000]            	mov	edi, uname
   621                                  gun1:
   622 00000368 E849000000              	call	tgetc
   623 0000036D 3C08                    	cmp	al, 08h
   624 0000036F 741A                    	je	short gun3
   625 00000371 3C7F                    	cmp	al, 127
   626 00000373 7416                    	je	short gun3
   627 00000375 AA                      	stosb
   628 00000376 20C0                    	and 	al, al
   629 00000378 7410                    	jz	short gun2
   630 0000037A E86D000000              	call 	tputc
   631 0000037F 81FF[71070000]          	cmp	edi, uname + 9
   632 00000385 72E1                    	jb	short gun1
   633 00000387 4F                      	dec	edi
   634 00000388 EBDE                    	jmp	short gun1
   635                                  gun2:
   636 0000038A C3                      	retn
   637                                  
   638                                  gun3:	; Backspace 
   639                                  	; (Retro UNIX 8086 v1 modification)
   640 0000038B 81FF[68070000]          	cmp	edi, uname
   641 00000391 76D5                    	jna	short gun1
   642                                  	;mov 	byte [chr], 08h
   643 00000393 E84C000000              	call	tputbs
   644 00000398 EBCE                    	jmp	short gun1
   645                                  
   646                                  compar:
   647                                  	; ESI = uname or _word 
   648                                  		; (encrypted passwd)
   649                                  	;mov	ebx, pbuf
   650                                  cmp_0:
   651 0000039A E847010000              	call	getc
   652 0000039F 7306                    	jnc	short cmp_1
   653 000003A1 58                      	pop	eax
   654 000003A2 E9A1FDFFFF                      jmp     sorry
   655                                  cmp_1:
   656 000003A7 88C4                    	mov	ah, al
   657                                  	; AH = character
   658 000003A9 AC                      	lodsb
   659 000003AA 38E0                    	cmp	al, ah
   660 000003AC 74EC                    	je	short cmp_0
   661 000003AE 20C0                    	and	al, al
   662 000003B0 7503                    	jnz	short cmp_2
   663 000003B2 80FC3A                  	cmp	ah, ':'
   664                                  cmp_2:
   665                                  	;ZF = 1 --> match
   666 000003B5 C3                      	retn
   667                                  
   668                                  tgetc:
   669                                  	sys	_read, 0, chr, 1
   670                              <1> 
   671                              <1>  %if %0 >= 2
   672 000003B6 BB00000000          <1>  mov ebx, %2
   673                              <1>  %if %0 >= 3
   674 000003BB B9[A6070000]        <1>  mov ecx, %3
   675                              <1>  %if %0 = 4
   676 000003C0 BA01000000          <1>  mov edx, %4
   677                              <1>  %endif
   678                              <1>  %endif
   679                              <1>  %endif
   680 000003C5 B803000000          <1>  mov eax, %1
   681 000003CA CD30                <1>  int 30h
   682 000003CC 6621C0                  	and	ax, ax
   683 000003CF 7507                    	jnz	short tgc1
   684                                  	sys	_exit
   685                              <1> 
   686                              <1>  %if %0 >= 2
   687                              <1>  mov ebx, %2
   688                              <1>  %if %0 >= 3
   689                              <1>  mov ecx, %3
   690                              <1>  %if %0 = 4
   691                              <1>  mov edx, %4
   692                              <1>  %endif
   693                              <1>  %endif
   694                              <1>  %endif
   695 000003D1 B801000000          <1>  mov eax, %1
   696 000003D6 CD30                <1>  int 30h
   697                                  tgc1:
   698 000003D8 A0[A6070000]            	mov	al, [chr]
   699 000003DD 3C0D                    	cmp	al, 0Dh
   700 000003DF 7502                    	jne	short tgc2
   701 000003E1 30C0                    	xor	al, al
   702                                  tgc2:
   703 000003E3 C3                      	retn
   704                                  
   705                                  tputbs:
   706 000003E4 C605[A6070000]08        	mov	byte [chr], 08h
   707 000003EB 4F                      	dec	edi
   708                                  tputc:
   709                                  	sys	_write, 1, chr, 1
   710                              <1> 
   711                              <1>  %if %0 >= 2
   712 000003EC BB01000000          <1>  mov ebx, %2
   713                              <1>  %if %0 >= 3
   714 000003F1 B9[A6070000]        <1>  mov ecx, %3
   715                              <1>  %if %0 = 4
   716 000003F6 BA01000000          <1>  mov edx, %4
   717                              <1>  %endif
   718                              <1>  %endif
   719                              <1>  %endif
   720 000003FB B804000000          <1>  mov eax, %1
   721 00000400 CD30                <1>  int 30h
   722 00000402 C3                      	retn	
   723                                  
   724                                  mesg:
   725 00000403 89F2                    	mov	edx, esi
   726                                  msg1:	
   727 00000405 AC                      	lodsb
   728 00000406 20C0                    	and 	al, al
   729 00000408 75FB                    	jnz 	short msg1
   730 0000040A 29D6                    	sub	esi, edx
   731 0000040C 87F2                    	xchg	esi, edx
   732                                  	; edx = string length
   733                                  	sys	_write, 1, esi 
   734                              <1> 
   735                              <1>  %if %0 >= 2
   736 0000040E BB01000000          <1>  mov ebx, %2
   737                              <1>  %if %0 >= 3
   738 00000413 89F1                <1>  mov ecx, %3
   739                              <1>  %if %0 = 4
   740                              <1>  mov edx, %4
   741                              <1>  %endif
   742                              <1>  %endif
   743                              <1>  %endif
   744 00000415 B804000000          <1>  mov eax, %1
   745 0000041A CD30                <1>  int 30h
   746 0000041C C3                      	retn
   747                                  
   748                                  
   749                                  ;/ return name of current tty
   750                                  ;
   751                                  
   752                                  ttyn:
   753 0000041D 57                      	push	edi
   754 0000041E 56                      	push	esi
   755 0000041F 52                      	push	edx
   756 00000420 C605[CA070000]78        	mov	byte [ttyname], 'x'
   757                                  	sys	_fstat, 1, buf ; get tty file status
   758                              <1> 
   759                              <1>  %if %0 >= 2
   760 00000427 BB01000000          <1>  mov ebx, %2
   761                              <1>  %if %0 >= 3
   762 0000042C B9[A8070000]        <1>  mov ecx, %3
   763                              <1>  %if %0 = 4
   764                              <1>  mov edx, %4
   765                              <1>  %endif
   766                              <1>  %endif
   767                              <1>  %endif
   768 00000431 B81C000000          <1>  mov eax, %1
   769 00000436 CD30                <1>  int 30h
   770                                  			       ; file descriptor = 1 
   771                                  			       ; (standard output) 
   772 00000438 727E                    	jc	short er1
   773                                  	sys	_open, dev, 0
   774                              <1> 
   775                              <1>  %if %0 >= 2
   776 0000043A BB[AD060000]        <1>  mov ebx, %2
   777                              <1>  %if %0 >= 3
   778 0000043F B900000000          <1>  mov ecx, %3
   779                              <1>  %if %0 = 4
   780                              <1>  mov edx, %4
   781                              <1>  %endif
   782                              <1>  %endif
   783                              <1>  %endif
   784 00000444 B805000000          <1>  mov eax, %1
   785 00000449 CD30                <1>  int 30h
   786 0000044B 726B                    	jc	short er1
   787                                  	;
   788 0000044D 668B35[A8070000]        	mov	si, [buf]
   789 00000454 89C7                    	mov	edi, eax	
   790                                  t1:
   791                                  	sys	_read, edi, buf, 10
   792                              <1> 
   793                              <1>  %if %0 >= 2
   794 00000456 89FB                <1>  mov ebx, %2
   795                              <1>  %if %0 >= 3
   796 00000458 B9[A8070000]        <1>  mov ecx, %3
   797                              <1>  %if %0 = 4
   798 0000045D BA0A000000          <1>  mov edx, %4
   799                              <1>  %endif
   800                              <1>  %endif
   801                              <1>  %endif
   802 00000462 B803000000          <1>  mov eax, %1
   803 00000467 CD30                <1>  int 30h
   804 00000469 7244                    	jc	short er
   805 0000046B 83F80A                  	cmp	eax, 10
   806 0000046E 753F                    	jne	short er
   807 00000470 668B15[A8070000]        	mov	dx, [buf]
   808 00000477 6639F2                  	cmp	dx, si
   809 0000047A 75DA                    	jne	short t1
   810 0000047C 668B15[AA070000]        	mov	dx, [buf+2]
   811 00000483 6681FA7474              	cmp	dx, 'tt'
   812 00000488 7525                    	jne	short er
   813 0000048A 668B15[AC070000]        	mov	dx, [buf+4]
   814 00000491 80FA79                  	cmp	dl, 'y'
   815 00000494 7519                    	jne	short er
   816                                  	;or	dh, dh
   817                                  	;jz	short er
   818 00000496 80FE30                  	cmp	dh, '0'
   819 00000499 7214                    	jb	short er
   820 0000049B 80FE39                  	cmp	dh, '9'
   821 0000049E 770F                    	ja	short er
   822 000004A0 803D[AE070000]00        	cmp	byte [buf+6], 0
   823 000004A7 7506                    	jne	short er
   824 000004A9 8835[CA070000]          	mov	byte [ttyname], dh
   825                                  er:
   826                                  	sys	_close, edi
   827                              <1> 
   828                              <1>  %if %0 >= 2
   829 000004AF 89FB                <1>  mov ebx, %2
   830                              <1>  %if %0 >= 3
   831                              <1>  mov ecx, %3
   832                              <1>  %if %0 = 4
   833                              <1>  mov edx, %4
   834                              <1>  %endif
   835                              <1>  %endif
   836                              <1>  %endif
   837 000004B1 B806000000          <1>  mov eax, %1
   838 000004B6 CD30                <1>  int 30h
   839                                  er1:
   840 000004B8 0FB605[CA070000]        	movzx	eax, byte [ttyname]
   841 000004BF 5A                      	pop	edx
   842 000004C0 5E                      	pop	esi
   843 000004C1 5F                      	pop	edi
   844 000004C2 C3                      	retn
   845                                  
   846                                  ; open a file for use by get(c|w)
   847                                  ;
   848                                  fopen:
   849                                  	; eax = file name ofset
   850 000004C3 BF[580E0000]            	mov	edi, pbuf
   851                                  	sys 	_open, eax, 0
   852                              <1> 
   853                              <1>  %if %0 >= 2
   854 000004C8 89C3                <1>  mov ebx, %2
   855                              <1>  %if %0 >= 3
   856 000004CA B900000000          <1>  mov ecx, %3
   857                              <1>  %if %0 = 4
   858                              <1>  mov edx, %4
   859                              <1>  %endif
   860                              <1>  %endif
   861                              <1>  %endif
   862 000004CF B805000000          <1>  mov eax, %1
   863 000004D4 CD30                <1>  int 30h
   864 000004D6 7207                    	jc	short f1
   865 000004D8 66AB                    	stosw
   866 000004DA 31C0                    	xor	eax, eax ; 0
   867 000004DC 66AB                    	stosw
   868 000004DE C3                      	retn
   869                                  f1:
   870 000004DF 66B8FFFF                	mov	ax, 0FFFFh
   871 000004E3 66AB                    	stosw	
   872 000004E5 C3                      	retn
   873                                  
   874                                  ; get characters from input file
   875                                  ;
   876                                  getc:
   877 000004E6 56                      	push	esi
   878 000004E7 BE[580E0000]            	mov	esi, pbuf
   879 000004EC 668B4602                	mov	ax, [esi+2] ; char count
   880 000004F0 6621C0                  	and	ax, ax
   881 000004F3 751D                    	jnz	short gch1
   882                                  gch0:
   883 000004F5 0FB71E                  	movzx	ebx, word [esi]
   884 000004F8 B9[600E0000]            	mov	ecx, pbuf + 8 ; read buff. addr.
   885 000004FD 894E04                  	mov 	[esi+4], ecx ; char offset
   886                                  	;mov	[esi+2], ax ; 0
   887 00000500 BA00020000              	mov 	edx, 512  
   888                                  	sys	_read ; sys _read, ebx, ecx, edx
   889                              <1> 
   890                              <1>  %if %0 >= 2
   891                              <1>  mov ebx, %2
   892                              <1>  %if %0 >= 3
   893                              <1>  mov ecx, %3
   894                              <1>  %if %0 = 4
   895                              <1>  mov edx, %4
   896                              <1>  %endif
   897                              <1>  %endif
   898                              <1>  %endif
   899 00000505 B803000000          <1>  mov eax, %1
   900 0000050A CD30                <1>  int 30h
   901 0000050C 7217                    	jc	short gch2
   902 0000050E 09C0                    	or	eax, eax
   903 00000510 7416                    	jz	short gch3
   904                                  gch1:
   905 00000512 6648                    	dec	ax
   906 00000514 66894602                	mov	[esi+2], ax
   907 00000518 8B5E04                  	mov	ebx, [esi+4]
   908 0000051B 8A03                    	mov	al, [ebx]
   909 0000051D 43                      	inc	ebx
   910 0000051E 895E04                  	mov	[esi+4], ebx
   911 00000521 30E4                    	xor	ah, ah
   912 00000523 5E                      	pop	esi
   913 00000524 C3                      	retn 	
   914                                  gch2:
   915 00000525 6631C0                  	xor	ax, ax
   916                                  gch3:
   917 00000528 5E                      	pop	esi
   918 00000529 F9                      	stc
   919 0000052A C3                      	retn
   920                                  
   921                                  ;/ crypt -- password incoding
   922                                  ;
   923                                  ;; Original Unix v5 (PDP-11) 'crypt'
   924                                  ;; code has been converted to 
   925                                  ;; Retro UNIX 8086 v1 'crypt' 
   926                                  ;; procedure in 'login.asm'
   927                                  ;; (by Erdogan Tan - 12/11/2013).
   928                                  ; 
   929                                  ;
   930                                  ;crypt:
   931                                  ;	mov	r1,-(sp)
   932                                  ;	mov	r2,-(sp)
   933                                  ;	mov	r3,-(sp)
   934                                  ;	mov	r4,-(sp)
   935                                  ;	mov	r5,-(sp)
   936                                  ;
   937                                  ;	mov	r0,r1
   938                                  ;	mov	$key,r0
   939                                  ;	movb	$004,(r0)+
   940                                  ;	movb	$034,(r0)+
   941                                  
   942                                  ; 14/10/2015 - 32 bit version (Retro UNIX 386 v1)
   943                                  
   944                                  crypt:
   945                                  	;mov	esi, passwd
   946 0000052B BF[CC070000]            	mov	edi, key
   947 00000530 B004                    	mov	al, 4
   948 00000532 AA                      	stosb
   949 00000533 B01C                    	mov	al, 28
   950 00000535 AA                      	stosb
   951                                  
   952                                  ;1:
   953                                  ;	cmp	r0,$key+64.
   954                                  ;	bhis	1f
   955                                  ;	movb	(r1)+,(r0)+
   956                                  ;	bne	1b
   957                                  ;1:
   958                                  ;	dec	r0
   959                                  
   960                                  cryp0:
   961 00000536 AC                      	lodsb
   962 00000537 AA                      	stosb
   963 00000538 20C0                    	and	al, al
   964 0000053A 7408                    	jz	short cryp1
   965 0000053C 81FF[0C080000]          	cmp	edi, key + 64
   966 00000542 72F2                    	jb	short cryp0
   967                                  cryp1:
   968 00000544 4F                       	dec	edi
   969                                  ;/
   970                                  ;/
   971                                  ;/	fill out key space with clever junk
   972                                  ;/
   973                                  ;	mov	$key,r1
   974                                  ;1:
   975                                  ;	movb	-1(r0),r2
   976                                  ;	movb	(r1)+,r3
   977                                  ;	xor	r3,r2
   978                                  ;	movb	r2,(r0)+
   979                                  ;	cmp	r0,$key+128.
   980                                  ;	blo	1b
   981                                  
   982                                  
   983                                  ;/	fill out key space with clever junk
   984                                  
   985 00000545 BE[CC070000]            	mov	esi, key
   986                                  cryp2:
   987 0000054A 8A5FFF                  	mov	bl, [edi-1]
   988 0000054D AC                      	lodsb
   989 0000054E 30D8                    	xor	al, bl
   990 00000550 AA                      	stosb
   991 00000551 81FF[4C080000]          	cmp	edi, key + 128
   992 00000557 72F1                    	jb	short cryp2
   993                                  	;
   994                                  ;/
   995                                  ;/
   996                                  ;/	establish wheel codes and cage codes
   997                                  ;/
   998                                  ;	mov	$wheelcode,r4
   999                                  ;	mov	$cagecode,r5
  1000                                  ;	mov	$256.,-(sp)
  1001                                  ;2:
  1002                                  ;	clr	r2
  1003                                  ;	clr	(r4)
  1004                                  ;	mov	$wheeldiv,r3
  1005                                  ;3:
  1006                                  ;	clr	r0
  1007                                  ;	mov	(sp),r1
  1008                                  ;	div	(r3)+,r0
  1009                                  ;	add	r1,r2
  1010                                  ;	bic	$40,r2
  1011                                  ;	bis	shift(r2),(r4)
  1012                                  ;	cmp	r3,$wheeldiv+6.
  1013                                  ;	bhis	4f
  1014                                  ;	bis	shift+4(r2),(r5)
  1015                                  ;4:
  1016                                  ;	cmp	r3,$wheeldiv+10.
  1017                                  ;	blo	3b
  1018                                  ;	sub	$2,(sp)
  1019                                  ;	tst	(r4)+
  1020                                  ;	tst	(r5)+
  1021                                  ;	cmp	r4,$wheelcode+256.
  1022                                  ;	blo	2b
  1023                                  ;	tst	(sp)+
  1024                                  ;/	
  1025                                  
  1026                                  ;/	establish wheel codes and cage codes
  1027                                  
  1028 00000559 BE[580C0000]            	mov	esi, wheelcode
  1029 0000055E BF[580A0000]            	mov	edi, cagecode
  1030 00000563 66B80001                	mov	ax, 256
  1031 00000567 6650                    	push	ax ; *
  1032 00000569 89E5                    	mov	ebp, esp
  1033                                  cryp3:
  1034 0000056B 6629D2                  	sub	dx, dx ; 0
  1035 0000056E 668916                  	mov	[esi], dx ; 0
  1036 00000571 BB[5A070000]            	mov	ebx, wheeldiv
  1037                                  cryp4:
  1038 00000576 668B4500                	mov	ax, [ebp]	
  1039 0000057A 8A0B                    	mov 	cl, [ebx]
  1040 0000057C F6F1                    	div	cl
  1041 0000057E 00E2                    	add	dl, ah
  1042 00000580 43                      	inc	ebx
  1043 00000581 80E21F                  	and	dl, 01Fh
  1044 00000584 53                      	push	ebx
  1045 00000585 BB[36070000]            	mov	ebx, shift
  1046 0000058A 01D3                    	add	ebx, edx
  1047 0000058C 668B03                  	mov	ax, [ebx] 
  1048 0000058F 660906                  	or	[esi], ax
  1049 00000592 59                      	pop	ecx
  1050 00000593 81F9[5D070000]          	cmp	ecx, wheeldiv + 3
  1051 00000599 7309                    	jnb	short cryp5
  1052 0000059B 83C304                  	add	ebx, 4
  1053 0000059E 668B03                  	mov	ax, [ebx]
  1054 000005A1 660907                  	or	[edi], ax 	 
  1055                                  cryp5:
  1056 000005A4 89CB                    	mov	ebx, ecx
  1057 000005A6 81FB[5F070000]          	cmp	ebx, wheeldiv + 5
  1058 000005AC 72C8                    	jb	short cryp4
  1059 000005AE 66836D0002              	sub	word [ebp], 2
  1060 000005B3 66AD                    	lodsw
  1061 000005B5 47                      	inc	edi
  1062 000005B6 47                      	inc	edi
  1063 000005B7 81FE[580D0000]          	cmp	esi, wheelcode + 256
  1064 000005BD 72AC                    	jb	short cryp3
  1065 000005BF 6658                    	pop	ax ; *
  1066                                  
  1067                                  ;	.data
  1068                                  ;shift:	1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000
  1069                                  ;	1;2
  1070                                  ;wheeldiv: 32.; 18.; 10.; 6.; 4.
  1071                                  ;	.bss
  1072                                  ;cagecode: .=.+256.
  1073                                  ;wheelcode: .=.+256.
  1074                                  ;	.text
  1075                                  ;/
  1076                                  ;/
  1077                                  ;/	make the internal settings of the machine
  1078                                  ;/	both the lugs on the 128 cage bars and the lugs
  1079                                  ;/	on the 16 wheels are set from the expanded key
  1080                                  ;/
  1081                                  ;	mov	$key,r0
  1082                                  ;	mov	$cage,r2
  1083                                  ;	mov	$wheel,r3
  1084                                  ;1:
  1085                                  ;	movb	(r0)+,r1
  1086                                  ;	bic	$!177,r1
  1087                                  ;	asl	r1
  1088                                  ;	mov	cagecode(r1),(r2)+
  1089                                  ;	mov	wheelcode(r1),(r3)+
  1090                                  ;	cmp	r0,$key+128.
  1091                                  ;	blo	1b
  1092                                  
  1093                                  ;/	make the internal settings of the machine
  1094                                  ;/	both the lugs on the 128 cage bars and the lugs
  1095                                  ;/	on the 16 wheels are set from the expanded key
  1096                                  cryp6:
  1097 000005C1 BB[CC070000]                    mov     ebx, key
  1098 000005C6 BE[58080000]                    mov     esi, cage
  1099 000005CB BF[58090000]                    mov     edi, wheel
  1100                                  cryp7:
  1101 000005D0 8A0B                            mov     cl, [ebx]
  1102 000005D2 43                              inc     ebx
  1103 000005D3 83E17F                          and     ecx, 7Fh
  1104 000005D6 D0E1                    	shl	cl, 1
  1105 000005D8 87CB                            xchg    ecx, ebx
  1106 000005DA 668B83[580A0000]                mov     ax, [ebx+cagecode]
  1107 000005E1 668906                          mov     [esi], ax
  1108 000005E4 46                              inc     esi
  1109 000005E5 46                              inc     esi
  1110 000005E6 668B83[580C0000]                mov     ax, [ebx+wheelcode]
  1111 000005ED 66AB                    	stosw
  1112 000005EF 89CB                            mov     ebx, ecx
  1113 000005F1 81FB[4C080000]                  cmp     ebx, key + 128
  1114 000005F7 72D7                    	jb	short cryp7
  1115                                  
  1116                                  ;/
  1117                                  ;/
  1118                                  ;/	now spin the cage against the wheel to produce output.
  1119                                  ;/
  1120                                  ;	mov	$word,r4
  1121                                  ;	mov	$wheel+128.,r3
  1122                                  ;3:
  1123                                  ;	mov	-(r3),r2
  1124                                  ;	mov	$cage,r0
  1125                                  ;	clr	r5
  1126                                  ;1:
  1127                                  ;	bit	r2,(r0)+
  1128                                  ;	beq	2f
  1129                                  ;	incb	r5
  1130                                  ;2:
  1131                                  ;	cmp	r0,$cage+256.
  1132                                  ;	blo	1b
  1133                                  
  1134                                  ;/
  1135                                  ;/	now spin the cage against the wheel to produce output.
  1136                                  ;/
  1137                                  cryp8:
  1138 000005F9 BF[4C080000]                    mov     edi, _word
  1139 000005FE BB[D8090000]                    mov     ebx, wheel + 128
  1140                                  cryp9:
  1141 00000603 4B                              dec     ebx
  1142 00000604 4B                              dec     ebx
  1143 00000605 668B13                          mov     dx, [ebx]
  1144 00000608 BE[58080000]                    mov     esi, cage
  1145 0000060D 6629C9                  	sub	cx, cx ; 0
  1146                                  cryp10:
  1147 00000610 66AD                    	lodsw
  1148 00000612 6685D0                  	test	ax, dx
  1149 00000615 7402                    	jz	short cryp11
  1150 00000617 FEC1                    	inc	cl
  1151                                  cryp11:
  1152 00000619 81FE[58090000]                  cmp     esi, cage + 256
  1153 0000061F 72EF                    	jb	short cryp10
  1154                                  
  1155                                  ;/
  1156                                  ;/	we have a piece of output from current wheel
  1157                                  ;/	it needs to be folded to remove lingering hopes of
  1158                                  ;/	inverting the function
  1159                                  ;/
  1160                                  ;	mov	r4,-(sp)
  1161                                  ;	clr	r4
  1162                                  ;	div	$26.+26.+10.,r4
  1163                                  ;	add	$'0,r5
  1164                                  ;	cmp	r5,$'9
  1165                                  ;	blos	1f
  1166                                  ;	add	$'A-'9-1,r5
  1167                                  ;	cmp	r5,$'Z
  1168                                  ;	blos	1f
  1169                                  ;	add	$'a-'Z-1,r5
  1170                                  ;1:
  1171                                  ;	mov	(sp)+,r4
  1172                                  ;	movb	r5,(r4)+
  1173                                  ;	cmp	r4,$word+8.
  1174                                  ;	blo	3b
  1175                                  ;/
  1176                                  ;
  1177                                  ;	mov	(sp)+,r5
  1178                                  ;	mov	(sp)+,r4
  1179                                  ;	mov	(sp)+,r3
  1180                                  ;	mov	(sp)+,r2
  1181                                  ;	mov	(sp)+,r1
  1182                                  ;	mov	$word,r0
  1183                                  ;	rts	pc
  1184                                  ;	.bss
  1185                                  ;key:	.=.+128.
  1186                                  ;word:	.=.+32.
  1187                                  ;cage:	.=.+256.
  1188                                  ;wheel:	.=.+256.
  1189                                  
  1190                                  ;/
  1191                                  ;/	we have a piece of output from current wheel
  1192                                  ;/	it needs to be folded to remove lingering hopes of
  1193                                  ;/	inverting the function
  1194                                  ;/
  1195 00000621 6689C8                  	mov	ax, cx
  1196 00000624 B23E                    	mov	dl, 26+26+10
  1197 00000626 F6F2                    	div	dl
  1198 00000628 88E0                    	mov	al, ah
  1199 0000062A 0430                    	add	al, '0'
  1200 0000062C 3C39                    	cmp	al, '9'
  1201 0000062E 7608                    	jna	short cryp12
  1202 00000630 0407                    	add	al, 'A'-'9'-1
  1203 00000632 3C5A                    	cmp	al, 'Z'
  1204 00000634 7602                    	jna	short cryp12
  1205 00000636 0406                    	add	al, 'a'-'Z'-1
  1206                                  cryp12:
  1207 00000638 AA                      	stosb	
  1208 00000639 81FF[54080000]                  cmp     edi, _word + 8
  1209 0000063F 72C2                    	jb	short cryp9
  1210 00000641 BE[4C080000]                    mov     esi, _word
  1211 00000646 C3                      	retn
  1212                                  
  1213                                  
  1214 00000647 90                      align 4
  1215                                  shellp:
  1216 00000648 [84060000]              	dd mshell
  1217 0000064C 00000000                	dd 0
  1218 00000650 2F746D702F75746D70      utmp:   db '/tmp/utmp'
  1219 00000659 00                              db 0
  1220 0000065A 2F746D702F77746D70      wtmp:   db '/tmp/wtmp'
  1221 00000663 00                              db 0
  1222 00000664 2F62696E2F7368          shell:	db '/bin/sh'
  1223 0000066B 00                      	db 0
  1224                                  shpl 	equ shell + 32 - shpad
  1225 0000066C 00<rept>                shpad:  times shpl db 0
  1226                                  
  1227 00000684 2D                      mshell: db '-'
  1228 00000685 00                      	db 0
  1229 00000686 2F6574632F6D6F7464      motd:   db '/etc/motd'
  1230 0000068F 00                              db 0
  1231 00000690 6D61696C626F78          mailf:  db 'mailbox'
  1232 00000697 00                              db 0
  1233                                  align 2
  1234 00000698 2F6574632F70617373-     passwdf: db '/etc/passwd'
  1235 000006A1 7764               
  1236 000006A3 00                              db 0
  1237 000006A4 2F6465762F747479        ttyx:   db '/dev/tty' ; db '/dev/ttyx'
  1238 000006AC 00                              db 0
  1239                                  
  1240 000006AD 2F64657600              dev:    db '/dev', 0
  1241                                  
  1242                                  align 2
  1243 000006B2 0D0A4E616D653A2000      msgName:  db 0Dh, 0Ah, 'Name: ', 0
  1244 000006BB 90                      align 2
  1245 000006BC 0D0A50617373776F72-     msgPswd:  db 0Dh, 0Ah, 'Password: ', 0
  1246 000006C5 643A2000           
  1247 000006C9 90                      align 2
  1248 000006CA 0D0A4C6F67696E2069-     msgIL:	  db 0Dh, 0Ah, 'Login incorrect !', 0
  1249 000006D3 6E636F727265637420-
  1250 000006DC 2100               
  1251                                  ;align 2
  1252 000006DE 0D0A4E6F205368656C-     msgNoSh:  db 0Dh, 0Ah, 'No Shell !'
  1253 000006E7 6C2021             
  1254 000006EA 0D0A00                  nextline: db 0Dh, 0Ah, 0
  1255 000006ED 90                      align 2
  1256                                  msgNoPswdf:
  1257 000006EE 0D0A43616E2774206F-             db 0Dh, 0Ah, "Can't open password file !"
  1258 000006F7 70656E207061737377-
  1259 00000700 6F72642066696C6520-
  1260 00000709 21                 
  1261 0000070A 0D0A00                  	db 0Dh, 0Ah, 0
  1262 0000070D 90                      align 2
  1263                                  msgNoDir:
  1264 0000070E 0D0A4E6F2064697265-     	db 0Dh, 0Ah, 'No directory !'
  1265 00000717 63746F72792021     
  1266 0000071E 0D0A00                  	db 0Dh, 0Ah, 0
  1267 00000721 90                      align 2
  1268                                  msgMail:
  1269 00000722 0D0A596F7520686176-     	db 0Dh, 0Ah, 'You have mail.'
  1270 0000072B 65206D61696C2E     
  1271 00000732 0D0A00                  	db 0Dh, 0Ah, 0
  1272                                  
  1273 00000735 90                      align 2
  1274 00000736 010002000400080010-     shift:	dw 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
  1275 0000073F 002000400080000001-
  1276 00000748 000200040008001000-
  1277 00000751 2000400080         
  1278 00000756 01000200                	dw 1, 2
  1279 0000075A 20120A0604              wheeldiv: db 32, 18, 10, 6, 4
  1280                                  
  1281 0000075F 90                      align 2	
  1282 00000760 A101                    	dw 417 ; 01A1h
  1283                                  
  1284 00000762 90<rept>                align 4
  1285                                  
  1286                                  bss_start:
  1287                                  
  1288                                  ABSOLUTE bss_start
  1289                                  
  1290 00000764 <res 00000004>          s_off:	resd 1
  1291                                  
  1292 00000768 <res 00000010>          uname: 	resb 16
  1293 00000778 <res 00000002>          	resw 1
  1294 0000077A <res 00000008>          passwd: resb 8
  1295 00000782 <res 00000002>          	resw 1
  1296 00000784 <res 00000020>          dirbuf: resb 32
  1297                                  ;shbuf: resb 32
  1298                                  ;ttyb:  resb 6
  1299 000007A4 <res 00000002>          uid:    resw 1
  1300 000007A6 <res 00000002>          chr:	resw 1
  1301                                  
  1302 000007A8 <res 00000022>          buf:	resb 34
  1303 000007CA <res 00000002>          ttyname: resw 1
  1304                                  
  1305 000007CC <res 00000080>          key:	resb 128
  1306 0000084C <res 0000000A>          _word:	resb 10  ; resb 32
  1307 00000856 <res 00000002>          	resb 2
  1308 00000858 <res 00000100>          cage:	resb 256
  1309 00000958 <res 00000100>          wheel:	resb 256
  1310 00000A58 <res 00000200>          cagecode:  resw 256
  1311 00000C58 <res 00000200>          wheelcode: resw 256
  1312                                  
  1313                                  alignb 4
  1314                                  
  1315 00000E58 <res 00000208>          pbuf:   resb 520
  1316                                  	
  1317                                  bss_end:
  1318                                  
  1319                                  _end:  ; end of login386.s (NASM 2.11) source code
  1320                                  
  1321                                  
  1322                                  
  1323                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1324                                  ;; login.s
  1325                                  ;
  1326                                  ;/  login --  enter new user
  1327                                  ;
  1328                                  ;.globl	ttyn
  1329                                  ;.globl	crypt
  1330                                  ;.globl	fopen
  1331                                  ;.globl	getc
  1332                                  ;.globl	mesg
  1333                                  ;
  1334                                  ;	sys	quit; 0
  1335                                  ;	sys	intr; 0
  1336                                  ;	jsr	pc,ttyn
  1337                                  ;	movb	r0,ttyx+8.
  1338                                  ;	sub	$'0,r0
  1339                                  ;	cmp	r0,$'a-'0
  1340                                  ;	blo	1f
  1341                                  ;	sub	$'a-'0-10.,r0	/ map a-z into 10. on
  1342                                  ;1:
  1343                                  ;	asl	r0
  1344                                  ;	asl	r0
  1345                                  ;	asl	r0
  1346                                  ;	asl	r0
  1347                                  ;	mov	r0,offset
  1348                                  ;	mov	(sp)+,r5
  1349                                  ;	tst	(sp)+
  1350                                  ;	dec	r5
  1351                                  ;	ble	login
  1352                                  ;	mov	(sp)+,r4
  1353                                  ;	mov	$uname,r1
  1354                                  ;2:
  1355                                  ;	movb	(r4)+,(r1)+
  1356                                  ;	bne	2b
  1357                                  ;	dec	r5
  1358                                  ;	ble	login
  1359                                  ;	mov	(sp)+,r4
  1360                                  ;	mov	$passwd,r1
  1361                                  ;2:
  1362                                  ;	movb	(r4)+,(r1)+
  1363                                  ;	bne	2b
  1364                                  ;login:
  1365                                  ;	clrb	uname+8.
  1366                                  ;	mov	$passwdf,r0
  1367                                  ;	jsr	r5,fopen; pbuf
  1368                                  ;	bec	1f
  1369                                  ;	jsr	r5,mesg; <Can't open password file\n\0>; .even
  1370                                  ;	sys	exit
  1371                                  ;1:
  1372                                  ;	jsr	pc,guname
  1373                                  ;1:
  1374                                  ;	jsr	r5,compar; uname
  1375                                  ;		br .+4
  1376                                  ;	br	2f
  1377                                  ;3:
  1378                                  ;	jsr	r5,getc; pbuf
  1379                                  ;	bes	sorry
  1380                                  ;	cmp	r0,$'\n
  1381                                  ;	bne	3b
  1382                                  ;	br	1b
  1383                                  ;sorry:
  1384                                  ;	jsr	r5,mesg; <Login incorrect\n\0>; .even
  1385                                  ;	mov	pbuf,r0
  1386                                  ;	sys	close
  1387                                  ;	clr	uname
  1388                                  ;	clr	passwd
  1389                                  ;	br	login
  1390                                  ;2:
  1391                                  ;	jsr	r5,getc; pbuf
  1392                                  ;	cmp	r0,$':
  1393                                  ;	beq	2f
  1394                                  ;	mov	r0,-(sp)
  1395                                  ;	jsr	pc,gpasswd
  1396                                  ;	cmpb	(r0)+,(sp)+
  1397                                  ;	bne	sorry
  1398                                  ;	mov	r0,0f
  1399                                  ;	jsr	r5,compar; 0:..
  1400                                  ;		br sorry
  1401                                  ;2:
  1402                                  ;	clr	r1
  1403                                  ;2:
  1404                                  ;	jsr	r5,getc; pbuf
  1405                                  ;	cmp	r0,$':
  1406                                  ;	beq	2f
  1407                                  ;	mpy	$10.,r1
  1408                                  ;	sub	$'0,r0
  1409                                  ;	add	r0,r1
  1410                                  ;	br	2b
  1411                                  ;2:
  1412                                  ;	mov	r1,0f
  1413                                  ;	sys	chown; ttyx; 0:..
  1414                                  ;	mov	r1,uid
  1415                                  ;1:
  1416                                  ;	jsr	r5,getc; pbuf
  1417                                  ;	cmp	r0,$':
  1418                                  ;	bne	1b			/ skip ident field
  1419                                  ;	mov	$dirbuf,r1
  1420                                  ;1:
  1421                                  ;	jsr	r5,getc; pbuf
  1422                                  ;	cmpb	r0,$':
  1423                                  ;	beq	1f
  1424                                  ;	movb	r0,(r1)+
  1425                                  ;	br	1b
  1426                                  ;1:
  1427                                  ;	clrb	(r1)
  1428                                  ;	sys	chdir; dirbuf
  1429                                  ;	bec	1f
  1430                                  ;	jsr	r5,mesg; <No directory\n\0>; .even
  1431                                  ;	br	sorry
  1432                                  ;1:
  1433                                  ;	mov	$uname+8.,r1
  1434                                  ;1:
  1435                                  ;	tstb	-(r1)
  1436                                  ;	bne	1f
  1437                                  ;	movb	$' ,(r1)
  1438                                  ;	br	1b
  1439                                  ;1:
  1440                                  ;	cmpb	ttyx+8.,$'x
  1441                                  ;	beq	1f
  1442                                  ;	sys	open; utmp; 1
  1443                                  ;	bes	1f
  1444                                  ;	mov	r0,r2
  1445                                  ;	sys	seek; offset:..; 0
  1446                                  ;	movb	ttyx+8.,uname+8.
  1447                                  ;	sys	time
  1448                                  ;	mov	r0,uname+10.
  1449                                  ;	mov	r1,uname+12.
  1450                                  ;	mov	r2,r0
  1451                                  ;	sys	write; uname; 16.
  1452                                  ;	mov	r2,r0
  1453                                  ;	sys	close
  1454                                  ;1:
  1455                                  ;	cmpb	ttyx+8.,$'x
  1456                                  ;	beq	1f
  1457                                  ;	sys	open; wtmp; 1
  1458                                  ;	bes	1f
  1459                                  ;	mov	r0,r1
  1460                                  ;	sys	seek; 0; 2
  1461                                  ;	sys	write; uname; 16.
  1462                                  ;	mov	r1,r0
  1463                                  ;	sys	close
  1464                                  ;1:
  1465                                  ;	jsr	r5,getc; pbuf
  1466                                  ;	cmp	r0,$'\n
  1467                                  ;	beq	1f
  1468                                  ;	mov	$shell,r1
  1469                                  ;2:
  1470                                  ;	movb	r0,(r1)+
  1471                                  ;	jsr	r5,getc; pbuf
  1472                                  ;	cmp	r0,$'\n
  1473                                  ;	bne	2b
  1474                                  ;	clrb	(r1)
  1475                                  ;1:
  1476                                  ;	mov	pbuf,r0
  1477                                  ;	sys	close
  1478                                  ;	mov	$motd,r0
  1479                                  ;	jsr	r5,fopen; pbuf
  1480                                  ;	bes	1f
  1481                                  ;2:
  1482                                  ;	jsr	r5,getc; pbuf
  1483                                  ;	bes	1f
  1484                                  ;	mov	r0,uname
  1485                                  ;	mov	$1,r0
  1486                                  ;	sys	write; uname; 1
  1487                                  ;	br	2b
  1488                                  ;1:
  1489                                  ;	mov	pbuf,r0
  1490                                  ;	sys	close
  1491                                  ;	sys	stat; mailf; pbuf
  1492                                  ;	bes	1f
  1493                                  ;	tst	pbuf+6
  1494                                  ;	beq	1f
  1495                                  ;	jsr	r5,mesg; <You have mail\n\0>; .even
  1496                                  ;1:
  1497                                  ;	mov	uid,r0
  1498                                  ;	sys	setuid
  1499                                  ;	sys	exec; shell; shellp
  1500                                  ;	jsr	r5,mesg; <No Shell\n\0>; .even
  1501                                  ;	sys	exit
  1502                                  ;
  1503                                  ;gpasswd:
  1504                                  ;	mov	$passwd,r1
  1505                                  ;	tstb	(r1)
  1506                                  ;	bne	3f
  1507                                  ;	clr	r0
  1508                                  ;	sys	gtty; ttyb
  1509                                  ;	bic	$10,ttyb+4		/ turn off echo
  1510                                  ;	clr	r0
  1511                                  ;	sys	stty; ttyb
  1512                                  ;	jsr	r5,mesg; <Password: \0>; .even
  1513                                  ;2:
  1514                                  ;	jsr	pc,tgetc
  1515                                  ;	movb	r0,(r1)+
  1516                                  ;	beq	1f
  1517                                  ;	cmp	r1,$passwd+9.
  1518                                  ;	blo	2b
  1519                                  ;	dec	r1
  1520                                  ;	br	2b
  1521                                  ;1:
  1522                                  ;	bis	$10,ttyb+4		/ turn on echo
  1523                                  ;	clr	r0
  1524                                  ;	sys	stty; ttyb
  1525                                  ;	jsr	r5,mesg; <\n\0>; .even
  1526                                  ;3:
  1527                                  ;	mov	$passwd,r0
  1528                                  ;	jsr	pc,crypt
  1529                                  ;	clrb	8(r0)
  1530                                  ;	rts	pc
  1531                                  ;
  1532                                  ;guname:
  1533                                  ;	mov	$uname,r1
  1534                                  ;	tstb	(r1)
  1535                                  ;	bne	1f
  1536                                  ;	clr	(r1)+
  1537                                  ;	clr	(r1)+
  1538                                  ;	clr	(r1)+
  1539                                  ;	clr	(r1)+
  1540                                  ;	mov	$uname,r1
  1541                                  ;	jsr	r5,mesg; <Name: \0>; .even
  1542                                  ;2:
  1543                                  ;	jsr	pc,tgetc
  1544                                  ;	movb	r0,(r1)+
  1545                                  ;	beq	1f
  1546                                  ;	cmp	r1,$uname+9.
  1547                                  ;	blo	2b
  1548                                  ;	dec	r1
  1549                                  ;	br	2b
  1550                                  ;1:
  1551                                  ;	rts	pc
  1552                                  ;
  1553                                  ;compar:
  1554                                  ;	mov	(r5)+,r4
  1555                                  ;1:
  1556                                  ;	jsr	r5,getc; pbuf
  1557                                  ;	bes	2f
  1558                                  ;	cmpb	r0,(r4)+
  1559                                  ;	beq	1b
  1560                                  ;	cmp	r0,$':
  1561                                  ;	bne	1f
  1562                                  ;	tstb	-(r4)
  1563                                  ;	bne	1f
  1564                                  ;	tst	(r5)+
  1565                                  ;1:
  1566                                  ;	rts	r5
  1567                                  ;2:
  1568                                  ;	tst	(sp)+
  1569                                  ;	jmp	sorry
  1570                                  ;
  1571                                  ;tgetc:
  1572                                  ;	clr	r0
  1573                                  ;	sys	read; ch; 1
  1574                                  ;	tst	r0
  1575                                  ;	bne	1f
  1576                                  ;	sys	exit
  1577                                  ;1:
  1578                                  ;	mov	ch,r0
  1579                                  ;	cmp	r0,$'\n
  1580                                  ;	bne	1f
  1581                                  ;	clr	r0
  1582                                  ;1:
  1583                                  ;	rts	pc
  1584                                  ;
  1585                                  ;shellp:
  1586                                  ;	mshell
  1587                                  ;	0
  1588                                  ;utmp:	</tmp/utmp\0>
  1589                                  ;wtmp:	</tmp/wtmp\0>
  1590                                  ;shell:	</bin/sh\0>; .=shell+32.
  1591                                  ;mshell:<-\0>
  1592                                  ;motd:	</etc/motd\0>
  1593                                  ;mailf:	<mailbox\0>
  1594                                  ;passwdf:</etc/passwd\0>
  1595                                  ;ttyx:	</dev/ttyx\0>
  1596                                  ;.even
  1597                                  ;.bss
  1598                                  ;uname: .=.+16.
  1599                                  ;passwd:.=.+8.
  1600                                  ;dirbuf:.=.+32.
  1601                                  ;shbuf:	.=.+32.
  1602                                  ;ttyb:	.=.+6
  1603                                  ;uid:	.=.+2
  1604                                  ;ch:	.=.+2
  1605                                  ;pbuf:	.=.+518.
  1606                                  
  1607                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1608                                  ;; ttyn.s
  1609                                  ;
  1610                                  ;/ return name of current tty
  1611                                  ;
  1612                                  ;.globl	ttyn, _ttyn
  1613                                  ;
  1614                                  ;_ttyn:
  1615                                  ;	mov	2(sp),r0
  1616                                  ;	br	1f
  1617                                  ;ttyn:
  1618                                  ;	clr	r0
  1619                                  ;1:
  1620                                  ;	mov	$'x,name
  1621                                  ;	tst	-(sp)
  1622                                  ;	sys	fstat; buf
  1623                                  ;	bes	er1
  1624                                  ;	mov	buf+2,(sp)
  1625                                  ;	sys	open; dev; 0
  1626                                  ;	bes	er1
  1627                                  ;	mov	r0,r1
  1628                                  ;1:
  1629                                  ;	mov	r1,r0
  1630                                  ;	sys	read; buf; 16.
  1631                                  ;	bes	er
  1632                                  ;	cmp	r0,$16.
  1633                                  ;	bne	er
  1634                                  ;	mov	$buf,r0
  1635                                  ;	cmp	(r0)+,(sp)
  1636                                  ;	bne	1b
  1637                                  ;	cmp	(r0)+,$"tt
  1638                                  ;	bne	1b
  1639                                  ;	cmpb	(r0)+,$'y
  1640                                  ;	bne	1b
  1641                                  ;	tstb	(r0)+
  1642                                  ;	beq	1b
  1643                                  ;	cmpb	(r0),$'\0
  1644                                  ;	bne	1b
  1645                                  ;	movb	-(r0),name
  1646                                  ;
  1647                                  ;er:
  1648                                  ;	mov	r1,r0
  1649                                  ;	sys	close
  1650                                  ;
  1651                                  ;er1:
  1652                                  ;	tst	(sp)+
  1653                                  ;	movb	name,r0
  1654                                  ;	rts	pc
  1655                                  ;
  1656                                  ;.data
  1657                                  ;dev:	</dev\0>
  1658                                  ;.even
  1659                                  ;.bss
  1660                                  ;buf:	.=.+40.
  1661                                  ;name:	.=.+2
  1662                                  
  1663                                  
  1664                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1665                                  ;; get.s (unix v5)
  1666                                  ;
  1667                                  ; fopen -- open a file for use by get(c|w)
  1668                                  ;
  1669                                  ;fopen:
  1670                                  ;	mov	r1,-(sp)
  1671                                  ;	mov	(r5)+,r1
  1672                                  ;	mov	r0,0f
  1673                                  ;	sys	0; 9f
  1674                                  ;.data
  1675                                  ;9:
  1676                                  ;	sys	open; 0:..; 0
  1677                                  ;.text
  1678                                  ;	bes	1f
  1679                                  ;	mov	r0,(r1)+
  1680                                  ;	clr	(r1)+
  1681                                  ;	mov	(sp)+,r1
  1682                                  ;	rts	r5
  1683                                  ;1:
  1684                                  ;	mov	$-1,(r1)
  1685                                  ;	mov	(sp)+,r1
  1686                                  ;	sec
  1687                                  ;	rts	r5
  1688                                  ;
  1689                                  
  1690                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1691                                  ;; get.s (unix v5)
  1692                                  ;
  1693                                  ; getc -- get characters from input file
  1694                                  ;
  1695                                  ;getc:
  1696                                  ;	mov	r1,-(sp)
  1697                                  ;	mov	(r5)+,r1
  1698                                  ;	dec	2(r1)
  1699                                  ;	bge	1f
  1700                                  ;	mov	r1,r0
  1701                                  ;	add	$6,r0
  1702                                  ;	mov	r0,0f
  1703                                  ;	mov	r0,4(r1)
  1704                                  ;	mov	(r1),r0
  1705                                  ;	sys	0; 9f
  1706                                  ;.data
  1707                                  ;9:
  1708                                  ;	sys	read; 0:..; 512.
  1709                                  ;.text
  1710                                  ;	bes	2f
  1711                                  ;	tst	r0
  1712                                  ;	bne	3f
  1713                                  ;2:
  1714                                  ;	mov	(sp)+,r1
  1715                                  ;	sec
  1716                                  ;	rts	r5
  1717                                  ;3:
  1718                                  ;	dec	r0
  1719                                  ;	mov	r0,2(r1)
  1720                                  ;1:
  1721                                  ;	clr	r0
  1722                                  ;	bisb	*4(r1),r0
  1723                                  ;	inc	4(r1)
  1724                                  ;	mov	(sp)+,r1
  1725                                  ;	rts	r5
  1726                                  
  1727                                  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1728                                  ;; crypt.s (unix v5)
  1729                                  ;
  1730                                  ;/ crypt -- password incoding
  1731                                  ;
  1732                                  ;/	mov	$key,r0
  1733                                  ;/	jsr	pc,crypt
  1734                                  ;
  1735                                  ;.globl	crypt, word
  1736                                  ;
  1737                                  ;crypt:
  1738                                  ;	mov	r1,-(sp)
  1739                                  ;	mov	r2,-(sp)
  1740                                  ;	mov	r3,-(sp)
  1741                                  ;	mov	r4,-(sp)
  1742                                  ;	mov	r5,-(sp)
  1743                                  ;
  1744                                  ;	mov	r0,r1
  1745                                  ;	mov	$key,r0
  1746                                  ;	movb	$004,(r0)+
  1747                                  ;	movb	$034,(r0)+
  1748                                  ;1:
  1749                                  ;	cmp	r0,$key+64.
  1750                                  ;	bhis	1f
  1751                                  ;	movb	(r1)+,(r0)+
  1752                                  ;	bne	1b
  1753                                  ;1:
  1754                                  ;	dec	r0
  1755                                  ;/
  1756                                  ;/
  1757                                  ;/	fill out key space with clever junk
  1758                                  ;/
  1759                                  ;	mov	$key,r1
  1760                                  ;1:
  1761                                  ;	movb	-1(r0),r2
  1762                                  ;	movb	(r1)+,r3
  1763                                  ;	xor	r3,r2
  1764                                  ;	movb	r2,(r0)+
  1765                                  ;	cmp	r0,$key+128.
  1766                                  ;	blo	1b
  1767                                  ;/
  1768                                  ;/
  1769                                  ;/	establish wheel codes and cage codes
  1770                                  ;/
  1771                                  ;	mov	$wheelcode,r4
  1772                                  ;	mov	$cagecode,r5
  1773                                  ;	mov	$256.,-(sp)
  1774                                  ;2:
  1775                                  ;	clr	r2
  1776                                  ;	clr	(r4)
  1777                                  ;	mov	$wheeldiv,r3
  1778                                  ;3:
  1779                                  ;	clr	r0
  1780                                  ;	mov	(sp),r1
  1781                                  ;	div	(r3)+,r0
  1782                                  ;	add	r1,r2
  1783                                  ;	bic	$40,r2
  1784                                  ;	bis	shift(r2),(r4)
  1785                                  ;	cmp	r3,$wheeldiv+6.
  1786                                  ;	bhis	4f
  1787                                  ;	bis	shift+4(r2),(r5)
  1788                                  ;4:
  1789                                  ;	cmp	r3,$wheeldiv+10.
  1790                                  ;	blo	3b
  1791                                  ;	sub	$2,(sp)
  1792                                  ;	tst	(r4)+
  1793                                  ;	tst	(r5)+
  1794                                  ;	cmp	r4,$wheelcode+256.
  1795                                  ;	blo	2b
  1796                                  ;	tst	(sp)+
  1797                                  ;/
  1798                                  ;	.data
  1799                                  ;shift:	1;2;4;10;20;40;100;200;400;1000;2000;4000;10000;20000;40000;100000
  1800                                  ;	1;2
  1801                                  ;wheeldiv: 32.; 18.; 10.; 6.; 4.
  1802                                  ;	.bss
  1803                                  ;cagecode: .=.+256.
  1804                                  ;wheelcode: .=.+256.
  1805                                  ;	.text
  1806                                  ;/
  1807                                  ;/
  1808                                  ;/	make the internal settings of the machine
  1809                                  ;/	both the lugs on the 128 cage bars and the lugs
  1810                                  ;/	on the 16 wheels are set from the expanded key
  1811                                  ;/
  1812                                  ;	mov	$key,r0
  1813                                  ;	mov	$cage,r2
  1814                                  ;	mov	$wheel,r3
  1815                                  ;1:
  1816                                  ;	movb	(r0)+,r1
  1817                                  ;	bic	$!177,r1
  1818                                  ;	asl	r1
  1819                                  ;	mov	cagecode(r1),(r2)+
  1820                                  ;	mov	wheelcode(r1),(r3)+
  1821                                  ;	cmp	r0,$key+128.
  1822                                  ;	blo	1b
  1823                                  ;/
  1824                                  ;/
  1825                                  ;/	now spin the cage against the wheel to produce output.
  1826                                  ;/
  1827                                  ;	mov	$word,r4
  1828                                  ;	mov	$wheel+128.,r3
  1829                                  ;3:
  1830                                  ;	mov	-(r3),r2
  1831                                  ;	mov	$cage,r0
  1832                                  ;	clr	r5
  1833                                  ;1:
  1834                                  ;	bit	r2,(r0)+
  1835                                  ;	beq	2f
  1836                                  ;	incb	r5
  1837                                  ;2:
  1838                                  ;	cmp	r0,$cage+256.
  1839                                  ;	blo	1b
  1840                                  ;/
  1841                                  ;/	we have a piece of output from current wheel
  1842                                  ;/	it needs to be folded to remove lingering hopes of
  1843                                  ;/	inverting the function
  1844                                  ;/
  1845                                  ;	mov	r4,-(sp)
  1846                                  ;	clr	r4
  1847                                  ;	div	$26.+26.+10.,r4
  1848                                  ;	add	$'0,r5
  1849                                  ;	cmp	r5,$'9
  1850                                  ;	blos	1f
  1851                                  ;	add	$'A-'9-1,r5
  1852                                  ;	cmp	r5,$'Z
  1853                                  ;	blos	1f
  1854                                  ;	add	$'a-'Z-1,r5
  1855                                  ;1:
  1856                                  ;	mov	(sp)+,r4
  1857                                  ;	movb	r5,(r4)+
  1858                                  ;	cmp	r4,$word+8.
  1859                                  ;	blo	3b
  1860                                  ;/
  1861                                  ;
  1862                                  ;	mov	(sp)+,r5
  1863                                  ;	mov	(sp)+,r4
  1864                                  ;	mov	(sp)+,r3
  1865                                  ;	mov	(sp)+,r2
  1866                                  ;	mov	(sp)+,r1
  1867                                  ;	mov	$word,r0
  1868                                  ;	rts	pc
  1869                                  ;	.bss
  1870                                  ;key:	.=.+128.
  1871                                  ;word:	.=.+32.
  1872                                  ;cage:	.=.+256.
  1873                                  ;wheel:	.=.+256.
