diff --git a/programs/ps2_keyboard_text_handler.s65 b/programs/ps2_keyboard_text_handler.s65 index 78bf796..d2d6cd2 100644 --- a/programs/ps2_keyboard_text_handler.s65 +++ b/programs/ps2_keyboard_text_handler.s65 @@ -111,10 +111,8 @@ set: bit previous_scancode jmi break_key ; bit 7 set = BREAK - cmp #$90 ; only BREAK is higher than 8F, (also code table only has 8F bytes) - bcs check_release - cmp #$60 ; codes >= 60 in separate table to reduce memory consumption - bcs upper_range + cpx #$60 ; codes >= 60 in separate table to reduce memory consumption + bcs x_ge_60 bbs kb::MOD::SHIFT, modifier, modshift ; if shift active bbs kb::MOD::RALT, modifier, modralt ; if ralt active @@ -122,19 +120,11 @@ set: nomod: lda CHARS_NOMOD,x bra check_char -upper_range: - bbs kb::MOD::NUMLOCK, modifier, modnumlock ; if numlock active - ; numlock off - lda CHARS_NUMLOCK_OFF,x - bra check_char -modnumlock: - lda CHARS_NUMLOCK_ON,x +modralt: + lda CHARS_MODRALT,x bra check_char modshift: lda CHARS_MODSHIFT,x - bra check_char -modralt: - lda CHARS_MODRALT,x check_char: beq not_mod ; 0 => not mod and not char cmp #1 ; 1 => mod @@ -146,8 +136,19 @@ not_mod: ; store keycode if not mod _rts: rts -check_release: - cmp #kb::K_BREAK +x_ge_60: ; x >= $60 + cpx #$90 ; only BREAK is higher than 8F, (also code table only has 8F bytes) + bcs check_release + ; CHARS_NUMLOCK_OFF - CHARS_NOMOD = 60 -> no need to subtract $60 first + ; CHARS_NUMLOCK_ON - CHARS_MODSHIFT = 60 -> no need to subtract $60 first + bbs kb::MOD::NUMLOCK, modifier, modshift ; if numlock active + lda CHARS_NOMOD,x + bra check_char +check_release: ; x >= $90 + ; DEBUG + lda #'9' + sta char + cpx #kb::K_BREAK bne _rts lda #$ff sta previous_scancode @@ -234,6 +235,9 @@ update_leds: .proc break_key ; rmb kb::PREVIOUS::BREAK, kb::previous_scancode stz previous_scancode + ; DEBUG + lda #'F' + sta char ; check mod keys cpx #kb::K::LEFTSHIFT @@ -252,12 +256,12 @@ update_leds: beq unset_ctrl cpx #kb::K::LEFTCTRL rts -unset_shift: ; process shift +unset_shift: ; process shift bbs kb::MOD::CAPSLOCK, modifier, @set_shift ; set shift when capslock is on rmb kb::MOD::SHIFT, modifier ; unset if capslock is off rts @set_shift: - smb kb::MOD::SHIFT, modifier + smb kb::MOD::SHIFT, modifier rts unset_ctrl: rmb kb::MOD::CTRL, modifier @@ -282,6 +286,10 @@ CHARS_NOMOD: .byte "\x00nbhgz6\x00\x00\x01mju78\x00" .byte "\x00,kio09\x00\x00.-l\xEFp\xE2\x00" .byte "\x00\x00\xE1#\xF5`\x00\x00\x01\x01\x00\x00\x00\x00\x00\x01" +CHARS_NUMLOCK_OFF: + .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + .byte "\x00\x00\x00\x00\x00\x00\x01/\x00\x00\x00\x00+\x00*\x00" + .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00-\x00" CHARS_MODSHIFT: .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xDF\x00" .byte "\x00\x01\x01>\x01Q!\x00\x00\x01YSAW\"\x00" @@ -289,6 +297,10 @@ CHARS_MODSHIFT: .byte "\x00NBHGZ&\x00\x00\x01MJU/(\x00" .byte "\x00;KIO=)\x00\x00:_L\xEFP\xE2\x00" .byte "\x00\x00\xE1'\xF5`\x00\x00\x01\x01\x00\x00\x00\x00\x00\x01" +CHARS_NUMLOCK_ON: + .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x001\x0047\x00\x00\x00" + .byte "0.2568\x01\x00\x00\x003\x00\x009\x00\x00" + .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00" CHARS_MODRALT: .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\x00" .byte "\x00\x01\x01|\x01\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" @@ -296,11 +308,3 @@ CHARS_MODRALT: .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00{[\x00" .byte "\x00\x00\x00\x00\x00}]\x00\x00\xA5\xB0\x00\x00\x00\x00\x00" .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x01" -CHARS_NUMLOCK_OFF: - .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - .byte "\x00\x00\x00\x00\x00\x00\x01/\x00\x00\x00\x00+\x00*\x00" - .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00-\x00" -CHARS_NUMLOCK_ON: - .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x001\x0047\x00\x00\x00" - .byte "0.2568\x01\x00\x00\x003\x00\x009\x00\x00" - .byte "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00" diff --git a/spicode.s65 b/spicode.s65 index b8ddad3..1b261ef 100644 --- a/spicode.s65 +++ b/spicode.s65 @@ -99,6 +99,13 @@ CODE_START: loop: + wai + ; put shift, ralt and lalt in debug leds + lda kb::modifier + Reverse A + and #%00000111 + ora IO1 + IO::RANH + sta IO1 + IO::RANH lda kb::char beq @no_char stz kb::char diff --git a/test.s65 b/test.s65 index ca84486..5799c87 100644 --- a/test.s65 +++ b/test.s65 @@ -1,23 +1,26 @@ -.include "system/system.h65" -.include "system/lcd.h65" +.include "other/file.h65" -.segment "TEST" -.macro MaskedWrite2 addr,value,mask - lda #value - eor addr - and #mask - eor addr - sta addr -.endmacro -.import __SPI_SIZE__ -label: - ; JsrIndirect $2022 - ; .byte 0,1,2,3,4 - ; JsrIndirect {($2022,x)}, label - ; .byte 5,6,7,8,9 - ; MaskedWrite2 lcd::LCD_IO+IO::DDRA, (lcd::RS | lcd::RW | lcd::E), lcd::RA_MASK - ; lda #(lcd::RS | lcd::RW | lcd::E) ; RA 5-7 output - ; sta lcd::LCD_IO+IO::DDRA - .word __SPI_SIZE__ - .byte >__SPI_SIZE__ - .byte <__SPI_SIZE__ +.zeropage +var1: .res 1 +char: .res 1 + +.code +.proc my_subroutine + pha + bbr4 var1,@bit_4_set + bit var1 + ; macro packs are supported + jmi other_routine + lda #'a' + sta char + bra @end +@bit_4_set: + ; custom macros can be highlighted + Printf STR_FMT,char,var1 +@end: + pla + rts +.endproc + +.rodata +STR_FMT: .asciiz "%c: num=%x"