;
; Ullrich von Bassewitz, 06.08.1998
;
; char cgetc (void);
;

        .export         _cgetc
        .constructor    initcgetc
        .destructor     donecgetc

        .import         cursor

        .include        "cbm_kernal.inc"
        .include        "c128.inc"

;--------------------------------------------------------------------------

_cgetc: lda     KEY_COUNT       ; Get number of characters
        bne     L2              ; Jump if there are already chars waiting

; Switch on the cursor if needed. We MUST always switch the cursor on,
; before switching it off, because switching it off will restore the
; character attribute remembered when it was switched on. So just switching
; it off will restore the wrong character attribute.

        jsr     CURS_SET        ; Set cursor to current position
        jsr     CURS_ON
        lda     cursor
        bne     L1
        lda     #$01
        jsr     CURS_OFF
L1:     lda     KEY_COUNT       ; Check characters again
        beq     L1
        jsr     CURS_OFF        ; Switch cursor off, if characters available

L2:     jsr     KBDREAD         ; Read char and return in A
        ldx     #0
        rts

;--------------------------------------------------------------------------
; Module constructor/destructor

.segment        "INIT"
keyvec: .res    2

.segment        "ONCE"
initcgetc:

; Save the old vector

        lda     KeyStoreVec
        ldx     KeyStoreVec+1
        sta     keyvec
        stx     keyvec+1

; Set the new vector. I can only hope that this works for other C128
; versions...

        lda     #<$C6B7
        ldx     #>$C6B7
        jmp     SetVec

.code
donecgetc:
        lda     keyvec
        ldx     keyvec+1
SetVec: sei
        sta     KeyStoreVec
        stx     KeyStoreVec+1
        cli
        rts
