1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-17 00:29:31 +00:00
cc65/libsrc/cx16/cgetc.s

78 lines
2.2 KiB
ArmAsm

;
; 2022-03-29, Greg King
;
; char cgetc (void);
; /* Return a character from the keyboard. */
;
.export _cgetc
.import _kbhit, cursor, GETIN
.include "cx16.inc"
.macpack generic
screen_addr := $1B000 ; VRAM address of text screen
_cgetc: jsr _kbhit
bnz L3 ; Jump if there are already chars waiting
; Switch the cursor on if wanted.
lda CURS_FLAG ; Save cursor's current enable flag
tay
lda cursor
jsr setcursor
L1: jsr _kbhit
bze L1 ; Wait for key
tya
eor #%00000001 ; (Cursor flag uses negative logic)
jsr setcursor ; Restore previous cursor condition
; An internal Kernal function can't be used because it might be moved in future
; revisions. Use an official function; but, make sure that it reads
; the keyboard.
L3: ldy IN_DEV ; Save current input device
stz IN_DEV ; Keyboard
phy
jsr GETIN ; Read char, and return in .A
ply
sty IN_DEV ; Restore input device
ldx #>$0000
rts
; Switch the cursor on or off.
setcursor:
tax ; On or off?
bnz seton ; Go set it on
lda CURS_FLAG ; Is the cursor currently off?
bnz crs9 ; Jump if yes
inc CURS_FLAG ; Mark it as off
ldx CURS_STATE ; Cursor currently displayed?
bze crs9 ; Jump if not
; Restore the current character in video RAM.
; Restore that character's colors.
stz VERA::CTRL ; Use port 0
lda CURS_Y
add #<(>screen_addr)
sta VERA::ADDR+1 ; Set row number
lda #VERA::INC1 | ^screen_addr ; Increment address by one
sta VERA::ADDR+2
lda CURS_X ; Get character column
asl a
sta VERA::ADDR
ldx CURS_CHAR
stx VERA::DATA0
ldx CURS_COLOR
stx VERA::DATA0
stz CURS_STATE ; Cursor not displayed
crs9: rts
seton: stz CURS_FLAG
rts