     1                                  ; ****************************************************************************
     2                                  ; getty386.s (getty2.s) - Retro Unix 386 v1 - /etc/getty
     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 'getty07.asm' source code file of 'Retro UNIX 8086 v1'
    10                                  ; operating system project, /etc/getty source code by Erdogan Tan
    11                                  ; (06/11/2013-22/05/2014)
    12                                  ;
    13                                  ; Derived from 'getty.s' file of original UNIX operating system
    14                                  ; (v1.0 for PDP-11)
    15                                  ; ****************************************************************************
    16                                  ; getty386.s (13/10/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit version)
    17                                  ; GETTY07.ASM, 06/11/2013 - 22/05/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                                  ;;;
    62                                  ENTERKEY  equ 0Dh
    63                                  NEXTLINE  equ 0Ah
    64                                  BACKSPACE equ 08h
    65                                  ; 22/05/2014
    66                                  EOT	  equ 04h ; 'End Of Transfer' for serial ports	
    67                                  
    68                                  %macro sys 1-4
    69                                      ; Retro UNIX 386 v1 system call.		
    70                                      %if %0 >= 2   
    71                                          mov ebx, %2
    72                                          %if %0 >= 3    
    73                                              mov ecx, %3
    74                                              %if %0 = 4
    75                                                 mov edx, %4   
    76                                              %endif
    77                                          %endif
    78                                      %endif
    79                                      mov eax, %1
    80                                      int 30h	   
    81                                  %endmacro
    82                                  
    83                                  ; Retro UNIX 386 v1 system call format:
    84                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    85                                  
    86                                  [BITS 32] ; We need 32-bit intructions for protected mode
    87                                  
    88                                  [ORG 0] 
    89                                  
    90                                  START_CODE:
    91                                  
    92                                  	sys _quit, 0
    93                              <1> 
    94                              <1>  %if %0 >= 2
    95 00000000 BB00000000          <1>  mov ebx, %2
    96                              <1>  %if %0 >= 3
    97                              <1>  mov ecx, %3
    98                              <1>  %if %0 = 4
    99                              <1>  mov edx, %4
   100                              <1>  %endif
   101                              <1>  %endif
   102                              <1>  %endif
   103 00000005 B81A000000          <1>  mov eax, %1
   104 0000000A CD30                <1>  int 30h
   105                                  	sys _intr, 0
   106                              <1> 
   107                              <1>  %if %0 >= 2
   108 0000000C BB00000000          <1>  mov ebx, %2
   109                              <1>  %if %0 >= 3
   110                              <1>  mov ecx, %3
   111                              <1>  %if %0 = 4
   112                              <1>  mov edx, %4
   113                              <1>  %endif
   114                              <1>  %endif
   115                              <1>  %endif
   116 00000011 B81B000000          <1>  mov eax, %1
   117 00000016 CD30                <1>  int 30h
   118                                  
   119                                          sys _gtty, 0, 1  ; get status of console tty (w)
   120                              <1> 
   121                              <1>  %if %0 >= 2
   122 00000018 BB00000000          <1>  mov ebx, %2
   123                              <1>  %if %0 >= 3
   124 0000001D B901000000          <1>  mov ecx, %3
   125                              <1>  %if %0 = 4
   126                              <1>  mov edx, %4
   127                              <1>  %endif
   128                              <1>  %endif
   129                              <1>  %endif
   130 00000022 B820000000          <1>  mov eax, %1
   131 00000027 CD30                <1>  int 30h
   132 00000029 0F8245010000                    jc  terminate
   133                                  	;
   134 0000002F A2[8D010000]            	mov [console], al
   135 00000034 0430                    	add al, '0'
   136 00000036 A2[B4010000]            	mov [ttynum], al
   137                                  	;	
   138                                  	sys _write, 1, msglogin, ml_size
   139                              <1> 
   140                              <1>  %if %0 >= 2
   141 0000003B BB01000000          <1>  mov ebx, %2
   142                              <1>  %if %0 >= 3
   143 00000040 B9[9C010000]        <1>  mov ecx, %3
   144                              <1>  %if %0 = 4
   145 00000045 BA24000000          <1>  mov edx, %4
   146                              <1>  %endif
   147                              <1>  %endif
   148                              <1>  %endif
   149 0000004A B804000000          <1>  mov eax, %1
   150 0000004F CD30                <1>  int 30h
   151 00000051 0F821D010000                    jc  terminate
   152                                  	;
   153                                  	;; mov word [cursorpos], 0FF00h
   154                                  	;; mov byte [cposll], 0
   155                                  	;
   156 00000057 803D[8D010000]07         	cmp byte [console], 7
   157 0000005E 772B                    	ja  short G0
   158                                  	; 	
   159                                  	sys _gtty, 0, 1  ; get status of console tty (w)	
   160                              <1> 
   161                              <1>  %if %0 >= 2
   162 00000060 BB00000000          <1>  mov ebx, %2
   163                              <1>  %if %0 >= 3
   164 00000065 B901000000          <1>  mov ecx, %3
   165                              <1>  %if %0 = 4
   166                              <1>  mov edx, %4
   167                              <1>  %endif
   168                              <1>  %endif
   169                              <1>  %endif
   170 0000006A B820000000          <1>  mov eax, %1
   171 0000006F CD30                <1>  int 30h
   172 00000071 0F82FD000000                    jc  terminate
   173                                  	;
   174 00000077 66891D[8F010000]        	mov [cursorpos], bx
   175 0000007E 881D[8E010000]          	mov [cposll], bl
   176 00000084 C605[8C010000]07        	mov byte [chr], 07h ; bell/beep
   177                                  G0:
   178                                  	sys _write, 1, chr, 1
   179                              <1> 
   180                              <1>  %if %0 >= 2
   181 0000008B BB01000000          <1>  mov ebx, %2
   182                              <1>  %if %0 >= 3
   183 00000090 B9[8C010000]        <1>  mov ecx, %3
   184                              <1>  %if %0 = 4
   185 00000095 BA01000000          <1>  mov edx, %4
   186                              <1>  %endif
   187                              <1>  %endif
   188                              <1>  %endif
   189 0000009A B804000000          <1>  mov eax, %1
   190 0000009F CD30                <1>  int 30h
   191 000000A1 0F82CD000000                    jc  terminate
   192                                  	;
   193 000000A7 BF[C2010000]                    mov edi, uname
   194 000000AC 89FE                    	mov esi, edi
   195                                  getc:
   196                                  	sys _read, 0, chr, 1
   197                              <1> 
   198                              <1>  %if %0 >= 2
   199 000000AE BB00000000          <1>  mov ebx, %2
   200                              <1>  %if %0 >= 3
   201 000000B3 B9[8C010000]        <1>  mov ecx, %3
   202                              <1>  %if %0 = 4
   203 000000B8 BA01000000          <1>  mov edx, %4
   204                              <1>  %endif
   205                              <1>  %endif
   206                              <1>  %endif
   207 000000BD B803000000          <1>  mov eax, %1
   208 000000C2 CD30                <1>  int 30h
   209 000000C4 0F82AA000000                    jc  terminate
   210                                  	;
   211 000000CA A0[8C010000]            	mov al, [chr]
   212                                  
   213 000000CF 3C20                    	cmp al, 20h
   214 000000D1 7233                    	jb  short G2
   215                                  
   216 000000D3 3C7F                    	cmp al, 127
   217 000000D5 7437                    	je  short G3
   218                                  
   219 000000D7 81FF[D2010000]                  cmp edi, uname + 16
   220 000000DD 733E                    	jnb short G4
   221                                  putc:
   222 000000DF AA                      	stosb
   223 000000E0 FE05[8F010000]          	inc byte [cursorpos]
   224 000000E6 39FE                    	cmp esi, edi
   225 000000E8 7302                    	jnb short G1
   226 000000EA 89FE                    	mov esi, edi
   227                                  G1:
   228                                  	sys _write, 1, chr, 1
   229                              <1> 
   230                              <1>  %if %0 >= 2
   231 000000EC BB01000000          <1>  mov ebx, %2
   232                              <1>  %if %0 >= 3
   233 000000F1 B9[8C010000]        <1>  mov ecx, %3
   234                              <1>  %if %0 = 4
   235 000000F6 BA01000000          <1>  mov edx, %4
   236                              <1>  %endif
   237                              <1>  %endif
   238                              <1>  %endif
   239 000000FB B804000000          <1>  mov eax, %1
   240 00000100 CD30                <1>  int 30h
   241 00000102 73AA                    	jnc  short getc
   242                                  	;
   243 00000104 EB6E                    	jmp short terminate
   244                                  G2:
   245 00000106 3C0D                    	cmp al, ENTERKEY  ; \r (carriage return)
   246 00000108 744C                            je  short G7
   247                                  
   248                                  	;cmp al, NEXTLINE  ; \n (next line)
   249                                          ;je  short G7
   250                                  
   251 0000010A 3C08                    	cmp al, BACKSPACE  ; \b (back space)
   252 0000010C 75A0                    	jne short getc
   253                                  G3:
   254                                  	; Backspace
   255 0000010E 668B15[8F010000]        	mov dx, [cursorpos]
   256                                  	;
   257 00000115 3A15[8E010000]          	cmp dl, [cposll] ; left limit
   258 0000011B 7709                    	ja  short G5
   259                                  G4:
   260 0000011D C605[8C010000]07        	mov byte [chr], 07h
   261 00000124 EBC6                    	jmp short G1
   262                                  G5:
   263 00000126 FECA                    	dec dl
   264 00000128 8815[8F010000]          	mov byte [cursorpos], dl
   265 0000012E 8A0D[8D010000]          	mov cl, [console]
   266 00000134 80F908                  	cmp cl, 8
   267 00000137 720A                    	jb  short G6
   268 00000139 4F                      	dec edi
   269                                  	;mov [chr], al
   270 0000013A C605[8C010000]08        	mov byte [chr], BACKSPACE
   271 00000141 EBA9                    	jmp short G1	
   272                                  G6:
   273 00000143 B520                    	mov ch, 20h ; ch < FFh & ch > 0 -> write 20h
   274                                  		    ; (space) at requested cursor position	 		
   275 00000145 31DB                    	xor ebx, ebx ; 0 
   276                                  	sys _stty  ; set cursor pos. for console tty
   277                              <1> 
   278                              <1>  %if %0 >= 2
   279                              <1>  mov ebx, %2
   280                              <1>  %if %0 >= 3
   281                              <1>  mov ecx, %3
   282                              <1>  %if %0 = 4
   283                              <1>  mov edx, %4
   284                              <1>  %endif
   285                              <1>  %endif
   286                              <1>  %endif
   287 00000147 B81F000000          <1>  mov eax, %1
   288 0000014C CD30                <1>  int 30h
   289                                  		   ; (back space)
   290 0000014E 7224                    	jc  short terminate
   291 00000150 4F                      	dec edi
   292 00000151 E958FFFFFF                      jmp getc
   293                                  G7:
   294 00000156 C60600                  	mov byte [esi], 0 ; ASCIIZ string
   295 00000159 807EFF20                	cmp byte [esi-1], 20h
   296 0000015D 7504                    	jne short go
   297 0000015F C646FF00                	mov byte [esi-1], 0
   298                                  go:
   299                                          sys _exec, login, loginp
   300                              <1> 
   301                              <1>  %if %0 >= 2
   302 00000163 BB[91010000]        <1>  mov ebx, %2
   303                              <1>  %if %0 >= 3
   304 00000168 B9[80010000]        <1>  mov ecx, %3
   305                              <1>  %if %0 = 4
   306                              <1>  mov edx, %4
   307                              <1>  %endif
   308                              <1>  %endif
   309                              <1>  %endif
   310 0000016D B80B000000          <1>  mov eax, %1
   311 00000172 CD30                <1>  int 30h
   312                                  terminate:
   313                                          sys _exit
   314                              <1> 
   315                              <1>  %if %0 >= 2
   316                              <1>  mov ebx, %2
   317                              <1>  %if %0 >= 3
   318                              <1>  mov ecx, %3
   319                              <1>  %if %0 = 4
   320                              <1>  mov edx, %4
   321                              <1>  %endif
   322                              <1>  %endif
   323                              <1>  %endif
   324 00000174 B801000000          <1>  mov eax, %1
   325 00000179 CD30                <1>  int 30h
   326                                  here:	
   327 0000017B F4                      	hlt
   328 0000017C EBFD                    	jmp short here
   329                                  
   330 0000017E 90<rept>                align 4
   331                                  loginp: 
   332 00000180 [91010000]              	dd login
   333 00000184 [C2010000]                      dd uname
   334 00000188 00000000                	dd 0
   335                                  chr:	
   336 0000018C 00                      	db 0
   337                                  ;align 2
   338                                  console: 
   339 0000018D 00                      	db 0 ; console tty
   340                                  ; cursor position
   341                                  cposll: 
   342 0000018E 00                      	db 0 ; left limit of cursor position
   343                                  cursorpos: 
   344 0000018F 00                      	db 0 ; row (for backspace)
   345 00000190 FF                      	db 0FFh ; column 
   346                                             ; (FFh for serial ports, for sysstty) 
   347                                  ;(cursorpos will set by return of sysgtty for pseduo ttys)
   348                                  
   349                                  ;align 2
   350                                  login:	
   351 00000191 2F62696E2F6C6F6769-     	db '/bin/login', 0
   352 0000019A 6E00               
   353                                  
   354                                  align 2
   355                                  msglogin:
   356 0000019C 0D0A                    	db 0Dh, 0Ah
   357 0000019E 526574726F20556E69-     	db 'Retro Unix 386 v1 (tty'
   358 000001A7 782033383620763120-
   359 000001B0 28747479           
   360 000001B4 78                      ttynum: db 'x'
   361 000001B5 29                      	db ')'
   362 000001B6 0D0A                    	db 0Dh, 0Ah
   363 000001B8 6C6F67696E203A20        	db 'login : '
   364                                  ml_size equ $ - msglogin
   365 000001C0 00                      	db 0
   366 000001C1 90                      align 2
   367                                  uname:  
   368 000001C2 00<rept>                	times 16 db 0
   369                                  
   370                                  ;/ getty --  get name and tty mode
   371                                  ;/ for initialization
   372                                  ;
   373                                  ;/ cycle through speeds and "login:" messages
   374                                  ;/ summarized in itab
   375                                  ;
   376                                  ;stty = 31.
   377                                  ;
   378                                  ;	sys	quit; 0
   379                                  ;	sys	intr; 0
   380                                  ;0:
   381                                  ;	jsr	r5,nextspeed
   382                                  ;1:
   383                                  ;	mov	$name,r5
   384                                  ;2:
   385                                  ;	jsr	r5,getc
   386                                  ;	cmp	r0,$174
   387                                  ;	beq	5f
   388                                  ;	cmp	r0,$176
   389                                  ;	beq	5f
   390                                  ;	cmp	r0,$'\n
   391                                  ;	beq	1f
   392                                  ;	cmp	r0,$'\r
   393                                  ;	beq	4f
   394                                  ;	cmp	r0,$'@
   395                                  ;	beq	1b
   396                                  ;	cmp	r0,$'#
   397                                  ;	bne	3f
   398                                  ;	cmp	r5,$name
   399                                  ;	blos	2b
   400                                  ;	dec	r5
   401                                  ;	br	2b
   402                                  ;3:
   403                                  ;	movb	r0,(r5)+
   404                                  ;	br	2b
   405                                  ;4:
   406                                  ;	bis	$20,flags		/cr bit
   407                                  ;	mov	$1,r0
   408                                  ;	sys	write; nl; 1
   409                                  ;	br	2f
   410                                  ;5:
   411                                  ;	mov	$tab2741,itabp
   412                                  ;	inc	nowr
   413                                  ;	br	0b
   414                                  ;1:
   415                                  ;	mov	$1,r0
   416                                  ;	sys	write; cr; 1
   417                                  ;2:
   418                                  ;	clrb	(r5)+
   419                                  ;
   420                                  ;/ determine whether terminal is upper-case only
   421                                  ;
   422                                  ;	cmp	r5,$name+1
   423                                  ;	bhi	1f
   424                                  ;	bic	$4,flags	/no data-assume lc
   425                                  ;1:
   426                                  ;	mov	$name,r5
   427                                  ;1:
   428                                  ;	movb	(r5)+,r0
   429                                  ;	beq	1f
   430                                  ;	cmp	r0,$'A
   431                                  ;	blo	2f
   432                                  ;	cmp	r0,$'Z
   433                                  ;	bhi	2f
   434                                  ;	add	$40,r0		/ map to lc
   435                                  ;	movb	r0,-1(r5)
   436                                  ;	br	1b
   437                                  ;2:
   438                                  ;	cmp	r0,$'a
   439                                  ;	blo	1b
   440                                  ;	cmp	r0,$'z
   441                                  ;	bhi	1b
   442                                  ;	bic	$4,flags
   443                                  ;	br	1b
   444                                  ;1:
   445                                  ;	clr	r0
   446                                  ;	mov	fstate,r4
   447                                  ;	bis	flags,4(r4)
   448                                  ;	sys	stty; fstate: ..
   449                                  ;
   450                                  ;go:
   451                                  ;	sys	exec; login; loginp
   452                                  ;	sys	exit
   453                                  ;
   454                                  ;getc:
   455                                  ;	clr	r0
   456                                  ;	sys	read; ch; 1
   457                                  ;	tst	r0
   458                                  ;	beq	done
   459                                  ;	mov	ch,r2
   460                                  ;	beq	1f
   461                                  ;getc1:
   462                                  ;	cmp	r2,$174
   463                                  ;	bhis	3f
   464                                  ;	tst	nowr
   465                                  ;	bne	3f
   466                                  ;	mov	$1,r0
   467                                  ;	sys	write; ch; 1
   468                                  ;3:
   469                                  ;	mov	r2,r0
   470                                  ;	rts	r5
   471                                  ;1:
   472                                  ;	dec	$0		/ wait a while
   473                                  ;	bne	1b
   474                                  ;	mov	$name,(sp)
   475                                  ;	jsr	r5,nextspeed
   476                                  ;2:
   477                                  ;	clr	r0		/ flush nulls
   478                                  ;	sys	read; ch; 1
   479                                  ;	tst	r0
   480                                  ;	beq	done
   481                                  ;	movb	ch,r2
   482                                  ;	beq	2b
   483                                  ;	br	getc1
   484                                  ;
   485                                  ;done:
   486                                  ;	sys	exit
   487                                  ;
   488                                  ;nextspeed:
   489                                  ;	mov	itabp,r1
   490                                  ;	mov	(r1)+,0f
   491                                  ;	bne	1f
   492                                  ;	mov	$itab,itabp
   493                                  ;	br	nextspeed
   494                                  ;1:
   495                                  ;	clr	r0
   496                                  ;	sys	stty; 0:..
   497                                  ;	bes	go
   498                                  ;	mov	(r1)+,-(sp)
   499                                  ;	mov	(r1)+,fstate
   500                                  ;	mov	r1,itabp
   501                                  ;	mov	(sp)+,r1
   502                                  ;1:
   503                                  ;	movb	(r1)+,ch
   504                                  ;	beq	1f
   505                                  ;	mov	$1,r0
   506                                  ;	sys	write; ch; 1
   507                                  ;	br	1b
   508                                  ;1:
   509                                  ;	rts	r5
   510                                  ;
   511                                  ;itabp:	itab
   512                                  ;loginp:login
   513                                  ;	name
   514                                  ;	0
   515                                  ;
   516                                  ;itab:
   517                                  ;	itty37; ttymes; tty37
   518                                  ;	itn300; tnmes;  tn300
   519                                  ;tab2741:i2741; m2741; f2741
   520                                  ;	0
   521                                  ;
   522                                  ;itty37:511; 511; 340	/ any parity, raw, 150 baud
   523                                  ;tty37:	511; 511; 210	/ 37 parity, echo, 150 baud
   524                                  ;itn300:521; 521; 340	/ any parity, raw, cr, 300 baud
   525                                  ;tn300:	521; 521; 310	/ any parity, echo, 300 baud
   526                                  ;i2741:	1501; 501; 100540	/134 bits, 2741, raw, first time
   527                                  ;f2741:	1501; 501; 500	/134 bps, 2741
   528                                  ;
   529                                  ;	0
   530                                  ;m2741:	<\nlogin: \0>
   531                                  ;
   532                                  ;ttymes:
   533                                  ;	<\n\r\p:\alogin: \0>
   534                                  ;tnmes:
   535                                  ;	<\n\r\p;login: \0>
   536                                  ;
   537                                  ;login:	</bin/login\0>
   538                                  ;	.even
   539                                  ;
   540                                  ;nl:	<\n>
   541                                  ;cr:	<\r>
   542                                  ;
   543                                  ;flags:	004	/ upper case map
   544                                  ;
   545                                  ;	.bss
   546                                  ;ch:	.=.+2
   547                                  ;nowr:	.=.+2
   548                                  ;name:	.=.+32.
