X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fc128%2Fcgetc.s;h=46f13d197c18214c54e4429d7f3a19d19cb428d0;hb=f16516047a551319c82debd339ded8bc2b587212;hp=391a25fd2dfbb66b215f7d0fdbd16fd02dfb9e1e;hpb=53dd513176425872128ef26031d00952ef7a0628;p=cc65 diff --git a/libsrc/c128/cgetc.s b/libsrc/c128/cgetc.s index 391a25fd2..46f13d197 100644 --- a/libsrc/c128/cgetc.s +++ b/libsrc/c128/cgetc.s @@ -4,28 +4,69 @@ ; char cgetc (void); ; - .export _cgetc - .import cursor + .export _cgetc + .constructor initcgetc + .destructor donecgetc - .include "c128.inc" + .import cursor -_cgetc: lda KEY_COUNT ; Get number of characters - bne L2 ; Jump if there are already chars waiting + .include "c128.inc" -; Switch on the cursor if needed +;-------------------------------------------------------------------------- - lda cursor - beq L1 - jsr CURS_ON - jmp L2 -L1: lda #$01 - jsr CURS_OFF -L2: lda KEY_COUNT ; Check characters again - beq L2 - jsr CURS_OFF ; Switch cursor off, if characters available +_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 + +.bss +keyvec: .res 2 + +.segment "INIT" +initcgetc: + +; Save the old vector + + lda KeyStoreVec + sta keyvec + lda KeyStoreVec+1 + sta 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 - jsr KBDREAD ; Read char and return in A - ldx #0 - rts -