cc65/libsrc/c128/cgetc.s

72 lines
1.8 KiB
ArmAsm

;
; 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