 sttl Clist - Get & Put Char Code
 pag

*
* getc
*
* Get a character from a specified character q.
* The q is pointed to by y upon entry.  The char
* is returned in b.
*

getc pshs x,b,cc save x
 seti
 ldx clfst,y get first pointer
 beq getc4
 ldb 0,x+ get character
 stb 1,s
 stx clfst,y save new ptr
 dec clcnt,y dec the count
 bne getc1
 ldd #0 zero pointers
 std clfst,y
 std cllst,y
 bra getc2
getc1 tfr x,d
 bitb #CBSIZE-1 check pointer
 bne getc3
 ldd -CBSIZE,x
 addd #2
 std clfst,y set new first
getc2 tfr x,d
 subd #1
 andb #!(CBSIZE-1) check pointer
 tfr d,x reset
 ldd cfreel get free block
 std 0,x set link
 stx cfreel
 dec cbufct dec the buffer count
getc3 puls cc
 clra
 puls b,x,pc
getc4 puls cc
 lda #$ff set -1
 puls b,x,pc

 pag

*
* putc
*
* Put a character on the specified q.  The q is
* pointed to by y upon entry and the character
* should be in b.
*

putc pshs x,b,cc
 seti
 ldx cllst,y get tail pointer
 bne putc1
 ldx cfreel get free list
 beq putc4
 ldd 0,x pickup pointer
 std cfreel
 inc cbufct update buffer count
 ldd #0 zero fwd link
 std 0,x++
 stx clfst,y set first
 bra putc2
putc1 tfr x,d mask pointer
 bitb #CBSIZE-1
 bne putc2
 pshs y
 ldy cfreel get free list
 beq putc3
 ldd 0,y get pointer
 std cfreel save new head
 inc cbufct update buffer count
 sty -CBSIZE,x
 tfr y,x
 puls y
 ldd #0 clear fwd link
 std 0,x++
putc2 ldb 1,s get character
 stb 0,x+ put in q
 stx cllst,y save last ptr
 inc clcnt,y update character count
 puls cc
 clra
 puls b,x,pc return
putc3 puls y
putc4 puls cc
 lda #$ff set error
 puls b,x,pc

 sttl Output Q Handling
 pag

*
* get_oq
*
* Fetch the next character from the output Q
*   Y - Output Queue Header
*   jsr get_oq
*   B - Character
*   <EQ> if Queue was not empty
*
get_oq pshs cc,a,x save registers
 seti no interrupts allowed!
 ldd oq_count,y
 beq 20f Queue empty
 subd #1
 std oq_count,y update counter
 ldx oq_get,y source pointer
 ldb ,x+ get data
 cmpx oq_end,y buffer overflow?
 blo 10f no - continue
 ldx oq_buf,y yes - reset pointer
10 stx oq_get,y update pointer
 puls cc
 clra Queue not empty
 puls a,x,pc return
20 puls cc
 lda #$FF Queue empty
 puls a,x,pc

 pag

*
* put_oq
*
* Put a character into an output Q
*    Y - Output Q header
*    B - Character to insert
*    jsr put_oq
*
put_oq pshs cc,d,x save registers
 seti no interrupts
 ldx oq_put,y get pointer
 stb ,x+ put data into Q
 cmpx oq_end,y buffer overflow?
 blo 10f no - continue
 ldx oq_buf,y yes - reset pointer
10 stx oq_put,y save new pointer
 ldd oq_count,y update count
 addd #1
 std oq_count,y
 puls cc,d,x,pc return
