1 ; **************************************************************************** 2 ; getty386.s (getty3.s) - Retro Unix 386 v1.2 - /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: 18/02/2022 ] 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 17 ; getty3.s (05/02/2022, Retro UNIX 386 v1 & v1.1 & v1.2) 18 ; getty2.s (17/11/2015, Retro UNIX 386 v1 & v1.1) 19 ; getty1.s (11/11/2015, Retro UNIX 386 v1) 20 ; getty0.s (13/10/2015, Retro UNIX 386 v1, NASM 2.11, 32 bit version) 21 ; GETTY07.ASM, 06/11/2013 - 22/05/2014 (Retro UNIX 8086 v1, MASM 6.11) 22 23 ; 12/01/2022 (Retro UNIX 386 v1.2) 24 ; 13/10/2015 25 26 ; Assembler: NASM 2.11 27 ; UNIX v1 system calls 28 _rele equ 0 29 _exit equ 1 30 _fork equ 2 31 _read equ 3 32 _write equ 4 33 _open equ 5 34 _close equ 6 35 _wait equ 7 36 _creat equ 8 37 _link equ 9 38 _unlink equ 10 39 _exec equ 11 40 _chdir equ 12 41 _time equ 13 42 _mkdir equ 14 43 _chmod equ 15 44 _chown equ 16 45 _break equ 17 46 _stat equ 18 47 _seek equ 19 48 _tell equ 20 49 _mount equ 21 50 _umount equ 22 51 _setuid equ 23 52 _getuid equ 24 53 _stime equ 25 54 _quit equ 26 55 _intr equ 27 56 _fstat equ 28 57 _emt equ 29 58 _mdate equ 30 59 _stty equ 31 60 _gtty equ 32 61 _ilgins equ 33 62 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 63 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 64 _sleep equ 34 ; Retro UNIX 8086 v1 feature only ! 65 _msg equ 35 ; Retro UNIX 386 v1 feature only ! 66 _geterr equ 36 ; Retro UNIX 386 v1 feature only ! 67 ; 12/01/2022 - Retro UNIX 386 v1.2 68 ; Retro UNIX 386 v2 system calls 69 _setgid equ 37 70 _getgid equ 38 71 _sysver equ 39 ; (get) Retro Unix 386 version 72 73 ;;; 74 ENTERKEY equ 0Dh 75 NEXTLINE equ 0Ah 76 BACKSPACE equ 08h 77 ; 22/05/2014 78 EOT equ 04h ; 'End Of Transfer' for serial ports 79 80 %macro sys 1-4 81 ; Retro UNIX 386 v1 system call. 82 %if %0 >= 2 83 mov ebx, %2 84 %if %0 >= 3 85 mov ecx, %3 86 %if %0 = 4 87 mov edx, %4 88 %endif 89 %endif 90 %endif 91 mov eax, %1 92 int 30h 93 %endmacro 94 95 ; Retro UNIX 386 v1 system call format: 96 ; sys systemcall (eax) , , 97 98 [BITS 32] ; We need 32-bit intructions for protected mode 99 100 [ORG 0] 101 102 START_CODE: 103 104 sys _quit, 0 81 <1> 82 <1> %if %0 >= 2 83 00000000 BB00000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 <1> mov ecx, %3 86 <1> %if %0 = 4 87 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 00000005 B81A000000 <1> mov eax, %1 92 0000000A CD30 <1> int 30h 105 sys _intr, 0 81 <1> 82 <1> %if %0 >= 2 83 0000000C BB00000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 <1> mov ecx, %3 86 <1> %if %0 = 4 87 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 00000011 B81B000000 <1> mov eax, %1 92 00000016 CD30 <1> int 30h 106 107 sys _gtty, 0, 1 ; get status of console tty (w) 81 <1> 82 <1> %if %0 >= 2 83 00000018 BB00000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 0000001D B901000000 <1> mov ecx, %3 86 <1> %if %0 = 4 87 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 00000022 B820000000 <1> mov eax, %1 92 00000027 CD30 <1> int 30h 108 ;jc short terminate 109 ; 05/02/2022 110 00000029 7224 jc short dont 111 ; 112 0000002B A2[75010000] mov [console], al 113 00000030 0430 add al, '0' 114 00000032 A2[9C010000] mov [ttynum], al 115 ; 116 sys _write, 1, msglogin, ml_size 81 <1> 82 <1> %if %0 >= 2 83 00000037 BB01000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 0000003C B9[84010000] <1> mov ecx, %3 86 <1> %if %0 = 4 87 00000041 BA24000000 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 00000046 B804000000 <1> mov eax, %1 92 0000004B CD30 <1> int 30h 117 ;jc short terminate 118 0000004D 7305 jnc short do 119 dont: ; 05/02/2022 120 0000004F E999000000 jmp terminate 121 do: 122 ;;mov word [cursorpos], 0FF00h 123 ;;mov byte [cposll], 0 124 ; 125 00000054 803D[75010000]07 cmp byte [console], 7 126 0000005B 7727 ja short G0 127 ; 128 sys _gtty, 0, 1 ; get status of console tty (w) 81 <1> 82 <1> %if %0 >= 2 83 0000005D BB00000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 00000062 B901000000 <1> mov ecx, %3 86 <1> %if %0 = 4 87 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 00000067 B820000000 <1> mov eax, %1 92 0000006C CD30 <1> int 30h 129 ;jc short terminate 130 ; 05/02/2022 131 0000006E 72DF jc short dont 132 133 00000070 66891D[77010000] mov [cursorpos], bx 134 00000077 881D[76010000] mov [cposll], bl 135 0000007D C605[74010000]07 mov byte [chr], 07h ; bell/beep 136 G0: 137 sys _write, 1, chr, 1 81 <1> 82 <1> %if %0 >= 2 83 00000084 BB01000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 00000089 B9[74010000] <1> mov ecx, %3 86 <1> %if %0 = 4 87 0000008E BA01000000 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 00000093 B804000000 <1> mov eax, %1 92 00000098 CD30 <1> int 30h 138 0000009A 7251 jc short terminate 139 ; 140 0000009C BF[AA010000] mov edi, uname 141 ; 18/02/2022 142 ;mov esi, edi 143 getc: 144 sys _read, 0, chr, 1 81 <1> 82 <1> %if %0 >= 2 83 000000A1 BB00000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 000000A6 B9[74010000] <1> mov ecx, %3 86 <1> %if %0 = 4 87 000000AB BA01000000 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 000000B0 B803000000 <1> mov eax, %1 92 000000B5 CD30 <1> int 30h 145 000000B7 7234 jc short terminate 146 ; 147 000000B9 A0[74010000] mov al, [chr] 148 149 000000BE 3C20 cmp al, 20h 150 000000C0 7235 jb short G2 151 152 000000C2 3C7F cmp al, 127 153 000000C4 7439 je short G3 154 155 000000C6 81FF[BA010000] cmp edi, uname + 16 156 000000CC 7340 jnb short G4 157 putc: 158 000000CE AA stosb 159 000000CF FE05[77010000] inc byte [cursorpos] 160 ; 18/02/2022 161 ;cmp esi, edi 162 ;jnb short G1 163 ;mov esi, edi 164 G1: 165 sys _write, 1, chr, 1 81 <1> 82 <1> %if %0 >= 2 83 000000D5 BB01000000 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 000000DA B9[74010000] <1> mov ecx, %3 86 <1> %if %0 = 4 87 000000DF BA01000000 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 000000E4 B804000000 <1> mov eax, %1 92 000000E9 CD30 <1> int 30h 166 000000EB 73B4 jnc short getc 167 168 ; 05/02/2022 169 terminate: 170 sys _exit 81 <1> 82 <1> %if %0 >= 2 83 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 <1> mov ecx, %3 86 <1> %if %0 = 4 87 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 000000ED B801000000 <1> mov eax, %1 92 000000F2 CD30 <1> int 30h 171 here: 172 000000F4 F4 hlt 173 000000F5 EBFD jmp short here 174 175 G2: 176 000000F7 3C0D cmp al, ENTERKEY ; \r (carriage return) 177 000000F9 744B je short G7 178 179 ;cmp al, NEXTLINE ; \n (next line) 180 ;je short G7 181 182 000000FB 3C08 cmp al, BACKSPACE ; \b (back space) 183 000000FD 75A2 jne short getc 184 G3: 185 ; Backspace 186 000000FF 668B15[77010000] mov dx, [cursorpos] 187 ; 188 00000106 3A15[76010000] cmp dl, [cposll] ; left limit 189 0000010C 7709 ja short G5 190 G4: 191 0000010E C605[74010000]07 mov byte [chr], 07h 192 00000115 EBBE jmp short G1 193 G5: 194 00000117 4F dec edi ; 18/02/2022 195 ; 196 00000118 FECA dec dl 197 0000011A 8815[77010000] mov byte [cursorpos], dl 198 00000120 8A0D[75010000] mov cl, [console] 199 00000126 80F908 cmp cl, 8 200 00000129 7209 jb short G6 201 ; 18/02/2022 202 ;dec edi 203 ;;mov [chr], al 204 0000012B C605[74010000]08 mov byte [chr], BACKSPACE 205 00000132 EBA1 jmp short G1 206 G6: 207 00000134 B520 mov ch, 20h ; ch < FFh & ch > 0 -> write 20h 208 ; (space) at requested cursor position 209 00000136 31DB xor ebx, ebx ; 0 210 sys _stty ; set cursor pos. for console tty 81 <1> 82 <1> %if %0 >= 2 83 <1> mov ebx, %2 84 <1> %if %0 >= 3 85 <1> mov ecx, %3 86 <1> %if %0 = 4 87 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 00000138 B81F000000 <1> mov eax, %1 92 0000013D CD30 <1> int 30h 211 ; (back space) 212 0000013F 72AC jc short terminate 213 ; 18/02/2022 214 ;dec edi 215 00000141 E95BFFFFFF jmp getc 216 G7: 217 ;mov byte [esi], 0 ; ASCIIZ string 218 ;cmp byte [esi-1], 20h 219 ;jne short go 220 ;mov byte [esi-1], 0 221 ;G8: 222 ;dec esi 223 ;; 18/02/2022 224 ;cmp byte [esi], 20h 225 ;jne short go 226 ;mov byte [esi], 0 227 ;jmp short G8 228 229 ; 18/02/2022 230 00000146 C60700 mov byte [edi], 0 231 G8: 232 00000149 4F dec edi 233 0000014A 803F20 cmp byte [edi], 20h 234 0000014D 7505 jne short go 235 0000014F C60700 mov byte [edi], 0 236 00000152 EBF5 jmp short G8 237 go: 238 sys _exec, login, loginp 81 <1> 82 <1> %if %0 >= 2 83 00000154 BB[79010000] <1> mov ebx, %2 84 <1> %if %0 >= 3 85 00000159 B9[68010000] <1> mov ecx, %3 86 <1> %if %0 = 4 87 <1> mov edx, %4 88 <1> %endif 89 <1> %endif 90 <1> %endif 91 0000015E B80B000000 <1> mov eax, %1 92 00000163 CD30 <1> int 30h 239 ; 05/02/2022 240 00000165 EB86 jmp short terminate 241 242 00000167 90 align 4 243 loginp: 244 00000168 [79010000] dd login 245 0000016C [AA010000] dd uname 246 00000170 00000000 dd 0 247 chr: 248 00000174 00 db 0 249 ;align 2 250 console: 251 00000175 00 db 0 ; console tty 252 ; cursor position 253 cposll: 254 00000176 00 db 0 ; left limit of cursor position 255 cursorpos: 256 00000177 00 db 0 ; row (for backspace) 257 00000178 FF db 0FFh ; column 258 ; (FFh for serial ports, for sysstty) 259 ;(cursorpos will set by return of sysgtty for pseduo ttys) 260 261 ;align 2 262 login: 263 00000179 2F62696E2F6C6F6769- db '/bin/login', 0 263 00000182 6E00 264 265 align 2 266 msglogin: 267 00000184 0D0A db 0Dh, 0Ah 268 00000186 526574726F20556E69- db 'Retro Unix 386 v1 (tty' 268 0000018F 782033383620763120- 268 00000198 28747479 269 0000019C 78 ttynum: db 'x' 270 0000019D 29 db ')' 271 0000019E 0D0A db 0Dh, 0Ah 272 000001A0 6C6F67696E203A20 db 'login : ' 273 ml_size equ $ - msglogin 274 000001A8 00 db 0 275 000001A9 90 align 2 276 uname: 277 000001AA 00 times 16 db 0 278 ; 18/02/2022 279 000001BA 00 db 0 280 000001BB 12 db 18 281 282 ;/ getty -- get name and tty mode 283 ;/ for initialization 284 ; 285 ;/ cycle through speeds and "login:" messages 286 ;/ summarized in itab 287 ; 288 ;stty = 31. 289 ; 290 ; sys quit; 0 291 ; sys intr; 0 292 ;0: 293 ; jsr r5,nextspeed 294 ;1: 295 ; mov $name,r5 296 ;2: 297 ; jsr r5,getc 298 ; cmp r0,$174 299 ; beq 5f 300 ; cmp r0,$176 301 ; beq 5f 302 ; cmp r0,$'\n 303 ; beq 1f 304 ; cmp r0,$'\r 305 ; beq 4f 306 ; cmp r0,$'@ 307 ; beq 1b 308 ; cmp r0,$'# 309 ; bne 3f 310 ; cmp r5,$name 311 ; blos 2b 312 ; dec r5 313 ; br 2b 314 ;3: 315 ; movb r0,(r5)+ 316 ; br 2b 317 ;4: 318 ; bis $20,flags /cr bit 319 ; mov $1,r0 320 ; sys write; nl; 1 321 ; br 2f 322 ;5: 323 ; mov $tab2741,itabp 324 ; inc nowr 325 ; br 0b 326 ;1: 327 ; mov $1,r0 328 ; sys write; cr; 1 329 ;2: 330 ; clrb (r5)+ 331 ; 332 ;/ determine whether terminal is upper-case only 333 ; 334 ; cmp r5,$name+1 335 ; bhi 1f 336 ; bic $4,flags /no data-assume lc 337 ;1: 338 ; mov $name,r5 339 ;1: 340 ; movb (r5)+,r0 341 ; beq 1f 342 ; cmp r0,$'A 343 ; blo 2f 344 ; cmp r0,$'Z 345 ; bhi 2f 346 ; add $40,r0 / map to lc 347 ; movb r0,-1(r5) 348 ; br 1b 349 ;2: 350 ; cmp r0,$'a 351 ; blo 1b 352 ; cmp r0,$'z 353 ; bhi 1b 354 ; bic $4,flags 355 ; br 1b 356 ;1: 357 ; clr r0 358 ; mov fstate,r4 359 ; bis flags,4(r4) 360 ; sys stty; fstate: .. 361 ; 362 ;go: 363 ; sys exec; login; loginp 364 ; sys exit 365 ; 366 ;getc: 367 ; clr r0 368 ; sys read; ch; 1 369 ; tst r0 370 ; beq done 371 ; mov ch,r2 372 ; beq 1f 373 ;getc1: 374 ; cmp r2,$174 375 ; bhis 3f 376 ; tst nowr 377 ; bne 3f 378 ; mov $1,r0 379 ; sys write; ch; 1 380 ;3: 381 ; mov r2,r0 382 ; rts r5 383 ;1: 384 ; dec $0 / wait a while 385 ; bne 1b 386 ; mov $name,(sp) 387 ; jsr r5,nextspeed 388 ;2: 389 ; clr r0 / flush nulls 390 ; sys read; ch; 1 391 ; tst r0 392 ; beq done 393 ; movb ch,r2 394 ; beq 2b 395 ; br getc1 396 ; 397 ;done: 398 ; sys exit 399 ; 400 ;nextspeed: 401 ; mov itabp,r1 402 ; mov (r1)+,0f 403 ; bne 1f 404 ; mov $itab,itabp 405 ; br nextspeed 406 ;1: 407 ; clr r0 408 ; sys stty; 0:.. 409 ; bes go 410 ; mov (r1)+,-(sp) 411 ; mov (r1)+,fstate 412 ; mov r1,itabp 413 ; mov (sp)+,r1 414 ;1: 415 ; movb (r1)+,ch 416 ; beq 1f 417 ; mov $1,r0 418 ; sys write; ch; 1 419 ; br 1b 420 ;1: 421 ; rts r5 422 ; 423 ;itabp: itab 424 ;loginp:login 425 ; name 426 ; 0 427 ; 428 ;itab: 429 ; itty37; ttymes; tty37 430 ; itn300; tnmes; tn300 431 ;tab2741:i2741; m2741; f2741 432 ; 0 433 ; 434 ;itty37:511; 511; 340 / any parity, raw, 150 baud 435 ;tty37: 511; 511; 210 / 37 parity, echo, 150 baud 436 ;itn300:521; 521; 340 / any parity, raw, cr, 300 baud 437 ;tn300: 521; 521; 310 / any parity, echo, 300 baud 438 ;i2741: 1501; 501; 100540 /134 bits, 2741, raw, first time 439 ;f2741: 1501; 501; 500 /134 bps, 2741 440 ; 441 ; 0 442 ;m2741: <\nlogin: \0> 443 ; 444 ;ttymes: 445 ; <\n\r\p:\alogin: \0> 446 ;tnmes: 447 ; <\n\r\p;login: \0> 448 ; 449 ;login: 450 ; .even 451 ; 452 ;nl: <\n> 453 ;cr: <\r> 454 ; 455 ;flags: 004 / upper case map 456 ; 457 ; .bss 458 ;ch: .=.+2 459 ;nowr: .=.+2 460 ;name: .=.+32.