 lib environment
 lib macdefs
 lib pprtab
 data
 sttl Parallel Printer Driver
 pag
 name pprdrvr
 global ppopn,ppcls,ppwrt,ppint

*
* This file contains parallel printer driver
* routines provided with the standard configuration.
*


*
* ppopn
*
* Open device
*

ppopn
 cmpb #PPMAX legal device #?
 bhi ppopn9 no - error
 bsr ppsel go select printer
 ldu ppadr,y get PIA address
 clra reset pia
 sta 1,u
 lda #$ff set direction in pia
 sta 0,u send to pia
 leax ppbuf,y set in & out ptrs
 stx ppipt,y
 stx ppopt,y
 clr ppcnt,y clear out count
 clr ppbusy,y
 lda 0,u clear any ints
 lda #PPCONE enable interrupts and configure
 sta 1,u
 rts return
*
ppopn9 lda #EBDEV illegal device #
 sta uerror
 rts

*
* ppsel - select a printer
*   set Y to point to printer control structure
*
ppsel ldy #PPstr point at ppr structures
 lda #PPSIZ
 mul
 leay d,y
 rts

*
* ppcls
*
* Close routine
*

ppcls rts return

*
* ppwrt
*
* Write to parallel printer
*

ppwrt bsr ppsel select printer structure
ppwrt0 pshs y save structure address
 jsr cpass get character from user
 puls y restore structure address
 bmi ppwrt6 none left?
 pshs b save character
ppwrt2 lda ppcnt,y check count
 adda #2
 cmpa #PPBUFSIZ upper limit?
 blo ppwrt4
 pshs cc save status
 seti mask interrupts
 tst ppbusy,y printer busy?
 bne ppwrt3
 bsr ppstrt kick port
ppwrt3 puls cc reset status
 ldb #TTYOPR set priority
 pshs y make sure we remember structure
 jsr sleep goto sleep
 puls y
 bra ppwrt2
ppwrt4 puls b get character
 bsr ppout output char to q
 bra ppwrt0 repeat
ppwrt6 pshs cc save status
 seti mask interrupts
 tst ppbusy,y busy?
 bne ppwrt8
 bsr ppstrt kick port
ppwrt8 puls cc,pc return

*
* ppout
*
* Output character to q.
*

ppout ldx ppipt,y get input pointer
 stb 0,x+ put char in q
 leau ppbnd,y end of buffer?
 pshs u
 cmpx ,s++
 bne ppout2
 leax ppbuf,y reset pointer
ppout2 stx ppipt,y save pointer
 tst ppcnt,y count zero?
 beq ppout4
 inc ppcnt,y bump count
 cmpb #$d is it cr?
 bne ppout3
 ldb #$a set up line feed
 bra ppout
ppout3 rts return
ppout4 inc ppcnt,y bump count
 pshs cc,b save status
 seti mask ints
 tst ppbusy,y printer busy?
 bne ppout6
 bsr ppstrt kick port
ppout6 puls cc,b
 cmpb #$d is it cr?
 bne ppout3
 ldb #$a setup line feed
 bra ppout

*
* ppstrt
*
* Start output on the parallel port
*

ppstrt ldu ppadr,y get PIA address
 lda 0,u clear out interrupt
 clr ppbusy,y
 tst ppcnt,y check char count
 beq ppstr4
 ldx ppopt,y get output ptr
 ldb 0,x+ get a char
 pshs u save PIA address
 leau ppbnd,y end of q?
 pshs u
 cmpx ,s++
 puls u restore PIA address
 bne ppstr2
 leax ppbuf,y reset pointer
ppstr2 stx ppopt,y save output ptr
 dec ppcnt,y dec the count
 stb 0,u output character
 inc ppbusy,y set busy status
ppstr4 rts return

*
* ppint
*
* Parallel driver interrupt routine
*

ppint lbsr ppsel select printer structure
 bsr ppstrt output a character
 lda ppcnt,y check count
 beq ppint2
 cmpa #PPLOC low water?
 beq ppint2
 rts return
ppint2 jmp wakeup awaken & return
