185 lines
2.4 KiB
ArmAsm
185 lines
2.4 KiB
ArmAsm
;; #LAYOUT# M65 KERNAL_0 #TAKE
|
|
;; #LAYOUT# * * #IGNORE
|
|
|
|
|
|
m65_scnkey:
|
|
|
|
;
|
|
; Scan the whole keyboard, store results in memory
|
|
;
|
|
|
|
lda #$00
|
|
sta M65_KB_COLSUM
|
|
|
|
ldx #$08
|
|
|
|
lda #%01111111
|
|
and KBSCN_BUCKY
|
|
sta M65_KB_BUCKY
|
|
|
|
; FALLTROUGH
|
|
|
|
m65_scnkey_loop:
|
|
|
|
stx KBSCN_SELECT
|
|
lda KBSCN_PEEK
|
|
eor #$FF ; let bit 1 mean 'pressed', not the otherwise
|
|
sta M65_KB_COLSCAN, x
|
|
ora M65_KB_COLSUM
|
|
sta M65_KB_COLSUM
|
|
dex
|
|
bpl m65_scnkey_loop
|
|
|
|
;
|
|
; Retrieve SHIFT / VENDOR / CTRL / ALT / NO SCROLL / CAPS LOCK status
|
|
;
|
|
|
|
lda SHFLAG
|
|
sta LSTSHF ; needed for SHIFT+VENDOR support
|
|
|
|
ldx #$00
|
|
stx SHFLAG
|
|
|
|
lda M65_KB_BUCKY
|
|
dex ; index into kb_matrix_bucky_shflag
|
|
|
|
; FALLTROUGH
|
|
|
|
m65_scnkey_shflag_loop:
|
|
|
|
inx
|
|
asr
|
|
bcc m65_scnkey_shflag_next
|
|
|
|
; Bucky key pressed
|
|
|
|
pha
|
|
lda kb_matrix_bucky_shflag, x
|
|
ora SHFLAG
|
|
sta SHFLAG
|
|
pla
|
|
|
|
; FALLTROUGH
|
|
|
|
m65_scnkey_shflag_next:
|
|
|
|
bne m65_scnkey_shflag_loop
|
|
|
|
;
|
|
; Scan the keyboard matrix stored in memory to determine which keys were pressed
|
|
;
|
|
|
|
ldx #$02
|
|
@1:
|
|
lda M65_KB_PRESSED, x
|
|
sta M65_KB_PRESSED_OLD, x
|
|
dex
|
|
bpl @1
|
|
|
|
jsr m65_scnkey_init_pressed
|
|
|
|
lda M65_KB_COLSUM
|
|
beq m65_scnkey_no_key ; branch if no key was pressed XXX try joystick
|
|
|
|
ldx #$08
|
|
|
|
; FALLTROUGH
|
|
|
|
m65_scnkey_loop_1:
|
|
|
|
lda M65_KB_COLSCAN, x
|
|
pha
|
|
ldy #$FF
|
|
|
|
; FALLTROUGH
|
|
|
|
m65_scnkey_loop_2:
|
|
|
|
iny
|
|
pla
|
|
beq m65_scnkey_next_1
|
|
asr
|
|
pha
|
|
bcc m65_scnkey_loop_2
|
|
|
|
; Found a pressed key - add it to the list
|
|
|
|
lda M65_KB_PRESSED+2
|
|
bpl m65_scnkey_jam ; branch if too many keys pressed
|
|
lda M65_KB_PRESSED+1
|
|
sta M65_KB_PRESSED+2
|
|
lda M65_KB_PRESSED+0
|
|
sta M65_KB_PRESSED+1
|
|
|
|
sty M65_KB_PRESSED+0
|
|
txa
|
|
asl
|
|
asl
|
|
asl
|
|
clc
|
|
adc M65_KB_PRESSED+0
|
|
sta M65_KB_PRESSED+0
|
|
|
|
bra m65_scnkey_loop_2
|
|
|
|
m65_scnkey_next_1:
|
|
|
|
dex
|
|
bpl m65_scnkey_loop_1
|
|
|
|
;
|
|
; Analyze currently and previously pressed keys
|
|
;
|
|
|
|
; XXX add proper implementation
|
|
ldx M65_KB_PRESSED+0
|
|
|
|
;
|
|
; Convert the key coordinates to key code
|
|
;
|
|
|
|
; XXX add proper implementation
|
|
ldy __kb_matrix_normal, x
|
|
beq m65_scnkey_no_key
|
|
|
|
m65_scnkey_output_key:
|
|
|
|
;
|
|
; Output selected key to the keyboard buffer
|
|
;
|
|
|
|
; Check if we have free space in the keyboard buffer
|
|
|
|
lda NDX
|
|
cmp XMAX
|
|
+bcs scnkey_buffer_full
|
|
|
|
; Put the key into the keyboard buffer
|
|
|
|
tya
|
|
ldy NDX
|
|
sta KEYD, y
|
|
inc NDX
|
|
|
|
rts
|
|
|
|
|
|
; XXX
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m65_scnkey_jam:
|
|
|
|
; XXX
|
|
|
|
jmp m65_scnkey_init_pressed
|
|
|
|
m65_scnkey_no_key:
|
|
|
|
; XXX
|
|
|
|
rts
|