 sttl Terminal Drivers
 pag

*
* The routines in this file make up the main system
* terminal drivers.  Most of the work is actually
* performed by other internal routines.
*

*
* ttopn
*
* Open a terminal for use.  On entry, D has
* the device number.
*

ttopn pshs d save device number
 bsr ttftab get table address
 lda tstate,x get states
 bita #TOPEN is it already open?
 bne ttopn8
 bsr ttdopn do actual open
ttopn8 ldy taddr,x point to device
 jsr ttenr enable rcv interrupts
 puls d,pc return


*
* ttdopn
*
* Do actual terminal open.  X points to tty entry.
*

ttdopn ldy taddr,x get device address
 jsr ttconf configure the port
 bne ttdop6 is it ready?
 pshs cc,x,y save regs
 seti mask ints
 jsr ttenx enable xmit ints only
 ldb #TTYOPR set priority
 ldy tqout,x point to output q
 jsr sleep sleep on CTS
 puls cc,x,y reset regs
 bra ttdopn repeat open
ttdop6 lda #ECHO|XTABS|CRMOD|BSECH
 sta tflags,x setup initial mode
 lda #BSPCH get backspace char
 sta tbksp,x save in table
 lda #CNCLC get cancel character
 sta tcncl,x save in table
 lda tstate,x set OPEN flag
 ora #TOPEN set open status
 sta tstate,x save in table
 lda #DSR_OK allow transmitting
 sta tstate2,x
 rts return

 pag

*
* ttcls
*
* Close the terminal whode device number is in D.
*

ttcls bsr ttftab find table entry
 lda tstate,x was the port really opened?
 bita #TOPEN
 beq 10f no - just clean up & get out
 anda #!TOPEN
 sta tstate,x keep from getting stuck...
 lbsr flusho flush out buffers
 ldy taddr,x get device address
 jsr ttenno close down the port
10 lda tstate,x clear state bits
 anda #PROTOCOL preserve protocol flags
 sta tstate,x
 rts

*
* ttftab
*
* Find tty table entry associated with device in D.
* Exit with entry pointed at by X.
*

ttftab ldx ttytab point to table
 lda #TTYSIZ set size up
 mul calculate offset
 leax d,x point to entry
 rts return


 pag

*
* tintr
*
* TTY interrupt handler.  Determine if the interrupt
* is a receive or transmit one and take appropriate
* actions.
*

 if DEBUG&DBG_HAN
00 fcc $d,'TINTR, (D) = $',0
01 fcc ', (X) = $',0
02 fcc ', (Y) = $',0
03 fcc ', TTYTAB = $',0
04 fcc ', (DP) = $',0
10 fcc ', Sys Vars:',$d,0
 endif
tintr
 if DEBUG&DBG_HAN
 pshs d save regs ** temp **
 endif
 bsr ttftab calculate table address
 ldy taddr,x get device address
 if DEBUG&DBG_HAN
 pshs x,y
 ldx #00b
 jsr DB_pdata
 ldd 4,s
 jsr DB_phex2
 ldx #01b
 jsr DB_pdata
 ldd 0,s
 jsr DB_phex2
 ldx #02b
 jsr DB_pdata
 ldd 2,s
 jsr DB_phex2
 ldx #03b
 jsr DB_pdata
 ldd ttytab
 jsr DB_phex2
 ldx #04b
 jsr DB_pdata
 tfr dp,a
 jsr DB_phex
 ldx #10b
 jsr DB_pdata
 ldx #sys_vars
 ldy #CLISTS
 jsr DB_dump
 puls x,y
 puls d clean up stack
99 cmpy #0
 beq 99b
 endif
01 pshs y save port address
 jsr tttstr test for rcv int
 bne tintr2
 jsr tttstb test for break interrupt
 bne tintr5
 jsr tttstc test drop carrier int
 bne tintr6
 jsr tttstd test dsr change
 bne tintr8
 jsr tttste test error int
 bne tintr7 ** should be 7? **
 jsr tttstx test for xmit int
 bne tintr3
 bra tintr9
tintr2 jsr ttgetc get character from port
 jsr ttyin go buffer char
 bra tintr9
tintr3 jsr ttyst go output another char
 ldd [tqout,x] check queue count
 beq tintr4
 cmpd #OQLO low water mark?
 bne tintr9
tintr4 ldy tqout,x get output queue
 jsr wakeup
 bra tintr9
tintr5 ldd #INTS set INT interrupt
 jsr send_TI send interrupt
 bra tintr9
tintr6 ldd #HANGS set hangup unt
 jsr send_TI send interrupt
 bra tintr9
tintr7 ldb #$07 set bell char
 jsr ttyin go buffer it
 bra tintr9 exit
tintr8 lda tstate2,x get state
 bita #DSR_OK was it OK to send before?
 beq 85f no - must be now
 anda #!DSR_OK don't allow any sending
 sta tstate2,x
 jsr ttdisx disable transmitter
 bra tintr9 exit
85 ora #DSR_OK allow transmitting
 sta tstate2,x
 jsr ttyren restart transmission
tintr9 puls y restore port address
 jmp ttend clean up the port & return

 pag

*
* ttyset/ttyget
*
* Handle the actual get or put of data for ttyset
* and ttyget.
*

ttyset lbsr ttftab get tty table address
 lda FIOdata move data from FIFO
 ldb tflags,x save current flags
 sta tflags,x set flags
 bitb #RAW|SCHR currently in RAW or Single Character mode?
 bne 10f yes - no change
 bita #RAW|SCHR going to one of those modes?
 beq 10f no - continue
 tst [tqin,x] any unsolicited input?
 beq 00f no - continue
 tst tdel,x any delimiters?
 beq 00f
 inc tdel,x force a delimiter
00 bita #RAW going into RAW mode?
 beq 10f no
 lda tstate,x yes - no HOLD processing in RAW mode
 bita #HOLD currently holding?
 beq 10f no - continue
 anda #!HOLD
 sta tstate,x
 bsr ttyren kick output
10 lda FIOdata
 sta tdelay,x set delays
 lda FIOdata
 sta tcncl,x set cancel char
 lda FIOdata
 sta tbksp,x set back space char
 lda FIOdata
 anda #$7F
 sta tbaud,x set bauds
 lda FIOdata -- protocol options
 pshs a
 anda #PROTOCOL save protocol bits
 pshs a
 lda tstate,x update state
 anda #(!PROTOCOL)&$FF clear current bits
 ora ,s+ set new bits
 sta tstate,x
 puls a
 anda #$0F get baud rate
 pshs a
 lda tbaud2,x update baud rate
 anda #$F0
 ora ,s+
 sta tbaud2,x
 ldb #R_TTY return TTYSET OK
 rts return


ttyget lbsr ttftab get table address
 lda tflags,x get flags byte
 sta FIOdata put into FIFO
 lda tdelay,x get delays
 sta FIOdata
 lda tcncl,x get cancel char
 sta FIOdata
 lda tbksp,x get b.s. char
 sta FIOdata
 lda tbaud,x get bauds
 anda #$7F
 tst tdel,x check delimiter count
 bne ttys45
 tst [tqproc,x] any chars in processed queue?
 beq ttysg5
ttys45 ora #%10000000 set del bit
ttysg5  sta FIOdata
 lda tstate,x return protocol bits
 anda #PROTOCOL
 pshs a
 lda tbaud2,x get baud rate
 anda #$0F
 ora ,s+
 sta FIOdata
 ldb #R_TTY response = TTYGET = OK
 rts return
