📄 keypad.asm
字号:
; 16-way keypad support
; Chris Ward, 22/12/1999
; *** KEYSCAN: Keypad matrix scanning routine
; A,X,Y preserved
KEYSCAN PHA
LDA KEYTIMER
BEQ KEYSCAN1
DEC KEYTIMER
KEYSCAN1 LDA KEYNEW
BEQ KEYSCAN2 ;only continue if key press flag is cleared
PLA
RTS
KEYSCAN2 TXA
PHA
LDA #$EF ;init variables
STA KEYCOL
LDA #$04
STA KEYCOLN
NEXTCOL DEC KEYCOLN ;next column
LDA KEYCOLN
CMP #$FF
BNE TESTCOL
PLA ;if we get here then no key was pressed
TAX
PLA
RTS
TESTCOL LSR KEYCOL ;rotate column-test bit pattern
LDA KEYCOL
STA KEYPORT
LDA KEYPORT
AND #$F0 ;select top 4 bits from port (rows)
EOR #$F0 ;invert top 4 bits
BEQ NEXTCOL ;no keys pressed in this column
STA KEYROW
AND #$10 ;test row 0
BEQ KEYROW1
LDA #$00
JMP KEYCODE
KEYROW1 LDA KEYROW
AND #$20 ;test row 1
BEQ KEYROW2
LDA #$04
JMP KEYCODE
KEYROW2 LDA KEYROW
AND #$40 ;test row 2
BEQ KEYROW3
LDA #$08
JMP KEYCODE
KEYROW3 LDA #$0C ;must be row 3
KEYCODE CLC
ADC KEYCOLN ;scancode = (row * 4) + column
TAX
LDA KEYTAB,X ;convert scancode to key value
CMP KEYVAL ;same as last key?
BNE KEYCODE1 ; no - OK
LDX KEYTIMER ; yes - only accept if timer has run down
BNE KEYSCANX
KEYCODE1 STA KEYVAL
INC KEYNEW ;set 'new key available' flag
LDA #$40 ;set key repeat timer
STA KEYTIMER
KEYSCANX PLA
TAX
PLA
RTS
KEYTAB .byte $0C, $0B, $00, $0A ;scancode to key value table
.byte $0D, $09, $08, $07
.byte $0E, $06, $05, $04
.byte $0F, $03, $02, $01
; *** WAITKEY: Wait for a keypress, don't return it
; A,X,Y preserved
WAITKEY PHA
WAITKEY0 LDA KEYNEW
BEQ WAITKEY0
DEC KEYNEW
PLA
RTS
; *** GETKEY: Get a keypress
; output: A = key value
; X,Y preserved
GETKEY LDA KEYNEW
BEQ GETKEY
DEC KEYNEW
LDA KEYVAL
RTS
; *** GETNUM: Get single-digit number from keypad
; input: A = max number (0-F)
; output: A = number received
; X,Y preserved
GETNUM PHA
GETNUM0 JSR GETKEY
PLA ;retrieve max value
CMP KEYVAL ;entered value > max value?
BMI GETNUM ; yes - scan again
LDA KEYVAL ; no - return value
RTS
; *** GETHEX: Get 2-digit hex number from keypad
; output: A = number received (00-FF)
; X,Y preserved
; uses ZTMP0
GETHEX JSR GETKEY
ASL A
ASL A
ASL A
ASL A
STA ZTMP0
JSR GETKEY
ORA ZTMP0
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -