; 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 "cbm_kernal.inc"
+ .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
- jsr KBDREAD ; Read char and return in A
- ldx #0
- rts
+; 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