asm-test/keyboard2.asm.in

117 lines
2.3 KiB
NASM

include(`common.m4')
define(KBD_STATE, 0x40) ;;; 0x40 - 0x7f
define(KBD_STATE2, 0x80) ;;; 0x80 - 0xbf
BRA r :reset ; RESB
NOP i ; IRQ
reset: LDX # ff
TXS i
JSR a :lcd_init
;; LDA # 61
;; JSR a :lcd_w_rs1
LDA # %11111111
STA a VIA1_PORTA
LDA # %00000000
STA a VIA1_DDRB
LDA # %11111111
STA a VIA1_DDRA
LDX # 80
LDA # 0
_state: STA zp,x hh(KBD_STATE)
DEX i
BNE r :_state
loop: LDX # 7 ; state
LDA # %01111111
STA zp 0
loop0: LDA zp 0
STA a VIA1_PORTA
LDY # 4 ; bit
LDA a VIA1_PORTB
loop1: ROR A
PHA s ; [A]
PHP s ; [P,A]
;; (X * 8 + Y) * 2
TXA i
ASL A
ASL A
ASL A
CLC i
STY zp 1
ADC zp 1
;;
PLP s ; [A]
PHX s ; [X,A]
TAX i
BCS r :_kbd_up
;;; down
_kbd_down: LDA zp,x hh(KBD_STATE)
CMP # 4
BNE r :_kbd_state_inc
;; if (kbd_state == 0)
LDA a,x hh(KBD_STATE2)
BNE r :_loop1_resume
INC a,x hh(KBD_STATE2)
LDA a,x :_bin_keymap_start
JSR a :kbd_char
BRA r :_loop1_resume
;; }
_kbd_state_inc: INC zp,x hh(KBD_STATE)
BRA r :_loop1_resume
;;; end down
_kbd_up: LDA zp,x hh(KBD_STATE)
BEQ r :_kbd_up_state2
_kbd_state_dec: DEC zp,x hh(KBD_STATE)
BRA r :_loop1_resume
_kbd_up_state2: STZ a,x hh(KBD_STATE2)
_loop1_resume: PLX s ; [A]
PLA s ; []
DEY i
BPL r :loop1
SEC i
ROR zp 0
DEX i
BPL r :loop0
BRA r :loop
;;; kbd char
kbd_char: CMP # 30
BEQ r :_backspace
JSR a :lcd_w_rs1
RTS s
;; CL
;; 0001SRxx
_backspace: LDA a %00010000
JSR a :lcd_w_rs0
RTS s
;;; end kbd_char