add debug utils
This commit is contained in:
parent
bd083150c5
commit
aa55d5fb37
33
programs/ps2_keyboard_printer.s65
Normal file
33
programs/ps2_keyboard_printer.s65
Normal file
@ -0,0 +1,33 @@
|
||||
.include "lcd.h65"
|
||||
.include "ps2_keyboard_text_handler.h65"
|
||||
|
||||
.export ps2_keyboard_printer
|
||||
|
||||
.import home:absolute
|
||||
|
||||
.code
|
||||
.proc ps2_keyboard_printer
|
||||
jsr lcd::clear
|
||||
jsr kb::init
|
||||
loop:
|
||||
lda kb::char
|
||||
beq @no_char
|
||||
stz kb::char
|
||||
jsr lcd::print_char
|
||||
bra loop
|
||||
@no_char:
|
||||
lda kb::keycode
|
||||
beq loop
|
||||
|
||||
cmp #kb::K::ESCAPE
|
||||
beq @esacpe
|
||||
cmp #kb::K::PRINT
|
||||
beq @clear_display
|
||||
bra loop
|
||||
@esacpe:
|
||||
jmp home
|
||||
@clear_display:
|
||||
jsr lcd::clear
|
||||
bra loop
|
||||
.endproc
|
||||
|
33
programs/ps2_keyboard_simple_handler.h65
Normal file
33
programs/ps2_keyboard_simple_handler.h65
Normal file
@ -0,0 +1,33 @@
|
||||
;;********************************************************************************
|
||||
;; @module ps2_keyboard_simple_handler
|
||||
;; @type system
|
||||
;; @details:
|
||||
;; This module processes keyboard scancodes from the ps2_keyboard driver.
|
||||
;; It requires a PS/2 keyboard that supports scancode set 3.
|
||||
;;
|
||||
;; @section What it does
|
||||
;; - swallow break (release) scancodes
|
||||
;;
|
||||
;; This handler is designed for debug purposes.
|
||||
;;
|
||||
;; @section How to use it
|
||||
;; Call `kb::init` and check if it was successful (Z = 1).
|
||||
;; In your program loop, check if kb::scancode is 0. If it is not, a key has been pressed.
|
||||
;;
|
||||
;; @subsection Changing the keyboard behaviour
|
||||
;; You can change the typematic rate and delay (see PS/2 keyboard command 0xF3)
|
||||
;; and the typematic behavior (make, make/release, typematic) for all keys.
|
||||
;;
|
||||
;; You may also send the echo (0xEE) and identify (0xF2) commands to the keyboard.
|
||||
;;********************************************************************************
|
||||
.ifndef INCLUDE_KEYBOARD_SIMPLE
|
||||
INCLUDE_KEYBOARD_SIMPLE = 1
|
||||
|
||||
.include "ps2_keyboard.h65"
|
||||
|
||||
.scope skb
|
||||
Import skb, init, scancode
|
||||
|
||||
K_BREAK = $F0
|
||||
.endscope
|
||||
.endif ; guard
|
77
programs/ps2_keyboard_simple_handler.s65
Normal file
77
programs/ps2_keyboard_simple_handler.s65
Normal file
@ -0,0 +1,77 @@
|
||||
.include "ps2_keyboard_simple_handler.h65"
|
||||
Export skb, init, scancode
|
||||
|
||||
.bss
|
||||
previous_scancode: .res 1 ; all 1 if previous_scancode is break
|
||||
scancode: .res 1
|
||||
|
||||
.code
|
||||
;;********************************************************************************
|
||||
;; @function Initialize the keyboard handler
|
||||
;; @returns Z: Z = 1 => success, Z = 0 => failure
|
||||
;; @details:
|
||||
;; Initializes the PS/2 keyboard driver and the handler.
|
||||
;; If any PS/2 command fails, init returns with Z = 0. The failed command (and parameter) can be loaded from `ps2kb::send_cmd` and `ps2kb::send_data`
|
||||
;; After init, the keyboard will be able to send scancodes.
|
||||
;;********************************************************************************
|
||||
.proc init
|
||||
stz scancode
|
||||
stz previous_scancode
|
||||
|
||||
jsr ps2kb::init
|
||||
|
||||
; init & reset
|
||||
ps2kb_CmdSelfTest
|
||||
ps2kb_WaitFinishCmd
|
||||
lda ps2kb::cmd_response+1
|
||||
cmp #$aa
|
||||
bne fail
|
||||
; set set 3
|
||||
ps2kb_CmdSetScancodeSet 3
|
||||
ps2kb_WaitFinishCmd
|
||||
lda ps2kb::cmd_response+1
|
||||
cmp #ps2kb::ACK
|
||||
bne fail
|
||||
|
||||
ps2kb_CmdEnable
|
||||
ps2kb_WaitFinishCmd
|
||||
lda ps2kb::cmd_response
|
||||
cmp #ps2kb::ACK
|
||||
bne fail
|
||||
|
||||
StoreDByte process_scancode, ps2kb::scancode_handler
|
||||
jsr ps2kb::begin_receive
|
||||
lda #0 ; set Z = success
|
||||
fail:
|
||||
rts
|
||||
.endproc
|
||||
|
||||
|
||||
;;********************************************************************************
|
||||
;; @function Process a scancode
|
||||
;; @details
|
||||
;; If it is a 'make' scancode, store it in skb::scancode
|
||||
;; If the key is not a mod key, the keycode is stored in kb::keycode
|
||||
;; If the key is an ascii character, the corresponding ascii character is stored in kb::char
|
||||
;; @param X: The scancode
|
||||
;; @modifies A, X, Y
|
||||
;;********************************************************************************
|
||||
.proc process_scancode
|
||||
; check how this scancode needs to be interpreted
|
||||
bit previous_scancode
|
||||
jmi break_key ; bit 7 set = BREAK
|
||||
|
||||
lda ps2kb::scancode
|
||||
cmp #skb::K_BREAK
|
||||
beq @break_scancode
|
||||
|
||||
sta scancode
|
||||
rts
|
||||
@break_scancode:
|
||||
lda #$ff
|
||||
sta previous_scancode
|
||||
rts
|
||||
break_key:
|
||||
stz previous_scancode
|
||||
rts
|
||||
.endproc
|
135
programs/ps2_keyboard_util.s65
Normal file
135
programs/ps2_keyboard_util.s65
Normal file
@ -0,0 +1,135 @@
|
||||
.include "system.h65"
|
||||
.include "string.h65"
|
||||
.include "keypad.h65"
|
||||
.include "lcd.h65"
|
||||
.include "ps2_keyboard_simple_handler.h65"
|
||||
.include "ps2_keyboard_text_handler.h65"
|
||||
|
||||
.export ps2_keyboard_util
|
||||
|
||||
.import home:absolute
|
||||
|
||||
.code
|
||||
.proc ps2_keyboard_util
|
||||
stz kp::_DEBUG_VAL
|
||||
jsr skb::init
|
||||
beq print_menu
|
||||
ps2kb_PrintCmdFailed
|
||||
bra loop
|
||||
print_menu:
|
||||
Print MENU
|
||||
loop:
|
||||
wai
|
||||
lda skb::scancode
|
||||
beq @read_keypad
|
||||
Printf FMT_CODE,skb::scancode
|
||||
stz skb::scancode
|
||||
@read_keypad:
|
||||
lda kp::_DEBUG_VAL
|
||||
jeq loop
|
||||
stz kp::_DEBUG_VAL
|
||||
cmp #'*'
|
||||
jeq home
|
||||
pha
|
||||
jsr lcd::clear
|
||||
pla
|
||||
ldy #0 ; arg for commands
|
||||
ldx #ps2kb::NO_DATA
|
||||
cmp #'0'
|
||||
beq @l0
|
||||
cmp #'1'
|
||||
beq @l1
|
||||
cmp #'2'
|
||||
beq @l2
|
||||
cmp #'3'
|
||||
beq @l3
|
||||
cmp #'4'
|
||||
beq @l4
|
||||
cmp #'5'
|
||||
beq @l5
|
||||
cmp #'6'
|
||||
beq @l6
|
||||
cmp #'7'
|
||||
beq @l7
|
||||
cmp #'8'
|
||||
beq @l8
|
||||
cmp #'9'
|
||||
beq @l9
|
||||
cmp #'#'
|
||||
beq @lhash
|
||||
cmp #'A'
|
||||
beq @lA
|
||||
cmp #'B'
|
||||
beq @lB
|
||||
cmp #'C'
|
||||
beq @lC
|
||||
cmp #'D'
|
||||
beq @lD
|
||||
jsr lcd::print_char
|
||||
jmp loop
|
||||
@l0: ; get scancode set
|
||||
lda #$f0
|
||||
ldx #0
|
||||
ldy #1
|
||||
bra @send_cmd
|
||||
@l1: ; echo
|
||||
lda #$ee
|
||||
bra @send_cmd
|
||||
@l2: ; identify
|
||||
lda #$f2
|
||||
ldy #2
|
||||
bra @send_cmd
|
||||
@l3: ; set typematic min speed and delay
|
||||
lda #$f3
|
||||
ldx #%01111111
|
||||
bra @send_cmd
|
||||
@l4: ; enable
|
||||
lda #$f4
|
||||
bra @send_cmd
|
||||
@l5: ; disable
|
||||
lda #$f5
|
||||
bra @send_cmd
|
||||
@l6: ; set typematic max speed and min delay
|
||||
lda #$f3
|
||||
ldx #0
|
||||
bra @send_cmd
|
||||
@l7: ; set typematic all
|
||||
lda #$f7
|
||||
bra @send_cmd
|
||||
@l8: ; set make/release all
|
||||
lda #$f8
|
||||
bra @send_cmd
|
||||
@l9: ; set CAPSLOCK
|
||||
lda #$ed
|
||||
ldx #kb::MOD::CAPSLOCK
|
||||
bra @send_cmd
|
||||
@lhash: ; set SCROLLLOCK led
|
||||
lda #$ed
|
||||
ldx #kb::MOD::SCROLLLOCK
|
||||
bra @send_cmd
|
||||
@lC: ; set NUMLOCK led
|
||||
lda #$ed
|
||||
ldx #kb::MOD::NUMLOCK
|
||||
bra @send_cmd
|
||||
@lD: ; turn all leds off
|
||||
lda #$ed
|
||||
ldx #0
|
||||
bra @send_cmd
|
||||
@lA:
|
||||
; TODO
|
||||
@lB: ; reprint menu
|
||||
jmp print_menu
|
||||
@send_cmd:
|
||||
jsr ps2kb::send_command
|
||||
ps2kb_WaitFinishCmd
|
||||
Printf FMT_CMD_DATA, ps2kb::send_cmd, ps2kb::send_data, ps2kb::cmd_response, ps2kb::cmd_response+1, ps2kb::cmd_response+2
|
||||
jmp loop
|
||||
.endproc
|
||||
|
||||
.rodata
|
||||
FMT_CODE: .asciiz "K %x "
|
||||
FMT_CMD_DATA: .asciiz "C %x-%x > %x%x%x"
|
||||
MENU: .byte " EE F2 F3 "
|
||||
.byte " F4 F5 F3' MEN"
|
||||
.byte " T1 T0 LC LN "
|
||||
.asciiz " RET F0 LS L0 "
|
Loading…
Reference in New Issue
Block a user