Files
cc65/libsrc/c128/cgetc.s
Oliver Schmidt 419eb700b5 Renamed INITBSS to INIT and INIT to ONCE.
The way we want to use the INITBSS segment - and especially the fact that it won't have the type bss on all ROM based targets - means that the name INITBSS is misleading. After all INIT is the best name from my perspective as it serves several purposes and therefore needs a rather generic name.

Unfortunately this means that the current INIT segment needs to be renamed too. Looking for a short (ideally 4 letter) name I came up with ONCE as it contains all code (and data) accessed only once during initialization.
2016-03-06 21:27:19 +01:00

73 lines
1.7 KiB
ArmAsm

;
; Ullrich von Bassewitz, 06.08.1998
;
; char cgetc (void);
;
.export _cgetc
.constructor initcgetc
.destructor donecgetc
.import cursor
.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
.bss
keyvec: .res 2
.segment "ONCE"
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