NEW
  AUTO 3,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF sbin/getty
*--------------------------------------
				.INB inc/macros.i
				.INB inc/a2osx.i
				.INB inc/net.telnet.i
*--------------------------------------
TIMEOUT.MAX		.EQ 40					4 sec.
IAC.BUF.MAX		.EQ 32
*--------------------------------------
				.DUMMY
				.OR ZPBIN
ZS.START
ZPPtr1			.BS 2
TimeOut			.BS 1
hErr			.BS 1
ArgIndex		.BS 1
ArgDev			.BS 1
ArgProg			.BS 1
hFILE			.BS 1
bExitOnClose	.BS 1
IAC.CMD			.BS 1
IAC.SUBCMD		.BS 1
IAC.SB.CMD		.BS 1
IAC.SB.LEN		.BS 1
ZS.END			.ED
*--------------------------------------
*			File Header (16 Bytes)
*--------------------------------------
CS.START		cld
				jmp (.1,x)
				.DA #$61				6502,Level 1 (65c02)
				.DA #1					BIN Layout Version 1
				.DA #S.PS.F.EVENT		S.PS.F
				.DA #0
				.DA CS.END-CS.START		Code Size (without Constants)
				.DA DS.END-DS.START		Data SegmentSize
				.DA #32					Stack Size
				.DA #ZS.END-ZS.START	Zero Page Size
				.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1				.DA CS.INIT
				.DA CS.RUN
				.DA CS.DOEVENT
				.DA	CS.QUIT
L.MSG.USAGE		.DA MSG.USAGE
L.MSG.GREETINGS .DA MSG.GREETINGS
L.TELNETOPTS	.DA TELNETOPTS
L.TELNETOPT.TTYPE	.DA TELNETOPT.TTYPE
L.TELNETOPT.LMODE	.DA TELNETOPT.LMODE
L.ENV.TERM		.DA ENV.TERM
				.DA 0					End Of Reloc Table
*--------------------------------------
CS.INIT			clc
				rts
*--------------------------------------
CS.RUN			ldy #S.PS.ARGC
				lda (pPS),y
				cmp #2

				bcc .9

.1				inc ArgIndex
				lda ArgIndex
				>SYSCALL ArgV
				bcs .8

				>STYA ZPPtr1

				jsr CkeckOption
				bcs .9

				beq .1					valid option, check next arg 

				lda ArgDev
				bne .2

				lda ArgIndex
				sta ArgDev
				bra .1

.2				lda ArgProg
				bne .9

				lda ArgIndex
				sta ArgProg
				bra .1

.9				>PUSHW L.MSG.USAGE
				>PUSHBI 0
				>SYSCALL PrintF
				lda #E.SYN
				sec
.99				rts

.8				lda ArgDev
				beq .9

				lda ArgProg
				beq .9

				ldy #S.PS.hStdErr
				lda (pPS),y
				sta hErr
				
				lda ArgDev
				>SYSCALL ArgV
				>PUSHYA
				>PUSHBI O.RDWR
				>PUSHBI 0				type
				>PUSHWZ					auxtype

				>SYSCALL FOpen
				bcs .99

				ldy #S.PS.hStdIn
				sta (pPS),y
				iny						#S.PS.hStdOut
				sta (pPS),y
				iny						#S.PS.hStdErr
				sta (pPS),y
				sta hFILE
	
CS.RUN.LOOP0 	>SLEEP

				>PUSHW L.ENV.TERM
				>SYSCALL UnsetEnv

.1				ldy #S.PS.hStdOut
				lda (pPS),y
				>PUSHA
				>PUSHW L.TELNETOPTS
				>PUSHWI TELNETOPTS.LEN
				>SYSCALL FWrite
				bcs CS.RUN.EXIT			I/O error

				lda #TIMEOUT.MAX
				sta TimeOut
			
CS.RUN.LOOP1	>SLEEP

				ldy #S.PS.hStdIn
				lda (pPS),y
				>SYSCALL FEOF
				bcs CS.RUN.9			I/O error

				tay
				bne .1					no char

				>SYSCALL GetChar
				bcs CS.RUN.9

				cmp #IAC
				beq CS.RUN.IACMODE

				>SYSCALL PutChar
				bcs CS.RUN.EXIT

				bra CS.RUN.LOOP1

.1				lda TimeOut
				bne CS.RUN.LOOP1

				jsr CS.RUN.GREETINGS
				bcs CS.RUN.EXIT			unable to send greetings...

.2				lda ArgProg
				>SYSCALL ArgV
				>PUSHYA
				>PUSHBI S.PS.F.HOLD
				>SYSCALL ExecV
				>SLEEP

CS.RUN.EXIT		lda bExitOnClose
				bmi .8

				ldy #S.PS.S
				lda (pPS),y
				cmp #S.PS.S.QUIT		I've been killed :-(
				beq .8
				
				jmp CS.RUN.LOOP0

.8				lda #0
				sec		
CS.RUN.9		rts
*--------------------------------------
CS.RUN.IACMODE	>SYSCALL GetChar		Wait for IAC CMD (or SB)
				bcs CS.RUN.9

				sta IAC.CMD
				>SYSCALL GetChar		Wait for IAC SUBCMD
				bcs CS.RUN.9

				sta IAC.SUBCMD
				tax
				lda IAC.CMD
				cmp #SB
				beq CS.RUN.IAC.SB
*--------------------------------------			
CS.RUN.IAC.CMD	cmp #WILL
				bne .8

				cpx #TN.O.TTYPE
				bne .2

				ldy #S.PS.hStdOut
				lda (pPS),y
				>PUSHA
				>PUSHW L.TELNETOPT.TTYPE
				>PUSHWI TELNETOPT.TTYPE.LEN
				bra .7

.2				cpx #TN.O.LINEMODE
				bne .8

				ldy #S.PS.hStdOut
				lda (pPS),y
				>PUSHA
				>PUSHW L.TELNETOPT.LMODE
				>PUSHWI TELNETOPT.LMODE.LEN

.7				>SYSCALL FWrite

.8				jmp CS.RUN.LOOP1
*--------------------------------------
CS.RUN.IAC.SB  	>SYSCALL GetChar		Wait for IAC SB.IS or SEND
				bcs .9

				sta IAC.SB.CMD
				stz IAC.SB.LEN
.2				>SYSCALL GetChar
				bcs .9

				cmp #IAC
				beq .4					end of DATA, go wait SE

				ldy IAC.SB.LEN
				sta (pData),y
				iny
				lda #0
				sta (pData),y
				sty IAC.SB.LEN
				cpy #IAC.BUF.MAX
				bne .2

				bra .8

.4				>SYSCALL GetChar
				bcs .9

				cmp #SE
				bne .8

				lda IAC.SUBCMD
				cmp #TN.O.TTYPE
				bne .8

				lda IAC.SB.CMD
				cmp #SB.IS
				bne .8

				>PUSHW L.ENV.TERM
				>PUSHW pData			 IAC.SB.DATA
				>SYSCALL SetEnv
.8				jmp CS.RUN.LOOP1
.9				rts
*--------------------------------------
CS.RUN.GREETINGS
				>PUSHW L.MSG.GREETINGS
				>PUSHW A2osX.KVER
				lda ArgDev
				>SYSCALL ArgV
				>PUSHYA
				>PUSHBI 4
				>SYSCALL PrintF
				rts
*--------------------------------------
CS.DOEVENT		lda (pEvent)
				bpl .9					is it a TIMER event?

				lda TimeOut
				beq .9

				dec TimeOut

.9				sec						do not discard TIMER event
				rts	
*--------------------------------------
CS.QUIT			lda hFILE
				beq .8

				>SYSCALL FClose

.8				clc
				rts
*--------------------------------------
CkeckOption		lda (ZPPtr1)
				cmp #'-'
				bne .8

				ldy #2 
				lda (ZPPtr1),y
				bne .8

				dey
				lda (ZPPtr1),y
				ldx #OptionVars-OptionList-1

.2				cmp OptionList,x
				beq .3

				dex
				bpl .2

				sec						invalid option
				rts

.3				ldy OptionVars,x
				eor #$80				toggle option
				sta $0,y
				lda #0					exit with 0

.8				clc						!0 if not an option
				rts
*--------------------------------------
CS.END
OptionList		.AS "Ee"
OptionVars		.DA #bExitOnClose,#bExitOnClose
MSG.GREETINGS	.AZ "\r\nA2osX-GeTTY %d.%d on %s\r\n"
MSG.USAGE		.AS "Usage : GETTY <DEV> <PROGRAM>\r\n"
				.AZ "   -E : Exit on disconnect\r\n"
*--------------------------------------
TELNETOPTS		.DA #IAC,#WILL,#TN.O.BINARY
				.DA #IAC,#WILL,#TN.O.ECHO
				.DA #IAC,#WILL,#TN.O.SGA
				.DA #IAC,#DO,#TN.O.SGA
*				.DA #IAC,#DO,#TN.O.NAWS
				.DA #IAC,#DO,#TN.O.TTYPE
				.DA #IAC,#DO,#TN.O.LINEMODE
TELNETOPTS.LEN	.EQ *-TELNETOPTS
*--------------------------------------
TELNETOPT.TTYPE	.DA #IAC,#SB,#TN.O.TTYPE,#SB.SEND,#IAC,#SE
TELNETOPT.TTYPE.LEN	.EQ *-TELNETOPT.TTYPE
*--------------------------------------
TELNETOPT.LMODE	.DA #IAC,#SB,#TN.O.LINEMODE,#SB.SEND,#0,#IAC,#SE
TELNETOPT.LMODE.LEN .EQ *-TELNETOPT.LMODE
ENV.TERM		.AZ "TERM"
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
IAC.SB.DATA		.BS IAC.BUF.MAX
DS.END			.ED
MAN
SAVE usr/src/sbin/getty.s
ASM
