 lib ../environment
 sttl PPI-1 System console Drivers
 pag
 name sysppi
 global systpc,sysrtt,sysbrg
 global sc_init


*
* These are non-interrupt output routines for the system
* console.
*

*
* systpc
*
* Output the character in A.  X points to the port.  All
* registers should be preserved.
*

systpc pshs cc,d,x,y,u save character
 seti
 lbsr map_ppi map in PPI
 lbsr lockup lock LOCKBOX
 tfr a,b put char in b reg.
 std ARG1 put in argument
 ldd #CWRITE write on console
 std DEVNUM setup command
 lbsr cmdppi send interrupt to PPI
 bsr waitppi wait for response from ppi
 cmpd #NOSPACE PPI overrun?
 bne 10f
 ldd #2000 kill some time
outdel subd #1
 bne outdel
 puls cc,d,x,y,u yes - try over
 bra systpc
10 lbsr map_io restore map
 puls cc,d,x,y,u,pc return

* Wait for response from PPI

waitppi lbsr lockup lock LOCKBOX
 pshs a
 lda MAILBACK check response
 lda MAILBACK (even accesses)
 puls a
 bmi wppi1 skip if response present
 clr LOCKBOX unlock LOCKBOX
 bra waitppi loop 'til there is a response
wppi1 ora #$80 set parity bit
wppi2 cmpd MAILBACK right response?
 beq wppi4 skip if right one
 clr MAILBACK
 clr MAILBACK+1
 clr LOCKBOX
 bra waitppi
wppi4 ldd #0
 std MAILBACK clear response
 lda MAILBOX clear pending interrupt
 stb LOCKBOX unlock LOCKBOX
 ldd MAILSTAT get returned status
 rts


*
* Flag which indicates if system console is "initialized"
*
sc_init fcb 1

*
* sysrtt
*
* Reset the console port.  X points to port.  Preserve all but A reg.
*

sysrtt
 rts ################################



sysbrg rts
