mirror of
https://github.com/cc65/cc65.git
synced 2024-12-27 00:29:31 +00:00
97494bc1f3
in the system bank. For one this performs better (several %), second it allows to handle the function keys in conformance with other platforms. Without the custom keyboard routine, we would have to apply some more magic to the function keys to make them work as with other cc65 targets. git-svn-id: svn://svn.cc65.org/cc65/trunk@2811 b7a2c559-68d2-44c3-8de9-860c34a00d81
146 lines
2.6 KiB
ArmAsm
146 lines
2.6 KiB
ArmAsm
;
|
|
; Ullrich von Bassewitz, 28.09.1998
|
|
;
|
|
; Keyboard polling stuff for the 610.
|
|
;
|
|
|
|
.export scnkey
|
|
.importzp tpi2, ktab1, ktab2, ktab3, ktab4
|
|
.importzp keyidx, keybuf, keyscanbuf, keysave, modkey, norkey
|
|
.importzp graphmode, lastidx, rptdelay, rptcount
|
|
|
|
.include "cbm610.inc"
|
|
|
|
.proc scnkey
|
|
|
|
lda #$FF
|
|
sta modkey
|
|
sta norkey
|
|
lda #$00
|
|
sta keyscanbuf
|
|
ldy #TPI::PRB
|
|
sta (tpi2),y
|
|
ldy #TPI::PRA
|
|
sta (tpi2),y
|
|
jsr Poll
|
|
and #$3F
|
|
eor #$3F
|
|
bne L1
|
|
jmp NoKey
|
|
|
|
L1: lda #$FF
|
|
ldy #TPI::PRA
|
|
sta (tpi2),y
|
|
asl a
|
|
ldy #TPI::PRB
|
|
sta (tpi2),y
|
|
jsr Poll
|
|
pha
|
|
sta modkey
|
|
ora #$30
|
|
bne L3 ; Branch always
|
|
|
|
L2: jsr Poll
|
|
L3: ldx #$05
|
|
ldy #$00
|
|
L4: lsr a
|
|
bcc L5
|
|
inc keyscanbuf
|
|
dex
|
|
bpl L4
|
|
sec
|
|
ldy #TPI::PRB
|
|
lda (tpi2),y
|
|
rol a
|
|
sta (tpi2),y
|
|
ldy #TPI::PRA
|
|
lda (tpi2),y
|
|
rol a
|
|
sta (tpi2),y
|
|
bcs L2
|
|
pla
|
|
bcc NoKey ; Branch always
|
|
|
|
L5: ldy keyscanbuf
|
|
sty norkey
|
|
pla
|
|
asl a
|
|
asl a
|
|
asl a
|
|
bcc L6
|
|
bmi L7
|
|
lda (ktab2),y ; Shifted normal key
|
|
ldx graphmode
|
|
beq L8
|
|
lda (ktab3),y ; Shifted key in graph mode
|
|
bne L8
|
|
|
|
L6: lda (ktab4),y ; Key with ctrl pressed
|
|
bne L8
|
|
L7: lda (ktab1),y ; Normal key
|
|
L8: tax
|
|
cpx #$FF ; Valid key?
|
|
beq Done
|
|
cpy lastidx
|
|
beq Repeat
|
|
ldx #$13
|
|
stx rptdelay
|
|
ldx keyidx
|
|
cpx #$09
|
|
beq NoKey
|
|
cpy #$59
|
|
bne PutKey
|
|
cpx #$08
|
|
beq NoKey
|
|
sta keybuf,x
|
|
inx
|
|
bne PutKey
|
|
|
|
NoKey: ldy #$FF
|
|
Done: sty lastidx
|
|
End: lda #$7F
|
|
ldy #TPI::PRA
|
|
sta (tpi2),y
|
|
ldy #TPI::PRB
|
|
lda #$FF
|
|
sta (tpi2),y
|
|
rts
|
|
|
|
Repeat: dec rptdelay
|
|
bpl End
|
|
inc rptdelay
|
|
dec rptcount
|
|
bpl End
|
|
inc rptcount
|
|
ldx keyidx
|
|
bne End
|
|
|
|
PutKey: sta keybuf,x
|
|
inx
|
|
stx keyidx
|
|
ldx #$03
|
|
stx rptcount
|
|
bne Done
|
|
|
|
.endproc
|
|
|
|
; Poll the keyboard port until it's stable
|
|
; This code goes into page 2, since it is included in every program and
|
|
; there's space left in p2
|
|
|
|
.segment "PAGE2"
|
|
|
|
.proc Poll
|
|
ldy #TPI::PRC
|
|
L1: lda (tpi2),y
|
|
sta keysave
|
|
lda (tpi2),y
|
|
cmp keysave
|
|
bne L1
|
|
rts
|
|
.endproc
|
|
|
|
|
|
|
|
|