mirror of
https://github.com/cc65/cc65.git
synced 2024-12-23 04:30:10 +00:00
Merge branch 'c1p_kbhit' into c1p
This commit is contained in:
commit
965aded1ba
@ -7,7 +7,7 @@ SYMBOLS {
|
||||
}
|
||||
MEMORY {
|
||||
# for size of ZP see runtime/zeropage.s and c1p/extzp.s
|
||||
ZP: file = "", define = yes, start = $0002, size = $001A + $0004;
|
||||
ZP: file = "", define = yes, start = $0002, size = $001A + $0005;
|
||||
RAM: file = %O, define = yes, start = %S, size = __HIMEM__ - __STACKSIZE__ - %S;
|
||||
}
|
||||
SEGMENTS {
|
||||
|
@ -1,6 +1,8 @@
|
||||
;
|
||||
; char cgetc (void);
|
||||
;
|
||||
|
||||
.constructor initcgetc
|
||||
.export _cgetc
|
||||
.import cursor
|
||||
|
||||
@ -8,8 +10,21 @@
|
||||
.include "extzp.inc"
|
||||
.include "zeropage.inc"
|
||||
|
||||
; Initialize one-character buffer that is filled by kbhit()
|
||||
initcgetc:
|
||||
lda #$00
|
||||
sta CHARBUF ; No character in buffer initially
|
||||
rts
|
||||
|
||||
; Input routine from 65V PROM MONITOR, show cursor if enabled
|
||||
_cgetc:
|
||||
lda CHARBUF ; character in buffer available?
|
||||
beq nobuffer
|
||||
tax ; save character in X
|
||||
lda #$00
|
||||
sta CHARBUF ; empty buffer
|
||||
jmp restorex ; restore X and return
|
||||
nobuffer:
|
||||
lda cursor ; show cursor?
|
||||
beq nocursor
|
||||
ldy CURS_X
|
||||
@ -25,7 +40,9 @@ nocursor:
|
||||
lda tmp1 ; fetch saved character
|
||||
ldy CURS_X
|
||||
sta (SCREEN_PTR),y ; store at cursor position
|
||||
|
||||
restorex:
|
||||
txa ; restore saved character from X
|
||||
ldx #$00 ; high byte of int return value
|
||||
done:
|
||||
ldx #$00 ; high byte of int return value
|
||||
rts
|
||||
|
@ -48,8 +48,16 @@ newline:
|
||||
lda CURS_Y
|
||||
cmp #SCR_HEIGHT ; screen height
|
||||
bne plot
|
||||
lda #0 ; wrap around to line 0
|
||||
sta CURS_Y
|
||||
dec CURS_Y ; bottom of screen reached, scroll
|
||||
ldx #0
|
||||
scroll: lda SCRNBASE+$00A5,x
|
||||
sta SCRNBASE+$0085,x
|
||||
lda SCRNBASE+$01A5,x
|
||||
sta SCRNBASE+$0185,x
|
||||
lda SCRNBASE+$02A5,x
|
||||
sta SCRNBASE+$0285,x
|
||||
inx
|
||||
bne scroll
|
||||
|
||||
plot: ldy CURS_Y
|
||||
lda ScrLo,y
|
||||
|
@ -4,4 +4,4 @@
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
|
||||
.globalzp CURS_X, CURS_Y, SCREEN_PTR
|
||||
.globalzp CURS_X, CURS_Y, SCREEN_PTR, CHARBUF
|
||||
|
@ -14,6 +14,7 @@
|
||||
CURS_X: .res 1
|
||||
CURS_Y: .res 1
|
||||
SCREEN_PTR: .res 2
|
||||
CHARBUF: .res 1
|
||||
|
||||
; size 4
|
||||
; Adjust size of this segment in osic1p.cfg if the size changes
|
||||
; size 5
|
||||
; Adjust size of the ZP segment in osic1p.cfg if the size changes
|
||||
|
47
libsrc/osic1p/kbhit.s
Normal file
47
libsrc/osic1p/kbhit.s
Normal file
@ -0,0 +1,47 @@
|
||||
;
|
||||
; unsigned char kbhit (void);
|
||||
;
|
||||
; The method to detect a pressed key is based on the documentation in
|
||||
; "Section 3 Programmed Key Functions" in "The Challenger Character Graphics
|
||||
; Reference Manual"
|
||||
; We only want to return true for characters that can be returned by cgetc(),
|
||||
; but not for keys like <Shift> or <Ctrl>. Therefore a special handling is
|
||||
; needed for the first row. This is implemented by a bit mask that is stored
|
||||
; in tmp1 and that is set to zero after the first round.
|
||||
;
|
||||
|
||||
.export _kbhit
|
||||
.include "osic1p.inc"
|
||||
.include "extzp.inc"
|
||||
.include "zeropage.inc"
|
||||
|
||||
_kbhit:
|
||||
lda #%11011111 ; Mask for only checking the column for the
|
||||
sta tmp1 ; ESC key in the first keyboard row.
|
||||
|
||||
lda #%11111110 ; Mask for first keyboard row
|
||||
scan:
|
||||
sta KBD ; Select keyboard row
|
||||
tax ; Save A
|
||||
lda KBD ; Read keyboard columns
|
||||
ora tmp1 ; Mask out uninteresting keys (only relevant in
|
||||
; first row)
|
||||
cmp #$FF ; No keys pressed?
|
||||
bne keypressed
|
||||
lda #$00 ; For remaining rows no keys masked
|
||||
sta tmp1
|
||||
txa ; Restore A
|
||||
sec ; Want to shift in ones
|
||||
rol a ; Rotate row select to next bit position
|
||||
cmp #$FF ; Done?
|
||||
bne scan ; If not, continue
|
||||
lda #$00 ; Return false
|
||||
tax ; High byte of return is also zero
|
||||
sta CHARBUF ; No character in buffer
|
||||
rts
|
||||
keypressed:
|
||||
jsr INPUTC ; Get input character in A
|
||||
sta CHARBUF ; Save in buffer
|
||||
ldx #$00 ; High byte of return is always zero
|
||||
lda #$01 ; Return true
|
||||
rts
|
@ -2,6 +2,7 @@
|
||||
SCRNBASE := $D000 ; Base of video RAM
|
||||
INPUTC := $FD00 ; Input character from keyboard
|
||||
RESET := $FF00 ; Reset address, show boot prompt
|
||||
KBD := $DF00 ; Polled keyboard register
|
||||
|
||||
; Other definitions
|
||||
VIDEORAMSIZE = $0400 ; Size of C1P video RAM (1 kB)
|
||||
|
Loading…
Reference in New Issue
Block a user