
 lib environment
 sttl Pass character code
 pag
 name pass
 global passc,cpass

*
* passc
*
* Transfer a character to uistrt location.  If uiosp
* is nonzero, then character is going to user segment.
* Enter with character in b.  Returns -1 when uicnt
* reaches zero.
*

passc tst uiosp user segment?
 bne passc2
 stb [uistrt] put character
 bra passc3
passc2 pshs x
 ldx uistrt point to space
 jsr ptubyt put byte in user
 puls x
passc3 bsr upduio update user i/o
 beq passc5
 clra set zero
 rts return
passc5 ldd #-1
 rts


*
* upduio
*
* Update the user i/o counters and base address.
*

upduio ldd uipos2 update offset
 addd #1
 std uipos2
 bne updui2
 ldd uipos
 addd #1
 std uipos
updui2 ldd uistrt update base
 addd #1
 std uistrt
 ldd uicnt dec the counter
 subd #1
 std uicnt
 rts return

 pag

*
* cpass
*
* Get a character from the user i/o space.  If uiosp
* is nonzero, get it from user segment.  The char
* is returned in b.  Return value of -1 is error
* or end of count.
*

cpass ldd uicnt check count
 beq cpass4
 tst uiosp user segment?
 bne cpass1
 ldb [uistrt] get character
 bra cpass3
cpass1 pshs x
 ldx uistrt point to base
 jsr gtubyt get byte from user
 puls x
cpass3 pshs b save character
 bsr upduio
 clra
 puls b,pc return
cpass4 ldd #-1
 rts return


