117 lines
2.3 KiB
NASM
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
|