From de1e3af061dd3b343694a6e5dd01589d6e003209 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 28 Nov 2020 18:04:20 +0100 Subject: [PATCH 01/55] started rework to fix MEGA65 extra keys --- Makefile | 1 + src/,,config_mega65.s | 2 ++ src/kernal/keyboard/scnkey.s | 6 ++++++ src/kernal/keyboard_m65/mega65_scnkey.s | 7 +++++++ 4 files changed, 16 insertions(+) create mode 100644 src/kernal/keyboard_m65/mega65_scnkey.s diff --git a/Makefile b/Makefile index 523b5a52..fc5883ec 100644 --- a/Makefile +++ b/Makefile @@ -55,6 +55,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal/iostack \ src/kernal/jumptable \ src/kernal/keyboard \ + src/kernal/keyboard_m65 \ src/kernal/memory \ src/kernal/print \ src/kernal/rom_revision \ diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 1796acfd..500ac99e 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -54,6 +54,8 @@ ;; #CONFIG# JOY1_CURSOR NO ;; #CONFIG# JOY2_CURSOR NO +;; #CONFIG# CONFIG_M65_KB_DEV NO ; for development, keep disabled + ;; #CONFIG# PROGRAMMABLE_KEYS YES ;; #CONFIG# KEYCMD_RUN "RUN" diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 5560f22d..6c81c0ca 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -34,6 +34,12 @@ SCNKEY: +!ifdef CONFIG_MB_M65 { !ifdef CONFIG_M65_KB_DEV { + + jsr M65_MODEGET + +bcc m65_scnkey +} } + ; Prepare for SHFLAG update lda SHFLAG diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s new file mode 100644 index 00000000..b8f32e75 --- /dev/null +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -0,0 +1,7 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +m65_scnkey: + + rts From bdbafaa76edc909aa8b2e450081b8ce1aec0896a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 28 Nov 2020 20:47:35 +0100 Subject: [PATCH 02/55] more work on MEGA65 keyboard scanner --- doc/Development.md | 6 +- src/,,config_mega65.s | 6 +- src/aliases/,aliases_hardware_m65.s | 4 + src/aliases/,aliases_petscii_codes.s | 3 +- src/aliases/,aliases_ram_lowmem_m65.s | 5 +- src/kernal/keyboard/scnkey.s | 8 +- src/kernal/keyboard_m65/mega65_scnkey.s | 105 ++++++++++++++++++++++++ 7 files changed, 125 insertions(+), 12 deletions(-) diff --git a/doc/Development.md b/doc/Development.md index b50e1213..775a21ce 100644 --- a/doc/Development.md +++ b/doc/Development.md @@ -53,9 +53,9 @@ There is no official PETSCII code for `TAB` - we can't utilize the ones from C12 `SHFLAG` (`$028D`) variable is extended to support additional bucky keys on C128 and C65 keyboards: -| bits 7-5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 | -| :------: | :---------: | :------: | :------: | :------: | :------: | -| reserved | `CAPS LOCK` | `ALT` | `CTRL` | `VENDOR` | `SHIFT` | +| bits 7-6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 | +| :------: | :-------: | :---------: | :------: | :------: | :------: | :------: | +| reserved | `NO SCRL` | `CAPS LOCK` | `ALT` | `CTRL` | `VENDOR` | `SHIFT` | Bits 3 and 4 are extension to the original variable, compatible with the C128 ROMs API. There is no official way to retrieve `NO_SCRL` status as of yet. The `40/80` key status cannot be retrieved in C64 mode at all (C128 hardware limitation). diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 500ac99e..c86a9e1b 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -46,15 +46,15 @@ ; --- Keyboard settings ;; #CONFIG# LEGACY_SCNKEY NO -;; #CONFIG# KEYBOARD_C65 NO ; untested -;; #CONFIG# KEYBOARD_C65_CAPS_LOCK NO ; untested +;; #CONFIG# KEYBOARD_C65 NO ; does not work +;; #CONFIG# KEYBOARD_C65_CAPS_LOCK NO ; does not work ;; #CONFIG# KEY_REPEAT_DEFAULT NO ;; #CONFIG# KEY_REPEAT_ALWAYS NO ;; #CONFIG# KEY_FAST_SCAN YES ;; #CONFIG# JOY1_CURSOR NO ;; #CONFIG# JOY2_CURSOR NO -;; #CONFIG# CONFIG_M65_KB_DEV NO ; for development, keep disabled +;; #CONFIG# M65_KB_DEV NO ; for development, keep disabled ;; #CONFIG# PROGRAMMABLE_KEYS YES diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 8a03c46e..9ca89e57 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -32,6 +32,10 @@ !addr C65_EXTKEYS_PR = $D607 !addr C65_EXTKEYS_DDR = $D608 + !addr KBSCN_BUCKY = $D611 + !addr KBSCN_PEEK = $D613 + !addr KBSCN_SELECT = $D614 + ; SD card !addr SD_CTL = $D680 diff --git a/src/aliases/,aliases_petscii_codes.s b/src/aliases/,aliases_petscii_codes.s index 5beb2c43..474573cf 100644 --- a/src/aliases/,aliases_petscii_codes.s +++ b/src/aliases/,aliases_petscii_codes.s @@ -16,6 +16,7 @@ !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 } !ifdef CONFIG_KEYBOARD_C65 { !set _NEED_EXTENDED = 1 } !ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 } +!ifdef CONFIG_MB_M65 { !set _NEED_CAPS_LOCK = 1 } !ifdef CONFIG_MB_M65 { !set _NEED_EXTENDED = 1 } !ifdef CONFIG_KEYBOARD_C65 { !set _NEED_C65KB = 1 } !ifdef CONFIG_MB_M65 { !set _NEED_C65KB = 1 } @@ -34,7 +35,7 @@ !set KEY_FLAG_NO_SCRL = %00100000 } !ifdef _NEED_CAPS_LOCK { - !set KEY_CAPS_LOCK = %00010000 + !set KEY_FLAG_CAPSL = %00010000 } diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 1db7a619..8d208c7e 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -53,7 +53,10 @@ !addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1 !addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start !addr M65_SCRCOLMAX = $594 ; maximum allowed column - ; $595-$5EB -- UNUSED -- + !addr M65_KB_BUCKY = $595 ; result of bucky keys scan + !addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8 + + ; $59F-$5EB -- UNUSED -- !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 6c81c0ca..01c8ad26 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -78,7 +78,7 @@ SCNKEY: and #$40 bne @1 ; branch if no CAPS LOCK - lda #KEY_CAPS_LOCK + lda #KEY_FLAG_CAPSL sta SHFLAG @1: @@ -92,7 +92,7 @@ SCNKEY: and #$01 bne @2 ; branch if no CAPS LOCK - lda #KEY_CAPS_LOCK + lda #KEY_FLAG_CAPSL sta SHFLAG @2: @@ -374,8 +374,8 @@ scnkey_handle_caps_lock: } tax lda SHFLAG - and #(%00000111 + KEY_CAPS_LOCK) - cmp #KEY_CAPS_LOCK + and #(%00000111 + KEY_FLAG_CAPSL) + cmp #KEY_FLAG_CAPSL bne @7 ; branch if no special CAPS LOCK handling needed cpx #$41 ; 'A' diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index b8f32e75..4d15f97c 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -4,4 +4,109 @@ m65_scnkey: + ; First scan the whole keyboard + + lda KBSCN_BUCKY + sta M65_KB_BUCKY + + ldx #$08 +@1: + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF ; let bit 1 mean 'pressed', not the otherwise + sta M65_KB_COLSCAN, x + dex + bpl @1 + + ; Update the SHFLAG + + lda SHFLAG + sta LSTSHF ; needed for SHIFT+VENDOR support + + ldy #$00 ; the new SHFLAG will be constructed in .Y + ldx M65_KB_BUCKY + beq m65_scnkey_SHFLAG_ready + + ; FALLTROUGH + +m65_scnkey_detect_SHIFT: + + txa + and #%00000011 + beq m65_scnkey_detect_VENDOR + + tya + ora #KEY_FLAG_SHIFT + tay + + ; FALLTROUGH + +m65_scnkey_detect_VENDOR: + + txa + and #%00001000 + beq m65_scnkey_detect_CTRL + + tya + ora #KEY_FLAG_VENDOR + tay + + ; FALLTROUGH + +m65_scnkey_detect_CTRL: + + txa + and #%00000100 + beq m65_scnkey_detect_ALT + + tya + ora #KEY_FLAG_CTRL + tay + + ; FALLTROUGH + +m65_scnkey_detect_ALT: + + txa + and #%00010000 + beq m65_scnkey_detect_CAPS_LOCK + + tya + ora #KEY_FLAG_ALT + tay + + ; FALLTROUGH + +m65_scnkey_detect_CAPS_LOCK: + + txa + and #%01000000 + beq m65_scnkey_detect_NO_SCRL + + tya + ora #KEY_FLAG_NO_SCRL + tay + + ; FALLTROUGH + +m65_scnkey_detect_NO_SCRL: + + txa + and #%00100000 + beq m65_scnkey_SHFLAG_ready + + tya + ora #KEY_FLAG_CAPSL + tay + + ; FALLTROUGH + +m65_scnkey_SHFLAG_ready: + + sty SHFLAG + + + ; XXX + + rts From 7918ef55b9c393711c66233dac00c2e0d3951bfb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 28 Nov 2020 23:33:29 +0100 Subject: [PATCH 03/55] more work on MEGA65 keyboard scanner --- src/aliases/,aliases_hardware_m65.s | 1 + src/aliases/,aliases_ram_lowmem_m65.s | 5 +- src/kernal/keyboard/scnkey.s | 2 +- .../keyboard_m65/mega65_kb_matrix_bucky.s | 15 ++ src/kernal/keyboard_m65/mega65_scnkey.s | 169 ++++++++++-------- 5 files changed, 108 insertions(+), 84 deletions(-) create mode 100644 src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 9ca89e57..c85b88f1 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -32,6 +32,7 @@ !addr C65_EXTKEYS_PR = $D607 !addr C65_EXTKEYS_DDR = $D608 + !addr KBSCN_KEYCODE = $D610 !addr KBSCN_BUCKY = $D611 !addr KBSCN_PEEK = $D613 !addr KBSCN_SELECT = $D614 diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 8d208c7e..e7bc2ce1 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -53,10 +53,7 @@ !addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1 !addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start !addr M65_SCRCOLMAX = $594 ; maximum allowed column - !addr M65_KB_BUCKY = $595 ; result of bucky keys scan - !addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8 - - ; $59F-$5EB -- UNUSED -- + ; $595-$5EB -- UNUSED -- !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 01c8ad26..74196ef0 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -317,7 +317,7 @@ scnkey_output_key: lda NDX cmp XMAX - bcs scnkey_early_repeat ; no space in buffer + bcs scnkey_early_repeat ; branch if no free space in buffer ; Reinitialize secondary counter diff --git a/src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s b/src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s new file mode 100644 index 00000000..b7ea685e --- /dev/null +++ b/src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s @@ -0,0 +1,15 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + +; Keyboard matrix for bucky keys decoding on MEGA65 + + +m65_kb_matrix_bucky: + + !byte KEY_FLAG_SHIFT + !byte KEY_FLAG_SHIFT + !byte KEY_FLAG_VENDOR + !byte KEY_FLAG_CTRL + !byte KEY_FLAG_ALT + !byte KEY_FLAG_NO_SCRL + !byte KEY_FLAG_CAPSL diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 4d15f97c..6e2d495c 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -4,109 +4,120 @@ m65_scnkey: - ; First scan the whole keyboard + ; Read the key from automatic scanner lda KBSCN_BUCKY - sta M65_KB_BUCKY + ldy KBSCN_KEYCODE + sty KBSCN_KEYCODE - ldx #$08 -@1: - stx KBSCN_SELECT - lda KBSCN_PEEK - eor #$FF ; let bit 1 mean 'pressed', not the otherwise - sta M65_KB_COLSCAN, x + ; Update the SHFLAG in a way that preserves .Y + + and #%01111111 + + ldx SHFLAG + stx LSTSHF ; needed for SHIFT+VENDOR support + + ldx #$00 + stx SHFLAG dex - bpl @1 - - ; Update the SHFLAG - - lda SHFLAG - sta LSTSHF ; needed for SHIFT+VENDOR support - - ldy #$00 ; the new SHFLAG will be constructed in .Y - ldx M65_KB_BUCKY - beq m65_scnkey_SHFLAG_ready ; FALLTROUGH -m65_scnkey_detect_SHIFT: +m65_scnkey_SHFLAG_loop: - txa - and #%00000011 - beq m65_scnkey_detect_VENDOR + inx + asr + bcc m65_scnkey_SHFLAG_next + + ; Bucky key pressed + + pha + lda m65_kb_matrix_bucky, x + ora SHFLAG + sta SHFLAG + pla + + ; FALLTROUGH + +m65_scnkey_SHFLAG_next: + + bne m65_scnkey_SHFLAG_loop + + ; We have the key code in .Y - check if same as the last one + + cpy LSTX + beq m65_scnkey_try_repeat + + ; Not the same key - store the key code, reset delay counter + + sty LSTX +!ifndef CONFIG_RS232_UP9600 { + lda #$16 +} else { + lda #$18 +} + sta DELAY + + ; FALLTROUGH + +m65_scnkey_output_key: + + ; Check if we have free space in the keyboard buffer + + lda NDX + cmp XMAX + +bcs scnkey_early_repeat ; branch if no free space in buffer + + ; Reinitialize secondary counter + + lda #$03 + sta KOUNT + + ; Output PETSCII code to the keyboard buffer + +m65_scnkey_got_petscii: + + ; XXX if no key pressed, try joysticks tya - ora #KEY_FLAG_SHIFT - tay + beq m65_scnkey_done ; branch if no key was pressed + ldy NDX + sta KEYD, y + inc NDX ; FALLTROUGH -m65_scnkey_detect_VENDOR: - - txa - and #%00001000 - beq m65_scnkey_detect_CTRL +m65_scnkey_done: - tya - ora #KEY_FLAG_VENDOR - tay + rts - ; FALLTROUGH +m65_scnkey_try_repeat: -m65_scnkey_detect_CTRL: - - txa - and #%00000100 - beq m65_scnkey_detect_ALT +!ifndef CONFIG_KEY_REPEAT_ALWAYS { - tya - ora #KEY_FLAG_CTRL - tay + ; Check whether we should repeat keys - first the flag, afterwards hardcoded list - ; FALLTROUGH + lda RPTFLG + bmi m65_scnkey_handle_repeat ; branch if we should repeat always -m65_scnkey_detect_ALT: - - txa - and #%00010000 - beq m65_scnkey_detect_CAPS_LOCK + ; XXX if key to be repeated - go to m65_scnkey_handle_repeat, otherwise to m65_scnkey_done - tya - ora #KEY_FLAG_ALT - tay +m65_scnkey_handle_repeat: - ; FALLTROUGH +} ; no CONFIG_KEY_REPEAT_ALWAYS -m65_scnkey_detect_CAPS_LOCK: - - txa - and #%01000000 - beq m65_scnkey_detect_NO_SCRL + ; Countdown before first repeat - tya - ora #KEY_FLAG_NO_SCRL - tay + lda DELAY + beq @10 + dec DELAY - ; FALLTROUGH + rts +@10: + ; Countdown before subsequent repeats -m65_scnkey_detect_NO_SCRL: - - txa - and #%00100000 - beq m65_scnkey_SHFLAG_ready - - tya - ora #KEY_FLAG_CAPSL - tay - - ; FALLTROUGH - -m65_scnkey_SHFLAG_ready: - - sty SHFLAG - - - ; XXX - + lda KOUNT + beq m65_scnkey_output_key ; if second counter is also 0, we can repeat the key + dec KOUNT rts From 05dbeea181a83b094ddb775d7198d855314ce1ca Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 00:01:52 +0100 Subject: [PATCH 04/55] Revert "more work on MEGA65 keyboard scanner" This reverts commit 7918ef55b9c393711c66233dac00c2e0d3951bfb. --- src/aliases/,aliases_hardware_m65.s | 1 - src/aliases/,aliases_ram_lowmem_m65.s | 5 +- src/kernal/keyboard/scnkey.s | 2 +- .../keyboard_m65/mega65_kb_matrix_bucky.s | 15 -- src/kernal/keyboard_m65/mega65_scnkey.s | 169 ++++++++---------- 5 files changed, 84 insertions(+), 108 deletions(-) delete mode 100644 src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index c85b88f1..9ca89e57 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -32,7 +32,6 @@ !addr C65_EXTKEYS_PR = $D607 !addr C65_EXTKEYS_DDR = $D608 - !addr KBSCN_KEYCODE = $D610 !addr KBSCN_BUCKY = $D611 !addr KBSCN_PEEK = $D613 !addr KBSCN_SELECT = $D614 diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index e7bc2ce1..8d208c7e 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -53,7 +53,10 @@ !addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1 !addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start !addr M65_SCRCOLMAX = $594 ; maximum allowed column - ; $595-$5EB -- UNUSED -- + !addr M65_KB_BUCKY = $595 ; result of bucky keys scan + !addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8 + + ; $59F-$5EB -- UNUSED -- !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 74196ef0..01c8ad26 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -317,7 +317,7 @@ scnkey_output_key: lda NDX cmp XMAX - bcs scnkey_early_repeat ; branch if no free space in buffer + bcs scnkey_early_repeat ; no space in buffer ; Reinitialize secondary counter diff --git a/src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s b/src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s deleted file mode 100644 index b7ea685e..00000000 --- a/src/kernal/keyboard_m65/mega65_kb_matrix_bucky.s +++ /dev/null @@ -1,15 +0,0 @@ -;; #LAYOUT# M65 KERNAL_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; Keyboard matrix for bucky keys decoding on MEGA65 - - -m65_kb_matrix_bucky: - - !byte KEY_FLAG_SHIFT - !byte KEY_FLAG_SHIFT - !byte KEY_FLAG_VENDOR - !byte KEY_FLAG_CTRL - !byte KEY_FLAG_ALT - !byte KEY_FLAG_NO_SCRL - !byte KEY_FLAG_CAPSL diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 6e2d495c..4d15f97c 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -4,120 +4,109 @@ m65_scnkey: - ; Read the key from automatic scanner + ; First scan the whole keyboard lda KBSCN_BUCKY - ldy KBSCN_KEYCODE - sty KBSCN_KEYCODE + sta M65_KB_BUCKY - ; Update the SHFLAG in a way that preserves .Y - - and #%01111111 - - ldx SHFLAG - stx LSTSHF ; needed for SHIFT+VENDOR support - - ldx #$00 - stx SHFLAG + ldx #$08 +@1: + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF ; let bit 1 mean 'pressed', not the otherwise + sta M65_KB_COLSCAN, x dex + bpl @1 + + ; Update the SHFLAG + + lda SHFLAG + sta LSTSHF ; needed for SHIFT+VENDOR support + + ldy #$00 ; the new SHFLAG will be constructed in .Y + ldx M65_KB_BUCKY + beq m65_scnkey_SHFLAG_ready ; FALLTROUGH -m65_scnkey_SHFLAG_loop: +m65_scnkey_detect_SHIFT: - inx - asr - bcc m65_scnkey_SHFLAG_next - - ; Bucky key pressed - - pha - lda m65_kb_matrix_bucky, x - ora SHFLAG - sta SHFLAG - pla - - ; FALLTROUGH - -m65_scnkey_SHFLAG_next: - - bne m65_scnkey_SHFLAG_loop - - ; We have the key code in .Y - check if same as the last one - - cpy LSTX - beq m65_scnkey_try_repeat - - ; Not the same key - store the key code, reset delay counter - - sty LSTX -!ifndef CONFIG_RS232_UP9600 { - lda #$16 -} else { - lda #$18 -} - sta DELAY - - ; FALLTROUGH - -m65_scnkey_output_key: - - ; Check if we have free space in the keyboard buffer - - lda NDX - cmp XMAX - +bcs scnkey_early_repeat ; branch if no free space in buffer - - ; Reinitialize secondary counter - - lda #$03 - sta KOUNT - - ; Output PETSCII code to the keyboard buffer - -m65_scnkey_got_petscii: - - ; XXX if no key pressed, try joysticks + txa + and #%00000011 + beq m65_scnkey_detect_VENDOR tya - beq m65_scnkey_done ; branch if no key was pressed - ldy NDX - sta KEYD, y - inc NDX + ora #KEY_FLAG_SHIFT + tay ; FALLTROUGH -m65_scnkey_done: +m65_scnkey_detect_VENDOR: + + txa + and #%00001000 + beq m65_scnkey_detect_CTRL - rts + tya + ora #KEY_FLAG_VENDOR + tay -m65_scnkey_try_repeat: + ; FALLTROUGH -!ifndef CONFIG_KEY_REPEAT_ALWAYS { +m65_scnkey_detect_CTRL: + + txa + and #%00000100 + beq m65_scnkey_detect_ALT - ; Check whether we should repeat keys - first the flag, afterwards hardcoded list + tya + ora #KEY_FLAG_CTRL + tay - lda RPTFLG - bmi m65_scnkey_handle_repeat ; branch if we should repeat always + ; FALLTROUGH - ; XXX if key to be repeated - go to m65_scnkey_handle_repeat, otherwise to m65_scnkey_done +m65_scnkey_detect_ALT: + + txa + and #%00010000 + beq m65_scnkey_detect_CAPS_LOCK -m65_scnkey_handle_repeat: + tya + ora #KEY_FLAG_ALT + tay -} ; no CONFIG_KEY_REPEAT_ALWAYS + ; FALLTROUGH - ; Countdown before first repeat +m65_scnkey_detect_CAPS_LOCK: + + txa + and #%01000000 + beq m65_scnkey_detect_NO_SCRL - lda DELAY - beq @10 - dec DELAY + tya + ora #KEY_FLAG_NO_SCRL + tay - rts -@10: - ; Countdown before subsequent repeats + ; FALLTROUGH + +m65_scnkey_detect_NO_SCRL: + + txa + and #%00100000 + beq m65_scnkey_SHFLAG_ready + + tya + ora #KEY_FLAG_CAPSL + tay + + ; FALLTROUGH + +m65_scnkey_SHFLAG_ready: + + sty SHFLAG + + + ; XXX - lda KOUNT - beq m65_scnkey_output_key ; if second counter is also 0, we can repeat the key - dec KOUNT rts From 71f027cdfb93b3ed0d13e53bfa69bb048a95cb03 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 10:52:43 +0100 Subject: [PATCH 05/55] restored some parts of the new keyboard scanner --- src/aliases/,aliases_ram_lowmem_m65.s | 3 +- src/kernal/keyboard/kb_matrix_bucky.s | 7 +- src/kernal/keyboard/scnkey_set_keytab.s | 11 +- src/kernal/keyboard_m65/mega65_scnkey.s | 131 ++++++++++-------------- 4 files changed, 69 insertions(+), 83 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 8d208c7e..6bbc5813 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -55,8 +55,9 @@ !addr M65_SCRCOLMAX = $594 ; maximum allowed column !addr M65_KB_BUCKY = $595 ; result of bucky keys scan !addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8 + !addr M65_KB_COLSUM = $59F ; sum (OR) of the M65_KB_COLSCAN - ; $59F-$5EB -- UNUSED -- + ; $560-$5EB -- UNUSED -- !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/kernal/keyboard/kb_matrix_bucky.s b/src/kernal/keyboard/kb_matrix_bucky.s index eb3d1b8e..16b12add 100644 --- a/src/kernal/keyboard/kb_matrix_bucky.s +++ b/src/kernal/keyboard/kb_matrix_bucky.s @@ -78,10 +78,15 @@ kb_matrix_bucky_shflag: ; mask to be ORed to SHFLAG to mark key status !byte KEY_FLAG_SHIFT !byte KEY_FLAG_VENDOR !byte KEY_FLAG_CTRL -!ifdef CONFIG_KEYBOARD_C128_OR_C65 { +!ifdef CONFIG_MB_M65 { + !byte KEY_FLAG_ALT + !byte KEY_FLAG_NO_SCRL + !byte KEY_FLAG_CAPSL +} else ifdef CONFIG_KEYBOARD_C128_OR_C65 { !byte KEY_FLAG_ALT !byte KEY_FLAG_NO_SCRL } + } ; no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey_set_keytab.s b/src/kernal/keyboard/scnkey_set_keytab.s index 86aceb29..cef83aac 100644 --- a/src/kernal/keyboard/scnkey_set_keytab.s +++ b/src/kernal/keyboard/scnkey_set_keytab.s @@ -61,10 +61,6 @@ scnkey_valid_offset_cont: ; FALLTROUGH - -} ; no CONFIG_LEGACY_SCNKEY - - scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) ; Check if we should toggle the character set @@ -84,8 +80,10 @@ scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) !ifdef CONFIG_MB_M65 { +!ifndef HOTFIX_CHARPTR { jsr M65_MODEGET bcc @2 +} ; Toggling charsets for C64 mode @@ -95,12 +93,15 @@ scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) @1: rts +!ifndef HOTFIX_CHARPTR { + ; Toggling charsets for M65 mode @2: lda VIC_CHARPTR+1 eor #%00001000 sta VIC_CHARPTR+1 rts +} } else { @@ -111,3 +112,5 @@ scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) rts } + +} ; no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 4d15f97c..a9496051 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -4,107 +4,84 @@ m65_scnkey: - ; First scan the whole keyboard + ; + ; Scan the whole keyboard, store results in memory + ; - lda KBSCN_BUCKY - sta M65_KB_BUCKY + lda #$00 + sta M65_KB_COLSUM ldx #$08 -@1: + + 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 @1 + bpl m65_scnkey_loop - ; Update the SHFLAG + ; + ; Retrieve SHIFT / VENDOR / CTRL / ALT / NO SCROLL / CAPS LOCK status + ; lda SHFLAG sta LSTSHF ; needed for SHIFT+VENDOR support - ldy #$00 ; the new SHFLAG will be constructed in .Y - ldx M65_KB_BUCKY - beq m65_scnkey_SHFLAG_ready + ldx #$00 + stx SHFLAG + + lda M65_KB_BUCKY + dex ; index into kb_matrix_bucky_shflag ; FALLTROUGH -m65_scnkey_detect_SHIFT: +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 + ; + + lda M65_KB_COLSUM + beq m65_scnkey_no_key + + ; XXX - txa - and #%00000011 - beq m65_scnkey_detect_VENDOR - tya - ora #KEY_FLAG_SHIFT - tay - ; FALLTROUGH -m65_scnkey_detect_VENDOR: - txa - and #%00001000 - beq m65_scnkey_detect_CTRL - tya - ora #KEY_FLAG_VENDOR - tay +m65_scnkey_no_key: - ; FALLTROUGH -m65_scnkey_detect_CTRL: - - txa - and #%00000100 - beq m65_scnkey_detect_ALT - - tya - ora #KEY_FLAG_CTRL - tay - - ; FALLTROUGH - -m65_scnkey_detect_ALT: - - txa - and #%00010000 - beq m65_scnkey_detect_CAPS_LOCK - - tya - ora #KEY_FLAG_ALT - tay - - ; FALLTROUGH - -m65_scnkey_detect_CAPS_LOCK: - - txa - and #%01000000 - beq m65_scnkey_detect_NO_SCRL - - tya - ora #KEY_FLAG_NO_SCRL - tay - - ; FALLTROUGH - -m65_scnkey_detect_NO_SCRL: - - txa - and #%00100000 - beq m65_scnkey_SHFLAG_ready - - tya - ora #KEY_FLAG_CAPSL - tay - - ; FALLTROUGH - -m65_scnkey_SHFLAG_ready: - - sty SHFLAG - ; XXX From 3a2a59837c6409c6b931884d58d05fe5d95e878f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 11:05:45 +0100 Subject: [PATCH 06/55] replaced 'GO 64' hotfix with a (hopefully) proper solution --- src/,,config_mega65.s | 5 ----- src/kernal/board_m65/mega65_viciv_shutdown.s | 11 +++++++++-- src/kernal/keyboard/scnkey_set_keytab.s | 5 ----- src/kernal/screen_m65/mega65_scrmodeset.s | 3 --- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index c86a9e1b..40166e4e 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -112,8 +112,3 @@ ; --- Other ;; #CONFIG# COMPRESSION_LVL_2 NO - - -; --- Temporary hotfixes - -;; #CONFIG# HOTFIX_CHARPTR YES ; workaround for https://github.com/MEGA65/mega65-core/issues/308 diff --git a/src/kernal/board_m65/mega65_viciv_shutdown.s b/src/kernal/board_m65/mega65_viciv_shutdown.s index 38cc0067..f5769257 100644 --- a/src/kernal/board_m65/mega65_viciv_shutdown.s +++ b/src/kernal/board_m65/mega65_viciv_shutdown.s @@ -17,9 +17,16 @@ viciv_shutdown: lda #$03 sta MISC_EMU - ; Set misc VIC-IV flags + ; Restore chargen location + + lda #$10 + sta VIC_CHARPTR+1 + lda #$00 + sta VIC_CHARPTR+0 + sta VIC_CHARPTR+2 - lda #%00000000 + ; Set misc VIC-IV flags + ; .A is %00000000 here sta VIC_CTRLB ; disable extended resolution and attributes, disable 3.5 MHz mode jsr mega65_viciv_setctrl_AC ; enable C64 character set, initialize remaining CTRLA / CTRLC bits diff --git a/src/kernal/keyboard/scnkey_set_keytab.s b/src/kernal/keyboard/scnkey_set_keytab.s index cef83aac..e4990d65 100644 --- a/src/kernal/keyboard/scnkey_set_keytab.s +++ b/src/kernal/keyboard/scnkey_set_keytab.s @@ -80,10 +80,8 @@ scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) !ifdef CONFIG_MB_M65 { -!ifndef HOTFIX_CHARPTR { jsr M65_MODEGET bcc @2 -} ; Toggling charsets for C64 mode @@ -93,15 +91,12 @@ scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) @1: rts -!ifndef HOTFIX_CHARPTR { - ; Toggling charsets for M65 mode @2: lda VIC_CHARPTR+1 eor #%00001000 sta VIC_CHARPTR+1 rts -} } else { diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 56b2d3b4..b060e736 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -91,8 +91,6 @@ m65_scrmodeset_internal: ; entry point for M65_MODE65 stx VIC_COLPTR+0 stx VIC_COLPTR+1 -!ifndef CONFIG_HOTFIX_CHARPTR { - ; Set the following location: ; - VIC_CHARPTR - for character generator location @@ -102,7 +100,6 @@ m65_scrmodeset_internal: ; entry point for M65_MODE65 sta VIC_CHARPTR+1 lda #$01 sta VIC_CHARPTR+2 -} ; Set the following locations: ; - M65_SCRGUARD, M65_COLGUARD - guards for virtual screen end From 391eb72c67ed48fba605134070a36185ca8a4486 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 18:30:04 +0100 Subject: [PATCH 07/55] more work on MEGA65 keyboard support --- src/aliases/,aliases_ram_lowmem_m65.s | 37 +++---- src/kernal/board_m65/mega65_imports.s | 1 + src/kernal/board_m65/mega65_native_meminit.s | 6 ++ src/kernal/keyboard/scnkey.s | 4 +- src/kernal/keyboard/scnkey_set_keytab.s | 7 +- src/kernal/keyboard_m65/mega65_scnkey.s | 101 +++++++++++++++++- .../keyboard_m65/mega65_scnkey_init_pressed.s | 12 +++ 7 files changed, 141 insertions(+), 27 deletions(-) create mode 100644 src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 6bbc5813..af7d83bb 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -39,24 +39,25 @@ ; $580-$5FF - reserved for KERNAL - !addr M65_SCRSEG = $580 ; $580-$581 segment address (2 higher bytes) of the screen memory - !addr M65_SCRBASE = $582 ; $582-$583 first byte of screen memory - !addr M65_SCRGUARD = $584 ; $584-$585 last byte of screen memory + 1 XXX is it needed? - !addr M65_COLGUARD = $586 ; $586-$587 last byte of colour memory + 1 - !addr M65_COLVIEW = $588 ; $588-$589 first byte of color memory viewport - !addr M65_COLVIEWMAX = $58A ; $58A-$58B largest allowed value of M65_COLVIEW - !addr M65_SCRMODE = $58C ; 0 = 40x25, 1 = 80x25, 2 = 80x50 - !addr M65_SCRWINMODE = $58D ; $00 = normal mode, $FF = window enabled - !addr M65_TXTWIN_X0 = $58E ; text window - top-left X coordinate, starting from 0 - !addr M65_TXTWIN_Y0 = $58F ; text window - top-left Y coordinate, starting from 0 - !addr M65_TXTWIN_X1 = $590 ; text window - bottom-right X coordinate + 1 - !addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1 - !addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start - !addr M65_SCRCOLMAX = $594 ; maximum allowed column - !addr M65_KB_BUCKY = $595 ; result of bucky keys scan - !addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8 - !addr M65_KB_COLSUM = $59F ; sum (OR) of the M65_KB_COLSCAN - + !addr M65_SCRSEG = $580 ; $580-$581 segment address (2 higher bytes) of the screen memory + !addr M65_SCRBASE = $582 ; $582-$583 first byte of screen memory + !addr M65_SCRGUARD = $584 ; $584-$585 last byte of screen memory + 1 XXX is it needed? + !addr M65_COLGUARD = $586 ; $586-$587 last byte of colour memory + 1 + !addr M65_COLVIEW = $588 ; $588-$589 first byte of color memory viewport + !addr M65_COLVIEWMAX = $58A ; $58A-$58B largest allowed value of M65_COLVIEW + !addr M65_SCRMODE = $58C ; 0 = 40x25, 1 = 80x25, 2 = 80x50 + !addr M65_SCRWINMODE = $58D ; $00 = normal mode, $FF = window enabled + !addr M65_TXTWIN_X0 = $58E ; text window - top-left X coordinate, starting from 0 + !addr M65_TXTWIN_Y0 = $58F ; text window - top-left Y coordinate, starting from 0 + !addr M65_TXTWIN_X1 = $590 ; text window - bottom-right X coordinate + 1 + !addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1 + !addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start + !addr M65_SCRCOLMAX = $594 ; maximum allowed column + !addr M65_KB_BUCKY = $595 ; result of bucky keys scan + !addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8 + !addr M65_KB_COLSUM = $59F ; sum (OR) of the M65_KB_COLSCAN + !addr M65_KB_PRESSED = $560 ; $560-$562 keys pressed, used during scanning keyboard + !addr M65_KB_PRESSED_OLD = $563 ; $563-$565 keys pressed during previous scan ; $560-$5EB -- UNUSED -- !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 60a496f9..beebb89e 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -29,6 +29,7 @@ ;; #ALIAS# colour_codes = KERNAL_0.colour_codes ;; #ALIAS# screen_check_toggle_quote = KERNAL_0.screen_check_toggle_quote ;; #ALIAS# screen_code_to_petscii = KERNAL_0.screen_code_to_petscii +;; #ALIAS# m65_scnkey_init_pressed = KERNAL_0.m65_scnkey_init_pressed ;; #ALIAS# setup_irq_timer = KERNAL_0.setup_irq_timer ;; #ALIAS# wait_x_bars = KERNAL_0.wait_x_bars diff --git a/src/kernal/board_m65/mega65_native_meminit.s b/src/kernal/board_m65/mega65_native_meminit.s index 6ff5e8e2..a15775bb 100644 --- a/src/kernal/board_m65/mega65_native_meminit.s +++ b/src/kernal/board_m65/mega65_native_meminit.s @@ -4,11 +4,17 @@ m65_native_meminit: + ; Initialize variables for keyboard scanning + + jsr m65_scnkey_init_pressed + ; Prepare generic DMAgic list jsr m65_dmagic_init + ; ; Copy MEGA65 charset to target location - set size + ; lda #$00 sta M65_DMAJOB_SIZE_0 diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 01c8ad26..554d78fd 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -317,7 +317,7 @@ scnkey_output_key: lda NDX cmp XMAX - bcs scnkey_early_repeat ; no space in buffer + bcs scnkey_buffer_full ; no space in buffer ; Reinitialize secondary counter @@ -466,7 +466,7 @@ scnkey_handle_repeat: rts -scnkey_early_repeat: +scnkey_buffer_full: ; Keyboard buffer was full - at least make sure the key ; will be repeated as soon as possible diff --git a/src/kernal/keyboard/scnkey_set_keytab.s b/src/kernal/keyboard/scnkey_set_keytab.s index e4990d65..98d90a77 100644 --- a/src/kernal/keyboard/scnkey_set_keytab.s +++ b/src/kernal/keyboard/scnkey_set_keytab.s @@ -61,6 +61,8 @@ scnkey_valid_offset_cont: ; FALLTROUGH +} ; no CONFIG_LEGACY_SCNKEY + scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) ; Check if we should toggle the character set @@ -105,7 +107,4 @@ scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version) sta VIC_YMCSB @1: rts - -} - -} ; no CONFIG_LEGACY_SCNKEY +} \ No newline at end of file diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index a9496051..343b8be1 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -69,21 +69,116 @@ m65_scnkey_shflag_next: ; 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 + asl + 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_no_key: +m65_scnkey_jam: ; XXX + jmp m65_scnkey_init_pressed + +m65_scnkey_no_key: + + ; XXX rts diff --git a/src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s b/src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s new file mode 100644 index 00000000..35e2761d --- /dev/null +++ b/src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s @@ -0,0 +1,12 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +m65_scnkey_init_pressed: + + lda #$FF + sta M65_KB_PRESSED+0 + sta M65_KB_PRESSED+1 + sta M65_KB_PRESSED+2 + + rts From 252214f5c36d574d388c730d1581188afbf6e8cb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 18:36:20 +0100 Subject: [PATCH 08/55] fixed visual glitch in the release tool --- tools/release.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/release.cc b/tools/release.cc index 918d3790..4f055b46 100644 --- a/tools/release.cc +++ b/tools/release.cc @@ -661,7 +661,7 @@ void ROMFile::save() if (sameContent) { - spacing.resize(10 - descPtr->romTypeName.length()); + spacing.resize(10 - descPtr->romTypeName.length(), ' '); std::cout << spacing << "(unchanged)"; } From 9e96fe628b341dee76967a501974978d5f616b1e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 19:22:37 +0100 Subject: [PATCH 09/55] small keyboard handling fix --- src/kernal/keyboard_m65/mega65_scnkey.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 343b8be1..3e99a84a 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -98,7 +98,7 @@ m65_scnkey_loop_2: iny pla beq m65_scnkey_next_1 - asl + asr pha bcc m65_scnkey_loop_2 From 48aa05d5757dd0104307515979733db4f4f8dada Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 20:32:20 +0100 Subject: [PATCH 10/55] removed obsolete TAB key support --- CONFIG.md | 6 --- doc/Development.md | 22 ++++------ src/,,config_custom.s | 1 - src/,,config_cx16.s | 1 - src/,,config_generic.s | 1 - src/,,config_generic_crt.s | 1 - src/,,config_mega65.s | 1 - src/,,config_testing.s | 1 - src/,,config_ultimate64.s | 1 - src/,,config_ultimate64_crt.s | 1 - src/aliases/,aliases_petscii_codes.s | 25 ++++------- src/kernal/keyboard/kb_matrix.s | 4 -- src/kernal/keyboard/kb_matrix_128.s | 2 +- src/kernal/keyboard/kb_matrix_65.s | 4 +- src/kernal/keyboard/scnkey.s | 16 ------- .../screen/chrout_screen_jumptable_codes.s | 16 ------- src/kernal/screen/chrout_screen_tab.s | 42 ------------------- 17 files changed, 20 insertions(+), 125 deletions(-) delete mode 100644 src/kernal/screen/chrout_screen_tab.s diff --git a/CONFIG.md b/CONFIG.md index c3033ba5..54740738 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -257,12 +257,6 @@ If enabled, STOP key terminates insert/quote mode (like on some _Black Box_ cart Feature needs 12 bytes in KERNAL segment. If unsure - enable. -### `EDIT_TABULATORS` - -If enabled, allows use of TAB (or CTRL+>) and SHIFT+TAB (or CTRL+<) to switch between predefined tabulator positions. - -Feature needs 35-45 bytes in KERNAL segment. If unsure - enable. - ## Software features ### `PANIC_SCREEN` diff --git a/doc/Development.md b/doc/Development.md index 775a21ce..2f76bdfd 100644 --- a/doc/Development.md +++ b/doc/Development.md @@ -31,23 +31,17 @@ Open ROMs interrupt handlers do not touch the ROM mapping, range `0x4000-0xBFFF` ### API extensions -#### PETSCII +#### PETSCII - C128 -Open ROMs provides support for several additional PETSCII codes (all compatible with C128 and/or C65): +When C128 keyboard support is compiled-in, Open ROMs provides support for a few PETSCII codes: -| PETSCII code | description | -| :----------: | :-------------------------------------------------- | -| `$07` | bell (C128 and C65 compatible), not implemented yet | -| `$1B` | `ESC` key (C128 and C65 compatible) | -| `$84` | `HELP` key (C128 and C65 compatible) | -| `$10` | `F9` key (C65 compatible) | -| `$15` | `F10` key (C65 compatible) | -| `$16` | `F11` key (C65 compatible) | -| `$17` | `F12` key (C65 compatible) | -| `$19` | `F13` key (C65 compatible) | -| `$1A` | `F14` key (C65 compatible) | +| PETSCII code | description | +| :----------: | :--------------------- | +| `$07` | bell | +| `$1B` | `ESC` key | +| `$84` | `HELP` key | -There is no official PETSCII code for `TAB` - we can't utilize the ones from C128 or C65 because it conflicts with some C64 codes. +There is no PETSCII code for `TAB` key - we can't utilize the ones from C128 or C65 because it conflicts with some C64 codes. #### Bucky keys diff --git a/src/,,config_custom.s b/src/,,config_custom.s index 17fa482c..8ae90876 100644 --- a/src/,,config_custom.s +++ b/src/,,config_custom.s @@ -113,7 +113,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES -;; #CONFIG# EDIT_TABULATORS NO ; --- Software features diff --git a/src/,,config_cx16.s b/src/,,config_cx16.s index b1f3b2c8..988b917a 100644 --- a/src/,,config_cx16.s +++ b/src/,,config_cx16.s @@ -47,7 +47,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE NO -;; #CONFIG# EDIT_TABULATORS NO ; --- Software features diff --git a/src/,,config_generic.s b/src/,,config_generic.s index ba3b0c5d..13d75e0a 100644 --- a/src/,,config_generic.s +++ b/src/,,config_generic.s @@ -100,7 +100,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES -;; #CONFIG# EDIT_TABULATORS NO ; --- Software features diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s index 045a4632..2b539aff 100644 --- a/src/,,config_generic_crt.s +++ b/src/,,config_generic_crt.s @@ -102,7 +102,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES -;; #CONFIG# EDIT_TABULATORS NO ; --- Software features diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 40166e4e..b12ad9d2 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -82,7 +82,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES -;; #CONFIG# EDIT_TABULATORS NO ; --- Software features diff --git a/src/,,config_testing.s b/src/,,config_testing.s index fb714a01..05fb3231 100644 --- a/src/,,config_testing.s +++ b/src/,,config_testing.s @@ -100,7 +100,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES -;; #CONFIG# EDIT_TABULATORS YES ; --- Software features diff --git a/src/,,config_ultimate64.s b/src/,,config_ultimate64.s index e295751d..7406fa92 100644 --- a/src/,,config_ultimate64.s +++ b/src/,,config_ultimate64.s @@ -90,7 +90,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES -;; #CONFIG# EDIT_TABULATORS NO ; --- Software features diff --git a/src/,,config_ultimate64_crt.s b/src/,,config_ultimate64_crt.s index 566868c0..83733a83 100644 --- a/src/,,config_ultimate64_crt.s +++ b/src/,,config_ultimate64_crt.s @@ -92,7 +92,6 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES -;; #CONFIG# EDIT_TABULATORS NO ; --- Software features diff --git a/src/aliases/,aliases_petscii_codes.s b/src/aliases/,aliases_petscii_codes.s index 474573cf..8d10f8f4 100644 --- a/src/aliases/,aliases_petscii_codes.s +++ b/src/aliases/,aliases_petscii_codes.s @@ -40,34 +40,27 @@ -; Note - the following PETSCII codes are currently unassigned, can be used for further extensions: $01, $04, $06, ($80 ?) +; Note - the following PETSCII codes are currently unassigned, can be used for further extensions: $01, $04, $06, $80, $8F !set KEY_NA = $00 ; to indicate that no key is presed - -; PETSCII codes for our extended screen editor - -!set KEY_C64_TAB_FW = $8F ; CTRL+>, TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? -!set KEY_C64_TAB_BW = $80 ; CTRL+<, SHIFT+TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? - - ; PETSCII codes for certain C128 and C65 functionalities !ifdef _NEED_EXTENDED { - !set KEY_BELL = $07 ; no key, originally CTRL+G ; XXX implement, add to C65 keyboard matrix + !set KEY_BELL = $07 ; no key, originally CTRL+G ; XXX implement !set KEY_ESC = $1B } !ifdef _NEED_C65KB { - !set KEY_TAB = $09 ; XXX add to C65 keyboard matrix - !set KEY_LINE_FEED = $0A ; XXX add to C65 keyboard matrix - !set KEY_TAB_SET_CLR = $18 ; XXX add to C65 keyboard matrix - !set KEY_UNDERLINE_ON = $02 ; XXX add to C65 keyboard matrix - !set KEY_UNDERLINE_OFF = $82 ; XXX add to C65 keyboard matrix - !set KEY_FLASHING_ON = $0F ; XXX add to C65 keyboard matrix - !set KEY_FLASHING_OFF = $8F ; XXX add to C65 keyboard matrix + !set KEY_TAB = $09 + !set KEY_LINE_FEED = $0A + !set KEY_TAB_SET_CLR = $18 + !set KEY_UNDERLINE_ON = $02 + !set KEY_UNDERLINE_OFF = $82 + !set KEY_FLASHING_ON = $0F + !set KEY_FLASHING_OFF = $8F } diff --git a/src/kernal/keyboard/kb_matrix.s b/src/kernal/keyboard/kb_matrix.s index 71c982b4..631dc00d 100644 --- a/src/kernal/keyboard/kb_matrix.s +++ b/src/kernal/keyboard/kb_matrix.s @@ -55,10 +55,6 @@ __kb_matrix_ctrl: !byte $9C,$12,$04,$1E,$03,$06,$14,$18 !byte $1F,$19,$07,$9E,$02,$08,$15,$16 !byte $12,$09,$0A,$92,$0D,$0B,$0F,$0E -!ifdef CONFIG_EDIT_TABULATORS { - !byte $00,$10,$0C,$00,KEY_C64_TAB_FW,$1B,$00,KEY_C64_TAB_BW -} else { !byte $00,$10,$0C,$00,$00,$1B,$00,$00 -} !byte $1C,$00,$1D,$00,$00,$1F,$1E,$00 !byte $90,$06,$00,$05,$00,$00,$11,$00 diff --git a/src/kernal/keyboard/kb_matrix_128.s b/src/kernal/keyboard/kb_matrix_128.s index 339cc107..d6083d68 100644 --- a/src/kernal/keyboard/kb_matrix_128.s +++ b/src/kernal/keyboard/kb_matrix_128.s @@ -16,7 +16,7 @@ kb_matrix_128: - !byte KEY_HELP,$38,$35,KEY_C64_TAB_FW,$32,$34,$37,$31 + !byte KEY_HELP,$38,$35,$00,$32,$34,$37,$31 ; $00 replaces TAB key !byte KEY_ESC,$2B,$2D,$8D,$0D,$36,$39,$33 !byte $00,$30,$2E,$91,$11,$9D,$1D,$00 diff --git a/src/kernal/keyboard/kb_matrix_65.s b/src/kernal/keyboard/kb_matrix_65.s index 998a29ec..06069c7d 100644 --- a/src/kernal/keyboard/kb_matrix_65.s +++ b/src/kernal/keyboard/kb_matrix_65.s @@ -15,11 +15,11 @@ kb_matrix_65: - !byte $00, KEY_C64_TAB_FW, $00, KEY_HELP, KEY_F9, KEY_F11, KEY_F13, KEY_ESC + !byte $00, $00, $00, KEY_HELP, KEY_F9, KEY_F11, KEY_F13, KEY_ESC kb_matrix_65_shifted: - !byte $00, KEY_C64_TAB_BW, $00, KEY_HELP, KEY_F10, KEY_F12, KEY_F14, KEY_ESC + !byte $00, $00, $00, KEY_HELP, KEY_F10, KEY_F12, KEY_F14, KEY_ESC } } ; CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 554d78fd..a2e236c7 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -401,22 +401,6 @@ scnkey_handle_caps_lock: scnkey_got_petscii: -!ifdef CONFIG_KEYBOARD_C128 { !ifdef CONFIG_EDIT_TABULATORS { - - ; Special handling for SHIFT+TAB; it is easier than creating new matrix - - tax - cmp #KEY_C64_TAB_FW - bne @8 - lda SHFLAG - and #KEY_FLAG_SHIFT - beq @8 - ldx #KEY_C64_TAB_BW -@8: - txa - -} } ; CONFIG_KEYBOARD_C128 and CONFIG_EDIT_TABULATORS - beq scnkey_no_keys ; branch if we have no PETSCII code for this key ldy NDX sta KEYD, y diff --git a/src/kernal/screen/chrout_screen_jumptable_codes.s b/src/kernal/screen/chrout_screen_jumptable_codes.s index 1777deba..f9555801 100644 --- a/src/kernal/screen/chrout_screen_jumptable_codes.s +++ b/src/kernal/screen/chrout_screen_jumptable_codes.s @@ -29,10 +29,6 @@ __chrout_screen_jumptable_quote_guard: !ifdef CONFIG_EDIT_STOPQUOTE { !byte KEY_STOP -} -!ifdef CONFIG_EDIT_TABULATORS { - !byte KEY_C64_TAB_BW - !byte KEY_C64_TAB_FW } !byte KEY_DEL !byte KEY_RETURN @@ -60,10 +56,6 @@ chrout_screen_jumptable_lo: !byte <(chrout_screen_INS-1) !ifdef CONFIG_EDIT_STOPQUOTE { !byte <(chrout_screen_STOP-1) -} -!ifdef CONFIG_EDIT_TABULATORS { - !byte <(chrout_screen_TAB_BW-1) - !byte <(chrout_screen_TAB_FW-1) } !byte <(chrout_screen_DEL-1) !byte <(chrout_screen_RETURN-1) @@ -85,10 +77,6 @@ chrout_screen_jumptable_hi: !byte >(chrout_screen_INS-1) !ifdef CONFIG_EDIT_STOPQUOTE { !byte >(chrout_screen_STOP-1) -} -!ifdef CONFIG_EDIT_TABULATORS { - !byte >(chrout_screen_TAB_BW-1) - !byte >(chrout_screen_TAB_FW-1) } !byte >(chrout_screen_DEL-1) !byte >(chrout_screen_RETURN-1) @@ -114,10 +102,6 @@ chrout_screen_jumptable: !word chrout_screen_INS !ifdef CONFIG_EDIT_STOPQUOTE { !word chrout_screen_STOP -} -!ifdef CONFIG_EDIT_TABULATORS { - !word chrout_screen_TAB_BW - !word chrout_screen_TAB_FW } !word chrout_screen_DEL !word chrout_screen_RETURN diff --git a/src/kernal/screen/chrout_screen_tab.s b/src/kernal/screen/chrout_screen_tab.s deleted file mode 100644 index 390350de..00000000 --- a/src/kernal/screen/chrout_screen_tab.s +++ /dev/null @@ -1,42 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 * #IGNORE -;; #LAYOUT# * KERNAL_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Tabulation keys handling within CHROUT -; - - -!ifdef CONFIG_EDIT_TABULATORS { - - -chrout_screen_TAB_FW: - - jsr screen_get_clipped_PNTR - tya - ora #%00000111 - tay - iny - cpy #40 - bcc @1 - ldy #39 -@1: - sty PNTR - - jmp chrout_screen_calc_lptr_done - - -chrout_screen_TAB_BW: - - jsr screen_get_clipped_PNTR - beq @2 ; column 0, recalculating pointers is not necessary, but this is a rare case nevertheless - - dey - tya - and #%11111000 - sta PNTR -@2: - jmp chrout_screen_calc_lptr_done - -} ; CONFIG_EDIT_TABULATORS From ea919a4129775638e0351343362b3afb714383b6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 20:58:10 +0100 Subject: [PATCH 11/55] removed obsolete C65 keyboard support code --- CONFIG.md | 4 -- src/,,config_custom.s | 9 --- src/,,config_cx16.s | 7 --- src/,,config_generic.s | 7 --- src/,,config_generic_crt.s | 7 --- src/,,config_mega65.s | 2 - src/,,config_testing.s | 7 --- src/,,config_ultimate64.s | 7 --- src/,,config_ultimate64_crt.s | 7 --- src/aliases/,aliases_config.s | 13 ----- src/aliases/,aliases_petscii_codes.s | 3 - src/kernal/assets/programmable_keys.s | 6 +- src/kernal/extapi_m65/mega65_modeset.s | 5 ++ src/kernal/init/fda3.ioinit.s | 6 -- src/kernal/keyboard/kb_matrix_65.s | 25 --------- src/kernal/keyboard/kb_matrix_bucky.s | 23 +------- src/kernal/keyboard/scnkey.s | 57 ++----------------- src/kernal/keyboard/scnkey_65.s | 68 ----------------------- src/kernal/screen/e8ea.screen_scroll_up.s | 2 +- src/kernal/time/udtim.s | 10 ++-- tools/generate_strings.cc | 1 - 21 files changed, 23 insertions(+), 253 deletions(-) delete mode 100644 src/kernal/keyboard/kb_matrix_65.s delete mode 100644 src/kernal/keyboard/scnkey_65.s diff --git a/CONFIG.md b/CONFIG.md index 54740738..0f0a1f3f 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -215,10 +215,6 @@ Allows to use CAPS LOCK key on the C128 keyboard, this is independent from `KEYB Needs about 50 bytes more space in KERNAL segment. If unsure - disable. -### `KEYBOARD_C65`, `KEYBOARD_C65_CAPS_LOCK` - -Similar, but for C65 keyboard. Please note - the C65 keyboard support is (as of yet) completely untested! - ### `KEY_REPEAT_DEFAULT` Enables key repetition by default during the startup (sets `RPTFLG`). diff --git a/src/,,config_custom.s b/src/,,config_custom.s index 8ae90876..aa03a16c 100644 --- a/src/,,config_custom.s +++ b/src/,,config_custom.s @@ -79,8 +79,6 @@ ;; #CONFIG# LEGACY_SCNKEY NO ;; #CONFIG# KEYBOARD_C128 NO ;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO -;; #CONFIG# KEYBOARD_C65 NO ; untested -;; #CONFIG# KEYBOARD_C65_CAPS_LOCK NO ; untested ;; #CONFIG# KEY_REPEAT_DEFAULT NO ;; #CONFIG# KEY_REPEAT_ALWAYS NO ;; #CONFIG# KEY_FAST_SCAN YES @@ -102,13 +100,6 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 NO -;; #CONFIG# KEYCMD_F10 NO -;; #CONFIG# KEYCMD_F11 NO -;; #CONFIG# KEYCMD_F12 NO -;; #CONFIG# KEYCMD_F13 NO -;; #CONFIG# KEYCMD_F14 NO - ; --- Screen editor diff --git a/src/,,config_cx16.s b/src/,,config_cx16.s index 988b917a..f5605fd9 100644 --- a/src/,,config_cx16.s +++ b/src/,,config_cx16.s @@ -36,13 +36,6 @@ ;; #CONFIG# KEYCMD_HELP NO -;; #CONFIG# KEYCMD_F9 NO -;; #CONFIG# KEYCMD_F10 NO -;; #CONFIG# KEYCMD_F11 NO -;; #CONFIG# KEYCMD_F12 NO -;; #CONFIG# KEYCMD_F13 NO -;; #CONFIG# KEYCMD_F14 NO - ; --- Screen editor diff --git a/src/,,config_generic.s b/src/,,config_generic.s index 13d75e0a..a2140f24 100644 --- a/src/,,config_generic.s +++ b/src/,,config_generic.s @@ -89,13 +89,6 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 NO -;; #CONFIG# KEYCMD_F10 NO -;; #CONFIG# KEYCMD_F11 NO -;; #CONFIG# KEYCMD_F12 NO -;; #CONFIG# KEYCMD_F13 NO -;; #CONFIG# KEYCMD_F14 NO - ; --- Screen editor diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s index 2b539aff..a3e60896 100644 --- a/src/,,config_generic_crt.s +++ b/src/,,config_generic_crt.s @@ -91,13 +91,6 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 NO -;; #CONFIG# KEYCMD_F10 NO -;; #CONFIG# KEYCMD_F11 NO -;; #CONFIG# KEYCMD_F12 NO -;; #CONFIG# KEYCMD_F13 NO -;; #CONFIG# KEYCMD_F14 NO - ; --- Screen editor diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index b12ad9d2..a6bfb2d1 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -46,8 +46,6 @@ ; --- Keyboard settings ;; #CONFIG# LEGACY_SCNKEY NO -;; #CONFIG# KEYBOARD_C65 NO ; does not work -;; #CONFIG# KEYBOARD_C65_CAPS_LOCK NO ; does not work ;; #CONFIG# KEY_REPEAT_DEFAULT NO ;; #CONFIG# KEY_REPEAT_ALWAYS NO ;; #CONFIG# KEY_FAST_SCAN YES diff --git a/src/,,config_testing.s b/src/,,config_testing.s index 05fb3231..dbeff3fc 100644 --- a/src/,,config_testing.s +++ b/src/,,config_testing.s @@ -89,13 +89,6 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 NO -;; #CONFIG# KEYCMD_F10 NO -;; #CONFIG# KEYCMD_F11 NO -;; #CONFIG# KEYCMD_F12 NO -;; #CONFIG# KEYCMD_F13 NO -;; #CONFIG# KEYCMD_F14 NO - ; --- Screen editor diff --git a/src/,,config_ultimate64.s b/src/,,config_ultimate64.s index 7406fa92..f729a50b 100644 --- a/src/,,config_ultimate64.s +++ b/src/,,config_ultimate64.s @@ -79,13 +79,6 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 NO -;; #CONFIG# KEYCMD_F10 NO -;; #CONFIG# KEYCMD_F11 NO -;; #CONFIG# KEYCMD_F12 NO -;; #CONFIG# KEYCMD_F13 NO -;; #CONFIG# KEYCMD_F14 NO - ; --- Screen editor diff --git a/src/,,config_ultimate64_crt.s b/src/,,config_ultimate64_crt.s index 83733a83..48cb09e2 100644 --- a/src/,,config_ultimate64_crt.s +++ b/src/,,config_ultimate64_crt.s @@ -81,13 +81,6 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 NO -;; #CONFIG# KEYCMD_F10 NO -;; #CONFIG# KEYCMD_F11 NO -;; #CONFIG# KEYCMD_F12 NO -;; #CONFIG# KEYCMD_F13 NO -;; #CONFIG# KEYCMD_F14 NO - ; --- Screen editor diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index de9bbbeb..a1e19e13 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -233,8 +233,6 @@ !ifdef CONFIG_TAPE_NORMAL { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_TAPE_NORMAL" } !ifdef CONFIG_KEYBOARD_C128 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128" } !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" } - !ifdef CONFIG_KEYBOARD_C65 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C65" } - !ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C65_CAPS_LOCK" } } !ifdef CONFIG_MB_M65 { !ifdef CONFIG_KEYBOARD_C128 { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128" } @@ -244,8 +242,6 @@ !ifdef CONFIG_MB_U64 { !ifdef CONFIG_KEYBOARD_C128 { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C128" } !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" } - !ifdef CONFIG_KEYBOARD_C65 { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C65" } - !ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C65_CAPS_LOCK" } } @@ -390,15 +386,6 @@ ; Handle keyboard configuration -!ifdef CONFIG_KEYBOARD_C128 { !set CONFIG_KEYBOARD_C128_OR_C65 = 1 } -!ifdef CONFIG_KEYBOARD_C65 { !set CONFIG_KEYBOARD_C128_OR_C65 = 1 } - -!ifdef CONFIG_KEYBOARD_C65 { !set CONFIG_KEYBOARD_C65_OR_CAPS_LOCK = 1 } -!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set CONFIG_KEYBOARD_C65_OR_CAPS_LOCK = 1 } - -!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !set CONFIG_KEYBOARD_CAPS_LOCK = 1 } -!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set CONFIG_KEYBOARD_CAPS_LOCK = 1 } - !ifdef CONFIG_JOY1_CURSOR { !set CONFIG_JOY1_OR_JOY2_CURSOR = 1 } !ifdef CONFIG_JOY2_CURSOR { !set CONFIG_JOY1_OR_JOY2_CURSOR = 1 } diff --git a/src/aliases/,aliases_petscii_codes.s b/src/aliases/,aliases_petscii_codes.s index 8d10f8f4..3c4123d7 100644 --- a/src/aliases/,aliases_petscii_codes.s +++ b/src/aliases/,aliases_petscii_codes.s @@ -14,11 +14,8 @@ !ifdef CONFIG_KEYBOARD_C128 { !set _NEED_EXTENDED = 1 } !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 } -!ifdef CONFIG_KEYBOARD_C65 { !set _NEED_EXTENDED = 1 } -!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 } !ifdef CONFIG_MB_M65 { !set _NEED_CAPS_LOCK = 1 } !ifdef CONFIG_MB_M65 { !set _NEED_EXTENDED = 1 } -!ifdef CONFIG_KEYBOARD_C65 { !set _NEED_C65KB = 1 } !ifdef CONFIG_MB_M65 { !set _NEED_C65KB = 1 } diff --git a/src/kernal/assets/programmable_keys.s b/src/kernal/assets/programmable_keys.s index 4a0f88a4..e5373114 100644 --- a/src/kernal/assets/programmable_keys.s +++ b/src/kernal/assets/programmable_keys.s @@ -29,7 +29,7 @@ programmable_keys_codes: !ifdef CONFIG_KEYCMD_HELP { !byte KEY_HELP } -} else ifdef CONFIG_KEYBOARD_C65 { +} else ifdef CONFIG_MB_M65 { !ifdef CONFIG_KEYCMD_HELP { !byte KEY_HELP } @@ -76,7 +76,7 @@ __str_offset_F8: !ifdef CONFIG_KEYCMD_F8 { +CONFIG_KEYCMD_F8 __str_offset_HELP: !ifdef CONFIG_KEYCMD_HELP { +CONFIG_KEYCMD_HELP !byte $00 } -} else ifdef CONFIG_KEYBOARD_C65 { +} else ifdef CONFIG_MB_M65 { __str_offset_HELP: !ifdef CONFIG_KEYCMD_HELP { +CONFIG_KEYCMD_HELP !byte $00 } @@ -123,7 +123,7 @@ programmable_keys_offsets: !ifdef CONFIG_KEYCMD_HELP { !byte __str_offset_HELP - programmable_keys_strings } -} else ifdef CONFIG_KEYBOARD_C65 { +} else ifdef CONFIG_MB_M65 { !ifdef CONFIG_KEYCMD_HELP { !byte __str_offset_HELP - programmable_keys_strings } diff --git a/src/kernal/extapi_m65/mega65_modeset.s b/src/kernal/extapi_m65/mega65_modeset.s index 4dec329c..a8a87136 100644 --- a/src/kernal/extapi_m65/mega65_modeset.s +++ b/src/kernal/extapi_m65/mega65_modeset.s @@ -65,6 +65,11 @@ m65_mode65: jsr m65_native_meminit + ; Set C65 keybord handling - XXX check this before enabling + + ; lda #$02 + ; sta C65_EXTKEYS_DDR ; output for most keys, input for CAPS LOCK bit + ; Set screen mode to 80x50 lda #$02 diff --git a/src/kernal/init/fda3.ioinit.s b/src/kernal/init/fda3.ioinit.s index 6d03d4d3..70851e0d 100644 --- a/src/kernal/init/fda3.ioinit.s +++ b/src/kernal/init/fda3.ioinit.s @@ -148,12 +148,6 @@ IOINIT_skip_DOS: stx VIC_CLKRATE ; store $00 } -!ifdef CONFIG_KEYBOARD_C65_OR_CAPS_LOCK { - - lda #$02 - sta C65_EXTKEYS_DDR ; output for most keys, input for CAPS LOCK bit -} - ; Set DDR on CIA2 for IEC bus, VIC-II banking (see [CM64], $DDOO description on page 193) lda #$3F sta CIA2_DDRA ; $DD02 diff --git a/src/kernal/keyboard/kb_matrix_65.s b/src/kernal/keyboard/kb_matrix_65.s deleted file mode 100644 index 06069c7d..00000000 --- a/src/kernal/keyboard/kb_matrix_65.s +++ /dev/null @@ -1,25 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 * #IGNORE -;; #LAYOUT# * KERNAL_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Extended keyboard matrix for Commodore 65 keyboards, based on -; -; - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt -; - - -!ifdef CONFIG_KEYBOARD_C65 { !ifndef CONFIG_LEGACY_SCNKEY { - - -kb_matrix_65: - - !byte $00, $00, $00, KEY_HELP, KEY_F9, KEY_F11, KEY_F13, KEY_ESC - -kb_matrix_65_shifted: - - !byte $00, $00, $00, KEY_HELP, KEY_F10, KEY_F12, KEY_F14, KEY_ESC - - -} } ; CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/kb_matrix_bucky.s b/src/kernal/keyboard/kb_matrix_bucky.s index 16b12add..7dde75b1 100644 --- a/src/kernal/keyboard/kb_matrix_bucky.s +++ b/src/kernal/keyboard/kb_matrix_bucky.s @@ -21,8 +21,8 @@ kb_matrix_bucky_confmask: ; values to be written to CIA1_PRA !byte %10111111 ; SHIFT (right) !byte %01111111 ; VENDOR !byte %01111111 ; CTRL -!ifdef CONFIG_KEYBOARD_C128_OR_C65 { - !byte %11111111 ; C128 / C65 extra keys +!ifdef CONFIG_KEYBOARD_C128 { + !byte %11111111 ; C128 !byte %11111111 } @@ -42,19 +42,6 @@ kb_matrix_bucky_confmask_c128: ; values to be written to VIC_XSCAN !byte %11111011 ; NO_SCRL } -!ifdef CONFIG_KEYBOARD_C65 { - -kb_matrix_bucky_confmask_c65: ; values to be written to C65_EXTKEYS_PR - - !byte %11111111 - !byte %11111111 - !byte %11111111 - !byte %11111111 - - !byte %11111101 ; ALT - !byte %11111101 ; NO_SCRL -} - kb_matrix_bucky_testmask: ; for AND with CIA1_PRB value @@ -66,10 +53,6 @@ kb_matrix_bucky_testmask: ; for AND with CIA1_PRB value !byte %10000000 ; ALT !byte %00000001 ; NO_SCRL } -!ifdef CONFIG_KEYBOARD_C65 { - !byte %00000100 ; ALT - !byte %00000001 ; NO_SCRL -} kb_matrix_bucky_shflag: ; mask to be ORed to SHFLAG to mark key status @@ -82,7 +65,7 @@ kb_matrix_bucky_shflag: ; mask to be ORed to SHFLAG to mark key status !byte KEY_FLAG_ALT !byte KEY_FLAG_NO_SCRL !byte KEY_FLAG_CAPSL -} else ifdef CONFIG_KEYBOARD_C128_OR_C65 { +} else ifdef CONFIG_KEYBOARD_C128 { !byte KEY_FLAG_ALT !byte KEY_FLAG_NO_SCRL } diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index a2e236c7..059bda01 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -86,21 +86,6 @@ SCNKEY: stx VIC_XSCAN ; disconnect C128 keys if no C128 keyboard is supported } } -!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { - - lda C65_EXTKEYS_PR - and #$01 - bne @2 ; branch if no CAPS LOCK - - lda #KEY_FLAG_CAPSL - sta SHFLAG -@2: - -!ifndef CONFIG_KEYBOARD_C65 { - ldx #$FF - stx C65_EXTKEYS_PR ; disconnect C65 keys if no C65 keyboard is supported -} } - ldy #(__kb_matrix_bucky_confmask_end - kb_matrix_bucky_confmask - 1) scnkey_bucky_loop: lda kb_matrix_bucky_confmask, y @@ -108,10 +93,6 @@ scnkey_bucky_loop: !ifdef CONFIG_KEYBOARD_C128 { lda kb_matrix_bucky_confmask_c128, y sta VIC_XSCAN -} -!ifdef CONFIG_KEYBOARD_C65 { - lda kb_matrix_bucky_confmask_c65, y - sta C65_EXTKEYS_PR } lda kb_matrix_bucky_testmask, y and CIA1_PRB @@ -162,9 +143,6 @@ scnkey_keytab_set_done: stx CIA1_PRA ; connect all the rows !ifdef CONFIG_KEYBOARD_C128 { stx VIC_XSCAN -} -!ifdef CONFIG_KEYBOARD_C65 { - stx C65_EXTKEYS_PR } dex ; puts $FF cpx CIA1_PRB @@ -194,9 +172,6 @@ scnkey_keytab_set_done: ldy #$FF ; offset in key matrix table, $FF for not found yet !ifdef CONFIG_KEYBOARD_C128 { jsr scnkey_128 -} -!ifdef CONFIG_KEYBOARD_C65 { - jsr scnkey_65 } ldx #$07 scnkey_matrix_loop: @@ -326,32 +301,12 @@ scnkey_output_key: ; Retrieve the PETSCII code -!ifdef CONFIG_KEYBOARD_C128_OR_C65 { +!ifdef CONFIG_KEYBOARD_C128 { cpy #$40 bcc scnkey_output_get_keycode -!ifdef CONFIG_KEYBOARD_C128 { lda kb_matrix_128 - $41, y ; retrieve key code from C128 extended matrix -} else ifdef CONFIG_KEYBOARD_C65 { - - ; Select key matrix (normal or shifted) for extended C65 keys - - lda SHFLAG - and #%00000111 ; KEY_FLAG_SHIFT + KEY_FLAG_VENDOR + KEY_FLAG_CTRL - beq scnkey_output_65_no_shift - cmp #KEY_FLAG_SHIFT - ; XXX how to behave on VENDOR/CTRL key? Harmonize this with clasic keys behavior - bne scnkey_no_keys ; no scanning for this bucky key combination - - lda kb_matrix_65_shifted - $41, y - jmp scnkey_got_petscii - -scnkey_output_65_no_shift: - - lda kb_matrix_65 - $41, y -} - jmp scnkey_got_petscii ; FALLTROUGH @@ -360,16 +315,16 @@ scnkey_output_get_keycode: lda (KEYTAB), y ; retrieve key code from standard matrix -} ; CONFIG_KEYBOARD_C128 or CONFIG_KEYBOARD_C65 +} ; CONFIG_KEYBOARD_C128 -!ifdef CONFIG_KEYBOARD_CAPS_LOCK { +!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { ; Check if we need special handling for a CAPS LOCK key ; This is shorter than a separate set of tables scnkey_handle_caps_lock: -!ifndef CONFIG_KEYBOARD_C128_OR_C65 { +!ifndef CONFIG_KEYBOARD_C128 { lda (KEYTAB), y } tax @@ -390,9 +345,9 @@ scnkey_handle_caps_lock: @7: txa -} ; CONFIG_KEYBOARD_C128_CAPS_LOCK or CONFIG_KEYBOARD_C65_CAPS_LOCK +} ; CONFIG_KEYBOARD_C128_CAPS_LOCK -!ifndef CONFIG_KEYBOARD_C128_OR_C65 { !ifndef CONFIG_KEYBOARD_CAPS_LOCK { +!ifndef CONFIG_KEYBOARD_C128 { !ifndef CONFIG_KEYBOARD_C128_CAPS_LOCK { lda (KEYTAB), y } } diff --git a/src/kernal/keyboard/scnkey_65.s b/src/kernal/keyboard/scnkey_65.s deleted file mode 100644 index 6d000c2e..00000000 --- a/src/kernal/keyboard/scnkey_65.s +++ /dev/null @@ -1,68 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 * #IGNORE -;; #LAYOUT# * KERNAL_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Keyboard scanning routine extension for C65 keyboards -; -; - [CM128] Computes Mapping the Commodore 128 - pages 212 (SHFLAG) -; - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt (matrix) -; - - -!ifdef CONFIG_KEYBOARD_C65 { !ifndef CONFIG_LEGACY_SCNKEY { - - -; Inlining this within SCNKEY would both overcomplicate the implementation -; and disrupt a lot of branches (they would cross the 127 bytes distance limit) - -; .Y is now $FF - try to put there a key code from extended keyboard - -scnkey_65: - - sty CIA1_PRA ; disconnect classic keys - - lda #$00 - sta C65_EXTKEYS_PR ; connect C65 keys - - lda #%00000101 ; filter out bucky keys: ALT, NO_SCRL - ora CIA1_PRB - - cmp #$FF - beq scnkey_65_done ; skip if no key pressed from this row - - ; At least one key is pressed - decode it - ldy #$07 -scnkey_matrix_65_loop: - cmp kb_matrix_row_keys, y - bne @1 ; not this particular key - tya ; now .A contains key offset within a row - clc - adc kb_matrix_row_offsets, x ; now .A contains key offset from the matrix start - adc #$41 ; now .A contains offset after the standard matrix - tay - jmp scnkey_65_done -@1: - dey - bpl scnkey_matrix_65_loop - - ; FALLTROUGH, multiple keys must have been pressed - -scnkey_65_no_keys: - - pla ; get rid of return address from the stack - pla - - jmp scnkey_no_keys ; pass controll to original routine - - -scnkey_65_done: - - ldx #$FF - stx C65_EXTKEYS_PR ; connect C65 keys - - rts - - -} } ; CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/screen/e8ea.screen_scroll_up.s b/src/kernal/screen/e8ea.screen_scroll_up.s index 73d1f5a7..b236e0cf 100644 --- a/src/kernal/screen/e8ea.screen_scroll_up.s +++ b/src/kernal/screen/e8ea.screen_scroll_up.s @@ -14,7 +14,7 @@ screen_scroll_up: ; First handle CTRL and NO_SCRL keys -!ifdef CONFIG_KEYBOARD_C128_OR_C65 { +!ifdef CONFIG_KEYBOARD_C128 { ; Do not scroll if NO_SCRL is pressed and interrupts are enabled @1: diff --git a/src/kernal/time/udtim.s b/src/kernal/time/udtim.s index f3438648..ec51e798 100644 --- a/src/kernal/time/udtim.s +++ b/src/kernal/time/udtim.s @@ -70,7 +70,7 @@ udtim_keyboard: ; key press. But something as simple as this would have created warm restart ; with M+N+SPACE+RESTORE due to ghosting - so the original ROM has to provide ; some protection here. I do not know what the mechanism there exactly does, - ; but I hope the mechanism below will be compatible enough. + ; but I hope the code below will be compatible enough. lda #$80 sta CIA1_PRA ; select all the rows except the last one @@ -78,9 +78,9 @@ udtim_keyboard: ldx #$00 stx VIC_XSCAN ; connect all the extra C128 keys } -!ifdef CONFIG_KEYBOARD_C65 { +!ifdef CONFIG_MB_M65 { ldx #$00 - stx C65_EXTKEYS_PR ; connect all the extra C65 keys + stx C65_EXTKEYS_PR ; connect all the extra C65 keys XXX test this } lda CIA1_PRB ; read the keys @@ -91,9 +91,9 @@ udtim_keyboard: dex ; puts $FF stx VIC_XSCAN ; disconnect the extra C128 keys } -!ifdef CONFIG_KEYBOARD_C65 { +!ifdef CONFIG_MB_M65 { dex ; puts $FF - stx C65_EXTKEYS_PR ; disconnect the extra C65 keys + stx C65_EXTKEYS_PR ; disconnect the extra C65 keys XXX test this } lda #$7F sta CIA1_PRA ; select the last row (bit to 0) diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 17440485..5a9e040b 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -1223,7 +1223,6 @@ void DataSet::generateConfigDepStrings() // Keyboard support features if (GLOBAL_ConfigOptions["KEYBOARD_C128"]) featureStr += "KBD 128\r"; - if (GLOBAL_ConfigOptions["KEYBOARD_C65"]) featureStr += "KBD 65\r"; // Add strings to appropriate list From bc6f154b7869215cf7003c10cfd81cd10970012e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 21:53:56 +0100 Subject: [PATCH 12/55] added initial MEGA65 keyboard matrix --- src/aliases/,aliases_petscii_codes.s | 14 +++++++------- src/kernal/keyboard/kb_matrix.s | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/aliases/,aliases_petscii_codes.s b/src/aliases/,aliases_petscii_codes.s index 3c4123d7..5393bed5 100644 --- a/src/aliases/,aliases_petscii_codes.s +++ b/src/aliases/,aliases_petscii_codes.s @@ -46,18 +46,18 @@ ; PETSCII codes for certain C128 and C65 functionalities !ifdef _NEED_EXTENDED { - !set KEY_BELL = $07 ; no key, originally CTRL+G ; XXX implement + !set KEY_BELL = $07 ; CTRL+G !set KEY_ESC = $1B } !ifdef _NEED_C65KB { !set KEY_TAB = $09 - !set KEY_LINE_FEED = $0A - !set KEY_TAB_SET_CLR = $18 - !set KEY_UNDERLINE_ON = $02 - !set KEY_UNDERLINE_OFF = $82 - !set KEY_FLASHING_ON = $0F - !set KEY_FLASHING_OFF = $8F + !set KEY_LINE_FEED = $0A ; XXX add to M65 matrix + !set KEY_TAB_SET_CLR = $18 ; XXX add to M65 matrix + !set KEY_UNDERLINE_ON = $02 ; XXX add to M65 matrix + !set KEY_UNDERLINE_OFF = $82 ; XXX add to M65 matrix + !set KEY_FLASHING_ON = $0F ; XXX add to M65 matrix + !set KEY_FLASHING_OFF = $8F ; XXX add to M65 matrix } diff --git a/src/kernal/keyboard/kb_matrix.s b/src/kernal/keyboard/kb_matrix.s index 631dc00d..ca19c243 100644 --- a/src/kernal/keyboard/kb_matrix.s +++ b/src/kernal/keyboard/kb_matrix.s @@ -28,6 +28,9 @@ __kb_matrix_normal: !byte $2B,$50,$4C,$2D,$2E,$3A,$40,$2C !byte $5C,$2A,$3B,$13,$00,$3D,$5E,$2F !byte $31,$5F,$00,$32,$20,$00,$51,$03 +!ifdef CONFIG_MB_M65 { + !byte $00,$09,$00,$84,$10,$16,$19,$1B +} __kb_matrix_shift: !byte $94,$8D,$9D,$8C,$89,$8A,$8B,$91 @@ -38,6 +41,10 @@ __kb_matrix_shift: !byte $DB,$70,$6C,$DD,$3E,$5B,$BA,$3C !byte $A9,$C0,$5D,$93,$00,$3D,$DE,$3F !byte $21,$5F,$00,$22,$A0,$00,$71,$83 +!ifdef CONFIG_MB_M65 { + ; XXX + !byte $00,$00,$00,$00,$15,$17,$1A,$00 ; XXX SHIFT+HELP?, SHIFT+ESC? +} __kb_matrix_vendor: !byte $94,$8D,$9D,$8C,$89,$8A,$8B,$91 @@ -48,6 +55,10 @@ __kb_matrix_vendor: !byte $A6,$AF,$B6,$DC,$3E,$5B,$A4,$3C !byte $A8,$DF,$5D,$93,$00,$3D,$DE,$3F !byte $81,$5F,$00,$95,$a0,$00,$AB,$83 +!ifdef CONFIG_MB_M65 { + ; XXX + !byte $00,$00,$00,$00,$15,$17,$1A,$00 ; XXX VENDOR+HELP?, VENDOR+ESC? +} __kb_matrix_ctrl: !byte $00,$00,$00,$00,$00,$00,$00,$00 @@ -58,3 +69,18 @@ __kb_matrix_ctrl: !byte $00,$10,$0C,$00,$00,$1B,$00,$00 !byte $1C,$00,$1D,$00,$00,$1F,$1E,$00 !byte $90,$06,$00,$05,$00,$00,$11,$00 + +!ifdef CONFIG_MB_M65 { + +__kb_matrix_ctrl_m65: + !byte $00,$00,$00,$00,$00,$00,$00,$00 + !byte $1C,$17,$01,$9F,$1A,$13,$05,$00 + !byte $9C,$12,$04,$1E,$03,$06,$14,$18 + !byte $1F,$19,$07,$9E,$02,$0B,$15,$16 + !byte $12,$0C,$0A,$92,$0D,$0B,$0F,$0E + !byte $00,$10,$0C,$00,$00,$1B,$00,$00 + !byte $1C,$00,$1D,$00,$00,$1F,$1E,$00 + !byte $90,$06,$00,$05,$00,$00,$11,$00 + ; XXX + !byte $00,$00,$00,$00,$00,$00,$00,$00 ; XXX CTRL+HELP?, CTRL+ESC? +} From 2a77b90b407c91d71c27e5ae286953e02b96c163 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 22:28:06 +0100 Subject: [PATCH 13/55] added new segment for MEGA65, $C000-$CFFF --- Makefile | 12 +++++++++-- doc/Development.md | 2 +- src/kernal/board_m65/C000.interop | 1 + .../board_m65/C000.mega65_vectable_kernal_C.s | 21 +++++++++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/kernal/board_m65/C000.interop create mode 100644 src/kernal/board_m65/C000.mega65_vectable_kernal_C.s diff --git a/Makefile b/Makefile index fc5883ec..65a602ff 100644 --- a/Makefile +++ b/Makefile @@ -203,6 +203,7 @@ SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ $(DIR_M65)/dos.seg_1 \ $(DIR_M65)/kernal.seg_0 \ + $(DIR_M65)/kernal.seg_C \ $(DIR_M65)/kernal.seg_1 SEG_LIST_X16 = $(DIR_X16)/basic.seg_0 \ @@ -356,6 +357,8 @@ $(DIR_M65)/basic.seg_1 $(DIR_M65)/BASIC_1_combined.vs $(DIR_M65)/BASIC_1_combi $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/BASIC_0_combined.sym $(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1_combined.vs $(DIR_M65)/DOS_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_DOS_M65) $(CFG_M65) +$(DIR_M65)/kernal.seg_C $(DIR_M65)/KERNAL_C_combined.vs $(DIR_M65)/KERNAL_C_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/kernal.seg_1 $(DIR_M65)/KERNAL_1_combined.vs $(DIR_M65)/KERNAL_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym @@ -513,6 +516,11 @@ $(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1_combined.vs $(DIR_M65)/DOS_1_combined.sym: @rm -f $@* $(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1* @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r M65 -s DOS_1 -i DOS_1-mega65 -o dos.seg_1 -d $(DIR_M65) -l 4000 -h 7fff $(CFG_M65) $(SRCDIR_DOS_M65) +$(DIR_M65)/kernal.seg_C $(DIR_M65)/KERNAL_C_combined.vs $(DIR_M65)/KERNAL_C_combined.sym: + @mkdir -p $(DIR_M65) + @rm -f $@* $(DIR_M65)/kernal.seg_C $(DIR_M65)/KERNAL_C* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r M65 -s KERNAL_C -i KERNAL_C-mega65 -o kernal.seg_C -d $(DIR_M65) -l c000 -h cfff $(CFG_M65) $(GEN_STR_M65) $(SRCDIR_KERNAL) $(GEN_KERNAL) + $(DIR_M65)/kernal.seg_1 $(DIR_M65)/KERNAL_1_combined.vs $(DIR_M65)/KERNAL_1_combined.sym: @mkdir -p $(DIR_M65) @rm -f $@* $(DIR_M65)/kernal.seg_1 $(DIR_M65)/KERNAL_1* @@ -710,7 +718,7 @@ $(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB bui @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_ORF) @cat build/chargen_openroms.patched >> $(TARGET_M65_x_ORF) @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_ORF) - @cat build/padding_4_KB >> $(TARGET_M65_x_ORF) + @cat $(DIR_M65)/kernal.seg_C >> $(TARGET_M65_x_ORF) @cat $(TARGET_CHR_ORF) >> $(TARGET_M65_x_ORF) @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_ORF) @cat build/padding_64_KB >> $(TARGET_M65_x_ORF) @@ -725,7 +733,7 @@ $(TARGET_M65_x_ORF) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB bui @cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) @cat build/chargen_pxlfont.patched >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) - @cat build/padding_4_KB >> $(TARGET_M65_x_PXL) + @cat $(DIR_M65)/kernal.seg_C >> $(TARGET_M65_x_PXL) @cat $(TARGET_CHR_PXL) >> $(TARGET_M65_x_PXL) @cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x_PXL) @cat build/padding_64_KB >> $(TARGET_M65_x_PXL) diff --git a/doc/Development.md b/doc/Development.md index 2f76bdfd..85d534d9 100644 --- a/doc/Development.md +++ b/doc/Development.md @@ -95,7 +95,7 @@ Currently there are 4 ROM layouts defined: - `STD` - with 2 code segments: `BASIC` (`$A000-$E4D2`, where `$C000-$DFFF` is a skip-gap for RAM and I/O area) and `KERNAL` (`$E4D3 - $FFFF`) - `CRT` - where `BASIC` becames `BASIC_0` and `KERNAL` becames `KERNAL_0`, with additional `BASIC`/`KERNAL` segments are placed on the required cartridge image -- `M65` - where `BASIC` becames `BASIC_0` and `KERNAL` becames `KERNAL_0`, additional segments might be added to the build system in the future; at the moment of writing this document additional 12KB of ROM is defined as `BASIC_1` segment and additional 8KB of ROM is defined as `KERNAL_1` segment +- `M65` - where `BASIC` becames `BASIC_0` and `KERNAL` becames `KERNAL_0`, additional segments might be added to the build system in the future; at the moment of writing this document additional 12KB of ROM is defined as `BASIC_1` segment, additional 4KB of ROM is defined as `KERNAL_C` segment, and additional 8KB of ROM is defined as `KERNAL_1` segment - `X16` - memory layout for the Commander X16 machine Expect at least one more, `U64`, if the planned additional ROM banks support for Ultimate 64 gets implemented. To check for current ROM layout or code segment use KickAssembler preprocessor defines, like `ROM_LAYOUT_STD`, `SEGMENT_M65_BASIC_0`, `SEGMENT_X16_KERNAL_1`. diff --git a/src/kernal/board_m65/C000.interop b/src/kernal/board_m65/C000.interop new file mode 100644 index 00000000..7acd2a6f --- /dev/null +++ b/src/kernal/board_m65/C000.interop @@ -0,0 +1 @@ +This particular address is not for interoperability - we had to choose some fixed location for the extended ROM jumptable, beginning of the mapped memory block is just sane. diff --git a/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s new file mode 100644 index 00000000..d085403f --- /dev/null +++ b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s @@ -0,0 +1,21 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE-FLOAT +;; #LAYOUT# M65 KERNAL_C #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Definitions for communication with MEGA65 segment KERNAL_C from KERNAL_0 +; + + +!ifdef SEGMENT_KERNAL_0 { + + ; Label definitions + + !addr VKC__m65_scnkey = $C000 + 2 * 0 + +} else { + + ; Vector table (Open ROMs private!) + + !word $0000 +} From a6831d7619bf3117d524567fcf7dcf628e5f4190 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 23:14:52 +0100 Subject: [PATCH 14/55] moved new MEGA65 keyboard handler to separate ROM segment --- .../board_m65/C000.mega65_vectable_kernal_C.s | 2 +- .../{mega65_imports.s => mega65_imports_1.s} | 0 src/kernal/board_m65/mega65_imports_C.s | 13 +++++++++++ src/kernal/keyboard/scnkey.s | 23 ++++++++++++++++++- src/kernal/keyboard_m65/mega65_scnkey.s | 6 ++++- 5 files changed, 41 insertions(+), 3 deletions(-) rename src/kernal/board_m65/{mega65_imports.s => mega65_imports_1.s} (100%) create mode 100644 src/kernal/board_m65/mega65_imports_C.s diff --git a/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s index d085403f..eae8567a 100644 --- a/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s +++ b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s @@ -17,5 +17,5 @@ ; Vector table (Open ROMs private!) - !word $0000 + !word m65_scnkey } diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports_1.s similarity index 100% rename from src/kernal/board_m65/mega65_imports.s rename to src/kernal/board_m65/mega65_imports_1.s diff --git a/src/kernal/board_m65/mega65_imports_C.s b/src/kernal/board_m65/mega65_imports_C.s new file mode 100644 index 00000000..df2a906e --- /dev/null +++ b/src/kernal/board_m65/mega65_imports_C.s @@ -0,0 +1,13 @@ +;; #LAYOUT# M65 KERNAL_C #TAKE +;; #LAYOUT# * * #IGNORE + +;; #IMPORT# KERNAL_0 = KERNAL_0_combined.sym + +; +; Definitions for calling MEGA65 segment KERNAL_0 routines from KERNAL_C +; + +;; #ALIAS# m65_scnkey_init_pressed = KERNAL_0.m65_scnkey_init_pressed +;; #ALIAS# scnkey_buffer_full = KERNAL_0.scnkey_buffer_full +;; #ALIAS# kb_matrix_bucky_shflag = KERNAL_0.kb_matrix_bucky_shflag +;; #ALIAS# __kb_matrix_normal = KERNAL_0.__kb_matrix_normal diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 059bda01..5cc314e8 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -37,7 +37,28 @@ SCNKEY: !ifdef CONFIG_MB_M65 { !ifdef CONFIG_M65_KB_DEV { jsr M65_MODEGET - +bcc m65_scnkey + bcs scnkey_legacy_mode + + ; Map KERNAL_C segment + + lda VIC_CTRLA + pha + ora #%00100000 + sta VIC_CTRLA + + ; Call the native mode routine + + jsr (VKC__m65_scnkey) + + ; Restore mapping and quit + + pla + sta VIC_CTRLA + + rts + +scnkey_legacy_mode: + } } ; Prepare for SHFLAG update diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 3e99a84a..473ba3e4 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -1,4 +1,4 @@ -;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_C #TAKE ;; #LAYOUT# * * #IGNORE @@ -127,6 +127,8 @@ m65_scnkey_next_1: dex bpl m65_scnkey_loop_1 + rts + ; ; Analyze currently and previously pressed keys ; @@ -156,6 +158,8 @@ m65_scnkey_output_key: ; Put the key into the keyboard buffer + inc $D020 + tya ldy NDX sta KEYD, y From 51b49796da2b61978b1378ed99b4ac93595fca26 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 23:17:35 +0100 Subject: [PATCH 15/55] updated documentation, removed debug code --- Makefile | 2 +- src/kernal/keyboard_m65/mega65_scnkey.s | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 65a602ff..0c5e1a82 100644 --- a/Makefile +++ b/Makefile @@ -693,7 +693,7 @@ $(TARGET_U64CRT_X): $(SEG_LIST_U64CRT) $(CRT_BIN_LIST) build/padding_8_KB # $0:$6000 - 12 KB - BASIC segment 1 # $0:$9000 - 4 KB - native mode chargen # $0:$A000 - 8 KB - BASIC segment 0 -# $0:$C000 - 4 KB - unused for now, padding +# $0:$C000 - 4 KB - KERNAL segment C # $0:$D000 - 4 KB - legacy mode chargen # $0:$E000 - 9 KB - KERNAL segment 0 # $1:$0000 - 64 KB - unused for now, padding diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 473ba3e4..2b4f4489 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -158,8 +158,6 @@ m65_scnkey_output_key: ; Put the key into the keyboard buffer - inc $D020 - tya ldy NDX sta KEYD, y From 52f20a41b6fda8c77d77e65784b7a49fd14d5450 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 23:28:39 +0100 Subject: [PATCH 16/55] moved MEGA65 native cursor blink to KERNAL_C segment --- src/,,config_mega65.s | 2 +- .../board_m65/C000.mega65_vectable_kernal_C.s | 4 +++- src/kernal/interrupts/ea31.default_irq_handler.s | 16 +++++++++++++++- src/kernal/screen_m65/mega65_cursor_blink.s | 2 +- .../screen_m65/mega65_screen_helpers_irq.s | 2 +- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index a6bfb2d1..b313772b 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -52,7 +52,7 @@ ;; #CONFIG# JOY1_CURSOR NO ;; #CONFIG# JOY2_CURSOR NO -;; #CONFIG# M65_KB_DEV NO ; for development, keep disabled +;; #CONFIG# M65_KB_DEV NO ; for development, keep disabled for release builds ;; #CONFIG# PROGRAMMABLE_KEYS YES diff --git a/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s index eae8567a..f713e937 100644 --- a/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s +++ b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s @@ -11,11 +11,13 @@ ; Label definitions - !addr VKC__m65_scnkey = $C000 + 2 * 0 + !addr VKC__m65_cursor_blink = $C000 + 2 * 0 + !addr VKC__m65_scnkey = $C000 + 2 * 1 } else { ; Vector table (Open ROMs private!) + !word m65_cursor_blink !word m65_scnkey } diff --git a/src/kernal/interrupts/ea31.default_irq_handler.s b/src/kernal/interrupts/ea31.default_irq_handler.s index bd43b132..05784c7f 100644 --- a/src/kernal/interrupts/ea31.default_irq_handler.s +++ b/src/kernal/interrupts/ea31.default_irq_handler.s @@ -20,7 +20,21 @@ default_irq_handler: jsr M65_MODEGET bcs @2 - jsr m65_cursor_blink + ; Map KERNAL_C segment + + lda VIC_CTRLA + pha + ora #%00100000 + sta VIC_CTRLA + + ; Call the native mode blink routine + + jsr (VKC__m65_cursor_blink) + + ; Restore mapping and quit + + pla + sta VIC_CTRLA bra default_irq_handler_common @2: diff --git a/src/kernal/screen_m65/mega65_cursor_blink.s b/src/kernal/screen_m65/mega65_cursor_blink.s index e144b74a..c380301c 100644 --- a/src/kernal/screen_m65/mega65_cursor_blink.s +++ b/src/kernal/screen_m65/mega65_cursor_blink.s @@ -1,4 +1,4 @@ -;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_C #TAKE ;; #LAYOUT# * * #IGNORE ; diff --git a/src/kernal/screen_m65/mega65_screen_helpers_irq.s b/src/kernal/screen_m65/mega65_screen_helpers_irq.s index 75f6d674..870bf171 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_irq.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_irq.s @@ -1,4 +1,4 @@ -;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_C #TAKE ;; #LAYOUT# * * #IGNORE From a6eb001fe66c357ac841e6cfa6ba3545341688f1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 29 Nov 2020 23:37:53 +0100 Subject: [PATCH 17/55] more data moved to new ROM segment --- src/kernal/board_m65/mega65_imports_C.s | 1 - src/kernal/keyboard/kb_matrix.s | 13 ++++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/kernal/board_m65/mega65_imports_C.s b/src/kernal/board_m65/mega65_imports_C.s index df2a906e..922818f6 100644 --- a/src/kernal/board_m65/mega65_imports_C.s +++ b/src/kernal/board_m65/mega65_imports_C.s @@ -10,4 +10,3 @@ ;; #ALIAS# m65_scnkey_init_pressed = KERNAL_0.m65_scnkey_init_pressed ;; #ALIAS# scnkey_buffer_full = KERNAL_0.scnkey_buffer_full ;; #ALIAS# kb_matrix_bucky_shflag = KERNAL_0.kb_matrix_bucky_shflag -;; #ALIAS# __kb_matrix_normal = KERNAL_0.__kb_matrix_normal diff --git a/src/kernal/keyboard/kb_matrix.s b/src/kernal/keyboard/kb_matrix.s index ca19c243..fc43a02e 100644 --- a/src/kernal/keyboard/kb_matrix.s +++ b/src/kernal/keyboard/kb_matrix.s @@ -1,6 +1,7 @@ ;; #LAYOUT# STD * #TAKE ;; #LAYOUT# X16 * #IGNORE ;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_C #TAKE ;; #LAYOUT# * * #IGNORE ; @@ -28,7 +29,7 @@ __kb_matrix_normal: !byte $2B,$50,$4C,$2D,$2E,$3A,$40,$2C !byte $5C,$2A,$3B,$13,$00,$3D,$5E,$2F !byte $31,$5F,$00,$32,$20,$00,$51,$03 -!ifdef CONFIG_MB_M65 { +!ifdef SEGMENT_KERNAL_C { !byte $00,$09,$00,$84,$10,$16,$19,$1B } @@ -41,7 +42,7 @@ __kb_matrix_shift: !byte $DB,$70,$6C,$DD,$3E,$5B,$BA,$3C !byte $A9,$C0,$5D,$93,$00,$3D,$DE,$3F !byte $21,$5F,$00,$22,$A0,$00,$71,$83 -!ifdef CONFIG_MB_M65 { +!ifdef SEGMENT_KERNAL_C { ; XXX !byte $00,$00,$00,$00,$15,$17,$1A,$00 ; XXX SHIFT+HELP?, SHIFT+ESC? } @@ -55,12 +56,13 @@ __kb_matrix_vendor: !byte $A6,$AF,$B6,$DC,$3E,$5B,$A4,$3C !byte $A8,$DF,$5D,$93,$00,$3D,$DE,$3F !byte $81,$5F,$00,$95,$a0,$00,$AB,$83 -!ifdef CONFIG_MB_M65 { +!ifdef SEGMENT_KERNAL_C { ; XXX !byte $00,$00,$00,$00,$15,$17,$1A,$00 ; XXX VENDOR+HELP?, VENDOR+ESC? } __kb_matrix_ctrl: +!ifndef SEGMENT_KERNAL_C { !byte $00,$00,$00,$00,$00,$00,$00,$00 !byte $1C,$17,$01,$9F,$1A,$13,$05,$00 !byte $9C,$12,$04,$1E,$03,$06,$14,$18 @@ -69,10 +71,7 @@ __kb_matrix_ctrl: !byte $00,$10,$0C,$00,$00,$1B,$00,$00 !byte $1C,$00,$1D,$00,$00,$1F,$1E,$00 !byte $90,$06,$00,$05,$00,$00,$11,$00 - -!ifdef CONFIG_MB_M65 { - -__kb_matrix_ctrl_m65: +} else { !byte $00,$00,$00,$00,$00,$00,$00,$00 !byte $1C,$17,$01,$9F,$1A,$13,$05,$00 !byte $9C,$12,$04,$1E,$03,$06,$14,$18 From 17ecb018aff2e61a654b80f4c097a57afa540332 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 30 Nov 2020 17:18:24 +0100 Subject: [PATCH 18/55] small directory structure cleanup --- Makefile | 2 +- src/kernal/{extapi_m65 => board_m65}/mega65_modeget.s | 0 src/kernal/{extapi_m65 => board_m65}/mega65_modeset.s | 0 src/kernal/{extapi_m65 => jumptable_m65}/mega65__jumptable.s | 3 +-- 4 files changed, 2 insertions(+), 3 deletions(-) rename src/kernal/{extapi_m65 => board_m65}/mega65_modeget.s (100%) rename src/kernal/{extapi_m65 => board_m65}/mega65_modeset.s (100%) rename src/kernal/{extapi_m65 => jumptable_m65}/mega65__jumptable.s (81%) diff --git a/Makefile b/Makefile index 0c5e1a82..9a2a878d 100644 --- a/Makefile +++ b/Makefile @@ -47,13 +47,13 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal/board_m65 \ src/kernal/board_u64 \ src/kernal/board_x16 \ - src/kernal/extapi_m65 \ src/kernal/iec \ src/kernal/iec_fast \ src/kernal/init \ src/kernal/interrupts \ src/kernal/iostack \ src/kernal/jumptable \ + src/kernal/jumptable_m65 \ src/kernal/keyboard \ src/kernal/keyboard_m65 \ src/kernal/memory \ diff --git a/src/kernal/extapi_m65/mega65_modeget.s b/src/kernal/board_m65/mega65_modeget.s similarity index 100% rename from src/kernal/extapi_m65/mega65_modeget.s rename to src/kernal/board_m65/mega65_modeget.s diff --git a/src/kernal/extapi_m65/mega65_modeset.s b/src/kernal/board_m65/mega65_modeset.s similarity index 100% rename from src/kernal/extapi_m65/mega65_modeset.s rename to src/kernal/board_m65/mega65_modeset.s diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/jumptable_m65/mega65__jumptable.s similarity index 81% rename from src/kernal/extapi_m65/mega65__jumptable.s rename to src/kernal/jumptable_m65/mega65__jumptable.s index 301226a2..c54021bd 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/jumptable_m65/mega65__jumptable.s @@ -4,8 +4,7 @@ ; ; Not this is not an official Kernal API extension (yet)! It is subject to change! ; -; XXX consider turning this into vector table, the only jumptable extension -; would copy the vector table to given memory location +; XXX assign addresses M65_JMODEGET: From 94d0d2176f11e8ee676fc73bf87cb8ed989b5a88 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 30 Nov 2020 17:53:25 +0100 Subject: [PATCH 19/55] added PRIMM implementation for easier debugging --- CREDITS.md | 1 + STATUS.md | 13 +++++++++++ src/aliases/,aliases_ram_lowmem.s | 4 ++-- src/basic/,imports.s | 1 + src/kernal/jumptable_m65/ff7d.jprimm.s | 11 +++++++++ src/kernal/print/primm.s | 31 ++++++++++++++++++++++++++ 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/kernal/jumptable_m65/ff7d.jprimm.s create mode 100644 src/kernal/print/primm.s diff --git a/CREDITS.md b/CREDITS.md index a514a658..e2790ddd 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -9,6 +9,7 @@ * enthusi/Onslaught - for his example Turbo Tape 64 compatible loader * djmips - for fast 8x8 multiplication routine * Verz - for the integer division routine +* Mike Barry - for his PRIMM implementation ## for documentation diff --git a/STATUS.md b/STATUS.md index ba005490..a8e6603a 100644 --- a/STATUS.md +++ b/STATUS.md @@ -397,3 +397,16 @@ Not all of them - only these we want to have implemented. | `$FF80` | revision byte | DONE | |
+ +### API extensions - MEGA65 build + +Not all of them - only these we want to have implemented. Note: this is likely to change in the future! + +
+ +| Address | Name | Status | Remarks | +| :-------: | :------- | :------: | :--------------------------------------------------------------------: | +| `$FF7D` | PRIMM | DONE | print immediate, address compatible with C128 and C65 ROMs | +| `$FFF8` | | DONE | reset vector for usage within hypervisor, starts in legacy mode | + +
diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index 151c261a..e9491bc4 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -100,8 +100,8 @@ !addr COLSTORE = $9C ; [!] screen border storage for tape routines } !addr MSGFLG = $9D ; bit 6 = error messages, bit 7 = control message - !addr PTR1 = $9E ; for tape support, counter of errorneous bytes - !addr PTR2 = $9F ; for tape support, counter for errorneous bytes correction + !addr PTR1 = $9E ; for tape support, counter of errorneous bytes [!] also used by PRIMM + !addr PTR2 = $9F ; for tape support, counter for errorneous bytes correction [!] also used by PRIMM !addr TIME = $A0 ; $A0-$A2 jiffy clock !addr IECPROTO = $A3 ; [!] IEC or pseudo-IEC protocol, >= $80 for unknown; originally named TSFCNT !addr TBTCNT = $A4 ; temporary variable for tape and IEC, [!] our usage probably differs in details diff --git a/src/basic/,imports.s b/src/basic/,imports.s index fa3bb638..1024c047 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -18,6 +18,7 @@ ;; #ALIAS# clear_screen = KERNAL_0.clear_screen ;; #ALIAS# printf = KERNAL_0.printf +;; #ALIAS# PRIMM = KERNAL_0.PRIMM ;; #ALIAS# plot_set = KERNAL_0.plot_set ;; #ALIAS# print_hex_byte = KERNAL_0.print_hex_byte diff --git a/src/kernal/jumptable_m65/ff7d.jprimm.s b/src/kernal/jumptable_m65/ff7d.jprimm.s new file mode 100644 index 00000000..082aee5d --- /dev/null +++ b/src/kernal/jumptable_m65/ff7d.jprimm.s @@ -0,0 +1,11 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +; 'Print immediate' - useful debug routine, present on many CBM machines +; see https://www.pagetable.com/?p=926 + + +JPRIMM: + + jmp PRIMM diff --git a/src/kernal/print/primm.s b/src/kernal/print/primm.s new file mode 100644 index 00000000..00df50ea --- /dev/null +++ b/src/kernal/print/primm.s @@ -0,0 +1,31 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +; 'Print immediate', original implementation by Mike Barry, adapted to 65CE02 +; see http://www.6502.org/source/io/primm.htm + + +PRIMM: + + pla ; get low part of (string address-1) + sta PTR1 + pla ; get high part of (string address-1) + sta PTR2 + +bra @2 +@1: + jsr JCHROUT ; output a string char +@2: + inc PTR1 ; advance the string pointer + bne @3 + inc PTR2 +@3: + ldy #$00 + lda (PTR1), y ; get string char + bne @1 ; output and continue if not NUL + lda PTR2 + pha + lda PTR1 + pha + + rts From 440f2bc99ded46a87888df8a386526ccfeb12f86 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 30 Nov 2020 18:48:08 +0100 Subject: [PATCH 20/55] added hex printing to MEGA65 build API --- STATUS.md | 3 ++- src/kernal/jumptable_m65/jprhex.s | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/kernal/jumptable_m65/jprhex.s diff --git a/STATUS.md b/STATUS.md index a8e6603a..c0f6d372 100644 --- a/STATUS.md +++ b/STATUS.md @@ -400,12 +400,13 @@ Not all of them - only these we want to have implemented. ### API extensions - MEGA65 build -Not all of them - only these we want to have implemented. Note: this is likely to change in the future! +Note: this is likely to change in the future, possibly in an incompatible way!
| Address | Name | Status | Remarks | | :-------: | :------- | :------: | :--------------------------------------------------------------------: | +| ? | PRHEX | DONE | print hex value from .A | | `$FF7D` | PRIMM | DONE | print immediate, address compatible with C128 and C65 ROMs | | `$FFF8` | | DONE | reset vector for usage within hypervisor, starts in legacy mode | diff --git a/src/kernal/jumptable_m65/jprhex.s b/src/kernal/jumptable_m65/jprhex.s new file mode 100644 index 00000000..b0a9162f --- /dev/null +++ b/src/kernal/jumptable_m65/jprhex.s @@ -0,0 +1,10 @@ +;; #LAYOUT# M65 KERNAL_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +; Prints value from .A in hex + + +JPRHEX: + + jmp print_hex_byte From f14ee352e09aa55964d0c5f8a270db323b3c2cb8 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 30 Nov 2020 19:22:08 +0100 Subject: [PATCH 21/55] small keyboard handling fix --- src/kernal/keyboard_m65/mega65_scnkey.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 2b4f4489..5c625098 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -127,8 +127,6 @@ m65_scnkey_next_1: dex bpl m65_scnkey_loop_1 - rts - ; ; Analyze currently and previously pressed keys ; @@ -175,6 +173,8 @@ m65_scnkey_output_key: m65_scnkey_jam: + pla + ; XXX jmp m65_scnkey_init_pressed From 4185eaf8275ed85f36c81e6ffb33fbd118371dba Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 30 Nov 2020 22:45:07 +0100 Subject: [PATCH 22/55] finished keyboard matrix --- src/kernal/keyboard/kb_matrix.s | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/kernal/keyboard/kb_matrix.s b/src/kernal/keyboard/kb_matrix.s index fc43a02e..dfcc7a35 100644 --- a/src/kernal/keyboard/kb_matrix.s +++ b/src/kernal/keyboard/kb_matrix.s @@ -43,8 +43,7 @@ __kb_matrix_shift: !byte $A9,$C0,$5D,$93,$00,$3D,$DE,$3F !byte $21,$5F,$00,$22,$A0,$00,$71,$83 !ifdef SEGMENT_KERNAL_C { - ; XXX - !byte $00,$00,$00,$00,$15,$17,$1A,$00 ; XXX SHIFT+HELP?, SHIFT+ESC? + !byte $00,$00,$00,$84,$15,$17,$1A,$1B } __kb_matrix_vendor: @@ -57,8 +56,7 @@ __kb_matrix_vendor: !byte $A8,$DF,$5D,$93,$00,$3D,$DE,$3F !byte $81,$5F,$00,$95,$a0,$00,$AB,$83 !ifdef SEGMENT_KERNAL_C { - ; XXX - !byte $00,$00,$00,$00,$15,$17,$1A,$00 ; XXX VENDOR+HELP?, VENDOR+ESC? + !byte $00,$00,$00,$84,$15,$17,$1A,$1B } __kb_matrix_ctrl: @@ -80,6 +78,5 @@ __kb_matrix_ctrl: !byte $00,$10,$0C,$00,$00,$1B,$00,$00 !byte $1C,$00,$1D,$00,$00,$1F,$1E,$00 !byte $90,$06,$00,$05,$00,$00,$11,$00 - ; XXX - !byte $00,$00,$00,$00,$00,$00,$00,$00 ; XXX CTRL+HELP?, CTRL+ESC? + !byte $00,$00,$00,$84,$00,$00,$00,$1B } From 8580a918e2029c695ee9bf33c0f69e05298c2c65 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 30 Nov 2020 23:29:45 +0100 Subject: [PATCH 23/55] small optimization in keyboard code --- src/kernal/keyboard_m65/mega65_scnkey.s | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 5c625098..0fbdd401 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -21,8 +21,8 @@ m65_scnkey: m65_scnkey_loop: - stx KBSCN_SELECT - lda KBSCN_PEEK + stx $D614 + lda $D613 eor #$FF ; let bit 1 mean 'pressed', not the otherwise sta M65_KB_COLSCAN, x ora M65_KB_COLSUM @@ -116,8 +116,7 @@ m65_scnkey_loop_2: asl asl asl - clc - adc M65_KB_PRESSED+0 + adc M65_KB_PRESSED+0 ; Carry already cleared by ASL sta M65_KB_PRESSED+0 bra m65_scnkey_loop_2 @@ -184,3 +183,7 @@ m65_scnkey_no_key: ; XXX rts + + + +m65_scnkey_is_new: From 21bc00138a63e95843686e9be595405de396ce08 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 1 Dec 2020 00:04:23 +0100 Subject: [PATCH 24/55] fixed improper ASR usage --- src/kernal/keyboard_m65/mega65_scnkey.s | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 0fbdd401..a3f34bef 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -48,7 +48,7 @@ m65_scnkey_loop: m65_scnkey_shflag_loop: inx - asr + asr ; ASR preserves most significant bit, but in our case it is 0 bcc m65_scnkey_shflag_next ; Bucky key pressed @@ -98,7 +98,8 @@ m65_scnkey_loop_2: iny pla beq m65_scnkey_next_1 - asr + clc + ror ; can't use ASR here, as it preserves most significant bit pha bcc m65_scnkey_loop_2 From ddc9f10f323f16a6cbf44121b48760fa9f9a94c6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 1 Dec 2020 21:31:30 +0100 Subject: [PATCH 25/55] some work on CAPS LOCK support --- src/,,config_mega65.s | 10 +++--- src/kernal/board_m65/mega65_imports_C.s | 1 + src/kernal/keyboard/kb_matrix.s | 13 +++++++ src/kernal/keyboard/kb_matrix_lookup.s | 31 +++++++++++++++- src/kernal/keyboard/scnkey_set_keytab.s | 4 +-- src/kernal/keyboard_m65/mega65_scnkey.s | 16 +++++++-- .../keyboard_m65/mega65_scnkey_set_kaytab.s | 35 +++++++++++++++++++ 7 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 src/kernal/keyboard_m65/mega65_scnkey_set_kaytab.s diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index b313772b..2c129faa 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -52,7 +52,7 @@ ;; #CONFIG# JOY1_CURSOR NO ;; #CONFIG# JOY2_CURSOR NO -;; #CONFIG# M65_KB_DEV NO ; for development, keep disabled for release builds +;; #CONFIG# M65_KB_DEV NO ; for development, keep disabled for release builds ;; #CONFIG# PROGRAMMABLE_KEYS YES @@ -63,15 +63,15 @@ ;; #CONFIG# KEYCMD_F3 "@9$" ;; #CONFIG# KEYCMD_F4 "RUN:" ;; #CONFIG# KEYCMD_F5 "@10$" -;; #CONFIG# KEYCMD_F6 NO +;; #CONFIG# KEYCMD_F6 "\5FL" ;; #CONFIG# KEYCMD_F7 "@11$" -;; #CONFIG# KEYCMD_F8 NO +;; #CONFIG# KEYCMD_F8 "\5FHF" ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 "\5FL" +;; #CONFIG# KEYCMD_F9 "REM F9" ;; #CONFIG# KEYCMD_F10 "REM F10" -;; #CONFIG# KEYCMD_F11 "\5FH" +;; #CONFIG# KEYCMD_F11 "REM F11" ;; #CONFIG# KEYCMD_F12 "REM F12" ;; #CONFIG# KEYCMD_F13 "REM F13" ;; #CONFIG# KEYCMD_F14 "REM F14" diff --git a/src/kernal/board_m65/mega65_imports_C.s b/src/kernal/board_m65/mega65_imports_C.s index 922818f6..dc2723a1 100644 --- a/src/kernal/board_m65/mega65_imports_C.s +++ b/src/kernal/board_m65/mega65_imports_C.s @@ -9,4 +9,5 @@ ;; #ALIAS# m65_scnkey_init_pressed = KERNAL_0.m65_scnkey_init_pressed ;; #ALIAS# scnkey_buffer_full = KERNAL_0.scnkey_buffer_full +;; #ALIAS# scnkey_toggle_if_needed = KERNAL_0.scnkey_toggle_if_needed ;; #ALIAS# kb_matrix_bucky_shflag = KERNAL_0.kb_matrix_bucky_shflag diff --git a/src/kernal/keyboard/kb_matrix.s b/src/kernal/keyboard/kb_matrix.s index dfcc7a35..2405b202 100644 --- a/src/kernal/keyboard/kb_matrix.s +++ b/src/kernal/keyboard/kb_matrix.s @@ -33,6 +33,19 @@ __kb_matrix_normal: !byte $00,$09,$00,$84,$10,$16,$19,$1B } +!ifdef SEGMENT_KERNAL_C { +__kb_matrix_caps: + !byte $14,$0D,$1D,$88,$85,$86,$87,$11 + !byte $33,$77,$61,$34,$7A,$73,$65,$00 + !byte $35,$72,$64,$36,$63,$66,$74,$78 + !byte $37,$79,$67,$38,$62,$68,$75,$76 + !byte $39,$69,$6A,$30,$6D,$6B,$6F,$6E + !byte $2B,$70,$6C,$2D,$2E,$3A,$40,$2C + !byte $5C,$2A,$3B,$13,$00,$3D,$5E,$2F + !byte $31,$5F,$00,$32,$20,$00,$71,$03 + !byte $00,$09,$00,$84,$10,$16,$19,$1B +} + __kb_matrix_shift: !byte $94,$8D,$9D,$8C,$89,$8A,$8B,$91 !byte $23,$77,$61,$24,$7A,$73,$65,$00 diff --git a/src/kernal/keyboard/kb_matrix_lookup.s b/src/kernal/keyboard/kb_matrix_lookup.s index b320f0ae..22a281ef 100644 --- a/src/kernal/keyboard/kb_matrix_lookup.s +++ b/src/kernal/keyboard/kb_matrix_lookup.s @@ -1,6 +1,7 @@ ;; #LAYOUT# STD * #TAKE ;; #LAYOUT# X16 * #IGNORE ;; #LAYOUT# * KERNAL_0 #TAKE +;; #LAYOUT# M65 KERNAL_C #TAKE ;; #LAYOUT# * * #IGNORE ; @@ -15,6 +16,8 @@ kb_matrix_lookup: +!ifndef SEGMENT_KERNAL_C { + !byte (__kb_matrix_normal - kb_matrix) ; %000 Normal !byte (__kb_matrix_shift - kb_matrix) ; %001 SHIFT !byte (__kb_matrix_vendor - kb_matrix) ; %010 VENDOR @@ -23,4 +26,30 @@ kb_matrix_lookup: !byte $FF ; %101 SHIFT+CTRL !byte $FF ; %110 VENDOR+CTRL !byte $FF ; %111 SHIFT+VENDOR+CTRL -} \ No newline at end of file + +} else { + + ; MEGA65 native mode - no CAPS LOCK active + + !word __kb_matrix_normal ; %0.000 Normal + !word __kb_matrix_shift ; %0.001 SHIFT + !word __kb_matrix_vendor ; %0.010 VENDOR + !word $0000 ; %0.011 SHIFT+VENDOR + !word __kb_matrix_ctrl ; %0.100 CTRL + !word $0000 ; %0.101 SHIFT+CTRL + !word $0000 ; %0.110 VENDOR+CTRL + !word $0000 ; %0.111 SHIFT+VENDOR+CTRL + + ; MEGA65 native mode - CAPS LOCK pressed + + !word __kb_matrix_caps ; %1.000 Normal + !word __kb_matrix_shift ; %1.001 SHIFT + !word __kb_matrix_vendor ; %1.010 VENDOR + !word $0000 ; %1.011 SHIFT+VENDOR + !word __kb_matrix_ctrl ; %1.100 CTRL + !word $0000 ; %1.101 SHIFT+CTRL + !word $0000 ; %1.110 VENDOR+CTRL + !word $0000 ; %1.111 SHIFT+VENDOR+CTRL +} + +} diff --git a/src/kernal/keyboard/scnkey_set_keytab.s b/src/kernal/keyboard/scnkey_set_keytab.s index 98d90a77..1bef2873 100644 --- a/src/kernal/keyboard/scnkey_set_keytab.s +++ b/src/kernal/keyboard/scnkey_set_keytab.s @@ -21,16 +21,14 @@ scnkey_set_keytab: ; Set initial KEYTAB value - lda #kb_matrix sta KEYTAB+1 ; Calculate table index - lda SHFLAG - and #$07 ; we are only interested in SHIFT / CTRL / VENDOR keys + and #$07 ; we are interested in SHIFT, VENDOR and CTRL keys only tax ; Retrieve table offset diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index a3f34bef..210afe72 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -132,16 +132,21 @@ m65_scnkey_next_1: ; ; XXX add proper implementation - ldx M65_KB_PRESSED+0 + ldy M65_KB_PRESSED+0 + + ; FALLTROUGH + +m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by KEYTAB ; ; Convert the key coordinates to key code ; - ; XXX add proper implementation - ldy __kb_matrix_normal, x + ldy __kb_matrix_normal, x ; XXX select matrix beq m65_scnkey_no_key + ; FALLTROUGH + m65_scnkey_output_key: ; @@ -154,6 +159,11 @@ m65_scnkey_output_key: cmp XMAX +bcs scnkey_buffer_full + ; Reinitialize secondary counter + + lda #$03 + sta KOUNT + ; Put the key into the keyboard buffer tya diff --git a/src/kernal/keyboard_m65/mega65_scnkey_set_kaytab.s b/src/kernal/keyboard_m65/mega65_scnkey_set_kaytab.s new file mode 100644 index 00000000..2920d7d3 --- /dev/null +++ b/src/kernal/keyboard_m65/mega65_scnkey_set_kaytab.s @@ -0,0 +1,35 @@ +;; #LAYOUT# M65 KERNAL_C #TAKE +;; #LAYOUT# * * #IGNORE + +; +; MEGA65 native mode version of a well-known Kernal routine, described in: +; +; - [CM64] Computes Mapping the Commodore 64 - pages 220, 221 +; + + +m65_scnkey_set_keytab: + + ; Set initial KEYTAB value + lda #kb_matrix + sta KEYTAB+1 + + ; Calculate table index + lda SHFLAG + asl ; multiply by 2 - keyboard matrix lookup table consists of words + and #$2E ; we are interested in SHIFT, VENDOR, CTRL and CAPS LOCK keys only + tax + and #$20 ; isolate CAPS LOCK bit + beq @1 + txa ; we have to move the CAPS LOCK bit (only) by one position down + and #$0E + ora #$10 + tax +@1: + + ; XXX finish the implementation + + + jmp scnkey_toggle_if_needed From 8c822f4464cb7fc51f172f8e509170022bb1d155 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 17:53:12 +0100 Subject: [PATCH 26/55] more work on MEGA65 native keyboard scanner --- .../board_m65/C000.mega65_vectable_kernal_C.s | 7 +- src/kernal/board_m65/mega65_imports_1.s | 1 + src/kernal/board_m65/mega65_imports_C.s | 4 + src/kernal/board_m65/mega65_modeset.s | 7 ++ src/kernal/board_m65/mega65_native_meminit.s | 10 ++ src/kernal/keyboard/scnkey.s | 2 + src/kernal/keyboard_m65/mega65_scnkey.s | 107 ++++++++++++++---- .../keyboard_m65/mega65_scnkey_init_keylog.s | 12 ++ ...et_kaytab.s => mega65_scnkey_set_keytab.s} | 0 9 files changed, 128 insertions(+), 22 deletions(-) create mode 100644 src/kernal/keyboard_m65/mega65_scnkey_init_keylog.s rename src/kernal/keyboard_m65/{mega65_scnkey_set_kaytab.s => mega65_scnkey_set_keytab.s} (100%) diff --git a/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s index f713e937..18d87e3c 100644 --- a/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s +++ b/src/kernal/board_m65/C000.mega65_vectable_kernal_C.s @@ -1,18 +1,20 @@ ;; #LAYOUT# M65 KERNAL_0 #TAKE-FLOAT +;; #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT ;; #LAYOUT# M65 KERNAL_C #TAKE ;; #LAYOUT# * * #IGNORE ; -; Definitions for communication with MEGA65 segment KERNAL_C from KERNAL_0 +; Definitions for communication with MEGA65 segment KERNAL_C from KERNAL_0 / KERNAL_1 ; -!ifdef SEGMENT_KERNAL_0 { +!ifndef SEGMENT_KERNAL_C { ; Label definitions !addr VKC__m65_cursor_blink = $C000 + 2 * 0 !addr VKC__m65_scnkey = $C000 + 2 * 1 + !addr VKC__m65_scnkey_init_keylog = $C000 + 2 * 2 } else { @@ -20,4 +22,5 @@ !word m65_cursor_blink !word m65_scnkey + !word m65_scnkey_init_keylog } diff --git a/src/kernal/board_m65/mega65_imports_1.s b/src/kernal/board_m65/mega65_imports_1.s index beebb89e..fdad4bb5 100644 --- a/src/kernal/board_m65/mega65_imports_1.s +++ b/src/kernal/board_m65/mega65_imports_1.s @@ -30,6 +30,7 @@ ;; #ALIAS# screen_check_toggle_quote = KERNAL_0.screen_check_toggle_quote ;; #ALIAS# screen_code_to_petscii = KERNAL_0.screen_code_to_petscii ;; #ALIAS# m65_scnkey_init_pressed = KERNAL_0.m65_scnkey_init_pressed +;; #ALIAS# scnkey_set_keytab = KERNAL_0.scnkey_set_keytab ;; #ALIAS# setup_irq_timer = KERNAL_0.setup_irq_timer ;; #ALIAS# wait_x_bars = KERNAL_0.wait_x_bars diff --git a/src/kernal/board_m65/mega65_imports_C.s b/src/kernal/board_m65/mega65_imports_C.s index dc2723a1..9ebbef07 100644 --- a/src/kernal/board_m65/mega65_imports_C.s +++ b/src/kernal/board_m65/mega65_imports_C.s @@ -10,4 +10,8 @@ ;; #ALIAS# m65_scnkey_init_pressed = KERNAL_0.m65_scnkey_init_pressed ;; #ALIAS# scnkey_buffer_full = KERNAL_0.scnkey_buffer_full ;; #ALIAS# scnkey_toggle_if_needed = KERNAL_0.scnkey_toggle_if_needed + ;; #ALIAS# kb_matrix_bucky_shflag = KERNAL_0.kb_matrix_bucky_shflag +;; #ALIAS# kb_matrix_alwaysrepeat = KERNAL_0.kb_matrix_alwaysrepeat +;; #ALIAS# __kb_matrix_alwaysrepeat_end = KERNAL_0.__kb_matrix_alwaysrepeat_end + diff --git a/src/kernal/board_m65/mega65_modeset.s b/src/kernal/board_m65/mega65_modeset.s index a8a87136..c02eb04a 100644 --- a/src/kernal/board_m65/mega65_modeset.s +++ b/src/kernal/board_m65/mega65_modeset.s @@ -25,6 +25,13 @@ m65_mode64: jsr viciv_shutdown jsr vicii_init + ; Restore KEYLOG + + lda #scnkey_set_keytab + sta KEYLOG+1 + ; Switch CPU speed to normal lda #$40 diff --git a/src/kernal/board_m65/mega65_native_meminit.s b/src/kernal/board_m65/mega65_native_meminit.s index a15775bb..781f2897 100644 --- a/src/kernal/board_m65/mega65_native_meminit.s +++ b/src/kernal/board_m65/mega65_native_meminit.s @@ -8,6 +8,16 @@ m65_native_meminit: jsr m65_scnkey_init_pressed + lda VIC_CTRLA + pha + ora #%00100000 + sta VIC_CTRLA + + jsr (VKC__m65_scnkey_init_keylog) + + pla + sta VIC_CTRLA + ; Prepare generic DMAgic list jsr m65_dmagic_init diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 5cc314e8..43bd4972 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -406,6 +406,8 @@ scnkey_try_repeat: bpl @9 bmi scnkey_done + ; FALLTROUGH + scnkey_handle_repeat: } ; no CONFIG_KEY_REPEAT_ALWAYS diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 210afe72..ea377e76 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -19,7 +19,7 @@ m65_scnkey: ; FALLTROUGH -m65_scnkey_loop: +m65_scnkey_fetch_loop: stx $D614 lda $D613 @@ -28,7 +28,7 @@ m65_scnkey_loop: ora M65_KB_COLSUM sta M65_KB_COLSUM dex - bpl m65_scnkey_loop + bpl m65_scnkey_fetch_loop ; ; Retrieve SHIFT / VENDOR / CTRL / ALT / NO SCROLL / CAPS LOCK status @@ -45,11 +45,11 @@ m65_scnkey_loop: ; FALLTROUGH -m65_scnkey_shflag_loop: +m65_scnkey_bucky_loop: inx asr ; ASR preserves most significant bit, but in our case it is 0 - bcc m65_scnkey_shflag_next + bcc m65_scnkey_bucky_next ; Bucky key pressed @@ -61,9 +61,20 @@ m65_scnkey_shflag_loop: ; FALLTROUGH -m65_scnkey_shflag_next: +m65_scnkey_bucky_next: - bne m65_scnkey_shflag_loop + bne m65_scnkey_bucky_loop + + ; Set KEYTAB vector + + lda KEYLOG+1 + bne @1 + jsr m65_scnkey_set_keytab ; KEYLOG routine on zeropage? most likely vector not set + bra m65_scnkey_keytab_set_done +@1: + jsr (KEYLOG) + +m65_scnkey_keytab_set_done: ; ; Scan the keyboard matrix stored in memory to determine which keys were pressed @@ -79,7 +90,7 @@ m65_scnkey_shflag_next: jsr m65_scnkey_init_pressed lda M65_KB_COLSUM - beq m65_scnkey_no_key ; branch if no key was pressed XXX try joystick + +beq m65_scnkey_no_keys ; branch if no key was pressed XXX try joystick ldx #$08 @@ -134,16 +145,29 @@ m65_scnkey_next_1: ; XXX add proper implementation ldy M65_KB_PRESSED+0 + + + + + + + ; FALLTROUGH m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by KEYTAB - ; - ; Convert the key coordinates to key code - ; + cpy LSTX + beq m65_scnkey_try_repeat ; branch if the same key as previously + sty LSTX - ldy __kb_matrix_normal, x ; XXX select matrix - beq m65_scnkey_no_key + ; Reset key repeat counters XXX turn values into constants + +!ifndef CONFIG_RS232_UP9600 { + lda #$16 +} else { + lda #$18 +} + sta DELAY ; FALLTROUGH @@ -164,20 +188,67 @@ m65_scnkey_output_key: lda #$03 sta KOUNT + ; Retrieve the PETSCII code + + lda (KEYTAB), y + + ; FALLTROUGH + +m65_scnkey_got_petscii: + ; Put the key into the keyboard buffer - tya + beq m65_scnkey_no_keys ; branch if we have no PETSCII code for this key ldy NDX sta KEYD, y inc NDX + ; FALLTROUGH + +m65_scnkey_done: + rts +m65_scnkey_try_repeat: - ; XXX +!ifndef CONFIG_KEY_REPEAT_ALWAYS { + ; Check whether we should repeat keys - first the flag, afterwards hardcoded list + + lda RPTFLG + bmi m65_scnkey_handle_repeat ; branch if we should repeat always + + tya + ldx #(__kb_matrix_alwaysrepeat_end - kb_matrix_alwaysrepeat - 1) +@1: + cmp kb_matrix_alwaysrepeat, x + beq m65_scnkey_handle_repeat + dex + bpl @1 + bmi m65_scnkey_done + + ; FALLTROUGH + +m65_scnkey_handle_repeat: + +} ; no CONFIG_KEY_REPEAT_ALWAYS + + ; Countdown before first repeat + + lda DELAY + beq @1 + dec DELAY + + rts +@1: + ; Countdown before subsequent repeats + + lda KOUNT + beq m65_scnkey_output_key ; if second counter is also 0, we can repeat the key + dec KOUNT + + rts - @@ -189,12 +260,8 @@ m65_scnkey_jam: jmp m65_scnkey_init_pressed -m65_scnkey_no_key: +m65_scnkey_no_keys: ; XXX rts - - - -m65_scnkey_is_new: diff --git a/src/kernal/keyboard_m65/mega65_scnkey_init_keylog.s b/src/kernal/keyboard_m65/mega65_scnkey_init_keylog.s new file mode 100644 index 00000000..05ca509f --- /dev/null +++ b/src/kernal/keyboard_m65/mega65_scnkey_init_keylog.s @@ -0,0 +1,12 @@ +;; #LAYOUT# M65 KERNAL_C #TAKE +;; #LAYOUT# * * #IGNORE + + +m65_scnkey_init_keylog: + + lda #m65_scnkey_set_keytab + sta KEYLOG+1 + + rts diff --git a/src/kernal/keyboard_m65/mega65_scnkey_set_kaytab.s b/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s similarity index 100% rename from src/kernal/keyboard_m65/mega65_scnkey_set_kaytab.s rename to src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s From c571e0babb30730c0c76b068a002042b5accf6b0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 17:55:16 +0100 Subject: [PATCH 27/55] removed temporary setting varaible --- src/,,config_mega65.s | 2 -- src/kernal/keyboard/scnkey.s | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 2c129faa..1acdcace 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -52,8 +52,6 @@ ;; #CONFIG# JOY1_CURSOR NO ;; #CONFIG# JOY2_CURSOR NO -;; #CONFIG# M65_KB_DEV NO ; for development, keep disabled for release builds - ;; #CONFIG# PROGRAMMABLE_KEYS YES ;; #CONFIG# KEYCMD_RUN "RUN" diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 43bd4972..2b1df0cd 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -34,7 +34,7 @@ SCNKEY: -!ifdef CONFIG_MB_M65 { !ifdef CONFIG_M65_KB_DEV { +!ifdef CONFIG_MB_M65 { jsr M65_MODEGET bcs scnkey_legacy_mode @@ -59,7 +59,7 @@ SCNKEY: scnkey_legacy_mode: -} } +} ; Prepare for SHFLAG update From 0ea10b24a1ac9b311880615dca266699bc366bec Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 18:24:16 +0100 Subject: [PATCH 28/55] improved key repeat handling --- src/aliases/,aliases_config.s | 2 ++ src/kernal/keyboard/scnkey.s | 6 +--- src/kernal/keyboard_m65/mega65_scnkey.s | 40 +++++++++++-------------- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index a1e19e13..598244ad 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -389,6 +389,8 @@ !ifdef CONFIG_JOY1_CURSOR { !set CONFIG_JOY1_OR_JOY2_CURSOR = 1 } !ifdef CONFIG_JOY2_CURSOR { !set CONFIG_JOY1_OR_JOY2_CURSOR = 1 } +!ifdef CONFIG_RS232_UP9600 { !set CONFIG_KEY_DELAY = $18 } else { !set CONFIG_KEY_DELAY = $16 } + ; Handle debug configuration diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 2b1df0cd..6857df74 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -298,11 +298,7 @@ scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by KEYT ; ; Besides - since I am the one who writes the code, I will make the values exactly how I like them :D -!ifndef CONFIG_RS232_UP9600 { - lda #$16 -} else { - lda #$18 -} + lda #CONFIG_KEY_DELAY sta DELAY ; FALLTROUGH diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index ea377e76..d8836af3 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -90,7 +90,7 @@ m65_scnkey_keytab_set_done: jsr m65_scnkey_init_pressed lda M65_KB_COLSUM - +beq m65_scnkey_no_keys ; branch if no key was pressed XXX try joystick + beq m65_scnkey_no_keys ; branch if no key was pressed XXX try joystick ldx #$08 @@ -162,11 +162,7 @@ m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by ; Reset key repeat counters XXX turn values into constants -!ifndef CONFIG_RS232_UP9600 { - lda #$16 -} else { - lda #$18 -} + lda #CONFIG_KEY_DELAY sta DELAY ; FALLTROUGH @@ -209,6 +205,21 @@ m65_scnkey_done: rts +m65_scnkey_jam: + + pla + jsr m65_scnkey_init_pressed + + ; FALLTROUGH + +m65_scnkey_no_keys: + + ; Mark no key press + + lda #$48 + sta LSTX + rts + m65_scnkey_try_repeat: !ifndef CONFIG_KEY_REPEAT_ALWAYS { @@ -248,20 +259,3 @@ m65_scnkey_handle_repeat: dec KOUNT rts - - - - -m65_scnkey_jam: - - pla - - ; XXX - - jmp m65_scnkey_init_pressed - -m65_scnkey_no_keys: - - ; XXX - - rts From 10757046c71a7c7a8fead558a1c0528cb4ccbc2a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 18:43:09 +0100 Subject: [PATCH 29/55] added keyboared matrix selection, does not work properly yet --- src/kernal/keyboard_m65/mega65_scnkey.s | 2 +- src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index d8836af3..cb1f21a6 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -160,7 +160,7 @@ m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by beq m65_scnkey_try_repeat ; branch if the same key as previously sty LSTX - ; Reset key repeat counters XXX turn values into constants + ; Reset key repeat counters lda #CONFIG_KEY_DELAY sta DELAY diff --git a/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s b/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s index 2920d7d3..5881a487 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s +++ b/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s @@ -10,13 +10,8 @@ m65_scnkey_set_keytab: - ; Set initial KEYTAB value - lda #kb_matrix - sta KEYTAB+1 - ; Calculate table index + lda SHFLAG asl ; multiply by 2 - keyboard matrix lookup table consists of words and #$2E ; we are interested in SHIFT, VENDOR, CTRL and CAPS LOCK keys only @@ -28,8 +23,13 @@ m65_scnkey_set_keytab: ora #$10 tax @1: + ; Set KEYTAB - ; XXX finish the implementation + ldx kb_matrix_lookup+0, x + sta KEYTAB+0 + ldx kb_matrix_lookup+1, x + sta KEYTAB+1 + ; Fall back to original routine jmp scnkey_toggle_if_needed From da90717ab243fefc3370ea1e935b36d043c08a84 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 19:19:26 +0100 Subject: [PATCH 30/55] warm restart stability improvement --- src/kernal/interrupts/fe66.default_brk_handler.s | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/kernal/interrupts/fe66.default_brk_handler.s b/src/kernal/interrupts/fe66.default_brk_handler.s index 258bd701..94a5e1d0 100644 --- a/src/kernal/interrupts/fe66.default_brk_handler.s +++ b/src/kernal/interrupts/fe66.default_brk_handler.s @@ -27,6 +27,10 @@ default_brk_handler: ; Make sure we have normal memory mapping jsr map_NORMAL + + lda VIC_CTRLA + and #%01000111 + sta VIC_CTRLA } jsr JRESTOR From 325eb90f33c3dfa4ce7f1781a5261679cb737efc Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 22:52:40 +0100 Subject: [PATCH 31/55] keyboard table fix --- .../keyboard_m65/mega65_scnkey_set_keytab.s | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s b/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s index 5881a487..f61cec03 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s +++ b/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s @@ -13,21 +13,21 @@ m65_scnkey_set_keytab: ; Calculate table index lda SHFLAG - asl ; multiply by 2 - keyboard matrix lookup table consists of words - and #$2E ; we are interested in SHIFT, VENDOR, CTRL and CAPS LOCK keys only - tax - and #$20 ; isolate CAPS LOCK bit + and #KEY_FLAG_CAPSL ; isolate CAPS LOCK bit + php + lda SHFLAG + and #%00000111 ; take SHIFT, VENDOR, CTRL, cancel the rest + plp beq @1 - txa ; we have to move the CAPS LOCK bit (only) by one position down - and #$0E - ora #$10 - tax + ora #%00001000 ; apply CAPS lock bit at convenient position @1: + asl ; multiply by 2 - we have a list of addresses + ; Set KEYTAB - ldx kb_matrix_lookup+0, x + lda kb_matrix_lookup+0, x sta KEYTAB+0 - ldx kb_matrix_lookup+1, x + lda kb_matrix_lookup+1, x sta KEYTAB+1 ; Fall back to original routine From 4488f332a05951d224344e9da07880a7a1ae5744 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 22:57:43 +0100 Subject: [PATCH 32/55] small keyboard bugfix --- src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s b/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s index f61cec03..e2b63f5b 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s +++ b/src/kernal/keyboard_m65/mega65_scnkey_set_keytab.s @@ -22,6 +22,7 @@ m65_scnkey_set_keytab: ora #%00001000 ; apply CAPS lock bit at convenient position @1: asl ; multiply by 2 - we have a list of addresses + tax ; Set KEYTAB From d1a3ae28f1ea437a3e6c11638bd46c46749c6acc Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Dec 2020 23:05:04 +0100 Subject: [PATCH 33/55] added missing protection against unsupported bucky key combination --- src/kernal/keyboard_m65/mega65_scnkey.s | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index cb1f21a6..6527a9fb 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -184,6 +184,11 @@ m65_scnkey_output_key: lda #$03 sta KOUNT + ; Check if KEYTAB is valid + + lda KEYTAB+1 + beq m65_scnkey_jam + ; Retrieve the PETSCII code lda (KEYTAB), y From fb70e4d7f927494b34f5d8af68a25a8eab8bece9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Dec 2020 16:11:36 +0100 Subject: [PATCH 34/55] more work on keyboard matrix selection --- src/aliases/,aliases_ram_lowmem_m65.s | 4 +- src/kernal/board_m65/mega65_native_meminit.s | 12 ++ src/kernal/keyboard_m65/mega65_scnkey.s | 132 ++++++++++++++++-- .../keyboard_m65/mega65_scnkey_init_pressed.s | 3 + 4 files changed, 135 insertions(+), 16 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index af7d83bb..5a683453 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -58,7 +58,9 @@ !addr M65_KB_COLSUM = $59F ; sum (OR) of the M65_KB_COLSCAN !addr M65_KB_PRESSED = $560 ; $560-$562 keys pressed, used during scanning keyboard !addr M65_KB_PRESSED_OLD = $563 ; $563-$565 keys pressed during previous scan - ; $560-$5EB -- UNUSED -- + !addr M65_KB_PRESSED_NEW = $566 ; $566-$568 set of M65_KB_PRESSED minus M65_KB_PRESSED_OLD + !addr M65_JOYCRSR = $569 ; joystick to be used for cursor movement + ; $56A-$5EB -- UNUSED -- !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/kernal/board_m65/mega65_native_meminit.s b/src/kernal/board_m65/mega65_native_meminit.s index 781f2897..b35c0b27 100644 --- a/src/kernal/board_m65/mega65_native_meminit.s +++ b/src/kernal/board_m65/mega65_native_meminit.s @@ -4,6 +4,18 @@ m65_native_meminit: + ; Clear pages 4-7 + + lda #$00 + tax +@1: + sta $0400, x + sta $0500, x + sta $0600, x + sta $0700, x + inx + bne @1 + ; Initialize variables for keyboard scanning jsr m65_scnkey_init_pressed diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 6527a9fb..06c560f2 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -21,8 +21,8 @@ m65_scnkey: m65_scnkey_fetch_loop: - stx $D614 - lda $D613 + 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 @@ -37,7 +37,7 @@ m65_scnkey_fetch_loop: lda SHFLAG sta LSTSHF ; needed for SHIFT+VENDOR support - ldx #$00 + inx ; .X goes from $FF to $00 stx SHFLAG lda M65_KB_BUCKY @@ -80,17 +80,17 @@ m65_scnkey_keytab_set_done: ; 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 + lda M65_KB_PRESSED+0 + sta M65_KB_PRESSED_OLD+0 + lda M65_KB_PRESSED+1 + sta M65_KB_PRESSED_OLD+1 + lda M65_KB_PRESSED+2 + sta M65_KB_PRESSED_OLD+2 jsr m65_scnkey_init_pressed lda M65_KB_COLSUM - beq m65_scnkey_no_keys ; branch if no key was pressed XXX try joystick + beq m65_scnkey_try_joystick ; branch if no key was pressed ldx #$08 @@ -117,7 +117,7 @@ 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 + +bpl m65_scnkey_pla_jam ; branch if too many keys pressed lda M65_KB_PRESSED+1 sta M65_KB_PRESSED+2 lda M65_KB_PRESSED+0 @@ -142,24 +142,79 @@ m65_scnkey_next_1: ; Analyze currently and previously pressed keys ; - ; XXX add proper implementation - ldy M65_KB_PRESSED+0 + ; First select the new keys + lda M65_KB_PRESSED+0 + jsr m65_scnkey_compare_with_old + jsr m65_scnkey_add_if_new_valid + lda M65_KB_PRESSED+1 + jsr m65_scnkey_compare_with_old + jsr m65_scnkey_add_if_new_valid + lda M65_KB_PRESSED+2 + jsr m65_scnkey_compare_with_old + jsr m65_scnkey_add_if_new_valid + ; If we have more than one key - consider it jam + lda M65_KB_PRESSED_NEW+1 + bmi m65_scnkey_jam + ; If we have exactly one new key - this is our key + ldy M65_KB_PRESSED_NEW+0 + bpl m65_scnkey_got_key + + ; No new key - check if the last one is still pressed + + ldy LSTX + cmp M65_KB_PRESSED+0 + beq m65_scnkey_got_key_skip_cmp + cmp M65_KB_PRESSED+1 + beq m65_scnkey_got_key_skip_cmp + cmp M65_KB_PRESSED+2 + beq m65_scnkey_got_key_skip_cmp + + ; Nope, previous key is not pressed ; FALLTROUGH +m65_scnkey_try_joystick: + + lda M65_JOYCRSR + cmp #$02 + beq m65_scnkey_try_joy2 + cmp #$01 + bne m65_scnkey_no_keys + + ; FALLTROUGH + +m65_scnkey_try_joy1: + + +nop + ; XXX provide implementation + +m65_scnkey_try_joy2: + + +nop + ; XXX provide implementation + +m65_scnkey_try_joy_common: + + ; XXX provide implementation + bra m65_scnkey_no_keys + m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by KEYTAB cpy LSTX beq m65_scnkey_try_repeat ; branch if the same key as previously sty LSTX + ; FALLTROUGH + +m65_scnkey_got_key_skip_cmp: + ; Reset key repeat counters lda #CONFIG_KEY_DELAY @@ -187,7 +242,7 @@ m65_scnkey_output_key: ; Check if KEYTAB is valid lda KEYTAB+1 - beq m65_scnkey_jam + beq m65_scnkey_no_keys ; Retrieve the PETSCII code @@ -210,9 +265,14 @@ m65_scnkey_done: rts -m65_scnkey_jam: +m65_scnkey_pla_jam: pla + + ; FALLTROUGH + +m65_scnkey_jam: + jsr m65_scnkey_init_pressed ; FALLTROUGH @@ -264,3 +324,45 @@ m65_scnkey_handle_repeat: dec KOUNT rts + + + +m65_scnkey_compare_with_old: + + ; Compare key index with the ones from previous scan + + cmp M65_KB_PRESSED+0 + beq @1 + cmp M65_KB_PRESSED+1 + beq @1 + cmp M65_KB_PRESSED+2 +@1: + rts + +m65_scnkey_add_if_new_valid: + + beq @1 + cmp #$FF ; invalid key code + beq @1 + + ; XXX filter-out SHIFT, VENDOR, etc. + ;cmp $xx ; left SHIFT + ;beq @1 + ;cmp $xx ; right SHIFT + ;beq @1 + ;cmp $xx ; VENDOR + ;beq @1 + ;cmp $xx ; CAPS LOCK + ;beq @1 + ;cmp $xx ; ALT + ;beq @1 + + ; New, valid key index + + ldx M65_KB_PRESSED_NEW+1 + stx M65_KB_PRESSED_NEW+2 + ldx M65_KB_PRESSED_NEW+0 + stx M65_KB_PRESSED_NEW+1 + sta M65_KB_PRESSED_NEW+0 +@1 + rts diff --git a/src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s b/src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s index 35e2761d..619ea52b 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s +++ b/src/kernal/keyboard_m65/mega65_scnkey_init_pressed.s @@ -8,5 +8,8 @@ m65_scnkey_init_pressed: sta M65_KB_PRESSED+0 sta M65_KB_PRESSED+1 sta M65_KB_PRESSED+2 + sta M65_KB_PRESSED_NEW+0 + sta M65_KB_PRESSED_NEW+1 + sta M65_KB_PRESSED_NEW+2 rts From 33e1e1ba4b249c088d4a55fe378a75a6fd1b51dc Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Dec 2020 17:51:18 +0100 Subject: [PATCH 35/55] iniitial POKE command implementation --- src/basic/basic_commands/cmd__unimplemented.s | 2 - src/basic/basic_commands/cmd_poke.s | 38 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/basic/basic_commands/cmd_poke.s diff --git a/src/basic/basic_commands/cmd__unimplemented.s b/src/basic/basic_commands/cmd__unimplemented.s index 37366ea2..8263485e 100644 --- a/src/basic/basic_commands/cmd__unimplemented.s +++ b/src/basic/basic_commands/cmd__unimplemented.s @@ -31,8 +31,6 @@ cmd_wait: +nop cmd_def: +nop -cmd_poke: - +nop cmd_printhash: +nop cmd_cont: diff --git a/src/basic/basic_commands/cmd_poke.s b/src/basic/basic_commands/cmd_poke.s new file mode 100644 index 00000000..40663a9c --- /dev/null +++ b/src/basic/basic_commands/cmd_poke.s @@ -0,0 +1,38 @@ +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +cmd_poke: + + + ; Fetch address, store it on the stack + + jsr fetch_uint16 + +bcs do_SYNTAX_error + + lda LINNUM+0 + pha + lda LINNUM+1 + pha + + ; Fetch value + + jsr fetch_coma_uint8 + +bcs do_SYNTAX_error + + ; Retrieve address + + tay + pla + sta LINNUM+1 + pla + sta LINNUM+0 + + ; Write to memory + + tya + ldy #$00 + sta (LINNUM), y + + rts From 755b7bb1a4a65d8d43593edacc861d92aec13d92 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Dec 2020 18:08:04 +0100 Subject: [PATCH 36/55] added MEGA65-specific JOYCRSR command --- doc/Extended-BASIC.md | 6 +++++ src/,,config_mega65.s | 4 ++-- src/basic/basic_commands_04/cmd_joycrsr.s | 24 +++++++++++++++++++ .../helper_ensure_legacy_mode_m65.s | 0 .../helper_ensure_native_mode_m65.s | 10 ++++++++ tools/generate_strings.cc | 2 ++ 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/basic/basic_commands_04/cmd_joycrsr.s rename src/basic/{basic_commands_01 => basic_commands_04}/helper_ensure_legacy_mode_m65.s (100%) create mode 100644 src/basic/basic_commands_04/helper_ensure_native_mode_m65.s diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index 1ea35116..a6294845 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -69,6 +69,12 @@ Verify operation for the binary data starting from a given addres. NOTE: for now Saves the binary data from the given memory area. NOTE: for now syntax differs from the BASIC V3.5+ - this will be changed once the necessary BASIC infrastructure is implemented. +## Additional BASIC commands - screen/keyboard + +### `JOYCRSR joy_number` (MEGA65) + +Sets the joystick (1 or 2) which moves the screen cursor. Native mode only. + ## Additional BASIC commands - misc ### `COLD` (cart, MEGA65) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 1acdcace..ca8e5649 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -71,8 +71,8 @@ ;; #CONFIG# KEYCMD_F10 "REM F10" ;; #CONFIG# KEYCMD_F11 "REM F11" ;; #CONFIG# KEYCMD_F12 "REM F12" -;; #CONFIG# KEYCMD_F13 "REM F13" -;; #CONFIG# KEYCMD_F14 "REM F14" +;; #CONFIG# KEYCMD_F13 "JOYCRSR 2" +;; #CONFIG# KEYCMD_F14 "JOYCRSR 0" ; --- Screen editor diff --git a/src/basic/basic_commands_04/cmd_joycrsr.s b/src/basic/basic_commands_04/cmd_joycrsr.s new file mode 100644 index 00000000..bb435f61 --- /dev/null +++ b/src/basic/basic_commands_04/cmd_joycrsr.s @@ -0,0 +1,24 @@ +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +cmd_joycrsr: + + ; Make sure we are in MEGA65 native mode + + jsr helper_ensure_native_mode + + ; Fetch joystick ID + + jsr fetch_coma_uint8 + +bcs do_SYNTAX_error + + ; Check if joystick ID is valid + + cmp #$03 + +bcs do_ILLEGAL_QUANTITY_error + + ; Set the joystick responsible for moving cursor keys + + sta M65_JOYCRSR ; XXX consider introducing Kernal call for this + rts diff --git a/src/basic/basic_commands_01/helper_ensure_legacy_mode_m65.s b/src/basic/basic_commands_04/helper_ensure_legacy_mode_m65.s similarity index 100% rename from src/basic/basic_commands_01/helper_ensure_legacy_mode_m65.s rename to src/basic/basic_commands_04/helper_ensure_legacy_mode_m65.s diff --git a/src/basic/basic_commands_04/helper_ensure_native_mode_m65.s b/src/basic/basic_commands_04/helper_ensure_native_mode_m65.s new file mode 100644 index 00000000..f8f08c2b --- /dev/null +++ b/src/basic/basic_commands_04/helper_ensure_native_mode_m65.s @@ -0,0 +1,10 @@ +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +helper_ensure_native_mode: + + jsr M65_MODEGET + +bcs do_NATIVE_MODE_ONLY_error + + rts diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 5a9e040b..93924ad2 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -200,6 +200,8 @@ const StringEntryList GLOBAL_Keywords_04 = { ListType::KEYWORDS, "keywords_04", { // STD CRT M65 U64 X16 { false, false, true, false, false, "K04_01", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, false, true, false, false, "K04_02", "JOYCRSR", }, // Not present in CBM BASIC dialects, Open ROMs specific + } }; From c4ed858e5fcc5e3f518850e94b0b00dfd07b96b9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Dec 2020 18:44:46 +0100 Subject: [PATCH 37/55] fixed wrong branch condition --- src/kernal/keyboard_m65/mega65_scnkey.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 06c560f2..2d25e372 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -159,7 +159,7 @@ m65_scnkey_next_1: ; If we have more than one key - consider it jam lda M65_KB_PRESSED_NEW+1 - bmi m65_scnkey_jam + bpl m65_scnkey_jam ; If we have exactly one new key - this is our key From 4a84316ecd82da12c399243e982041ad7834c088 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 01:07:18 +0100 Subject: [PATCH 38/55] various keyboard related fixes --- STATUS.md | 1 + src/basic/basic_commands/cmd_rem.s | 5 +++++ src/kernal/board_m65/mega65_imports_C.s | 1 - src/kernal/keyboard/eb48.interop | 2 ++ ...cnkey_set_keytab.s => eb48.scnkey_set_keytab.s} | 0 src/kernal/keyboard/kb_matrix_bucky.s | 6 +----- .../keyboard_m65/mega65_kb_matrix_bucky_shflag.s | 14 ++++++++++++++ src/kernal/keyboard_m65/mega65_scnkey.s | 12 ++++++------ 8 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 src/kernal/keyboard/eb48.interop rename src/kernal/keyboard/{scnkey_set_keytab.s => eb48.scnkey_set_keytab.s} (100%) create mode 100644 src/kernal/keyboard_m65/mega65_kb_matrix_bucky_shflag.s diff --git a/STATUS.md b/STATUS.md index c0f6d372..28b0ab74 100644 --- a/STATUS.md +++ b/STATUS.md @@ -386,6 +386,7 @@ Not all of them - only these we want to have implemented. | `$EA31` | default IRQ | PARTIAL | | | `$EA7E` | ack CIA1 + below | DONE | | | `$EA81` | ret from IRQ/NMI | DONE | | +| `$EB48` | set keyboard mapping table | DONE | | | `$F142` | get key from buffer | DONE | | | `$F3F6` | (unknown) | NOT DONE | | | `$F646` | IEC close | NOT DONE | | diff --git a/src/basic/basic_commands/cmd_rem.s b/src/basic/basic_commands/cmd_rem.s index 9a4cf91c..8b9bc74f 100644 --- a/src/basic/basic_commands/cmd_rem.s +++ b/src/basic/basic_commands/cmd_rem.s @@ -7,6 +7,11 @@ cmd_rem: + lda LSTX + jsr print_hex_byte + jmp cmd_rem + + ; XXX do we need these PHA's? pha diff --git a/src/kernal/board_m65/mega65_imports_C.s b/src/kernal/board_m65/mega65_imports_C.s index 9ebbef07..d98a7946 100644 --- a/src/kernal/board_m65/mega65_imports_C.s +++ b/src/kernal/board_m65/mega65_imports_C.s @@ -11,7 +11,6 @@ ;; #ALIAS# scnkey_buffer_full = KERNAL_0.scnkey_buffer_full ;; #ALIAS# scnkey_toggle_if_needed = KERNAL_0.scnkey_toggle_if_needed -;; #ALIAS# kb_matrix_bucky_shflag = KERNAL_0.kb_matrix_bucky_shflag ;; #ALIAS# kb_matrix_alwaysrepeat = KERNAL_0.kb_matrix_alwaysrepeat ;; #ALIAS# __kb_matrix_alwaysrepeat_end = KERNAL_0.__kb_matrix_alwaysrepeat_end diff --git a/src/kernal/keyboard/eb48.interop b/src/kernal/keyboard/eb48.interop new file mode 100644 index 00000000..2800f4bb --- /dev/null +++ b/src/kernal/keyboard/eb48.interop @@ -0,0 +1,2 @@ +This routine is pointed by a vector - it has to be available at the same location as in the original ROM, +otherwise programs frozem with (for example) Action Replay might crash after loading. \ No newline at end of file diff --git a/src/kernal/keyboard/scnkey_set_keytab.s b/src/kernal/keyboard/eb48.scnkey_set_keytab.s similarity index 100% rename from src/kernal/keyboard/scnkey_set_keytab.s rename to src/kernal/keyboard/eb48.scnkey_set_keytab.s diff --git a/src/kernal/keyboard/kb_matrix_bucky.s b/src/kernal/keyboard/kb_matrix_bucky.s index 7dde75b1..f128b340 100644 --- a/src/kernal/keyboard/kb_matrix_bucky.s +++ b/src/kernal/keyboard/kb_matrix_bucky.s @@ -61,11 +61,7 @@ kb_matrix_bucky_shflag: ; mask to be ORed to SHFLAG to mark key status !byte KEY_FLAG_SHIFT !byte KEY_FLAG_VENDOR !byte KEY_FLAG_CTRL -!ifdef CONFIG_MB_M65 { - !byte KEY_FLAG_ALT - !byte KEY_FLAG_NO_SCRL - !byte KEY_FLAG_CAPSL -} else ifdef CONFIG_KEYBOARD_C128 { +!ifdef CONFIG_KEYBOARD_C128 { !byte KEY_FLAG_ALT !byte KEY_FLAG_NO_SCRL } diff --git a/src/kernal/keyboard_m65/mega65_kb_matrix_bucky_shflag.s b/src/kernal/keyboard_m65/mega65_kb_matrix_bucky_shflag.s new file mode 100644 index 00000000..effe7910 --- /dev/null +++ b/src/kernal/keyboard_m65/mega65_kb_matrix_bucky_shflag.s @@ -0,0 +1,14 @@ +;; #LAYOUT# M65 KERNAL_C #TAKE +;; #LAYOUT# * * #IGNORE + + + +kb_matrix_bucky_shflag: ; mask to be ORed to SHFLAG to mark key status + + !byte KEY_FLAG_SHIFT + !byte KEY_FLAG_SHIFT + !byte KEY_FLAG_CTRL + !byte KEY_FLAG_VENDOR + !byte KEY_FLAG_ALT + !byte KEY_FLAG_NO_SCRL + !byte KEY_FLAG_CAPSL \ No newline at end of file diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 2d25e372..0153811e 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -169,11 +169,11 @@ m65_scnkey_next_1: ; No new key - check if the last one is still pressed ldy LSTX - cmp M65_KB_PRESSED+0 + cpy M65_KB_PRESSED+0 beq m65_scnkey_got_key_skip_cmp - cmp M65_KB_PRESSED+1 + cpy M65_KB_PRESSED+1 beq m65_scnkey_got_key_skip_cmp - cmp M65_KB_PRESSED+2 + cpy M65_KB_PRESSED+2 beq m65_scnkey_got_key_skip_cmp ; Nope, previous key is not pressed @@ -331,11 +331,11 @@ m65_scnkey_compare_with_old: ; Compare key index with the ones from previous scan - cmp M65_KB_PRESSED+0 + cmp M65_KB_PRESSED_OLD+0 beq @1 - cmp M65_KB_PRESSED+1 + cmp M65_KB_PRESSED_OLD+1 beq @1 - cmp M65_KB_PRESSED+2 + cmp M65_KB_PRESSED_OLD+2 @1: rts From df6545adf25e66750ce1e6acb42eb1ed9b8c4c76 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 01:19:52 +0100 Subject: [PATCH 39/55] fix for filtering out bucky keys --- src/basic/basic_commands/cmd_rem.s | 5 ----- src/kernal/keyboard_m65/mega65_scnkey.s | 25 ++++++++++++++----------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/basic/basic_commands/cmd_rem.s b/src/basic/basic_commands/cmd_rem.s index 8b9bc74f..9a4cf91c 100644 --- a/src/basic/basic_commands/cmd_rem.s +++ b/src/basic/basic_commands/cmd_rem.s @@ -7,11 +7,6 @@ cmd_rem: - lda LSTX - jsr print_hex_byte - jmp cmd_rem - - ; XXX do we need these PHA's? pha diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 0153811e..deae8815 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -345,17 +345,20 @@ m65_scnkey_add_if_new_valid: cmp #$FF ; invalid key code beq @1 - ; XXX filter-out SHIFT, VENDOR, etc. - ;cmp $xx ; left SHIFT - ;beq @1 - ;cmp $xx ; right SHIFT - ;beq @1 - ;cmp $xx ; VENDOR - ;beq @1 - ;cmp $xx ; CAPS LOCK - ;beq @1 - ;cmp $xx ; ALT - ;beq @1 + ; Filter-out SHIFT, VENDOR, etc. + + cmp #$0F ; left SHIFT + beq @1 + cmp #$34 ; right SHIFT + beq @1 + cmp #$3A ; CONTROL + beq @1 + cmp #$3D ; VENDOR + beq @1 + cmp #$40 ; NO SCROLL + beq @1 + cmp #$42 ; ALT + beq @1 ; New, valid key index From c45fcb7fa96cadd264d2a0182fa1fcf3b453d260 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 15:09:18 +0100 Subject: [PATCH 40/55] fixed old key index storage --- src/kernal/keyboard_m65/mega65_scnkey.s | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index deae8815..ba90bba3 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -209,12 +209,13 @@ m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by cpy LSTX beq m65_scnkey_try_repeat ; branch if the same key as previously - sty LSTX ; FALLTROUGH m65_scnkey_got_key_skip_cmp: + sty LSTX + ; Reset key repeat counters lda #CONFIG_KEY_DELAY From 5fc87be2cf485b7788082931e2c7b1d92c7d6dc6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 15:36:16 +0100 Subject: [PATCH 41/55] fixed jumptable in BASIC --- src/basic/basic_commands_04/cmd__jumptable_04.s | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/basic/basic_commands_04/cmd__jumptable_04.s b/src/basic/basic_commands_04/cmd__jumptable_04.s index 4b623071..642fc7d8 100644 --- a/src/basic/basic_commands_04/cmd__jumptable_04.s +++ b/src/basic/basic_commands_04/cmd__jumptable_04.s @@ -1,4 +1,4 @@ -;; #LAYOUT# M65 * #TAKE +;; #LAYOUT# M65 BASIC_0 #TAKE ;; #LAYOUT# * * #IGNORE ; @@ -6,7 +6,7 @@ ; !set ITEM_01 = cmd_sysinfo - +!set ITEM_02 = cmd_joycrsr !ifndef HAS_OPCODES_65C02 { @@ -14,10 +14,13 @@ command_04_jumptable_lo: !byte <(ITEM_01-1) + !byte <(ITEM_02-1) command_04_jumptable_hi: !byte >(ITEM_01-1) + !byte >(ITEM_02-1) + } else { ; HAS_OPCODES_65C02 @@ -26,4 +29,5 @@ command_04_jumptable: ; Note: 65C02 has the page boundary vector bug fixed! !word ITEM_01 + !word ITEM_02 } From 05f57201ba7aff1cbd14988358779b8dadb55398 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 15:41:18 +0100 Subject: [PATCH 42/55] fix for command syntax parsing --- src/basic/basic_commands_04/cmd_joycrsr.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/basic_commands_04/cmd_joycrsr.s b/src/basic/basic_commands_04/cmd_joycrsr.s index bb435f61..47e11730 100644 --- a/src/basic/basic_commands_04/cmd_joycrsr.s +++ b/src/basic/basic_commands_04/cmd_joycrsr.s @@ -10,7 +10,7 @@ cmd_joycrsr: ; Fetch joystick ID - jsr fetch_coma_uint8 + jsr fetch_uint8 +bcs do_SYNTAX_error ; Check if joystick ID is valid From 5c8ac04083db86ed75eb51d63a3aa0ae42b22af9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 16:08:59 +0100 Subject: [PATCH 43/55] added joystick support to MEGA65 keyboard scanner --- src/aliases/,aliases_ram_lowmem_m65.s | 8 ++-- src/kernal/board_m65/mega65_imports_C.s | 3 +- src/kernal/keyboard/scnkey.s | 2 +- .../keyboard_m65/mega65_kb_matrix_joy.s | 37 ++++++++++++++++++ src/kernal/keyboard_m65/mega65_scnkey.s | 38 ++++++++++++++++--- 5 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 src/kernal/keyboard_m65/mega65_kb_matrix_joy.s diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 5a683453..9fc12e3b 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -60,10 +60,10 @@ !addr M65_KB_PRESSED_OLD = $563 ; $563-$565 keys pressed during previous scan !addr M65_KB_PRESSED_NEW = $566 ; $566-$568 set of M65_KB_PRESSED minus M65_KB_PRESSED_OLD !addr M65_JOYCRSR = $569 ; joystick to be used for cursor movement - ; $56A-$5EB -- UNUSED -- - !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) - !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- - !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- + ; $56A-$5EB -- UNUSED -- + !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) + !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- + !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- ; ; Addresses for configuring the DMA job diff --git a/src/kernal/board_m65/mega65_imports_C.s b/src/kernal/board_m65/mega65_imports_C.s index d98a7946..4e0c8a92 100644 --- a/src/kernal/board_m65/mega65_imports_C.s +++ b/src/kernal/board_m65/mega65_imports_C.s @@ -13,4 +13,5 @@ ;; #ALIAS# kb_matrix_alwaysrepeat = KERNAL_0.kb_matrix_alwaysrepeat ;; #ALIAS# __kb_matrix_alwaysrepeat_end = KERNAL_0.__kb_matrix_alwaysrepeat_end - +;; #ALIAS# kb_matrix_joy_status = KERNAL_0.kb_matrix_joy_status +;; #ALIAS# kb_matrix_joy_keytab_idx = KERNAL_0.kb_matrix_joy_status diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 6857df74..68357223 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -259,7 +259,7 @@ scnkey_joystick_1: scnkey_joystick_filtered: - ; Set appropriate keyboard matrix and key code for joystick event + ; Decode joystick event using appropriate matrix ldy #$03 @5: diff --git a/src/kernal/keyboard_m65/mega65_kb_matrix_joy.s b/src/kernal/keyboard_m65/mega65_kb_matrix_joy.s new file mode 100644 index 00000000..764d5648 --- /dev/null +++ b/src/kernal/keyboard_m65/mega65_kb_matrix_joy.s @@ -0,0 +1,37 @@ +;; #LAYOUT# M65 KERNAL_C #TAKE +;; #LAYOUT# * * #IGNORE + +; +; Matrix for retrieving C64 joystick status and inject is as keyboard event +; + +!ifndef CONFIG_JOY1_OR_JOY2_CURSOR { + +kb_matrix_joy_status: + + !byte %00001110 ; up + !byte %00001101 ; down + !byte %00001011 ; left + !byte %00000111 ; right + +kb_matrix_joy_keytab_idx: + + !byte $07 ; up + !byte $07 ; down + !byte $02 ; left + !byte $02 ; right +} + +kb_matrix_joy_keytab_lo: + + !byte <__kb_matrix_shift ; up + !byte <__kb_matrix_normal ; down + !byte <__kb_matrix_shift ; left + !byte <__kb_matrix_normal ; right + +kb_matrix_joy_keytab_hi: + + !byte >__kb_matrix_shift ; up + !byte >__kb_matrix_normal ; down + !byte >__kb_matrix_shift ; left + !byte >__kb_matrix_normal ; right diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index ba90bba3..50bb7e70 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -192,18 +192,46 @@ m65_scnkey_try_joystick: m65_scnkey_try_joy1: - +nop - ; XXX provide implementation + lda #$FF + sta CIA1_PRA ; disconnect all the rows to prevent keyboard interference + + lda CIA1_PRB + bra m65_scnkey_try_joy_common m65_scnkey_try_joy2: - +nop - ; XXX provide implementation + lda CIA1_PRA + + ; FALLTROUGH m65_scnkey_try_joy_common: - ; XXX provide implementation + and #%00001111 ; filter out anything but joystick movement + beq m65_scnkey_no_keys ; branch if no joystick movement detected + + ; Decode joystick event using appropriate matrix + + ldy #$03 +@1: + cmp kb_matrix_joy_status, y + beq @2 + dey + bpl @1 + + ; Not found + bra m65_scnkey_no_keys +@2: + ; Found joystick movement + + lda kb_matrix_joy_keytab_lo, y + sta KEYTAB+0 + lda kb_matrix_joy_keytab_hi, y + sta KEYTAB+1 + lda kb_matrix_joy_keytab_idx, y + tay + + ; FALLTROUGH m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by KEYTAB From c7f9f0ae348f0ea53f3c7edcfe3b72a7c939b90a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 16:56:57 +0100 Subject: [PATCH 44/55] small performance optimization, fix for keyboard scanner variables optimization --- src/aliases/,aliases_ram_lowmem_m65.s | 5 ++-- src/kernal/keyboard_m65/mega65_scnkey.s | 35 ++++++++++++++----------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 9fc12e3b..ee955201 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -55,12 +55,11 @@ !addr M65_SCRCOLMAX = $594 ; maximum allowed column !addr M65_KB_BUCKY = $595 ; result of bucky keys scan !addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8 - !addr M65_KB_COLSUM = $59F ; sum (OR) of the M65_KB_COLSCAN + !addr M65_JOYCRSR = $59F ; joystick to be used for cursor movement !addr M65_KB_PRESSED = $560 ; $560-$562 keys pressed, used during scanning keyboard !addr M65_KB_PRESSED_OLD = $563 ; $563-$565 keys pressed during previous scan !addr M65_KB_PRESSED_NEW = $566 ; $566-$568 set of M65_KB_PRESSED minus M65_KB_PRESSED_OLD - !addr M65_JOYCRSR = $569 ; joystick to be used for cursor movement - ; $56A-$5EB -- UNUSED -- + ; $569-$5EB -- UNUSED -- !addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed) !addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer -- !addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 50bb7e70..419034a9 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -4,13 +4,21 @@ m65_scnkey: + ; Initialize work variables for scanning the keyboard + + lda M65_KB_PRESSED+0 + sta M65_KB_PRESSED_OLD+0 + lda M65_KB_PRESSED+1 + sta M65_KB_PRESSED_OLD+1 + lda M65_KB_PRESSED+2 + sta M65_KB_PRESSED_OLD+2 + + jsr m65_scnkey_init_pressed + ; ; Scan the whole keyboard, store results in memory ; - lda #$00 - sta M65_KB_COLSUM - ldx #$08 lda #%01111111 @@ -25,8 +33,6 @@ m65_scnkey_fetch_loop: 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_fetch_loop @@ -80,16 +86,15 @@ m65_scnkey_keytab_set_done: ; Scan the keyboard matrix stored in memory to determine which keys were pressed ; - lda M65_KB_PRESSED+0 - sta M65_KB_PRESSED_OLD+0 - lda M65_KB_PRESSED+1 - sta M65_KB_PRESSED_OLD+1 - lda M65_KB_PRESSED+2 - sta M65_KB_PRESSED_OLD+2 - - jsr m65_scnkey_init_pressed - - lda M65_KB_COLSUM + lda M65_KB_COLSCAN+0 ; no loop here - for performance purposes + ora M65_KB_COLSCAN+1 + ora M65_KB_COLSCAN+2 + ora M65_KB_COLSCAN+3 + ora M65_KB_COLSCAN+4 + ora M65_KB_COLSCAN+5 + ora M65_KB_COLSCAN+6 + ora M65_KB_COLSCAN+7 + ora M65_KB_COLSCAN+8 beq m65_scnkey_try_joystick ; branch if no key was pressed ldx #$08 From d01c7e8ac981c258fedf7ce08d56bdc70a852e24 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 17:03:55 +0100 Subject: [PATCH 45/55] unrolled a loop for better performance --- src/kernal/keyboard_m65/mega65_scnkey.s | 61 +++++++++++++++++++++---- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 419034a9..a76a0b33 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -25,26 +25,67 @@ m65_scnkey: and KBSCN_BUCKY sta M65_KB_BUCKY - ; FALLTROUGH - -m65_scnkey_fetch_loop: - - stx KBSCN_SELECT + stx KBSCN_SELECT ; no loop here, for performance and accuracy purposes lda KBSCN_PEEK eor #$FF ; let bit 1 mean 'pressed', not the otherwise - sta M65_KB_COLSCAN, x + sta M65_KB_COLSCAN+8 + dex - bpl m65_scnkey_fetch_loop + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+7 + + dex + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+6 + + dex + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+5 + + dex + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+4 + + dex + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+3 + + dex + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+2 + + dex + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+1 + + dex + stx KBSCN_SELECT + lda KBSCN_PEEK + eor #$FF + sta M65_KB_COLSCAN+0 ; - ; Retrieve SHIFT / VENDOR / CTRL / ALT / NO SCROLL / CAPS LOCK status + ; Calculate SHIFT / VENDOR / CTRL / ALT / NO SCROLL / CAPS LOCK status ; lda SHFLAG sta LSTSHF ; needed for SHIFT+VENDOR support - inx ; .X goes from $FF to $00 - stx SHFLAG + stx SHFLAG ; .X is $00 here lda M65_KB_BUCKY dex ; index into kb_matrix_bucky_shflag From 22936314fea79d20ea0face76dfec0311d162414 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 17:41:26 +0100 Subject: [PATCH 46/55] another keyboard code optimization --- src/kernal/keyboard_m65/mega65_scnkey.s | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index a76a0b33..c2abed52 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -88,6 +88,7 @@ m65_scnkey: stx SHFLAG ; .X is $00 here lda M65_KB_BUCKY + beq m65_scnkey_bucky_done dex ; index into kb_matrix_bucky_shflag ; FALLTROUGH @@ -96,22 +97,22 @@ m65_scnkey_bucky_loop: inx asr ; ASR preserves most significant bit, but in our case it is 0 - bcc m65_scnkey_bucky_next + bcc @1 ; Bucky key pressed - pha + tay lda kb_matrix_bucky_shflag, x ora SHFLAG sta SHFLAG - pla - - ; FALLTROUGH - -m65_scnkey_bucky_next: - + tya +@1: bne m65_scnkey_bucky_loop + ; FALLTROUGH + +m65_scnkey_bucky_done: + ; Set KEYTAB vector lda KEYLOG+1 From 9b52f32a90286be7fa1d1e61584c34f6f92fcdbe Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 18:04:57 +0100 Subject: [PATCH 47/55] one more keyboard performance optimization --- src/kernal/keyboard_m65/mega65_scnkey.s | 115 +++++++++++++++++------- 1 file changed, 83 insertions(+), 32 deletions(-) diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index c2abed52..ec736f47 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -137,53 +137,72 @@ m65_scnkey_keytab_set_done: ora M65_KB_COLSCAN+6 ora M65_KB_COLSCAN+7 ora M65_KB_COLSCAN+8 - beq m65_scnkey_try_joystick ; branch if no key was pressed + +beq m65_scnkey_try_joystick ; branch if no key was pressed ldx #$08 ; FALLTROUGH -m65_scnkey_loop_1: +m65_scnkey_loop: lda M65_KB_COLSCAN, x - pha - ldy #$FF +@8: + asl ; no loop here, for performance resons + bcc @7 - ; FALLTROUGH - -m65_scnkey_loop_2: - - iny - pla - beq m65_scnkey_next_1 - clc - ror ; can't use ASR here, as it preserves most significant bit - pha - bcc m65_scnkey_loop_2 - - ; Found a pressed key - add it to the list - - lda M65_KB_PRESSED+2 - +bpl m65_scnkey_pla_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 + ldy #$07 + jsr m65_scnkey_add_pressed +@7: asl + bcc @6 + + ldy #$06 + jsr m65_scnkey_add_pressed + beq @0 +@6: asl + bcc @5 + + ldy #$05 + jsr m65_scnkey_add_pressed + beq @0 +@5: asl - adc M65_KB_PRESSED+0 ; Carry already cleared by ASL - sta M65_KB_PRESSED+0 + bcc @4 - bra m65_scnkey_loop_2 + ldy #$04 + jsr m65_scnkey_add_pressed + beq @0 +@4: + asl + bcc @3 -m65_scnkey_next_1: + ldy #$03 + jsr m65_scnkey_add_pressed + beq @0 +@3: + asl + bcc @2 + ldy #$02 + jsr m65_scnkey_add_pressed + beq @0 +@2: + asl + bcc @1 + + ldy #$01 + jsr m65_scnkey_add_pressed + beq @0 +@1: + asl + bcc @0 + + ldy #$00 + jsr m65_scnkey_add_pressed +@0: dex - bpl m65_scnkey_loop_1 + bpl m65_scnkey_loop ; ; Analyze currently and previously pressed keys @@ -344,6 +363,8 @@ m65_scnkey_done: m65_scnkey_pla_jam: pla + pla + pla ; FALLTROUGH @@ -403,6 +424,36 @@ m65_scnkey_handle_repeat: +m65_scnkey_add_pressed: + + ; Add pressed key to the 'M65_KB_PRESSED' list, first preserve .A + + pha + + ; Make space on the list + + lda M65_KB_PRESSED+2 + +bpl m65_scnkey_pla_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 + + ; Store key scan code + + sty M65_KB_PRESSED+0 + txa + asl + asl + asl + adc M65_KB_PRESSED+0 ; Carry already cleared by ASL + sta M65_KB_PRESSED+0 + + ; Restore .A and uit + + pla + rts + m65_scnkey_compare_with_old: ; Compare key index with the ones from previous scan From 295bed09c763d74113ebaf14109903bd8e99fda4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 18:21:59 +0100 Subject: [PATCH 48/55] fixed problem with key repetition, updated binaries --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/extrom_generic_crt.crt | Bin 32896 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_orfont.rom | Bin 131072 -> 131072 bytes src/kernal/keyboard_m65/mega65_scnkey.s | 17 ++++++----------- 10 files changed, 6 insertions(+), 11 deletions(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 6d8d0ed886a23c62adb0ea512c4714fed5176017..1a157f0403880b2d2e58c831cb3781b24bd56641 100644 GIT binary patch delta 2234 zcmZWqeQ*=U6~7P5vSmq@!5^{>@)C?~f&(_6#(_c_?40Ax)Cp-io=KaN!C(hyGM)a> zfwXp~oN;ZEifl=MfsRhn%03CnvL$~=mSPP3;7AFAmUL*!MEC>jFwGovsG(u1?ukx^ zneNQ(d%O2`-`n55-`mdZo!bMQbR({p8{%oWPJW%YQ=t3S?SpaV_95Pk*R?hY>uk*J z^?dL2FI?~8qQ05FF8{A0c>JsXZ*a&BK1b(h^P*l6^olZ6Sa`(^t~y~bg1(~b%s8MK zRI(lEpgD{Of#Dk*ART1SqIzZ{I>9VK?~%{BxEvYT=TL|#(;7n#8a9WKXjqN*v(@N% zwt6e*7?3Gth5SrvcYIJ7$A^TdgHkNguzAcBWNBJLPy2{(1biHO@lk z7>|!tv2c@DjiXk1M11b>NPV0%!zF0NlK7Mu9StQq0xT@Si9VYOL98ss#gb8uCjlJJ z-;LI5_AWAvfKHLv{xbshOc0srLO#u&Vzp`?SeU08J zo}}1r(}F!MJb>EM0dqHudeirG@CkxIbGXd|c7`3S3UIBQRP>Itl*1C^Dg2Bt<)|>g&Esu z3u?|Nt+WhF)ESBacaos_p_FaU29YGFixLlZYVaUgR3^!#MAS*(3X(F)=?Zi;!@^u! zK=(4XsA5g#kC@lJ$eCHIe;{HjU>vxebZ9ARlN zTT(jOrYj>6?$Pxyoqlv*_pB-`S%oYhE|c24B4Y^BXUV|Mg5$TiZqj+$2+-g!3+Qov zF%$Hn!h(ji*S&4vTJoa8!gsuUTN}LK1^2xPHt@v>4!jj^>xX{tMY2?;JPLD(?}mT# zB3j?D@iFDT0;}v`4?0x#K{heldewXhi=ZV~uev%<7NmeSgSsNI+9(6xh|_4m6$U4 zlp~``Mnai;@Pb?2mgL!1pmzmo`rEi0&H-EYVJIbqMtIoY#>F4GpxaPIVJnAQIJ}GN z;eaI?o*dx9L*#P~aB$E^95v#`_|-NZbs4`;yU>jBG~J7So?X0txg)>`VP2z2PtRcJ zv{ciwlZSTxqxp|-{&<7$ipTiLxMyM}nix+^L@kis4!M2>O@dXc4G?LQ||a zEtdkEl;rSE&Oyxq7ZOd&ic>Ttbu2|wLJ>WO>o{D`5lqlc(_Y3IMD;nZ>YPDrwNuAl z0)GmMIV_Xk6sLK>g#$Dn*MW~ki4mIM$07=`uQ4}+h|XPZ7JY&hw>*k@gqFa3kGZ{y zq)E5wCXY;MFB(+ZxRk{NZa_s)LvC5F9FiztOM=`fa-XuBhVn``#0Pvdt-K;F2pgoBuo1M5+ZIdb$YA=( zU^Cb^47*2qI6p<3+dEZWelUfy@|PFxACc&@6n&Cn=6Wt3O(~#v3hp04AEli^zb>fA z`Kx^lSiBC(t^@j6>AZamT`sVga-EKJ@~r4*;Xcf(sC`pV%q&Ea+1!}7FhWsa#SCs& zUchR7ecT5YM$k{pD+uv^V=hJcC0iJ1`LOV0@ezm0qWI;(4J(xhcaex}^G_-IlqYrs zg$g&J*5c<@btY=?s(D&?0awmb!nb*{GrS~mY7JY62I_@el0(c&H>*+H;PM_J?_ITH)5W+ z23v24K3@HC#E(}ATXCiEEgqh8Aj^^ij6aCpU$S>8SzR+U&Djrqc)bz{4dLM zmj1A*X($*P9vL0&!pGf(W8v_|$oQGqsc16xvrj%vPDIX4p8xxW&p!LDS5%u{41_}C z5mB5ba|tXYpc)?O3GK0 z`tZC`p%w-5I;c;NDIM%cKyiY^q}B-?d7oy8i6;JqT4{qNTXOD($pzF%)NDn+TG;+@ F>pu^3^OFDo delta 2208 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 delta 2271 zcmYjTdsGzH8J`Ec%Px;yVS(l8EpH4WDCmO0$5CL!F~wk;lh`(c3IW?vPg{FZI7U2m z8cHQudYjW8tEamocVSl4S$VnaZc$TO#z>qrIj7|un=TKDlxim?t4XHyyh=c1iVQ56CP9e|AX}@8dw1OCmYB*kO_@IC-~&mfJZy2dV;K(u*&d zRcZE~8+>qy9UO!A$f8XkwNF|n#(<(R$%GQH_O2UQZ5;UdEI55lu25+9^AVZAq;?d) z_;>g!nOJrp;y(XY*MT^NKlkecy8HawNH~!C5#P=JE_8N-9c4e*z-LR;A9Cy{7qhvT z&08pd`>70ALZw2U%7e>>jT?13y*`p6Bf`T#-}=VtXZ3eue^_?qo`-t5-4ps-VBSAB z9`FXeq0l%SpfX*H+NPjr5(a(;~q37(2B;SS#7YV+dLv3rT_VCK1 zn(tV4K(9U@{zbnhMzgk1)rEbu!L3mlr6R#sV<}F(V@=FgY1uyIl1x|;<{Zm%wwfX5 zs3uXz*K6Ll846->Xox~_m5;V@?0zU2m`GHokQ`uq@C3a9#w4aRPR%69z)CaSZ3;X7q`O^VZ$A+U2Hf&F!lxJ4 ze$bpr;VjOWQ?!%tU-O16ykDjoD-)_=p+WhSeb)5^fcE9lASL+W|ao9AP zy>x?f5}l;HN0UWEqI*Vf=yBUUU8il_~*++E^!Hk4%vJ4I+q)~xkcqd^mJes&AY02k^7tix$ z;w647z>9JKhS`V1@JeC{b$1ws5)(A?H1T2!>M5q#ZI{Eir>@{g?)8W+MtsDCNHrt$ z9=3ev_f^VhERu`i7f1jw03E$VKhWul-DyflKEs#+~HJJk!%*wVB!@>^R?>e*ht0UcQh zdiW#KVwbI@7+cY4`76g_J(lsx^v_MeNT2xv~tEXBB$Yk$zN*8fl* z4)KJDa`^_3I1WS?@DHNz@{Q;_{4w-x{wO-mAJJmFlw1jg)Fg0tNbXa$dTMUQ4VbMA zuz?%+I5}&DeV|KVTi|qRHYn&rN2Y@wMTZ)u&-UWpFR*W3MbGh-sF2^mv0X4dt(Btt zVRzc`6#HT^{uwZ7KLhWKI%vEXs%He^A!vo`(pz7si_qx}k)y_+zEbOkrYPUm=$MPa z^RZ^j8|&WtaoqRftqG43-+w>pvY?Htf;2Sb_Y1-tUXRU=VbQoS=NE>Sa`u#3cl{C*Ao H{y6i0#Pj6$ diff --git a/bin/extrom_generic_crt.crt b/bin/extrom_generic_crt.crt index a68b68b7ef12bcdd9710c3d3c571731b9390096e..ca10de0dece4d4352797ec22d562503924b476b0 100644 GIT binary patch delta 196 zcmZo@WNK(++HgjWN#f7ub8;1o%ti(#n>`h-S}-Min5+;vUuxl>rE_`}F8FBusaVO- zdTg!2h1NL=zd!mc|FijKaRH3dEhEHYKd`JnLj+lE&l{)MkA8Cwq|Eb<2l zmVWSwoT=b9bCD;IH+g1kD3`|vg~*u_2|$_2KVq#cnctjJV1Cna;iW`^MFLQvLf{9V us1HDfPud5C-*Xh|K2#{Qe^5|-x`;_Ze&(Y8eQbC7*zYI+osb#?;87h2~i{Ql_U`C;?T$O+5_4ZoK%Y6^T1SY)cO>bJt%ZyR2L_!qveWNbZnTtGuyvZ|TL%G_1D@4weNC3)A{t;_s`TN@`h2P&gF1(aTut)$ZROtWh vGvhaq;j`qo!tXf>dwy3a9R01J_;eAIg8a-y|NGeP^s(Pj06HN%PE-j1CI?@j diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 9d6d01f0f2a325c04c8ba8b718c56445d61796ec..a352f3b1aee25a55deb03a231c32ba5cdb23696e 100644 GIT binary patch delta 4369 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 diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom index a23ba2c62f8ed3bbb9e495282460a5f127d916c9..ce5757f49e3c179aec87a6096fc988e98bf886c7 100644 GIT binary patch delta 2778 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 delta 2725 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 KfS25uHtoMUDC2bi delta 3592 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 diff --git a/bin/mega65.rom b/bin/mega65.rom index ddd88d83d9d0e213ae6d67681657ec0ab5e989a6..1ccebc7f859264a9ba4bde3fbdf1d859f6867da8 100644 GIT binary patch delta 11210 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 delta 9975 zcmY*<3tSV&_V8vycte8nh!4z&sGunLYN@RXZB?q<78DfF*0oqfYwx}PKD?A_6R)fy z6$_4SwO;$Bkp&h6gH$ajKI)6u)~@39iQkPVAhd+V2!RC5cP8k)|Bs)}IWs$Z_RN{{ znlsVqJaszH!a(`7>9N%z?eoTXr2J*+_9P1awxk(X{_EY`^i@le6J_a#QVuNt>$2+j z7gRVnarkIzK)p^^NUuB1JbV{v>;`I^tmqtRnQ3-BKXJ*-9a5nj&9_ue6TRXJrit89 zfhthlWYN~d3*Q*~nXQS)YZ-KmebBWPcIhePwgmr@ILf_0(WpWg|Cu;y*s-tgqVdTU zja21!x?^`UT9}MSB&DZpO)MOSCc54piK3PPVI-Ap@UB^$&7);_Jo(J+)TAb9}s4q*m<#DY*Vv>53Cu4 zqP|{`dL7pJt)567R*08wlC8t4l8kZa&qNUOyU8Ooef{FGV&C@ z6t?4PCv+a1V;b-`$q8{?eTINt{!NB0yZoA%6&Af00va=2G?o<7#!=|&6v+d+#^6FF z0UrM!jf@mLCS}}&OtM!6ipp(@f<8s%c11zI0)4SeK*%o@9b8tqjgC|Tir1!$4f>m{ zvOp2z2khVA8VhzS3b2A@u{~w9EE2a}NmYV&f_ z9);vHs^duW%P=@fC$T6aiEotD&(-R`FF$)NWfhaM3hh~r%9k2F(U;57v1Aa+@uy5- z8tJ8_7$57Y>LaE^g*8cGl1ZK>xp)<}z82;n^-ALf^wUz1-Ld4F=?Zk_X=9XvJV;Ba z8K+==SjpFL=lLVtIhH@q{mh@^&axE1pzry1qvF}l`60dbn2nQFDFeZd3Jzc zX~==wQzvQ_}8mg4UR z(afbadk6KDw&+L$C@-{U6rvokGiO9F{OTi;XQWJYbBPgN1~FbSDC<8?JV41Vt8Bci zz*`1-upcd1YIML`h;rH1gL5EYu?q&u;gb*dTZ?I?e5FZl^th7^CYfqy3wA2XQIoA+ zv!WnatPft{4#tlfZMY=;1^h>Pcmgc4V2^^mlYW;MrSJ<4B2hPyyDs=Sa_nlhRV+iR zllKxiplS;epXeSTu9LqgU9J2(ZSoTn(Cj1>I*8`t8R=p4>SVk;9r-mn3XSNl1IC%{ z={R`BjyYq}#-%CKeAA|}P;SDkpy7EmW=#=jO>TrP98$E!Y;Llb@ zhTTp=j~$HNfo>-;?gK>r;RD&oBL#)_fsZrL=rlgRGRuui6)xeJcQkbO!rZ3Bx~K-laJVr^1EO+u+gx|LsrG#lIV-K@<9UF`EJydJJTcwkApua9dd%AGys!x-?ScdACp-^JsLkKZGmkxpX62(#3 zLG=XmpPqvqoB3(xr8VEJJ-u#s=H5)_n!xv`zJK9;_qB^NCawA5gX(zMxOn%q0V<`x zUuP5LbWWQQJ!SHY7pFx}8BlFnu%8? zEcyVyyLH*f#S!CD6PBliFMD<2Yl(idC%!Oi=JaXvX2hf~!dJGY`s~dtnf*wdY*3)R zcv^1ctd$NWmD@zEaHljWyS%841Hr%eQxEzB{VC1TFJbUp-!MR}!@ggrp)^O|ryj_G z7o48^!U)t>ua_ZPsVHOhZU9Y`xuLSlcrbUW?5{YA)5q-1)VrM;n~{$8 zW*U5;$w@yoIpe4d%`O|lD8LN9Ll0syYA53XZoGC~CW&$0XiFx1)wOyFmfN>175Fn1r@vqD5uo-(ZHpOHVQBWdcUi%LF(5I_8rM1T?ph z8O)+GgD1>4jE6=@(VvEg0;0K11{tCP3>ZX!YyS&I~Z^ zS&>RMW_Lm=TQ2%1+2TL^fD#q5xbkz{5tj8{h9(0ktAzE)D?srvL@ zrwZ5Jfl<2|iSF=-2y!g!?27H-?m#G<*^9aDv2VVWRVkB6nGnlo3G2BR&`a+ZMhPpS zvu3E13gLg2kTKMmFHHDv=Vi3Dz*)IzGg zX+P-nk5L+UGDV=;Gse&6KA3vnML5)s4~|Q+80AZ%Tn2v_RzO z9qQ92FcvRLGs~SCQ2A1h;40{Y*=Qd60Ru{^Kx6fx>ZxKaH4v=n@u3F&tEf6Zs_AJk zrIb@jFG@*MN*Sf}pvv5-{gl$3QYt8=8#NHEc2fH&x&e|w7RBPMo#SOzybD?<{&8od_VhZwQ2H5Y zGh53N0Aw*mYxGWFLUimc$tnJvsdv_o+GWT8^y!)hpgLORy>8`A z<*94&`(a=2^!X9(7#isg{N?d*YI5k})weu{UQ|YuZ5~unj$z*?g9n8t)8_8iP=?kg zBZ8Z5&8-4O*%}gZ zNxOA0Na;^CeP$25dLpR;HvE$o^1UBlTB5EWr8#O1ZczeV&ORa(w6L^!=xgEjpv@J} z^c9p>gLf&t$x(+8p7z0*iXIi|ecJH@EOJEsD2}*xkjIOfWpk@K-6`rpO~0x;Xn&;U zhL+0TtZ9Ds4hTonqk7iS*fdo4@CI8Dur6MSZwJl%c2}<|`bh|Nf8T!Ue@0T8?d{#F z$!B*z)yOD~ZFs-;mQcXJGKyXvt=YOs6BHe+>=05l9?!;LQpkTk0m^BcxTRgI4rtmN z8n7w4IRNGbbO%rYKrEyaOj;A7`G*PGy`*V^#uh@jaM2$aFQcB5@_)7j!r;5R{)E?S z_6B#WWz+*$j(t>-24dSY%e^F2dWw}E+axL(!u?<^$DnO&AG~0SYs5=8eupZ6L zzTh!1b~NjU{ab^k^bdE0v}u9@y4Bs|7CupFz8&xyrx`?=P>s4yV++z``~q|9;xmLWL;vg(47rPO7sg|C@jGS1^YI8VqMJf7ze=nXTL@l%GMsb(e!Xm?GRTO6aY zgVM++;&^`2>#y+Kd&c&B^|}~z&6%gV$Fg_o%q*TGv$L@R)e=#L(#_0{`{-_Up^Odp zo$-DMdZEI~_@MX->-b>w&l0QC6CdWQ{6>}TqvUxio8GN=gks*PJYLA%B5m zMxhh^P-&b1GN@VLM$Uu;=77L_T#BnpXK6t|qltis zq}*Ky;P>yFC}wvJlnsjJ3_;Z9)b&6gopb6s2|VM}wGepGsk=wu?@ryn2)yRh{YKyo z31S_1_NMIz90KQm0OO}lX%4etZ z3rr^0rY5t1zVQr&Z7{lnL^ce7=zpvvF9wnqyHEF>uBz^>`>|4f=vdXA6E#&#MQR1w zUSX86rkFx+(`?ohUnnkf|TN#UO^%INY|AxP>yzBm{IUjv$#@edrDb*!Rb%`L00&Uq-hZ0KA+1eVP zKCTXx9_GE#znnEUZ7e8%jm?HGRp7f-pL%|3=2v@@*HaIN&lz@-Esh{2^6`C_#Jry? zk1s)3H9zD1L~ceQ-8z#+V@}qD*#vJit*&OItt7BG2-hC|NS1`7jEK(f#BUi7f|ws0 zSx?Y-52EWhy*hIa5vTe&RZkZJW^$yl=LrkDwE%1eBwFZpE+>}d=7T<2ijJq&A zSiM$#ty*yELeRBpV!1mN#B!HC0n5dkj)ePPswk9$1hTl*<;=KxTysApl{vuNcYK)nO39Uy;btbDhtH_rU&t*4HB4Yx zL1u{8cSE|xPv++EQQTZMcN`a{cdHKLKFq5Q!wHpRYsQ?KE7L%Qb?SoGrcR?Me#wQI zVC+d3X0T{`71;>{e&qAhV`(sh?@uR;+{SN#-Jo1g=A0DbbP5C@o})lPWU3mO=v3nF z=0KupIK(_%C5$Il@Wn+w$mF!HyvX7-^XTbZqM8o_a|tV?FOFm3pdy3Jb>W5iqM`x7 z0%p>EH2EaByM@1)ba)iS9Bsy>=G76Kd7uRqMX-t}$-@*WxieQv^c1Uix@aJ#*;AOv z$s%yf{n7OA75J_D4Ma`V&7VZN4!Oj;i*hEnm@gXcdmEXm!D%wPnqA*_%fGr1zRT`5 zk5Z8|nwtX&D>qj$2L`dZxrD4g@4@sah#{Q7>M6rY=K2YA@IF*^C4paUZF3T~c38{K znMxZiKWAk@5XP+!CZ!SMs(!C1tl|7>(MH&Fc@OHjozro;9-y|IPy>bXkJI@RsEX6M z6F7{_V|k;ZT2dO^QPE+(8X^pDga)sB_|~X>_P3YNug_mLb$ZOS|L$VzYU{6!_%B`I z$(6DuFv}uATR=4dt|;P)SffX72#zM)??NE=8>AlTp4lkdftEPX51r^mM+Eb_#8y)GB0ac0EP7z$ z51M4wcZ2SvXOrhJtFjZVkPMLQB)|YnoTRd6txwR8aG_p#q75Z?W$C;wtITMXBa16W zk}b#17pqgXtmiX&qFV&>es=^|_aa9&5QOq+X(u84ngi|cG$$6j ziIC07A2EJ*H9BRXlH-Qy!Bgf?&J7k*3Xvkv{gRao2+?zA929`rJX?4^d}t z4d=9n7bgB2g*b6Dwb&!* zxNh`O7gn~vJa=`ML5-a47jJ~$R$(T(A0=8)u?3GF4rQ)`!aU}!KB9Xhrwg^9hCU?r zL0O2Dgf`kCH^Lc@{yzH-n$~aEPlS>j=nhCJPxZv5Wd3oGI5BPAMB!8}O9Esln{#RN z3CNl{!fEaR4(-%<9P(?*v1i3q$2(|zxZgWK@PpJ5z1{+QfHFyoFZ63P+)uf++v-?; zpLMgGS=kL6R(;ikSol!UIdXF}&_8i}q$9gnU-AQQNM$PnL@!lAfXI?H&G(1Zl+>9$ zjkLiNC)tNDk96=iQJE8$$eE^YVIf@X2usQBP6EG2a*IWq+OmkYd#NIC7Et$C6w+21 zBpRq)K_WYNTC3Hmkef_KyCtBR14cK&jXRjd=47GtE_}%zPv^B`Z^tOr3Ja(t=$}DR zFW24EcH&u%anXhDhyFoVZJ~GmgWk1;W+@%g$DLu#s=^p!qWCw-FsyQz_}eg1asa$6 z_TX&C*l=B!J%>M(z*i;kl?nXeg!DTsTHaSf_j;Mh;;#6@;&8oVq!v26eHl$#rCN-n z3)CVL=>XJ=7Oi9>h7uw`TnQ1-H%%?{1<)BFMtYdsjj(l)?ZV9!Y!NxQv~iEPb~e3u zujHLqn?^%|&B&!3G{edyc9o;p$N8Y}g4w0psLg`X+gGqeg}$(0Dooz%TnwC#apx}GRB3tx>(;GO201Q)7?Q@ zKQBUY)j&j!J(h(AC`Y7%L%j(yPPEj1NSjzFD1oc`KaUkddj#2hn+3YST4Gl|l6Td7 zHc*>EOGIRNj-N^1xSI62eT40tEGEC@nL~KN+vN~expo@gc*+8W5zk1x=pr$kkoZmk zBs2qf!{Z6w@-E{9phbrN`FMi%H79t$(3af{_)vQ+`v+!{?cnTmfUD`giY4K zSjko%izc|V7jByl^2Oj=wiPocAF%=gWdb6RT`&Yt<$xvz6d6LWPcPosJ_c?;%5(Bd zzJ-e**dEtK(6yn9pg3f11x>*}w$Gir(^mKsy4+3ff7DNM&u=@oAx6$&a@WV7&;1!# z=j$Les2nB_tB(VHYr$Kr%p1<^T>Z8mI72FacW^qE^^DMdWPwzocB5sAtV#5$ETBi^ zSPBa0JXLFDAuTG<7KoW)U(x93;GZxdj_;LT(K`(u_4hmBwfgQ(KUtH>DUCSe6vOo% zx9@j~UVGJ>Z+Dh4pY`Oax?+@NY8U&!Jw ze;KI-9k|Zj;w}~6IHQ)lAq>VST5ph?sAv%Uyy(%oN1ere?TQezg6Lf99_Ce>o;rVA z8iqdVYdC*gEy`j+IX-M-mfM*0c5<=od#7rrq8=^)xdtfAR2C{acPRj84es|=_DhP( zs=ipZertbueTGlJv0zx7ZVZ8eaZt4a7);VyfNGM~0vswg z_*tfrBr(pC=&_aCu`Pc))R~`*(#B1j7EV!ao_+zrqq1+ol19jprOObpD_BH_29dE} zfEu0Nc~H5syzJn-l^v;YRB@twC$q(ghkJVY@7g^q^guw-9(kbOSDjyXzG|IkJ==Ax zYlbDpLfQT7kNeyEojv`XzqV;?{0+E5yaC$5-!Q2~IqG=SdSf`r3r<} z&CtQEmJhXmvt_Xfg0rANf#5d)yA)hwaZ)6maKfZRRHBoh^eEO-JzABm4tg9dki9U_U2II0UhY#qA#Tu-~M zK7oaNf5oMutN-iH6G=$1rwg(mjHRjcW(Pheg#`%5xE`T}>jlG%^eC@y@5E_;Ox8kJ z^MXkI1_|0M+^fGqZrEMnc&80E1j6#=Zpd)}VX|Gtt(K>{E;1bA)U}aOk^_<$K-#xS zizI2N-1WOZi=g1^D0+E5J zIH-F8oEireHh?j4P+amFO4U}$3lX9J)Nov@x)D4vW`7efScC~)c5W@&Iy)3)- z@ASTnbi=PZXz|I#i>WwzFiZ=&OS{heyffdRH2aFaW&Cx;Ey-;!902y-tL+!v^PxIt z>c6aNHYo4ic_g~;+D1adWz}P7S>h_5=@~Fgjse6R;4~OD@C<=pEID^kP3&F%SMlwO zzo{0(t+$}$EJ7dGS&939iPkD?9Y_A)uDqe^*!>4NO*vTCkC6UA3LAfgjKL{O*9w_n zE?u>i-kD49+Db!S3(*o{bnIjPI}$g8{$QcPGb9pPhweL#a%M{hylUjCHw4Q^jF_Hn zpy0;|x8!8E^PLFfwZfUYf!2EnTME9S1qWW;IVzwSi|%@=s7eio5D252`|$T2W3|6q zTu#m#oE#)Y4GaWz{(#D1Q1V!!4IxDBBcUMyNAfp$NZ$Nma;mLjp!u0#X9;#dWirIT zG)C?OydG{upV9TKK0(NePoS1kQdN8yf?j$TWPGH>Ej-r3J#VP^P#7J{B6SOMyAK>1 zgtlKE6AyP%su|HWKT7{U$-EDL diff --git a/bin/mega65_orfont.rom b/bin/mega65_orfont.rom index 57418010051a35867c106a1af8b67b9fe62a5c57..35f78028d545f1f3b0d3d35e51f059163eac1add 100644 GIT binary patch delta 11210 zcmZ8{30xFM_Ha!P%?&ehj^~sL3LX*9kQgIGjbqYDKv9vnYb%PQF`L~S#t^eJuCxa_ z1Z)$pXl6$mX>f1|QG*6GQ3>POifcT`E*>Cq*~lTxfb)MfXp--nAJltQU0wC+)w}9d z8;#yZqjz?Qa$L-W;_!!42kl8ZGkaDdg5QS=YzzPM*T)N{%n3`#NQs-9HJ_bV9N($p zlM;dl1hr^Z7_+GrCz<ol{te ztQ)ENZFlkQIsE*@l({n!vV*W@9(lVT9ykvM#*&5w3|g|i;fY4{lp11LEY=9$z%vZA z1c*wQUN{V-n8rx#8WC~jRxEMf;I9*yLp68??>T!61th#UJ8FQa;P!|H?g0KU(KbZ( z5*0J{aC>6Y4%nLUhy0=01AN{~!0#nk5PpxpHalvfc#_+O%M)xdmQ!Yr4Lfj4qMefJ zH%V=IJI+Z>+3Pwh7Nl6m_OADY3znO^IyM-7%3e^lg=MP<@cMtoc#_0t&K){zKG{(dZQVed zI%(@h+SEnk59Wy&Kb?=a&$DizqE&$Mm2(Hbve;!c(J=wA#_L?AX&Y_gX_ggH!CvIC z7two>=U(JhC$-?29o860=Yvf#(h!eRdH{F{|8({QDlnP%nKwXz`C;>l4W)B%{k+2M zFf&ZiD{s9GB8HliiA)4hoLse?mi_wIe|L8>H1;>jERIYRDrL=cQT^lPXRpm&#LQiU zx%n8)v3cXQ^YI%=z{1>mX59i(Yf7>`HlyP2>PK3KERb`}TD z0ZzY>R1!~PYklQpnmlMqDj7#J|6VARaA$?*LcUeLh|u8t&ohr0v7$m*aoT# z8VjV1AB_%frAsUCzx*b!&5kP%yKdv93*791PENp|v%L0(ai{U?$xN~x8_ zgA?%l1Z+sazrKqD7UIw6@cVjj=IoN4J!WLc`K|)A3CdHnqy+5LDG7{8@prO!v_kT5 zvk_hfHeRx*$|fd&FrQOD5fmn01xU>voIl&-fFXz+mYSG!(#;_xH4xP)xzX zTPe2%Nsc&MArVQFxNBm7Gu@$KYo&Y~**<3{SrvZhz>9i}b@=-(p5wfG@vs)Y>fH$e z!&>kQEzFTb%Pi6|aN%1j5V1imxLXFp`a%mn!hg0fddQwc?9sybx8OaAjHZQb$E21u zcux}ksR_)eg~IFjGYj<|tCPjKe9T|8l<84P;$JvLG)feHEr@1YaeF2n)KqXA)Cl$+ z_Pkfggc~wdej^iD$h-bJYINm&uClyRsJvNuKijkRI>1&f61HJv61=>vHNbLYg6!GshCyUcQPAgx!Yx#*4 zIcYo6o-PeuHhS5aW%Tk{sZmS6eXlsaYsk#;FOD5Ex{q2F7|>LOT&}U>$BZ6{=f3qi zGksS4+q2)9lQg3{cWlFIE8yvba5}Ucm>a{pV#k=H=~9o z>*hzyTkzVj!o*4AV^XH_()wh-9cg(l*GVHSG~U6F&xq!8GA6yV(5Xfl zRp?z$q@9=Li&l4spASU$9HD_oo3sTQ&vXU>+7?taQ>#SUBg@b|C6Iva#byP5azIkB zW)FaNBzsm!9n5OJI%A;1&Ogm~L2-~D&6#6%q?tWV3`kAEJJKwEP^71v7?yfifnUz= z#SmZ?|K11TsinjC9xl?LPb1FM7aP;SqwPpDj$77dc=8=Vl z=9GMk7j(j08h#_6{5exCK4!$EJ(xH0E#A=I5($Mk*L)Hl zipc!FG(h~s{5L5~%r+aAN^0>XbE@Pk4u;Z0{HJ*(&P)Y;pBSx@U$?8|sDiQ)sW3P+ z$nr$HEc?CzKhkLQswkdVP*y;mR!EmfhhsWuidJd9K#JYZo-p<_7HF{q5yD9fV+kH* z2_aO4Lh%YA3j@utm_yyRXwowb+O5&o&E7XRESKp`>Q1xIi7%Jmf>uX0mOSARVdP-g z*@YV;JYk>+W(U7vW9(aR>8%QdoF@L0n<%d2CgIp+*`vg4s4VTRB#SRWCAGIQLmd1^ zWitL`nepdLT@g}16t)*p_&>bgrU=D;K4w#2kE^N7e*UdZgZ)ON%7L4tPILIpf|AcR zeXLLn=9@Q1Dh}}>nb>gHd>0myZuHO-epG(#V)c43U;kKH?Pt4_g7>DS8_$v&WvfiV z`_qgvsVHpaDOgN1-m3u7Dv+sj>?UT$%6*>bdtdZW^w`=_=!Or{K6vVfYJ5Ojj&q1AvkD&zb>Ug5cx66_ZhEVT>=CU$A&5zS*%I;kl2ltj zMRB_QWyupqEiI`>xMdYCbK!pZCHD~-7c5sj3V)t&_vV*$>hMST z_6T{79aYZZ$8H@GKB^NRbxHnsM1ILuv z{u#z**5~U0=$VwIW)~14Id|rz=YGzVxyt&l?+T8ee+hkDQ>=a910d)2?@0W}6{uGG zp|&>Xc1w7D<4sgL5F}vW$2EYA>lapadd+v}d$=Pr?IG{p!|!VfmTRVYT+dwR>7Zw83NU9_t-xb-ngF z>Iv39FpT|WeNUK5g{soKLa!W8+yh(waSfUA`dk5H~?FfEW(RL0+Eg=<8!hrP3OY!wUMSfOC@R&9Yx>Hby z{?Qj{H`TWUkNnBjr`Zf@=JG@&IkdT5Z^vFjd3uWUcqJHt3}JeF~7z z&f$i2^_o6a`2+i`9dox2^y|~o2lau$G)T8;K!=b+3dMHLjC8bXD8{O(8vdOlR( zvn3D$|C-eZuYaE(*3wsj?!j_ggZ{1c`yKOtj*W36PYkL(gB<b}c?Zf$4K@)Lcuz?O~e z8g#Qe4A!H)(HTAn+79b;3fG5@c7!-J542%@TKcy5&TI?T=0|q>XuGj?fVOX`wlhq- z^gQ$}jZahk)S<`>9;JN}Uf82S^(Eb34hjjoRcIS*M#9XT@fCtDXFRyMhj;KrJ|=h1 zq}>gImwYq1ZaqE=%Vo?7VE*6eBamuyo7FU}jH1Fz?i0{(9quMkED>k64+ zBA!(}#3PPrZ`SD;PUPc-5z~*|fczFDb9mGJmp6*&PWpw&mk7y zF3wi45&q-9QsA_ct&AW3Ca*Oz45t;g>O%QLLQ%lBl3hr-N&Up^QM#{$Uzs;CaF*mD z%&;f11#+Kr>NvhQZ#Zwu@ZfLch0*QJw{RBUnir+SQ3v?N>w}fp;~?)*mab%`mGQ*~ zCK`ZJZ$c@i@7lksy!n)c900y^$Bvj;)qv(q>4o@#%h*mHopu?U2t4I7)(}|kGX6&3 zWtZ_k1YUI+FA`YU0A2@RykIONaCd|8FoD0c8Lb5R*BAwWgYo=F#=WGW>&~;8=)1i$ zm6y6_;y2`ql6@mlsS_9OkQoUX7e45Fn(DAH$I!HoxtL<0-GnWc2&2FT`yz`Ma9;l@2znM z_Z_-*e9xh;3aNh-@`~y(KD!W)yXU|Sr8XtrdQTjgH#+wPe8W{DI9Oo}H&ck=bb{{e zILTX>d3LNsLBeExb!8BLw{V(bIzQ~7X@CK}J9=XF<&O)d=Y75QP=QeT7AF{7u~5DDFX2XZm8C@gOMqJxOZ=GLu& z_5+nvr(REF{dRH5lP5&1ZWn#xJ@k&S*q6MXd?;c{aUPo+MOOXM9XEGBzaw?22R(C@(g0~?CIJSH4xi{o3A{Pv?GsZ+)L zPe-FEdoka5bQG0X$oKo<#lDlRLfR}Bm&UC8q5aLRffQmk=OctCTltkgyrulH`DDql zA3jhFoNQ%=o&X|rWHE__w&`35EG?8Q0S0>g*i8S)R<|+Xd?6;`cOCm{|Khw14DJfL zrJ0Y3U5x6u@swGe{0bR6==j@|u8?1HJZh-J30lb<&%>>y%%!7Hno&k6^X5UOxy(Hv zJmsy&`_FCrkvVk_C@{YPhsxy#nTA97>tk4TujElZh-67^J?z@86e#pus2->bVR{Og z-S>ngH;>(uXkqcq>D4TGZ(|Wrh%mDE%yNFh^`#r@b&1AuuHNXJ#F5EF!)FgCYC;DN~V0g zeGAIYoafrh&YtHwm{kpLU-<8ZVHXkl8~l^s*Z*Jrws1k>Pxi!7Th8-}r{Mux&I_07 zw>5xFUN+Y9M{456BOjEZ4(r=LBw*ksZo|et<3C+IA^oFeXyS)UC#9x+yynHvmd7s9 zf3o_e6)R)jfA538jr{v6{!UG>??05!-{d=L;=Ez*jL`6Y{rO3?(}ue-H$6}c2v>aD zFPKK(1bGZndWLAUeZBTkexYGO{`}6`K?d?7{P(xAv?-OgE~ZUOY3mZ&w2X!405yz-~HV z4;}Cg9k7=U*hjZ+K^E__uW8?G+U$ibmwmIn%$@+{mkCA_EXF`k4}uOOn37-v2u2Ys zh+qnWd6Pj9VCU3Dz$$#^GQN5lxb+NK@*G)Ct3N%MMyqG$p1r`*@<$gI)AHXgETQEU z)^BM$B?sCS(gM+CLRD5pl~HLmpei`&>&(iVpPzT1wvDfpt_J}t-3S6!YB-;N=Bzv> zdu(E)~%H6acL{XTDMU050|!3tPb`#_`J(H4>o)WO*Vfqy_KaieSLl3hYCyU z*^8;P?0s=5Eh{fBqgi>R-6ao)jKom;1X*i;S?+J2B8S`KVb5a{!_zChM+yeviy6GhtpfXzDhE2mM&0J|p@P^W}XeFC;hgIgRPu z6gXRQuhLVXFJFB(kC>-T_r{F^#ZnGu!Gtd)CLG?QP75JAAyh{^eaFxFy{=-X8Rdkq zeC@pv3y4E4UXnAU;>=>{3E_h~VnEL$1}YAM!b9C9tABR42gVr#i8E2h89fOMat9QG zjV_i|7EhdWNGOH~RIow8uekrV;n1UZW>eE=%zI&6%-BDSZ0+LK3zckCLPDlRRqZeN z=L^^98?whv#;<4RZ-X94o|zC~zVP6j`mROw+pRjuGiw9IOqI{6A46&L%Bb9M9j~g% zt<1a55{E<+Po%`=8YZPF_oy6---E0Zv#~}f4Z-`G+$jFAk;!O<&U}eC|3=MFKftQJ zaB4I2Vl%&{CL-WkBLr_=k9toJC1TA$1=Zo;D{3PR9S-4A&K0;n%YiHdcUcVKF0!mO zNV30>?GK=-j}+}?_q4UKEcZi3>4sx0AMEWDn6)iv;NCtt+m#^!rClexUTdA&TJQXy zbCF}A<9hSG=8EQ%&93$Vjx#;;8*#{^Avg}sIRJ+c{sN33`~^5H?j0uT5y7J3o*^U1 zjzGhxI0(}Lz7Pio0)R1ba3BCUE)EU^04Ky5FRp>`V4FjS&v#kTZ_)oNz|;eNSNC|s z7fx8pc1Z2-*PB8mX0wdHuCXGCtd7 z@shlR{jw5&+aTn=!Q}$`Ps_mmBQjo8L%J-gIj62lwzyzQwf8xxGe*g5?Pk_>2h5of zKYN;P*4s1rZ4ck)Z`BRxyVpswYpC=V+I16EoYF|`U`|@F-pQ*TPBvsZEgI~4Sbja? zrkZC`oAFu)u5$3NK83vSesL;uu!-gN5((fdl^b@XzzxIDKW-S(^LA*&0CK}nY=^vf zL3(E14!B={WW4)+;cD;wLL9EHCHD*WYlSPEUAW4f%e`KD6UC?mdn~VSi%wEBW&eQB zwUE1p&mP{w%bFeL;gA;xS-?40HmTcKJ-1KKeGBWq>Z;u*QMKQKI_;BMgl~1iKAl@U zgZ{WVL++b1{-yee3FPPnx04{gSRDN8u^a$2IH5RSn`SfJfY_7x5h zl`LYQ_?cio5p1v8Zi#_zj9d?R8Dv+zoct)4CThJCGzUY;*9bi1hX+dc#R0Lbc!X;g zYq$<~TvAZx@8GvNM;ajR^Ra5AS(Hg5v2bZMi(Fr^VgST_=18*tez3p7el^^m$uvk1 zkvJBH4HbTdQY9R+d)s^n4?JR-`%P@8j-;CHzAIvGz|uPP(JD6%qj^K8Y|kijUrQ7l zrGvY$6P5Q%lagBU^(>K!0tf$@6IVJ)KJ4;|<8q07FeAF*9TJYlIdFFq_GpGAJ4vuJ zkKpL56ShlUwc9m%?kkqa)DWizd(_o#XQnsu+9zSeFyz4981Oj=_*`-3s76x6a=Fll z`M8ludB}@T1{wb0fLkT?uVNhTl?dmsNxDHoZ*O^yj;ksQTDRF&WEvexS$Eo41-v?G?RI2Yn zg;zV?@4wikXLS(bm}m_5*;zDKY5kJsuH(ceJ%9CngaH=obseG~IQ8Y615`BhMniNC zm&5AT;Qc+oKysd0gMlMIHCaN;fsiP%ECi*{%i%f;1;Lqrja~=pqX+v)TlDY*M#WN{ zy2s)PuwIg3m-(qZ#FV(N>Mpgpuj+tCRVMvQ&Xqsi(fK;@urepvv0j7Qn)2jU${MiJ z#E62O-Pvt{{1!3WeB6Uj%@y4y_JsOM;Nb86OQpUK;S4fFV8+vm`Ue4a!5#)^AxuY?y z#>340t`R~x$!&ne)TMwSOxJ7JzJ13DyIMm#LFf3$0464~VGRU4`@v;Y$;9IbxzVbE zvScSgWL@5NvMTUBn_DJO>$>@qEun^?PszJmyra?`u`CooP*gH3>{qbRYaONUQ+5`z z_j9|MZy(duZmF{=vDOJyAmTG;CZ6mpDfR{(lKsd)`IKE*xr@}fU4+1NJ(F4U%wZ(A zyB)@&UfE6eWnqNA&xZKGJwz}W;-3x}V!k)O>hUn&$xhoaqMy+G&EsK)mX$thJ=d$D7d)>b)721%K5ii$Bh8Ggcc3!lg-S0 zyvEu`f+3XMn5#FtK%}0#`+8jHH1WH;F>h}T>36NMAQsOClhy0^g6gH*VRqHA5X57T&kt?745FxY!89yc0hi#k~}Ppy6c{H#Q~$En)zU1*m%+ zvXyg^(Cis+;n!d41!H5L!LiTaIP}Il3#QGUGaLVb#USM29ndGN|Dd76M~$C6?ajGM zGR|x`y(&h@@#G5(;Y`NQuvFs1T3_b}6^p-PYdEu+IUSUutoTR#Zto;LG~vIpBo1NnP7}!qYXl zPk4AiPa|}QgA>myW|zgQ%!9mE7UBp{RKb~~?JgRluATOmj7A-XhdtcV~dc7)=MO}_qM;)oqhBPGA5Nvi=xPIugNv%{adgkvmj&w7bveX}Mo2PpzktjNzv6rspZx z3nFX{mB6xwN^H+bgCWwW#vTd<<)Op#9@soY4~SS<5DQ9DiY`{j20e#Zh5xcSespS` z`bo3_WCOlUvL;EF>g*U> zg7kOUkuDt62}L@=suK?BQf~3@JQ{3R?X(0zn13-ylAQq0N$qZrc=Mr8HSvhQGyoqU z<>D_~mb@Xnxd@BC41~!ZB>E&hwlpv^WC)U?Nst8W0Mv()T8TUC&C3Gf&dUOSqaOi( z0jix)#5jR?gZCO@Qo%2Pci1CG!5Uyiyo~oafoG<7MtJ7wQZpapPIz{GW@ zKHQ<7iS0VHB4sy`3n#F8Js=Ly=L&%8I_<2J7a4q3vw$rVP{V{8KR=NbyH4j zMe&tQIaeyqsb!*`Fq3@0{5qVODB@CTG6|JYXW>8t{Db}o5Q~D{jYc*AI zVKXJQm6s>8kcjAAJ7vUoTs9@Mt{w;-W#fuhg()F6Ut>Y=`O*y~=pmS}=$RnTIMaoJ zL+`qhS5an0aPg^~kp}RXOhygZ5^$2QH0XPgH8tR=eyPPj)I%LS)h$T8f~Tq^p6VJj zc{SQDig2EQD9&~US9IG>Vx5aCBE=!06fQD;;)=j=9l|FYAaH;n9nN}SY5(4aXUH}l zo9b;@_lks~Xsu-MyM;}Ua8pMK=W;}3C;Sfrj9wZbz<|y^LUweVq!e-?QN$EK#hMx> zpc%epi}Alzw3RM{udlcY2ODe6rkk>8z*#1^US{5PG5dR%gdQfehw0bDybor~!E9({ zBA+scdzgkc#@WtXax$+pG9j^#ArNQY>t?(fnIjG+`~mY@7k|n%AYzt-iFB-rQmz`I pTs2C`eDH{AYG8b8%vBb|W;f4r-tB(US{(n^sl^HJ{OSKN^?$}#Ry_a! delta 9972 zcmY*<3tSV&_V8vycte8nh!4z&sGunLYN@RXZB?q<78DfF*0oqfYwx}PKD?A_6R)fy z6$_4SwO;$Bkp&h6gH$ajKI)6u)~@39iQkPVAhd+V2!RC5cP8k)|Bs)}IWs$Z_RN{{ znlsVqJaszH!a(`7>9N%z?eoTXr2J*+_9P1awxk(X{_EY`^i@le6J_a#QVuNt>$2+j z7gRVnarkIzK)p^^NUuB1JbV{v>;`I^tmqtRnQ3-BKXJ*-9a5nj&9_ue6TRXJrit89 zfhthlWYN~d3*Q*~nXQS)YZ-KmebBWPcIhePwgmr@ILf_0(WpWg|Cu;y*s-tgqVdTU zja21!x?^`UT9}MSB&DZpO)MOSCc54piK3PPVI-Ap@UB^$&7);_Jo(J+)TAb9}s4q*m<#DY*Vv>53Cu4 zqP|{`dL7pJt)567R*08wlC8t4l8kZa&qNUOyU8Ooef{FGV&C@ z6t?4PCv+a1V;b-`$q8{?eTINt{!NB0yZoA%6&Af00va=2G?o<7#!=|&6v+d+#^6FF z0UrM!jf@mLCS}}&OtM!6ipp(@f<8s%c11zI0)4SeK*%o@9b8tqjgC|Tir1!$4f>m{ zvOp2z2khVA8VhzS3b2A@u{~w9EE2a}NmYV&f_ z9);vHs^duW%P=@fC$T6aiEotD&(-R`FF$)NWfhaM3hh~r%9k2F(U;57v1Aa+@uy5- z8tJ8_7$57Y>LaE^g*8cGl1ZK>xp)<}z82;n^-ALf^wUz1-Ld4F=?Zk_X=9XvJV;Ba z8K+==SjpFL=lLVtIhH@q{mh@^&axE1pzry1qvF}l`60dbn2nQFDFeZd3Jzc zX~==wQzvQ_}8mg4UR z(afbadk6KDw&+L$C@-{U6rvokGiO9F{OTi;XQWJYbBPgN1~FbSDC<8?JV41Vt8Bci zz*`1-upcd1YIML`h;rH1gL5EYu?q&u;gb*dTZ?I?e5FZl^th7^CYfqy3wA2XQIoA+ zv!WnatPft{4#tlfZMY=;1^h>Pcmgc4V2^^mlYW;MrSJ<4B2hPyyDs=Sa_nlhRV+iR zllKxiplS;epXeSTu9LqgU9J2(ZSoTn(Cj1>I*8`t8R=p4>SVk;9r-mn3XSNl1IC%{ z={R`BjyYq}#-%CKeAA|}P;SDkpy7EmW=#=jO>TrP98$E!Y;Llb@ zhTTp=j~$HNfo>-;?gK>r;RD&oBL#)_fsZrL=rlgRGRuui6)xeJcQkbO!rZ3Bx~K-laJVr^1EO+u+gx|LsrG#lIV-K@<9UF`EJydJJTcwkApua9dd%AGys!x-?ScdACp-^JsLkKZGmkxpX62(#3 zLG=XmpPqvqoB3(xr8VEJJ-u#s=H5)_n!xv`zJK9;_qB^NCawA5gX(zMxOn%q0V<`x zUuP5LbWWQQJ!SHY7pFx}8BlFnu%8? zEcyVyyLH*f#S!CD6PBliFMD<2Yl(idC%!Oi=JaXvX2hf~!dJGY`s~dtnf*wdY*3)R zcv^1ctd$NWmD@zEaHljWyS%841Hr%eQxEzB{VC1TFJbUp-!MR}!@ggrp)^O|ryj_G z7o48^!U)t>ua_ZPsVHOhZU9Y`xuLSlcrbUW?5{YA)5q-1)VrM;n~{$8 zW*U5;$w@yoIpe4d%`O|lD8LN9Ll0syYA53XZoGC~CW&$0XiFx1)wOyFmfN>175Fn1r@vqD5uo-(ZHpOHVQBWdcUi%LF(5I_8rM1T?ph z8O)+GgD1>4jE6=@(VvEg0;0K11{tCP3>ZX!YyS&I~Z^ zS&>RMW_Lm=TQ2%1+2TL^fD#q5xbkz{5tj8{h9(0ktAzE)D?srvL@ zrwZ5Jfl<2|iSF=-2y!g!?27H-?m#G<*^9aDv2VVWRVkB6nGnlo3G2BR&`a+ZMhPpS zvu3E13gLg2kTKMmFHHDv=Vi3Dz*)IzGg zX+P-nk5L+UGDV=;Gse&6KA3vnML5)s4~|Q+80AZ%Tn2v_RzO z9qQ92FcvRLGs~SCQ2A1h;40{Y*=Qd60Ru{^Kx6fx>ZxKaH4v=n@u3F&tEf6Zs_AJk zrIb@jFG@*MN*Sf}pvv5-{gl$3QYt8=8#NHEc2fH&x&e|w7RBPMo#SOzybD?<{&8od_VhZwQ2H5Y zGh53N0Aw*mYxGWFLUimc$tnJvsdv_o+GWT8^y!)hpgLORy>8`A z<*94&`(a=2^!X9(7#isg{N?d*YI5k})weu{UQ|YuZ5~unj$z*?g9n8t)8_8iP=?kg zBZ8Z5&8-4O*%}gZ zNxOA0Na;^CeP$25dLpR;HvE$o^1UBlTB5EWr8#O1ZczeV&ORa(w6L^!=xgEjpv@J} z^c9p>gLf&t$x(+8p7z0*iXIi|ecJH@EOJEsD2}*xkjIOfWpk@K-6`rpO~0x;Xn&;U zhL+0TtZ9Ds4hTonqk7iS*fdo4@CI8Dur6MSZwJl%c2}<|`bh|Nf8T!Ue@0T8?d{#F z$!B*z)yOD~ZFs-;mQcXJGKyXvt=YOs6BHe+>=05l9?!;LQpkTk0m^BcxTRgI4rtmN z8n7w4IRNGbbO%rYKrEyaOj;A7`G*PGy`*V^#uh@jaM2$aFQcB5@_)7j!r;5R{)E?S z_6B#WWz+*$j(t>-24dSY%e^F2dWw}E+axL(!u?<^$DnO&AG~0SYs5=8eupZ6L zzTh!1b~NjU{ab^k^bdE0v}u9@y4Bs|7CupFz8&xyrx`?=P>s4yV++z``~q|9;xmLWL;vg(47rPO7sg|C@jGS1^YI8VqMJf7ze=nXTL@l%GMsb(e!Xm?GRTO6aY zgVM++;&^`2>#y+Kd&c&B^|}~z&6%gV$Fg_o%q*TGv$L@R)e=#L(#_0{`{-_Up^Odp zo$-DMdZEI~_@MX->-b>w&l0QC6CdWQ{6>}TqvUxio8GN=gks*PJYLA%B5m zMxhh^P-&b1GN@VLM$Uu;=77L_T#BnpXK6t|qltis zq}*Ky;P>yFC}wvJlnsjJ3_;Z9)b&6gopb6s2|VM}wGepGsk=wu?@ryn2)yRh{YKyo z31S_1_NMIz90KQm0OO}lX%4etZ z3rr^0rY5t1zVQr&Z7{lnL^ce7=zpvvF9wnqyHEF>uBz^>`>|4f=vdXA6E#&#MQR1w zUSX86rkFx+(`?ohUnnkf|TN#UO^%INY|AxP>yzBm{IUjv$#@edrDb*!Rb%`L00&Uq-hZ0KA+1eVP zKCTXx9_GE#znnEUZ7e8%jm?HGRp7f-pL%|3=2v@@*HaIN&lz@-Esh{2^6`C_#Jry? zk1s)3H9zD1L~ceQ-8z#+V@}qD*#vJit*&OItt7BG2-hC|NS1`7jEK(f#BUi7f|ws0 zSx?Y-52EWhy*hIa5vTe&RZkZJW^$yl=LrkDwE%1eBwFZpE+>}d=7T<2ijJq&A zSiM$#ty*yELeRBpV!1mN#B!HC0n5dkj)ePPswk9$1hTl*<;=KxTysApl{vuNcYK)nO39Uy;btbDhtH_rU&t*4HB4Yx zL1u{8cSE|xPv++EQQTZMcN`a{cdHKLKFq5Q!wHpRYsQ?KE7L%Qb?SoGrcR?Me#wQI zVC+d3X0T{`71;>{e&qAhV`(sh?@uR;+{SN#-Jo1g=A0DbbP5C@o}<_w;#CGwg}a*r ziJIXM^K_Lko|wQF7x^HQ)4K8^i_^@br*nyFJ`8LntdPDqj)hZ-4ARzx7v_tK1^^3~ zN%zs@li=$X{$kSMQ518u8JC(@M{MSS7L*ggB%&k_Q>5h1Tq)60tlsIOftY4bVIn7s zz%lnn)4x~Xx9&F(9aT4f66reO64x%uncQN&Xt?ifWU2;_$?R%&ecvtr>O%M~yW2cU zMRI6v4rHs`T*Vw1#OCG_viQ6Q)1x4Oa008R3@e%IC(yzBP|}qIezmpDN!Z$9Ejwo_ zZM6KHl?4$Pw?3GZMl7rPy`r#&^Q%Q0VbA3{sOLsb$LV^2+Hyh-w8=kC=TD$2PUlYG zFfxzjjf!eXX>dnHhxuvNyzb#!qxRX~UP8YF5SQ2s-B-YB2zJ>YXY4LF>2u+1UEVI3Z zuSIcvE)1pEm|QE&#oFO`QOh_Vz>d42=zd1tkF#6C{UjSG^)&lX#!(}*gv#hs7TnM} zUVF;IUn#l@Me-szmvFxef!uG9ccgn}qihFS;y^!iq8A+z%swvgrgfFT*FN=LKa^`Ib*eG&^^Ug$w{^zXct{Nsn zDkp!$_}SIylqI(jeg1fFY)fN#abq3~Uuv9t z%-hbaAtbwnKWA9O7Y)lT7yF3nSx1IbRItdM4%(zVm4Gi1;p2DWGcaQ2TCE4QJG1kD%ka z(MMfa+5Ym})m;WPa<*T*5q?{Rndp9$XhFpmJbF0PxDE>Qn78_f?vaEp)PfrNkk|(` zAyN<8XotiIXFU4*>^o>$zg<5O>T#euAf-Ij6PJ?t$3fP_v~?4OQ@Jb&kfBu0rOhWG zW$Fm0xdS+~Q{!>SuPMi#6;~bapz+~;?*PFM@<#M}3+w^PBrU$suhDQn<<@SiWBGm7 z&2naCH*8q-RTE<2Lq+Gvwb4NT#PN}i>|%Y%54<6jtqc&oR0RPdOV%{sA68RRXZAGG z22Y%1AHF=&!QVt>PFx~qn!1IBaH}IMC09EM{2s|I7Hw+FBHHeyio97s-D6QmTV;@F zpmqg`?BHpwR;NO4G8yfbfMyOD-2^x8U>2K`h0?q5C3`%b*N(j%qf{#_ppu|}21UJG zcTd}iXF0}27rGz%2VJ#=-uVxD*A|+kbVwg}hBd1SV~mO7-z3AZ%3uHg^y0me zcV2B84cRp#mvYbyE0fq&j$$9@gTf1Dmu{mr3rcTa!4ehv!h(@6+HY~WB`?JMCIPKI zId(93HH%hQhI-(_9c*7p~-t)%q__O z`?4aHE*vxrtSyND8CoTO*yL&SBI|aGWsH5SemwCZK43ijK^5GoNDA;mf=tUD9P*1F zI9y(4lFH+@08h%cenvF?>2v!C+c{ZGe#B#7j004c!%14|&OJ;1Y|~ z=)*Q}i!KOPVBo4V`i6Q#_cju|l-}-oQ@Hn}ik^k;MZ+8{olWho_tbwtT ztvnV@aA_}GH67%O!MAKHW==k01q8|jL?XLj2%yRVO$;b9gkYauys>=@Tz{13pgDY z?-afEsyE;6EMq?F$y0U3C@-t7pK(f_L+?XijpHt`=PyW_+zUc*!A_dT`+8Dl5?%?1 zzYPF~1su&HQ>P?v9H#)UU2@~-ZPhR|y_WEqOy2j8U}SAURRdAozLFqjirui~HIYA!r5Bxz;_*t2RA#{GSwOsWP*ni$6OvFl zO^iIP^C2B?(sBLzA&Uj~YyGR8SkzRhW>YV8y;u}zsrjE?X2WBAwlh2o;=%k*FNws1 z05_LK;N88fNmb}>VkPiNz`>5EH<+qTD?F0)j_n--0ELkRwZ%A!1jshz<=RW4{0e zI=%Cta%Fkh!Fek?QsJE9MEOo;ixUs`^zz@edsyg!fTBI}K)sZ$e zON@oG``I7&xA!}H`a6GZ)7bbMaDR9Mw1dB4Qj2ob@u>C2aFQ3CvYeS{&6hXiHmaJT zgIg^hYX4@-ViN>sL4g9n4*+&4xW>w_6xu}YZ?Oe{!r>M ztVF+CvZRm%1Fff_pOpZ)dzMKiDhyfh1cE*iAE^cn?f^SP5*=|=7kbz_bnm&IcHMgd z3;F(vOGQ`z*M%pNkYZ04WI-59Q|ZkPd`=1r5RP#@LJQXmh8gKmUfDl-B^xjMM#=4HgV>?YR#vhiHaRw9Uv!?jmuYc+RYXAd$&v zL*KL*|9qxBa)a|b&>+-f5#<{w-H;~bIzf}vuwAJeDE;%F3)$>y{h%R+5o~%{cJ1Hk zeH-b9Uw6>rlZzKqar9uA7Ic?(9r$@?zCmgB6@AP2>xx^F+g>;T?7dgpFS_SLY0lJt zS=DS%-n;Wibl+ZTUR zEru&^LCIN!KCZJ8_x}>DRoFU?{J~v$L)WqU4|1Avu&!Sq{ecuV{t6j`Qok7f48`t zoHsZ*NQxR520Gr`Uh?10K-h=FO0 z+zEI+T!%iR>sft*kQJXmA*H0M_%H;$^e)KwNQ+x|tc6S7Q1PKKI+jK17Up&zI5Y@t zzdR-$?xa*RqHD;*ZL`++cQKP5OUw!FId@(odPrtu+TkQnb4eUpJ=^ZNt3ng{aws^j0CSDpCw|N4KF{(t3p4qgBN diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index ec736f47..2666e5cf 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -222,12 +222,12 @@ m65_scnkey_loop: jsr m65_scnkey_compare_with_old jsr m65_scnkey_add_if_new_valid - ; If we have more than one key - consider it jam + ; If we have more than one key - consider it a jam lda M65_KB_PRESSED_NEW+1 bpl m65_scnkey_jam - ; If we have exactly one new key - this is our key + ; If we have exactly one new key - this is our key to output ldy M65_KB_PRESSED_NEW+0 bpl m65_scnkey_got_key @@ -236,11 +236,11 @@ m65_scnkey_loop: ldy LSTX cpy M65_KB_PRESSED+0 - beq m65_scnkey_got_key_skip_cmp + beq m65_scnkey_try_repeat cpy M65_KB_PRESSED+1 - beq m65_scnkey_got_key_skip_cmp + beq m65_scnkey_try_repeat cpy M65_KB_PRESSED+2 - beq m65_scnkey_got_key_skip_cmp + beq m65_scnkey_try_repeat ; Nope, previous key is not pressed @@ -303,11 +303,6 @@ m65_scnkey_got_key: ; .Y should now contain the key offset in matrix pointed by cpy LSTX beq m65_scnkey_try_repeat ; branch if the same key as previously - - ; FALLTROUGH - -m65_scnkey_got_key_skip_cmp: - sty LSTX ; Reset key repeat counters @@ -378,7 +373,7 @@ m65_scnkey_no_keys: ; Mark no key press - lda #$48 + lda #$80 sta LSTX rts From 64c2def1404df5475a5a70696db9787bd726dd6e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 21:55:50 +0100 Subject: [PATCH 49/55] legacy keyboard code removed --- CONFIG.md | 8 +- STATUS.md | 2 +- src/,,config_custom.s | 1 - src/,,config_generic.s | 1 - src/,,config_generic_crt.s | 1 - src/,,config_mega65.s | 1 - src/,,config_testing.s | 1 - src/,,config_ultimate64.s | 1 - src/,,config_ultimate64_crt.s | 1 - src/aliases/,aliases_config.s | 8 - src/aliases/,aliases_ram_lowmem.s | 9 - src/kernal/,kernal_aliases.s | 23 - src/kernal/assets/programmable_keys.s | 14 +- src/kernal/init/cint_screen_keyboard.s | 24 - src/kernal/keyboard/eb48.scnkey_set_keytab.s | 9 - src/kernal/keyboard/kb_matrix_128.s | 6 +- src/kernal/keyboard/kb_matrix_alwaysrepeat.s | 4 +- src/kernal/keyboard/kb_matrix_bucky.s | 6 - src/kernal/keyboard/kb_matrix_bucky_filter.s | 4 - src/kernal/keyboard/kb_matrix_joy.s | 4 +- src/kernal/keyboard/kb_matrix_lookup.s | 4 - src/kernal/keyboard/kb_matrix_lookup_legacy.s | 31 -- src/kernal/keyboard/kb_matrix_row_keys.s | 5 - src/kernal/keyboard/kb_matrix_row_offsets.s | 4 - src/kernal/keyboard/keyboard_disconnect.s | 4 - src/kernal/keyboard/scnkey.s | 5 - src/kernal/keyboard/scnkey_128.s | 6 +- src/kernal/keyboard/scnkey_legacy.s | 519 ------------------ src/kernal/keyboard_m65/mega65_scnkey.s | 4 + 29 files changed, 16 insertions(+), 694 deletions(-) delete mode 100644 src/kernal/,kernal_aliases.s delete mode 100644 src/kernal/keyboard/kb_matrix_lookup_legacy.s delete mode 100644 src/kernal/keyboard/scnkey_legacy.s diff --git a/CONFIG.md b/CONFIG.md index 0f0a1f3f..12699fbf 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -197,12 +197,6 @@ Each of them needs a couple of bytes in KERNAL segment - but they can share some Original keyboard support routine is just horrible. It does nothing to prevent ghosting - press A+S+D at the same time - it prints F. Try to use joystick connected to control port 1 - it outputs phantom characters. The Open ROMs provides much more sophisticated routines to prevent such problems. -### `LEGACY_SCNKEY` - -Uses old Open ROMs keyboard scanning routine, which is basically the example routine by TWW/CTR, hacked to work within Kernal. It's greatest advantage is multi-key rollover, it's disadvantages - it's much less compatible (uses several bytes of memory which are normally free for user software - thus, it is considered legacy for now), does not support all the system variables (`RPTFLG` and `KEYLOG` are unsupported), and ignores the configuration options - this can be changed, but it requires some effort. - -Needs 30-250 more space in KERNAL segment (depending on the features enabled for current default routine). If unsure - disable. - ### `KEYBOARD_C128` Allows to use additional keys found on the C128 keyboard. @@ -235,7 +229,7 @@ Needs 13 bytes more space in KERNAL segment. Only disable if you are running out ### `JOY1_CURSOR` and `JOY2_CURSOR` -Joystick movement also moves the cursor. +Use joystick to move the cursor. On MEGA65 applies to legacy mode only (on native mode there is BASIC command available to set this option in runtime). Needs about 65 bytes of ROM space in KERNAL segment to handle both joysticks. diff --git a/STATUS.md b/STATUS.md index 28b0ab74..b68d16e2 100644 --- a/STATUS.md +++ b/STATUS.md @@ -4,7 +4,7 @@ Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md) during compilation): -* improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-key rollover), supports additional C128 keys +* improved keyboard scanning, resistant to ghosting and joystick interference, supports additional C128 keys * joystick can be used to move text cursor * pre-defined function keys diff --git a/src/,,config_custom.s b/src/,,config_custom.s index aa03a16c..b692a05f 100644 --- a/src/,,config_custom.s +++ b/src/,,config_custom.s @@ -76,7 +76,6 @@ ; --- Keyboard settings -;; #CONFIG# LEGACY_SCNKEY NO ;; #CONFIG# KEYBOARD_C128 NO ;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO ;; #CONFIG# KEY_REPEAT_DEFAULT NO diff --git a/src/,,config_generic.s b/src/,,config_generic.s index a2140f24..7eba194e 100644 --- a/src/,,config_generic.s +++ b/src/,,config_generic.s @@ -65,7 +65,6 @@ ; --- Keyboard settings -;; #CONFIG# LEGACY_SCNKEY NO ;; #CONFIG# KEYBOARD_C128 NO ;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO ;; #CONFIG# KEY_REPEAT_DEFAULT NO diff --git a/src/,,config_generic_crt.s b/src/,,config_generic_crt.s index a3e60896..37dc7deb 100644 --- a/src/,,config_generic_crt.s +++ b/src/,,config_generic_crt.s @@ -67,7 +67,6 @@ ; --- Keyboard settings -;; #CONFIG# LEGACY_SCNKEY NO ;; #CONFIG# KEYBOARD_C128 NO ;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO ;; #CONFIG# KEY_REPEAT_DEFAULT NO diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index ca8e5649..a14d3c59 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -45,7 +45,6 @@ ; --- Keyboard settings -;; #CONFIG# LEGACY_SCNKEY NO ;; #CONFIG# KEY_REPEAT_DEFAULT NO ;; #CONFIG# KEY_REPEAT_ALWAYS NO ;; #CONFIG# KEY_FAST_SCAN YES diff --git a/src/,,config_testing.s b/src/,,config_testing.s index dbeff3fc..17f271b4 100644 --- a/src/,,config_testing.s +++ b/src/,,config_testing.s @@ -65,7 +65,6 @@ ; --- Keyboard settings -;; #CONFIG# LEGACY_SCNKEY YES ;; #CONFIG# KEYBOARD_C128 NO ;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO ;; #CONFIG# KEY_REPEAT_DEFAULT NO diff --git a/src/,,config_ultimate64.s b/src/,,config_ultimate64.s index f729a50b..8a0b075d 100644 --- a/src/,,config_ultimate64.s +++ b/src/,,config_ultimate64.s @@ -55,7 +55,6 @@ ; --- Keyboard settings -;; #CONFIG# LEGACY_SCNKEY NO ;; #CONFIG# KEYBOARD_C128 NO ;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO ;; #CONFIG# KEY_REPEAT_DEFAULT NO diff --git a/src/,,config_ultimate64_crt.s b/src/,,config_ultimate64_crt.s index 48cb09e2..710d5077 100644 --- a/src/,,config_ultimate64_crt.s +++ b/src/,,config_ultimate64_crt.s @@ -57,7 +57,6 @@ ; --- Keyboard settings -;; #CONFIG# LEGACY_SCNKEY NO ;; #CONFIG# KEYBOARD_C128 NO ;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO ;; #CONFIG# KEY_REPEAT_DEFAULT NO diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index 598244ad..d334a0d8 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -227,17 +227,9 @@ ; Check that keyboard settings are correct -!ifdef CONFIG_LEGACY_SCNKEY { - !ifdef CONFIG_RS232_UP2400 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP2400" } - !ifdef CONFIG_RS232_UP9600 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP9600" } - !ifdef CONFIG_TAPE_NORMAL { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_TAPE_NORMAL" } - !ifdef CONFIG_KEYBOARD_C128 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128" } - !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" } -} !ifdef CONFIG_MB_M65 { !ifdef CONFIG_KEYBOARD_C128 { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128" } !ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" } - !ifdef CONFIG_LEGACY_SCNKEY { !error "MEGA65 motherboard is not compatible with CONFIG_LEGACY_SCNKEY" } } !ifdef CONFIG_MB_U64 { !ifdef CONFIG_KEYBOARD_C128 { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C128" } diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index e9491bc4..cc4d80ff 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -108,23 +108,17 @@ !addr CNTDN = $A5 ; -- NOT IMPLEMENTED -- !addr BUFPNT = $A6 ; -- NOT IMPLEMENTED -- !addr INBIT = $A7 ; temporary storage for tape / RS-232 received bits -!ifndef CONFIG_LEGACY_SCNKEY { !addr BITCI = $A8 ; -- NOT IMPLEMENTED -- !addr RINONE = $A9 ; -- WIP -- (UP9600 only) RS-232 check for start bit flag !addr RIDDATA = $AA ; -- NOT IMPLEMENTED -- !addr RIPRTY = $AB ; -- WIP -- checksum while reading tape -} !addr SAL = $AC ; $AC-$AD -- XXX: describe -- (implemented screen part) !addr EAL = $AE ; $AE-$AF -- XXX: describe -- [!] used also by screen editor, for temporary color storage when scrolling !addr CMP0 = $B0 ; $B0-$B1 temporary tape storage, [!] here used for BRK instruction address !addr TAPE1 = $B2 ; $B2-$B3 tape buffer pointer -!ifndef CONFIG_LEGACY_SCNKEY { !addr BITTS = $B4 ; -- NOT IMPLEMENTED -- -} !addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- [!] also used by tape routine to store CPU turbo settings -!ifndef CONFIG_LEGACY_SCNKEY { !addr RODATA = $B6 ; -- NOT IMPLEMENTED -- -} !addr FNLEN = $B7 ; current file name length !addr LA = $B8 ; current logical_file number !addr SA = $B9 ; current secondary address @@ -175,7 +169,6 @@ !addr BUF = $200 ; $200-$250, BASIC line editor input buffer (81 bytes) ; $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20 - ; and not used on C64 - they are used if CONFIG_LEGACY_SCNKEY is enabled. ; [!] XXX document $251-$258 usage !addr LAT = $259 ; $259-$262, logical file numbers (table, 10 bytes) @@ -197,14 +190,12 @@ !addr KEYLOG = $28F ; $28F-$290 routine to setup keyboard decoding !addr MODE = $291 ; flag, is case switch allowed !addr AUTODN = $292 ; -- NOT IMPLEMENTED -- screen scroll disable -!ifndef CONFIG_LEGACY_SCNKEY { !addr M51CRT = $293 ; -- NOT IMPLEMENTED -- mock 6551 !addr M51CDR = $294 ; -- NOT IMPLEMENTED -- mock 6551 !addr M51AJB = $295 ; $295-$296 -- NOT IMPLEMENTED -- mock 6551 !addr RSSTAT = $297 ; -- WIP -- (UP9600 only) mock 6551, RS-232 status !addr BITNUM = $298 ; -- NOT IMPLEMENTED -- !addr BAUDOF = $299 ; $299-$29A -- NOT IMPLEMENTED -- -} !addr RIDBE = $29B ; -- WIP -- write pointer into RS-232 receive buffer !addr RIDBS = $29C ; -- WIP -- read pointer into RS-232 receive buffer !addr RODBS = $29D ; -- WIP -- read pointer into RS-232 send buffer diff --git a/src/kernal/,kernal_aliases.s b/src/kernal/,kernal_aliases.s deleted file mode 100644 index 4140a5f5..00000000 --- a/src/kernal/,kernal_aliases.s +++ /dev/null @@ -1,23 +0,0 @@ - -; -; Aliases for legacy keyboard scan routine -; - -!ifdef CONFIG_LEGACY_SCNKEY { - - ; Low memory variables - - ; Reuse RS232 variables, since they should not be used by other things. - ; Carefully avoid $A7 which is used by 64NET - !addr KeyQuantity = $A8 ; 1 byte - !addr BufferNew = $A9 ; 3 bytes - !addr TempZP = $B6 ; 1 byte - ; These should be initialized in CINT to $FF - !addr BufferQuantity = $B4 ; 1 byte - !addr BufferOld = $293 ; 3 bytes - !addr Buffer = $297 ; 4 bytes - - ; $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20 - ; and not used on C64, so safe for us to use, probably. - !addr ScanResult = $250 ; 8 bytes -} diff --git a/src/kernal/assets/programmable_keys.s b/src/kernal/assets/programmable_keys.s index e5373114..e655f6fe 100644 --- a/src/kernal/assets/programmable_keys.s +++ b/src/kernal/assets/programmable_keys.s @@ -23,8 +23,6 @@ programmable_keys_codes: !ifdef CONFIG_KEYCMD_F7 { !byte KEY_F7 } !ifdef CONFIG_KEYCMD_F8 { !byte KEY_F8 } -!ifndef CONFIG_LEGACY_SCNKEY { - !ifdef CONFIG_KEYBOARD_C128 { !ifdef CONFIG_KEYCMD_HELP { !byte KEY_HELP } @@ -39,9 +37,7 @@ programmable_keys_codes: !ifdef CONFIG_KEYCMD_F12 { !byte KEY_F12 } !ifdef CONFIG_KEYCMD_F13 { !byte KEY_F13 } !ifdef CONFIG_KEYCMD_F14 { !byte KEY_F14 } - - -} } +} __programmable_keys_codes_end: @@ -69,8 +65,6 @@ __str_offset_F7: !ifdef CONFIG_KEYCMD_F7 { +CONFIG_KEYCMD_F7 __str_offset_F8: !ifdef CONFIG_KEYCMD_F8 { +CONFIG_KEYCMD_F8 !byte $00 } -!ifndef CONFIG_LEGACY_SCNKEY { - !ifdef CONFIG_KEYBOARD_C128 { __str_offset_HELP: !ifdef CONFIG_KEYCMD_HELP { +CONFIG_KEYCMD_HELP @@ -94,7 +88,7 @@ __str_offset_F13: !ifdef CONFIG_KEYCMD_F13 { +CONFIG_KEYCMD_F13 __str_offset_F14: !ifdef CONFIG_KEYCMD_F14 { +CONFIG_KEYCMD_F14 !byte $00 } -} } +} __programmable_keys_strings_end: @@ -117,8 +111,6 @@ programmable_keys_offsets: !ifdef CONFIG_KEYCMD_F7 { !byte __str_offset_F7 - programmable_keys_strings } !ifdef CONFIG_KEYCMD_F8 { !byte __str_offset_F8 - programmable_keys_strings } -!ifndef CONFIG_LEGACY_SCNKEY { - !ifdef CONFIG_KEYBOARD_C128 { !ifdef CONFIG_KEYCMD_HELP { !byte __str_offset_HELP - programmable_keys_strings } @@ -135,5 +127,3 @@ programmable_keys_offsets: !ifdef CONFIG_KEYCMD_F14 { !byte __str_offset_F14 - programmable_keys_strings } } } - -} diff --git a/src/kernal/init/cint_screen_keyboard.s b/src/kernal/init/cint_screen_keyboard.s index a03fa9a7..b85557ae 100644 --- a/src/kernal/init/cint_screen_keyboard.s +++ b/src/kernal/init/cint_screen_keyboard.s @@ -34,30 +34,6 @@ cint_screen_keyboard: sta RPTFLG } } - ; Set keyboard decode vector (Computes Mapping the 64 p215) - -!ifdef CONFIG_LEGACY_SCNKEY { - - ; Set initial variables for our improved keyboard scan routine - lda #$FF - ldx #6 -@1: - sta BufferOld,x - dex - bpl @1 - sta BufferQuantity - - ; Set key repeat delay (Computes Mapping the 64 p215) - ; Making some numbers up here: Repeat every ~1/10th sec - ; But require key to be held for ~1/3sec before - ; repeating (Computes Mapping the 64 p58) - - ; Not needed for default keyboard scanning code - - ldx #22-2 ; Fudge factor to match speed - stx DELAY -} - ; Set current colour for text (Computes Mapping the 64 p215) ldx #CONFIG_COLOR_TXT stx COLOR diff --git a/src/kernal/keyboard/eb48.scnkey_set_keytab.s b/src/kernal/keyboard/eb48.scnkey_set_keytab.s index 1bef2873..f81723d1 100644 --- a/src/kernal/keyboard/eb48.scnkey_set_keytab.s +++ b/src/kernal/keyboard/eb48.scnkey_set_keytab.s @@ -13,13 +13,6 @@ scnkey_set_keytab: -!ifdef CONFIG_LEGACY_SCNKEY { ; routine not compatible with legacy SCNKEY - - rts - -} else { - - ; Set initial KEYTAB value lda #__kb_matrix_shift ; left !byte >__kb_matrix_normal ; right -} } +} diff --git a/src/kernal/keyboard/kb_matrix_lookup.s b/src/kernal/keyboard/kb_matrix_lookup.s index 22a281ef..0840f6fa 100644 --- a/src/kernal/keyboard/kb_matrix_lookup.s +++ b/src/kernal/keyboard/kb_matrix_lookup.s @@ -12,8 +12,6 @@ ; -!ifndef CONFIG_LEGACY_SCNKEY { - kb_matrix_lookup: !ifndef SEGMENT_KERNAL_C { @@ -51,5 +49,3 @@ kb_matrix_lookup: !word $0000 ; %1.110 VENDOR+CTRL !word $0000 ; %1.111 SHIFT+VENDOR+CTRL } - -} diff --git a/src/kernal/keyboard/kb_matrix_lookup_legacy.s b/src/kernal/keyboard/kb_matrix_lookup_legacy.s deleted file mode 100644 index 1d1ddaa2..00000000 --- a/src/kernal/keyboard/kb_matrix_lookup_legacy.s +++ /dev/null @@ -1,31 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 * #IGNORE -;; #LAYOUT# * KERNAL_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Work out if normal, shifted, control or Vendor modified keyboard. -; Table contains the offsets into keyboard_matrixes that should be used -; for different values of the bottom 3 bits of key_bucky_state XXX -; Interaction is simple to work out when playing with a C64: -; CTRL trumps SHIFT or VENDOR -; VENDOR + SHIFT = DOES NOTHING -; All 3 does CONTROL -; - -; This lookup table is used by TWW/CTR keyboard routine only! - - -!ifdef CONFIG_LEGACY_SCNKEY { - -kb_matrix_lookup: - - !byte $00 ; Normal - !byte $40 ; Shifted - !byte $80 ; Control - !byte $80 ; Control + SHIFT - !byte $C0 ; Vendor - !byte $C0 ; Vendor + SHIFT - !byte $80 ; Vendor + CTRL - !byte $80 ; Vendor + CTRL + SHIFT -} diff --git a/src/kernal/keyboard/kb_matrix_row_keys.s b/src/kernal/keyboard/kb_matrix_row_keys.s index e74f02db..a550b83a 100644 --- a/src/kernal/keyboard/kb_matrix_row_keys.s +++ b/src/kernal/keyboard/kb_matrix_row_keys.s @@ -11,9 +11,6 @@ ; -!ifndef CONFIG_LEGACY_SCNKEY { - - kb_matrix_row_keys: ; - values for CIA1_PRA to connect only the given row @@ -28,5 +25,3 @@ kb_matrix_row_keys: !byte %11011111 !byte %10111111 !byte %01111111 - -} ; no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/kb_matrix_row_offsets.s b/src/kernal/keyboard/kb_matrix_row_offsets.s index 6a59df0d..39192b58 100644 --- a/src/kernal/keyboard/kb_matrix_row_offsets.s +++ b/src/kernal/keyboard/kb_matrix_row_offsets.s @@ -8,9 +8,6 @@ ; -!ifndef CONFIG_LEGACY_SCNKEY { - - kb_matrix_row_offsets: ; - offsets (in bytes) to the first bytes of keyboard matrix rows @@ -23,4 +20,3 @@ kb_matrix_row_offsets: !byte 5*8 !byte 6*8 !byte 7*8 -} diff --git a/src/kernal/keyboard/keyboard_disconnect.s b/src/kernal/keyboard/keyboard_disconnect.s index 416ed33a..b3b140ef 100644 --- a/src/kernal/keyboard/keyboard_disconnect.s +++ b/src/kernal/keyboard/keyboard_disconnect.s @@ -9,9 +9,6 @@ ; -!ifndef CONFIG_LEGACY_SCNKEY { - - keyboard_disconnect: ldx #$FF @@ -21,4 +18,3 @@ keyboard_disconnect: } rts -} diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index 68357223..677c4726 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -25,9 +25,6 @@ ; - RPTFLG - whether key repeat is allowed - -!ifndef CONFIG_LEGACY_SCNKEY { - ; Routine takes some ideas from TWW/CTR proposal, see here: ; - http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way @@ -434,5 +431,3 @@ scnkey_buffer_full: sta KOUNT rts - -} ; no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey_128.s b/src/kernal/keyboard/scnkey_128.s index 07b11b21..f2bcf90b 100644 --- a/src/kernal/keyboard/scnkey_128.s +++ b/src/kernal/keyboard/scnkey_128.s @@ -10,7 +10,7 @@ ; -!ifdef CONFIG_KEYBOARD_C128 { !ifndef CONFIG_LEGACY_SCNKEY { +!ifdef CONFIG_KEYBOARD_C128 { ; Inlining this within SCNKEY would both overcomplicate the implementation @@ -66,6 +66,4 @@ scnkey_128_no_keys: pla jmp scnkey_no_keys ; pass controll to original routine - - -} } ; CONFIG_KEYBOARD_C128 and no CONFIG_LEGACY_SCNKEY +} diff --git a/src/kernal/keyboard/scnkey_legacy.s b/src/kernal/keyboard/scnkey_legacy.s deleted file mode 100644 index b1bb9d41..00000000 --- a/src/kernal/keyboard/scnkey_legacy.s +++ /dev/null @@ -1,519 +0,0 @@ -;; #LAYOUT# STD * #TAKE -;; #LAYOUT# X16 * #IGNORE -;; #LAYOUT# * KERNAL_0 #TAKE -;; #LAYOUT# * * #IGNORE - -; -; Official Kernal routine, described in: -; -; - [RG64] C64 Programmers Reference Guide - page 295 -; - [CM64] Computes Mapping the Commodore 64 - page 220 -; -; CPU registers that has to be preserved (see [RG64]): none -; - - -; NOTE: The code here is described as legacy, because the algorithm (although working very well) -; requires much more RAM than the original Kernal routine uses; without any form of extended -; RAM available to Open ROMs it will always be a serious compatibility risk. - - -!ifdef CONFIG_LEGACY_SCNKEY { - - -; Scan the keyboard.. -; Here we don't use the horrible buggy original routine, -; not just because of copyright. Instead, we use the -; nice one with joystick interference removal and -; key roll-over support from -; http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way - -; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -; Keyboard IO Routine -; ~~~~~~~~~~~~~~~~~~~ -; By: TWW/CTR - - -; Information -; ~~~~~~~~~~~ -; The routine uses "2 Key rollower" or up to 3 if the key-combination doesen't induce shadowing. -; If 2 or 3 keys are pressed simultaneously (within 1 scan) a "No Activity" state has to occur before new valid keys are returned. -; RESTORE is not detectable and must be handled by NMI IRQ. -; SHIFT LOCK is not detected due to unreliability. - - -; History: -; ~~~~~~~~ -; V3.0 - Hacked to pieces by PGS to work as KERNAL keyboard scan routine -; V2.5 - New test tool. -; Added return of error codes. -; Fixed a bug causing Buffer Overflow. -; Fixed a bug in Non Alphanumerical Flags from 2.0. -; V2.1 - Shortened the source by adding .for loops & Updated the header and some comments. -; Added "simultaneous keypress" check. -; V2.0 - Added return of non-Alphanumeric keys into X & Y-Registers. -; Small optimizations here and there. -; V1.1 - Unrolled code to make it faster and optimized other parts of it. -; Removed SHIFT LOCK scanning. -; V1.0 - First Working Version along with test tool. - -; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ - - - - ; Operational Variables - !set MaxKeyRollover = 3 - -SCNKEY: - - lda #$00 - sta BufferQuantity - - ; Decrement key repeat timeout if non-zero - ldx KOUNT - beq sk_start - dec KOUNT - -sk_start: - ; Call main keyboard scanning routine - jsr Main - - lda BufferQuantity - beq no_keys_waiting - - ; Stuff each key pressed into the keyboard buffer - - ldy #$00 -@1: - lda Buffer,y - jsr accept_key - iny - cpy BufferQuantity - bne @1 -no_keys_waiting: - - rts - -accept_key: - ; Work out what is new and needs to be added - ; to the input buffer. - ; Also update the bucky key status flags etc - cmp #$ff - beq sk_nokey - ; Got a key, turn it from matrix position to key value, - ; and stuff it in the keyboard buffer - - ; Convert matrix position to key code - ; XXX - Add offset of $40, $80 or $C0 if shift, CONTROL or C= are held down - pha - lda SHFLAG - and #$7 - tax - pla - and #$3f - ora kb_matrix_lookup,x - tax - lda kb_matrix,x - ; But don't insert $00 characters - beq sk_nokey - - ; Stash key into keyboard buffer - ldx NDX - cpx XMAX - beq sk_nokey - sta KEYD,x - inc NDX - -sk_nokey: - - rts - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Routine for Scanning a Matrix Row - -KeyInRow: - ldy #7 -NextKeyInRow: - ror - bcs nokey - jsr KeyFound -nokey: - inx - dey - bpl NextKeyInRow - - rts - - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Routine for handling: Key Found - -KeyFound: - stx TempZP - dec KeyQuantity - bmi OverFlow - - ; Originally, we resolved the keys. - ; Now we just return the matrix position, so that - ; we can do C64-style bucky modifications as normal - ; was: ldy KeyTable,x - pha - txa - - ldx KeyQuantity - sta BufferNew,x - pla - ldx TempZP - rts - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Routine for handling: Overflow - -OverFlow: - pla ; Dirty hack to handle 2 layers of JSR - pla - pla - pla - ; Don't manipulate last legal buffer as the routine will fix itself once it gets valid input again. - -ReturnNoKeys: - sec - lda #$00 - sta BufferQuantity - lda #$FF - sta LSTX - ldx #MaxKeyRollover-1 -@2: - sta Buffer,x - sta BufferOld,x - dex - bpl @2 - - rts - - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Exit Routine for: No Activity - -NoActivityDetected: - - ; So cancel all bucky keys - lda SHFLAG - sta LSTSHF - lda #$00 - sta SHFLAG - - jmp ReturnNoKeys - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Configure Data Direction Registers -Main: - ; Begin with no key events - lda #$ff - sta BufferNew+0 - sta BufferNew+1 - sta BufferNew+2 - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Check for Port Activity - - ldx #$FF - ldy #$00 - - sty CIA1_PRA ; Connect all Keyboard Rows - cpx CIA1_PRB - bne skip0 - - jmp NoActivityDetected - -JoystickActivity: - - ; Clear bucky key status - lda #$00 - sta SHFLAG - - lda CIA1_PRB - and #$03 - cmp #$01 - bne @3 - ; down - ldx #$07 ; UP/DOWN - jsr KeyFound -@3: - cmp #$02 - bne @4 - ; Up - ; Mark shift as pressed - ldx #$01 - stx SHFLAG - ldx #$07 ; UP/DOWN - jsr KeyFound -@4: - ; Only allow up/down OR left/right, since - ; else we have confusing situation with SHIFT required - ; for one, but not the other. - ; XXX - We could fix this by making the joystick activity - ; feed the key input at a higher level, rather than - ; simulating directly pressing the cursor keys. - cmp #$03 - beq @5 - jmp skdone -@5: - lda CIA1_PRB - and #$0c - cmp #$04 - bne @6 - ldx #$02 - jsr KeyFound ; LEFT/RIGHT -@6: - cmp #$08 - bne @7 - ldx #$01 - stx SHFLAG - ldx #$02 - jsr KeyFound ; LEFT/RIGHT -@7: - jmp skdone - - -skip0: - - ; ; Set max keys allowed before ignoring result - lda #MaxKeyRollover - sta KeyQuantity - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Check for Control Port #1 Activity - - stx CIA1_PRA ; Disconnect all Keyboard Rows - cpx CIA1_PRB ; Only Control Port activity will be detected - bne JoystickActivity - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Scan Keyboard Matrix - - ldx #7 - lda #%11111110 -next_row: - sta CIA1_PRA - pha - lda CIA1_PRB - sta ScanResult,x - pla - sec - rol - dex - bpl next_row - - ; X gets back to $FF here, which is assumed below - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Check for Control Port #1 Activity (again) - - stx CIA1_PRA ; Disconnect all Keyboard Rows - cpx CIA1_PRB ; Only Control Port activity will be detected - beq @8 - jmp ReturnNoKeys -@8: - ; Make X = $00, assumed below - inx - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Check and flag Non Alphanumeric Keys - - ; Store de-bounce data for bucky keys - ; (Compute's Mapping the 64, p58-59) - lda SHFLAG - sta LSTSHF - - ; Build bucky state - lda #$00 - sta SHFLAG - lda ScanResult+6 - eor #%10000000 - and #%10000000 ; Left shift - rol - rol - and #$01 - ora SHFLAG - sta SHFLAG - - ; Right shift - lda ScanResult+1 - eor #$10 - lsr - lsr - lsr - lsr - and #$01 - ora SHFLAG - sta SHFLAG - - ; Control - lda ScanResult+0 - eor #$04 - and #$04 - ora SHFLAG - sta SHFLAG - - ; Vendor key - lda ScanResult+0 - eor #$ff - lsr - lsr - lsr - lsr - and #$02 - ora SHFLAG - sta SHFLAG - - ; Handle SHIFT + VENDOR - jsr scnkey_toggle_if_needed - -no_case_toggle: - - ; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; ; Check for pressed key(s) - - lda ScanResult+7 - cmp #$ff - beq sk6 - jsr KeyInRow -sk6: - ldx #8 - lda ScanResult+6 - beq sk5 - jsr KeyInRow -sk5: - ldx #16 - lda ScanResult+5 - beq sk4 - jsr KeyInRow -sk4: - ldx #24 - lda ScanResult+4 - beq sk3 - jsr KeyInRow -sk3: - ldx #32 - lda ScanResult+3 - beq sk2 - jsr KeyInRow -sk2: - ldx #40 - lda ScanResult+2 - beq sk1 - jsr KeyInRow -sk1: - ldx #48 - lda ScanResult+1 - beq sk0 - jsr KeyInRow -sk0: - ldx #56 - lda ScanResult+0 - beq skdone - jsr KeyInRow -skdone: - - - - ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ; Key Scan Completed - - ; Put any new key (not in old scan) into buffer - ldx #MaxKeyRollover-1 - -ProcessPressedKeys: - - ; Check if the currently pressed key is continuing to be held down - lda BufferNew,x - cmp #$ff - beq ConsiderNextKey - cmp BufferOld - beq KeyHeld - cmp BufferOld+1 - beq KeyHeld - cmp BufferOld+2 - beq KeyHeld - -RecordKeypress: - - ; New Key Detected - ldy BufferQuantity - cpy #MaxKeyRollover - bcc @9 - jmp ReturnNoKeys ; too many new keys -@9: -AcceptKeyEvent: - sta Buffer,y - iny - sty BufferQuantity - -ConsiderNextKey: - dex - bpl ProcessPressedKeys - - ; Copy new presses to old list - ldx #MaxKeyRollover-1 -@10: - lda BufferNew,x - sta BufferOld,x - dex - bpl @10 - - ; Return success and set of pressed keys - clc - rts - -KeyHeld: - ; The key in A is still held down. - ; compare with key in LSTX - ; (Compute's Mapping the 64 p36-37) - ; if different, reset repeat count down. - - ; Ignore bucky keys, so that repeat can work when a - ; bucky is held down. - cmp #15 - beq BuckyHeld - cmp #52 - beq BuckyHeld - cmp #58 - beq BuckyHeld - cmp #61 - beq BuckyHeld - - cmp LSTX - beq SameKeyHeld - - ; Different key held - sta LSTX - pha - lda DELAY - sta KOUNT - pla -BuckyHeld: - jmp ConsiderNextKey - -SameKeyHeld: - pha - lda KOUNT - bmi KeyCanRepeat - bne KeyRepeatWait - ; Count down ended, so repeat key now -KeyCanRepeat: - - ; (Compute's Mapping the 64 p58) - pha - lda #6-2 ; Fudge factor to match speed - sta KOUNT - pla - pla - - jmp RecordKeypress -KeyRepeatWait: - pla - jmp ConsiderNextKey - - -} ; CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard_m65/mega65_scnkey.s b/src/kernal/keyboard_m65/mega65_scnkey.s index 2666e5cf..e4eeaaf5 100644 --- a/src/kernal/keyboard_m65/mega65_scnkey.s +++ b/src/kernal/keyboard_m65/mega65_scnkey.s @@ -2,6 +2,10 @@ ;; #LAYOUT# * * #IGNORE +; Routine takes many ideas from TWW/CTR proposal, see here: +; - http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way + + m65_scnkey: ; Initialize work variables for scanning the keyboard From da11de3729b07adb0c0813e4a8b332034d97a525 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 22:21:05 +0100 Subject: [PATCH 50/55] implemented WAIT command --- src/basic/basic_commands/cmd__unimplemented.s | 2 - src/basic/basic_commands/cmd_poke.s | 1 - src/basic/basic_commands/cmd_wait.s | 62 +++++++++++++++++++ .../basic_commands/helper_eggshell_m65.s | 19 ++++++ .../board_m65/4000.mega65_vectable_basic_1.s | 4 +- 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/basic/basic_commands/cmd_wait.s create mode 100644 src/basic/basic_commands/helper_eggshell_m65.s diff --git a/src/basic/basic_commands/cmd__unimplemented.s b/src/basic/basic_commands/cmd__unimplemented.s index 8263485e..c08bf0e9 100644 --- a/src/basic/basic_commands/cmd__unimplemented.s +++ b/src/basic/basic_commands/cmd__unimplemented.s @@ -27,8 +27,6 @@ cmd_return: +nop cmd_on: +nop -cmd_wait: - +nop cmd_def: +nop cmd_printhash: diff --git a/src/basic/basic_commands/cmd_poke.s b/src/basic/basic_commands/cmd_poke.s index 40663a9c..9e8164fc 100644 --- a/src/basic/basic_commands/cmd_poke.s +++ b/src/basic/basic_commands/cmd_poke.s @@ -5,7 +5,6 @@ cmd_poke: - ; Fetch address, store it on the stack jsr fetch_uint16 diff --git a/src/basic/basic_commands/cmd_wait.s b/src/basic/basic_commands/cmd_wait.s new file mode 100644 index 00000000..db9a1071 --- /dev/null +++ b/src/basic/basic_commands/cmd_wait.s @@ -0,0 +1,62 @@ +;; #LAYOUT# STD * #TAKE +;; #LAYOUT# * BASIC_0 #TAKE +;; #LAYOUT# * * #IGNORE + + +cmd_wait: + + ; Fetch address, store it on the stack + + jsr fetch_uint16 + +bcs do_SYNTAX_error + + lda LINNUM+0 + pha + lda LINNUM+1 + pha + + ; Fetch 1st value, store it on the stack + + jsr fetch_coma_uint8 + +bcs do_SYNTAX_error + pha + + ; Fetch 2nd value + + jsr fetch_coma_uint8 + bcc @1 + lda #$00 +@1: + + ; Put all the values into work area + + sta INDEX+3 + pla + sta INDEX+2 + pla + sta INDEX+1 + pla + sta INDEX+0 + +!ifdef CONFIG_MB_M65 { + + jsr helper_eggshell +} + + ldy #$00 + ; FALLTROUGH + +cmd_wait_loop: + + ; Wait for the congition to be met - see https://www.c64-wiki.com/wiki/WAIT + + lda (INDEX), y + eor INDEX+3 + and INDEX+2 + beq cmd_wait_loop + + ; FALLTROUGH + +cmd_wait_end: + + rts diff --git a/src/basic/basic_commands/helper_eggshell_m65.s b/src/basic/basic_commands/helper_eggshell_m65.s new file mode 100644 index 00000000..ae0fc376 --- /dev/null +++ b/src/basic/basic_commands/helper_eggshell_m65.s @@ -0,0 +1,19 @@ +;; #LAYOUT# M65 BASIC_0 #TAKE +;; #LAYOUT# M65 BASIC_1 #TAKE +;; #LAYOUT# * * #IGNORE + + +helper_eggshell: + +!ifdef SEGMENT_M65_BASIC_0 { + + jsr map_BASIC_1 + jsr (VB1__helper_eggshell) + jmp map_NORMAL + +} else { + + ; XXX implement till Easter + + rts +} diff --git a/src/basic/board_m65/4000.mega65_vectable_basic_1.s b/src/basic/board_m65/4000.mega65_vectable_basic_1.s index e24b38c0..1962d456 100644 --- a/src/basic/board_m65/4000.mega65_vectable_basic_1.s +++ b/src/basic/board_m65/4000.mega65_vectable_basic_1.s @@ -26,9 +26,10 @@ !addr VB1__cmd_sysinfo = $4000 + 2 * 11 !addr VB1__prepare_direct_execution = $4000 + 2 * 12 !addr VB1__helper_ask_if_sure = $4000 + 2 * 13 + !addr VB1__helper_eggshell = $4000 + 2 * 14 !ifdef CONFIG_DOS_WEDGE { - !addr VB1__wedge_dos = $4000 + 2 * 14 + !addr VB1__wedge_dos = $4000 + 2 * 15 } } else { @@ -49,6 +50,7 @@ !word cmd_sysinfo !word prepare_direct_execution !word helper_ask_if_sure + !word helper_eggshell !ifdef CONFIG_DOS_WEDGE { !word wedge_dos From 3979a93cbbc69b499ea0eba57df328645469c10b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 23:18:11 +0100 Subject: [PATCH 51/55] disabled JiffyDOS on MEGA65 (unstable), added alternatiove kernal wait implementation --- src/,,config_mega65.s | 4 ++-- src/kernal/iec/iec_wait1ms.s | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index a14d3c59..f105434d 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -29,8 +29,8 @@ ;; #CONFIG# IEC YES ;; #CONFIG# IEC_DOLPHINDOS NO ;; #CONFIG# IEC_DOLPHINDOS_FAST NO -;; #CONFIG# IEC_JIFFYDOS YES -;; #CONFIG# IEC_JIFFYDOS_BLANK YES +;; #CONFIG# IEC_JIFFYDOS NO ; fastloaders do not work on MEGA65 yet! +;; #CONFIG# IEC_JIFFYDOS_BLANK NO ;; #CONFIG# IEC_BURST_M65 NO ; please keep disabled for now diff --git a/src/kernal/iec/iec_wait1ms.s b/src/kernal/iec/iec_wait1ms.s index 4412d0f4..254fbdda 100644 --- a/src/kernal/iec/iec_wait1ms.s +++ b/src/kernal/iec/iec_wait1ms.s @@ -34,6 +34,22 @@ wait_x_bars: ; additional entry point for delay in screen and tape support dex bne @1 + ; Alternative implementation, using CIA#1 timer B + +; lda #%00001000 ; stop timer B, load latch once +; sta CIA1_CRB + +; lda #$40 +; sta CIA1_TIMBLO ; timer B - low byte +; stx CIA1_TIMBHI ; timer B - high byte + +; lda #%00001001 ; start timer B, load latch once +; sta CIA1_CRB +;@1: +; lda CIA1_ICR +; and #%00000010 +; beq @1 + ; FALLTROUGH iec_wait_rts: ; dummy RTS, for very short waits From 051dd41f54055b0365651468b8d37e9afea4167b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 4 Dec 2020 23:27:32 +0100 Subject: [PATCH 52/55] minor usability improvement --- src/basic/basic_commands_01/helper_ask_if_sure.s | 1 + 1 file changed, 1 insertion(+) diff --git a/src/basic/basic_commands_01/helper_ask_if_sure.s b/src/basic/basic_commands_01/helper_ask_if_sure.s index 5c5f456a..8ab34bb7 100644 --- a/src/basic/basic_commands_01/helper_ask_if_sure.s +++ b/src/basic/basic_commands_01/helper_ask_if_sure.s @@ -55,6 +55,7 @@ helper_ask_if_sure: ; Check if 'Y' + and #%01111111 ; allow 'Y' + SHIFT (or CAPS LOCK) too cmp #$59 beq @2 From f382aae65b5c0d752a5c006eda9710ac8a5ab972 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 5 Dec 2020 14:35:11 +0100 Subject: [PATCH 53/55] fixed bug with BASIC line numbers starting from digit '9' --- src/basic/engine_editor/shell.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/engine_editor/shell.s b/src/basic/engine_editor/shell.s index 98e80875..79372fcd 100644 --- a/src/basic/engine_editor/shell.s +++ b/src/basic/engine_editor/shell.s @@ -121,7 +121,7 @@ shell_process_line: lda BUF cmp #$30 bcc shell_execute_line - cmp #$39 + cmp #$3A bcs shell_execute_line ; Yes, the line begins with a number - parse it and check validity From 7bed1029c49dcf2cba62bc79e53191c6ddf8a15b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 5 Dec 2020 19:11:15 +0100 Subject: [PATCH 54/55] visual improvements --- .../basic_commands/helper_eggshell_m65.s | 114 +++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/src/basic/basic_commands/helper_eggshell_m65.s b/src/basic/basic_commands/helper_eggshell_m65.s index ae0fc376..19251f54 100644 --- a/src/basic/basic_commands/helper_eggshell_m65.s +++ b/src/basic/basic_commands/helper_eggshell_m65.s @@ -13,7 +13,119 @@ helper_eggshell: } else { - ; XXX implement till Easter + ; Make sure this is direct mode + + ldx CURLIN+1 + inx + bne helper_eggshell_end + + ; Make sure this is native mode + + jsr M65_MODEGET + bcs helper_eggshell_end + + ; Make sure screen mode is 80x50 characters and it is the output device + + jsr JSCREEN + cpy #50 + bne helper_eggshell_end + cpx #80 + bne helper_eggshell_end + + lda DFLTO + cmp #$03 + bne helper_eggshell_end + + ; Check key values + + ldx #$03 +@1: + lda INDEX, x + cmp helper_eggshell_key, x + bne helper_eggshell_end + dex + bpl @1 + + ; FALLTROUGH + +helper_eggshell_prepare: + + ; Enforce lowercase mode + + lda MODE + pha + lda #$FF + sta MODE + + lda VIC_CHARPTR+1 + pha + ora #%00001000 + sta VIC_CHARPTR+1 + + ; FALLTROUGH + +helper_eggshell_effect: + + ldy #$00 +@1: + lda helper_eggshell_content, y + eor #$65 + beq helper_eggshell_wait + jsr JCHROUT + iny + bra @1 + + ; FALLTROUGH + +helper_eggshell_wait: + + ; Wait for a key + + lda #$00 + sta NDX +@1: + ldx NDX + beq @1 + sta NDX + + ; FALLTROUGH + +helper_eggshell_restore: + + ; Clear screen, restore mode + + lda #147 + jsr JCHROUT + + pla + sta VIC_CHARPTR+1 + + pla + sta MODE + + ; FALLTROUGH + +helper_eggshell_end: rts + +helper_eggshell_key: + + !byte <6502, >6502, 65, 0 + +helper_eggshell_content: + + !byte $93 XOR $65 + + !byte $0D XOR $65, $0D XOR $65, $0D XOR $65, $0D XOR $65 + !byte $12 XOR $65, $20 XOR $65 + !byte $D4 XOR $65, $48 XOR $65, $45 XOR $65, $20 XOR $65, $CF XOR $65, $50 XOR $65, $45 XOR $65, $4E XOR $65 + !byte $20 XOR $65, $D2 XOR $65, $CF XOR $65, $CD XOR $65, $53 XOR $65, $20 XOR $65, $50 XOR $65, $52 XOR $65 + !byte $4F XOR $65, $4A XOR $65, $45 XOR $65, $43 XOR $65, $54 XOR $65, $20 XOR $65, $4E XOR $65, $45 XOR $65 + !byte $45 XOR $65, $44 XOR $65, $53 XOR $65, $20 XOR $65, $D9 XOR $65, $CF XOR $65, $D5 XOR $65, $D2 XOR $65 + !byte $20 XOR $65, $43 XOR $65, $4F XOR $65, $4E XOR $65, $54 XOR $65, $52 XOR $65, $49 XOR $65, $42 XOR $65 + !byte $55 XOR $65, $54 XOR $65, $49 XOR $65, $4F XOR $65, $4E XOR $65, $21 XOR $65 + !byte $20 XOR $65 + + !byte $00 XOR $65 } From 6223f90e9c55f11076e599984504a8e9aaa9a326 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 6 Dec 2020 15:32:09 +0100 Subject: [PATCH 55/55] explained more similarities >3, updated binaries --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_generic_crt.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/extrom_generic_crt.crt | Bin 32896 -> 32896 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_generic_crt.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_orfont.rom | Bin 131072 -> 131072 bytes strings/00911460 | 3 +++ strings/11D009108D11D0 | 4 ++++ strings/20D7F7A9 | 3 +++ strings/8564A563 | 3 +++ strings/8565A564 | 3 +++ strings/867060A561F0 | 3 +++ strings/9002A900 | 3 +++ strings/9D0001E8 | 4 ++++ strings/A000B122 | 3 +++ strings/A56BE56385 | 3 +++ strings/A56CE56485 | 3 +++ strings/A90060A5 | 3 +++ strings/A9488D8F02A9EB8D9002A9 | 3 +++ strings/BAA9008526852785288529 | 3 +++ strings/EDA00020 | 3 +++ strings/EEAD00DD09 | 3 +++ strings/FAAD01DD | 3 +++ strings/FCA97F8D0D | 3 +++ 27 files changed, 56 insertions(+) create mode 100644 strings/00911460 create mode 100644 strings/11D009108D11D0 create mode 100644 strings/20D7F7A9 create mode 100644 strings/8564A563 create mode 100644 strings/8565A564 create mode 100644 strings/867060A561F0 create mode 100644 strings/9002A900 create mode 100644 strings/9D0001E8 create mode 100644 strings/A000B122 create mode 100644 strings/A56BE56385 create mode 100644 strings/A56CE56485 create mode 100644 strings/A90060A5 create mode 100644 strings/A9488D8F02A9EB8D9002A9 create mode 100644 strings/BAA9008526852785288529 create mode 100644 strings/EDA00020 create mode 100644 strings/EEAD00DD09 create mode 100644 strings/FAAD01DD create mode 100644 strings/FCA97F8D0D diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 1a157f0403880b2d2e58c831cb3781b24bd56641..b1f5d2b784b4a37a3bd8e88b05feddcddd980e21 100644 GIT binary patch delta 1445 zcmZWpdu&rx7{8Bp-MX&rSb@FD4(tVj2-}cR!~s%vh1-OOiZe0XA&XsRfIpBZ$SZJR zvPDY1EK#DS_jae_Zr$3^3Tff;2%_tZSZ0iw4_MjQ#>*5m83f}zZTy48lY74JJLkLS zoZt7I-}w$KKd?ODpzUr7HOEJH$C%MQLd)=>_K$FW$4JMKp5qaG4(*Zxv=Ck3(noDV zbcKtJ?h&d5WIvA_68WNhg5`hkqIeJ<(cBA27()B~QCp1Vp*>0wb*G)UaX{OfFv)4C zE{uCo)>9lHg0J$y4Qn23V76J&z=Ui?8^hQZolF>HP4Y*ZcL`b_;wyacw{8YpWKjKP8k1ZUY%AqS#YLqehZ>9Zm-F&q=a#o^Db8F3F`Oc&i1`o=j<@6wr&SQx-UNdrj`laGmrS#WtHK+?sF$ zG^Uk7e)=AZLn52*Ciu#fXbDkv1#JfiV%@j-eh zQ|!X7#3eK~Nyfg6g@!f>*CScNjYPnmj6z$Rl#6$ucRP{S<6=h3aKkh9)@ST@p0T&2 zY^c#c*5lRDS7RD%kG=++#cm#$aI>f_&NUO!=|t?<8~F884s8xQPw_Xq`pBv%)tO-Wg=Rj>2ehG_UIlXu)yDl2+H$6wVhA^1 ziP~VhVZro=GP2ylx~u647WH=UD}98ggoqF`Jx6bXr>0gb-_uR&w~m|JXQO2@ABZay zhc1U*DGoc}TviQX#M7*~M3x(8GHX4s##o|n^l;&~NGHP&j7^0*uyhzpaq7}Fz9P+`P%ye9~eoC3Jc z=8+@su~zsgXEB39V6-fSR?8dHGvvTbH-&3YRQ6%+L?t=)%Q(uA;fVz?9)GZ4Y7?C` z=If^EghOc&7b$@tOnZ~2XTbgGN11LJ-p_r=wzvb(n75!{lbpP%*!R7Q<|HCqA5o^< zy%c@2Q{4oiyki7FO@7OiUnE3DP$foF&UTyAFh zs|qd?>(R7}s7*pEyI@1XAx*!`{|ti#C8%4*TL#t6m=@O$O5Fk?j-x$zuDA@(6JHki zey|p9qa)B-c$nS^+173QmEUjN9EzX4^$53l^M*&l$8Xntp`IL_9NRbk-Q=Cf-Fx>R zJh*o44_QsN9#sv6&P7ypSXRA}TM_l9dQlw?t6ve{Mb+z7c~W&wdvhCV#afbkP7vW&m`u)%C9RxWT#6Nfi)GBu8Nf@IDy*IYn*G3xFiNqBq~k;3t{`2g()d-evS sKZxty)QMX3V~E#`Kz5OXei1eom60SKDSFRX;j31t+p|w48TxJfU#V$;d;kCd delta 1386 zcmYjReN0nV6o2=<)?$GIQlWgwb+W>yGe~hF&W~*(PkkofG})FcKAdJXZt6cvj84U{ zC&ao~JaIa+EqyJw_0duat+*CDa1O_FQL9E5GpAMrbel;vGiYYk-SU?&_nvd^y*b~% z^O~16FAJ!8VyLRY-8cWjDU!f+L8B$0(2G zeDDgp4KA>|bcT=<2_J-ECpQ;<a!ffw)VR%;W_RVJ~#Q}OW1eei0^sDYTKw1o4Kh0-EYE4_uQ;$*RQ zNsJRXA67GB~t{*y}-OC9vxDd@aH?qmPPpRcQ~G6z4K%S-0j*MmdVZ7^N?+$C z_QW6_Ptvn*>b#7nGHJrBlWd^`9!@Q;eJY#C4*W?ccDQKU%w+RR@}`&Mk6)5EPRg)U z{|xM`DbElRkPly-aB%o&oNuF~(~1r7b$TfZLSOo-s_R}WzM34Sp>6kyR;zH%i=TM! za)IBE^LRtpdQ$LvhpCpzbSBsfVw-Tw3so8AC>K7=s4?7;@y5O`hNYl+S6v8>jLQ6R zCpO+Ax}mfLhkHCij*kL}Rt{WQtJ#(=NM!A0V?NlCT~HeH3H~mm-}E56qXK{C6asOD z;qlq9eG+Ci=+9i5f=}jbO3Mv1Sywl#GL-4hcJtw0y6JJJVQX=RbIeHbJw3(=7u>|i zlj-~*lNdk9<31lG4g0C`{;VS1EN6g~!Xm8Z-hlCp*HJ4>%RICgukcKIBN^GVlmM?J zdGa3bWFFuSC$&SZQBzN-sXatV3fBUZ<1Rn-^z1aIK&zb5j9kz&W39mzBux&cy&hi+ z37Y#ra^@fuyqa?bRgs1m5-}g9lNHnBW3s|Z4Z<<`e1nNJ(s690eO*f$sBYu&;r2$l zL@*f_uzv)h(YOfSNnZ|M8Q16Ejs|8r7*gME876$Yg^u<2aeO-p&yASv^975hZ$+80 z?kW-unm{;qUxb_Js#NH$CPi98uU(P+8RKO!Yf5iz2Qv|DA$ZyuckKh3GJ;!$>t|AQnrlXzBy)g0Urx%iIbld4 zW~mA14dACTUKxV5MJ<{^r?4Gv7M0-_9C*?uQFp-);qaT0{_mnE&LpFIfBZE$5E(rC)1z~j zF8%D4Q=eZBghKrhSstP1$i0YsM;?$z!tyElHXys*vOv+_>o#q!m+EPqc~O)aYKUc& z{sn3H)ud{uI)OwoZ^$BE)H1HA%&p*&>|6vnrE5?%Y$!F;S{x|-)PQ_73Nu=9G6m9K G;{O96W@F3% diff --git a/bin/basic_generic_crt.rom b/bin/basic_generic_crt.rom index b2c1ee345324df965dbaa86ec422320b40b30cad..6a7ebf068424a96f05dda5fb76fc1780dc1739b6 100644 GIT binary patch delta 2445 zcmZWreNa@_6@ToqyX>-jh%hW4;&oXNL=b}}D@G%uz%z5(Xtgt>I^#oKXVqkqIyTdR zw2+CnH5ik{+gO{V9fojsdHW%6VGqE^{G#z^0qJMPy zX7}B5&wcOS-~Ij0IrlYhY2G5G#?w7XTj{R&waMt%U1V;??z@_iN6*Cj4IIbmSJEoO zs;1`|*)Pqs*bbMYzb>3i{f8j18hN`C&#L9!0@~f@i4z>wR6SnnLmzt;J^p(b{enR| zGJrzop`GnxrKFaX5uWjv$`vE4y|hM6M{|>kNz|d?uuTw6(BMy*lU3YU%d>Sio>3Cq zvPp`^pL^Z(wxL+}AWAcgeA1bo-*NhrssC<^@B2d!Jz`w$*c`;YldQx!6Gs}@>KTqS zYUt!A==^HR7pa?R*jPY^jq&tv#vI+L33}gnKsOwwb*8Oa^LrETxcz?@?((9GeI7l& z>TTn~4Wl)k^h)Yh8*44sm8^+lt!{(R|y)#BHCKN8cH-y)8iyZ%SS%d@hQG#7} zZ;0lZvvts`G_P{N8g?}q7B)@SD|2|*i|!4<8`389QNQHubn~NSA$rp6u;38iw+a5x z{mdNEMJ4*W#a0=WT*aig#Z^R#JjUsjif+1)9Yx>;M~iDES?SR{M>G#~T3m&sP!MpQ*dNDCGlkF$(S05nnRUag$t6k*X>UwetUl^kwrDV|^ z*5_70M5jFs?Tn{}EoOZ1xP2KqN#jgQm*X!(8jYFg+fJ5Lt}VvuNiWPjzz&e8jSg8e zETH>|4v-F?rQcYKbH5ryZv+9%H7|O1G6o9y11@=`Zdz zUR_wPyLQ|kI{V$rjsCIm=s%-lgG1r)WdGO@I^6+^!%xO)q5K22Naj@yhDH;oCdxI+ zy_l)Yq7VOrK6s4#ylAcuZ;{~M#+~THN5?Q=FCm-QYO+}XgNBllGoA$6T^lPstRtl$ zZyBzoO43g<(xUP{MUVG{kZT~s>Ev?HR=JYCkX)V~7eeV1%ycP1)uXTvkB0yoeLK0- zv^$noyJ&B6OG4EotGA%4NxD7d*&GcvQs)Ihs~^^eE< z8YMuYYPkxNuT~9^3{Jr&2sT$OsfE4r!s!M@*~YQjR{Lefx7vkUw{9sHgj17mcf856eN(<)oqxZd4a7KF z5#tCzcgI8)Y^=hygH!Ou7nC+W{@ zwdqhp^!SsAfIjJwjOgaVE8i~&^mxviq}QYt9)iDs9fVRqty!fnMWr!LnYFp{rD>86 z%NJkJw9e7?A#$V!1VBYT&!PgPS_|bIpJai7nB{pWJJdY6K(&YlvI}IQC$sGPVgE&{ z5qcuGT3jGjoA8!~Ruhv`%}`;r=^*_zRh!qx-(UBZc57~iXPVa@%X}CUf7^}4=L?`P z#`3lSa<-8~+c{X8TCSJT?H-MQG#dJ>69_f~fDX0wi}N^T0KtIbjp_%%u6-586Xvc+1+(s`D_BO35%`;Qqqn6ki49Bz{DCU!W%?9~MY z4iy;tI11uHq0p2c^lQ|;1J>g%*%xEa?S_JkH$}0z19$z<+xBAncGMljyQk3qlsid} zKI;`ryrmsw=<5Yo*XI==sM!9|=b2()^`rfhg7zM47tlI1w78ot%PrQu5u|+XZ{sK( z%S~U}QKTIo(m2YCYBfI*;84@DpEn(wx-ot8R_{#Nqubt>ZqG*RzI}Do=*m0S{`Jed zXKK{>xqJ5$9$dNdUC^gp=Y8E>T?1hIgT4W2K=MU>L%!hR*nrRL_2DW8R1*ubec#66 z{sjTZNnsU`@#{!Fe1hB!NGoD_TcPD`MH^>CRa4-l@p*1TT>z~aqd(1i(fl9^r<`*N z)zLratxvBDK(A!VFY2KPw#5E*G->(HxM%6U<%L!Vjg4v%1Oc3Mv~~H9v$q6du`Q&% RaE4(OnB5<2WL7- zX~O8SA%bo^iU_D{+_RgTn~=LuCCP3GRH?4waD{1y{9)NV1bv%Ga%x&~y>b^s zx<5VNczBd#4IMS1JHp^JdhRxQh`wg-vhcjn(MfA83!4LRvQ@s`=Gj?+E={+( zzrvWUPi|JstTwp`qs{$61NOPxCShq5ZIBd`knBP|C!l|R2<>CgKayZ&q>hynp7G}^ z6f3JczeLSKRU?W`G@{Fc9xU3R6Fy*mRynbhXUirYR_qN)n`{<7i8Rm~mIcPi~QFOq>(MY&XFdpxp`969L8O0=4b9|8nYJD zvsN?xyEWg4Q}i3_Hsj?%`lM~G*1c`xvo*I1TZD$&Xu%mx&evp`aR1!H+AB=LOWoQx zSEy4EzI9!q#Ebu;+wHz8h%g5ZUWg=JL9Oc=Y?b)IeG-o&E3U!BK4%Lj&bM}%sv6!&rq{#8;T)(~>0HgQqUSljq3mthz7_D$D^uZZkH3JT|P1Y-S zgtHM8i@^?gH99sR`#T%>;Xn7%R)^1dsh98n2p$-I=;$-vkJ4wIo;CNQfdyniTcDJb z2Cb9x72{+H+l@dAinhRfGC!zkc4-O4bveC~PCpMBs+4$Ec{PNff;Xkmv=y>#{6R!@ic>9r|3#Dxi zi(}KRQ>S9_GovFtBU1FnkDJgNVOzLqq{@$ zEHNFG56DiItwN?oSe6GPoYLV1aD+}B(2h>6TJ8?%u!v6Bpi7aga5iSLC8lO}SW$Z~ ziy`AJCc_Jmrq!-|YIi+qedD{1xu}&IY;&rGFMHT;NPz7j+u3fijqM^^*)wDZ+ezv> zxR;*A=)Inh0r|)ELt*WMT$`PMbP+zHG1r2EJ#ln&3{JloL5V)y3S{kWbg60D_{)o1x_T}g{t<0MAU2*hc7#x=E;4NM0E->GgVCpG%edZ5U65?Ww!}b_;*w@mGS&cv8 z`vousD)-yO1K}%aMgUNPEgZ*T$O|ns8fQqNNhb-dLRFLSK_p~2(!L1&BMMm2zc{zh zC9_NC9*>CALeoifJTk**_fF3+8rZpyo!UFwX(&FB3UREi-TNuy+r9YOwQI^5e5g?o zIn{EgNf8Z)Din-kv+kJa>p31*)d-wr8TVj}uF$@m5+j5&m9x&_hzGpH+aDOEWgeez zZ=CJeFimy{yZVp`4CjQyVU9zf-l^8Gdcg4gZu-2ZE(=|eWFr~Cevz9f?bHzYWQ3l| zEYA>rE4T4b1I27RR5W$vmi_F0G{q@5J%J*5k`!Sa;?Sb;$wuITCMq!>ao2|{Q$y?D3-*3RytdeZp0If^784>ozG4@}t2%3^k?8mUsf4wW1 zk#x$=qz!I8hnoAqB$$E=!lv18Q*Me*!1a0U$85gHJugv@x$*^v9mRe%+ponP&H>PK}C$iN2EeBwl&??aq0 zFijQDlIG(HNQr-T>fo+oT0jl}%-{7Uqk2pl8i107)d|577S>IK9`D$Iu67HX$I<`M zf^0$`o)#BH%EIO7%5=~qL?akdg>4-U#1#vxA08OP+CK0BO2wfSt8f)aWFSSo1wP}^ zG0GRbX}CgD1zB^nNFa3zqr!y7lWAZQwaxu~^Sku*Hx9pf`bhcx8FKrDrT}uxKfspBKT8qtXF{?eR^Jr3mjXimIA!M_q2W9FY-R_)3X-O Qe(W_pbr&G7aKaWN;bN~PV diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 7d7cecb7e512824368ac57d9086c66ab581776fa..f44b1632d49e31c70a7c8cc72398bcd575b04fd4 100644 GIT binary patch delta 1233 zcmXX_eM}o=7{9wxzFMHAe3jbq@=+*G2@H|0n**bT%ea|ko6EMCaOkF;By<00OdAF+ zxrnftZts?WSxm3)3P;=ZwpJX-!QA5Hrp}^?i7^8TD<2!v6aR42#QI+2=2KwVGt{Ac6hKJLepe6GpQjA)-5Y1{{szTu4fdlfHHTZ{c zF4Ke?;G@i_=4gQP$Tz@h5{U_BHE4!et_%2C?l|znwJb9}4AZk85JMrjnfk8sXO=5_C>DN2%$+EVvk#urZmq zL-$h~=e1V664q*Mxv#R|_3;o!pm<-B?C>3J%Uk6^lr04>^B9Trr@TWdr3(3=WRDv?_oegLWDOLLA)! zX!7_82wX7j&3Pk2i0$7IK8kdC{@Z&BuajDT;T132l>^7 zO5c(?->eGY3a$!QatC3>I(|v>a#Y2r0#I025T$5}=nq6xrfH`AAvCPHi5@2IM;|8i z8&v@oyKFmvb7A)m#kpDd^^BMUgF#f9XwJLD4{8V(8_U%Y9`FJ$CUdntNT5c5ZX_g?fCySjG65C(J1ML^ z;m3pW4Y(C290R*bwTnD%gv&f`h0ADrml-Uggyj2lkBDN)dlksn8j+JWqtjX|2%#(5 z*Gqr#JK<091w!MzpLIH!TYebx|DhFsAGX7W8Rr-?;a`AP)+B0Nrf;)-%reraSU?7< zNU^03@UUs>8bwRi!B?aT)Rl55$q;}wa}2tQM$#Pg``3`1c9D(-P>0^Ai3S+56<${l z9Oxh2&NEi;W@eP$%p%%u`*5ZmXW4I1@>ahcP6bdrwWo_%3FRj&n||mciaTnBhNWlaHzkYwqU0y@V?k+*z=NO^ zC!iLkZZVbE0{gINfk)PvDv_D=d34WvQkgc9c&GI5*(+C)QNoyK0)95f7?cu$;&gJM zH{Pq;?rrqBdYgRi-eyvas&)HlPDJN)MTaMYq{@LE(IqDfYe%2*!72LZ1ko&i)qp)fsQS`1bel zw%K>iwf}Jb&Ycb~uUr$n7!H3m%k%5xIea(Fuk!Q!`V9XC`F4-@`FQ5mG;u7qrH-o` zq&Mv>i&lX#G@#D|$WU+u>_-g+#c9OnD%qk$Vc@Q^mX8ZgrXQ=n$Md5$f!eT)DJlDI F?SBh}57+t&M}#nqIaJ$v@b=lZf`Rxd8-E@D;qH)AD3>oFicqwwVaNrn$UHR~te6O){*E$++M zJGoNahiUbr$;ZW~njM|Gh+zSjLiNU#hZam%0P+~YyhWlQBi=8V4-#Sq3n{owTg0}2 z0jSicd-5cSIQ@#LGdzH*7I6cK438E2il=U6R0!V)WikMni+G??c~f^5PnMT-5d1xL z0mDX9P5uw=C;2~UuG(8Oxj<5cyJo77!^{&KO;_!`JGoy{lJV~3m6Gv{3X?gdEEr`s zJ4s0}G9H~AEgb?>_<^tE!jA=FH}7uVB`w1&K4+>z%SND)RTr3j{N|rj0aCg16}C=( zE2qM{b?OHG6C0~eT3z5!SUy=!-cVrnG!KQ|jVDz;!~=tb*=OeDczF%Rsgpb8(}Cm% Td27bv$vO%$jAolX70eR=JfW#n delta 412 zcmZo@WNK(+nvl;iZ>mq}G@s&m8yjs!Cr;p*yie4Lao=P{u}mh$X_Irr!Y!9sy||#g zh*ja=jFk+n$AI{Z!ju0e89w|x8To;IrJsV|MvDX>A+dB(CeP7D7yd{jtok5u%IEd6 z$rr_xCO;5kXL;pwec5DfabL!RlPkr2m>M2TJ}y4h?D*703=6mvsyD7Yv|zddkjDt- zEfNLU^nSs7kPtIiNWo*;BDMt#K&3vtlP5{U=~qpi;Q>^&h#N>`c&yl0I&~|fLik1~ zlL5$F!~>Non7Xrcvb>~&;NPhW7&e+}@_%qY$^Suf)!w?v1(G7%byIyDW}et+x@zzJ z$^DX&jQ1z6l#FLon#?I>!6?7kNlJo|@%ZFu=@6j84}2XLek>5Xd4KaRX&Gkmc~ccy zHUf>Ty1?w?H~*vxkjkB}uzm7dIThaRQ#bIR*jRPa>H>#C>0~*1LxJch| n4-7eGpR<$WjPVSIT2a+G;tr?e3)=`jQG}-K_V4eT~r_Zti diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index a352f3b1aee25a55deb03a231c32ba5cdb23696e..9185ef3fd95eaf26d1fbaa2ba58281eb05da84d8 100644 GIT binary patch delta 101 zcmV-r0Gj`RK!89IATGL)15D4Rr4&e|6-Xe%p^*`00lJZRCk!H@$$+o}Oupbutf8^1 z;sOH0p_7jT7!&2EsV0R1AWY&2sV9X2C}2$Sp_94;9}6<9rI9cLOpu}=g_Gn1;Q=qLC410j`mFCk#@e$$+o}Oupbu45G2C z;sOFAqLYsU7!z8isV0R1AWY&2sV9X2C}2!FqLaD<9}5AjrI9cLOgF0_RFmWb;Q=(W H#soSWh%_ZR diff --git a/bin/kernal_generic_crt.rom b/bin/kernal_generic_crt.rom index ce5757f49e3c179aec87a6096fc988e98bf886c7..90d615b69663c1f7c1982e47026775443f826830 100644 GIT binary patch delta 363 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

e2s`(yJc*FO=4{ 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 aayys08wMWrlqLOfVcGIm|IgoX=6?a(zq4}y diff --git a/bin/mega65_orfont.rom b/bin/mega65_orfont.rom index 35f78028d545f1f3b0d3d35e51f059163eac1add..428e93a3d784c8f3bdb613551e87612424f536e5 100644 GIT binary patch delta 8009 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

e2s`(yJc*FO=4{ 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 aayys08wMWrlqLOfVcGIm|IgoX=6?a(zq4}y diff --git a/strings/00911460 b/strings/00911460 new file mode 100644 index 00000000..b769674f --- /dev/null +++ b/strings/00911460 @@ -0,0 +1,3 @@ +$00 + STA ($14),Y + RTS + +Routine ends by storing value in memory via pointer. Trivial - not copyrightable. diff --git a/strings/11D009108D11D0 b/strings/11D009108D11D0 new file mode 100644 index 00000000..d470a641 --- /dev/null +++ b/strings/11D009108D11D0 @@ -0,0 +1,4 @@ + $D011 + ORA #$10 + STA $D011 + + Part of code setting a bit in documented hardware register. Trivial - not copyrightable. + diff --git a/strings/20D7F7A9 b/strings/20D7F7A9 new file mode 100644 index 00000000..45e726d2 --- /dev/null +++ b/strings/20D7F7A9 @@ -0,0 +1,3 @@ +JSR $F7D7 + LDA # (value does not match) + +Instruction + some part. Trivial - not copyrightable. diff --git a/strings/8564A563 b/strings/8564A563 new file mode 100644 index 00000000..a15fdb6b --- /dev/null +++ b/strings/8564A563 @@ -0,0 +1,3 @@ +STA $64 + LDA $63 + +Part of the code multiplying floating point mantissa by 8, by shifting it 8 bit left. Trivial - not copyrightable. diff --git a/strings/8565A564 b/strings/8565A564 new file mode 100644 index 00000000..509981ff --- /dev/null +++ b/strings/8565A564 @@ -0,0 +1,3 @@ +STA $65 + LDA $64 + +Part of the code multiplying floating point mantissa by 8, by shifting it 8 bit left. Trivial - not copyrightable. diff --git a/strings/867060A561F0 b/strings/867060A561F0 new file mode 100644 index 00000000..c21b234c --- /dev/null +++ b/strings/867060A561F0 @@ -0,0 +1,3 @@ +STX $70 + RTS + LDA $61 + BEQ (offset does not match) + +One routine ends by storing value in a well-known zaropage location, followed by other which starts by checking whether another location is zero or not. Not creative - not copyrightable. diff --git a/strings/9002A900 b/strings/9002A900 new file mode 100644 index 00000000..12f92262 --- /dev/null +++ b/strings/9002A900 @@ -0,0 +1,3 @@ +BCC (skip next instruction) + LDA #$00 + +Load 0 into .A if carry is set. Trivial - not copyrightable. diff --git a/strings/9D0001E8 b/strings/9D0001E8 new file mode 100644 index 00000000..76082e2a --- /dev/null +++ b/strings/9D0001E8 @@ -0,0 +1,4 @@ +STA $0100,X + INX + +Small part of the loop iterating over memory area. Trivial - not copyrightable. + diff --git a/strings/A000B122 b/strings/A000B122 new file mode 100644 index 00000000..3a5596a2 --- /dev/null +++ b/strings/A000B122 @@ -0,0 +1,3 @@ +LDY #$00 + LDA ($22),Y + +Reading content of memory pointed by pointer in RAM. Would be one instruction os some CPUs. Trivial - not copyrightable. diff --git a/strings/A56BE56385 b/strings/A56BE56385 new file mode 100644 index 00000000..2cb384d7 --- /dev/null +++ b/strings/A56BE56385 @@ -0,0 +1,3 @@ +LDA $6B + SBC $63 + STA (zeropage address does not match) + +Small part of floating point mantissa manipulation - subtraction of 2 values. Trivial - not copyrightable. diff --git a/strings/A56CE56485 b/strings/A56CE56485 new file mode 100644 index 00000000..ebf0f48d --- /dev/null +++ b/strings/A56CE56485 @@ -0,0 +1,3 @@ +LDA $6C + SBC $64 + STA (zeropage address does not match) + +Small part of floating point mantissa manipulation - subtraction of 2 values. Trivial - not copyrightable. diff --git a/strings/A90060A5 b/strings/A90060A5 new file mode 100644 index 00000000..b891cc7c --- /dev/null +++ b/strings/A90060A5 @@ -0,0 +1,3 @@ +LDA #$00 + RTS + LDA (zeropage address does not match) + +Routine returning 0 in .A followed by other which starts from fetching zeropage variable. Trivial - not copyrightable. diff --git a/strings/A9488D8F02A9EB8D9002A9 b/strings/A9488D8F02A9EB8D9002A9 new file mode 100644 index 00000000..a7674474 --- /dev/null +++ b/strings/A9488D8F02A9EB8D9002A9 @@ -0,0 +1,3 @@ +LDA #$48 + STA $028F + LDA #$EB + STA $0290 + LDA (value does not match) + +Initializing a documented function pointer with the only value compatible with existing software. Trivial and not creative - not copyrightable. diff --git a/strings/BAA9008526852785288529 b/strings/BAA9008526852785288529 new file mode 100644 index 00000000..de7df5fe --- /dev/null +++ b/strings/BAA9008526852785288529 @@ -0,0 +1,3 @@ +$BA + LDA #$00 + STA $26 + STA $27 + STA $28 + STA $29 + +Zeroying a well-known temporary workarea. Trivial - not copyrightable. diff --git a/strings/EDA00020 b/strings/EDA00020 new file mode 100644 index 00000000..c73277a1 --- /dev/null +++ b/strings/EDA00020 @@ -0,0 +1,3 @@ +$ED + LDY #$00 + JSR (address does not match) + +Instruction + some parts. Trivial - not copyrightable. diff --git a/strings/EEAD00DD09 b/strings/EEAD00DD09 new file mode 100644 index 00000000..cc76afce --- /dev/null +++ b/strings/EEAD00DD09 @@ -0,0 +1,3 @@ +$EE + LDA $DD00 + ORA (value does not match) + +Instruction (accessing hardware register) + some parts. Trivial - not copyrightable. diff --git a/strings/FAAD01DD b/strings/FAAD01DD new file mode 100644 index 00000000..62d1cba3 --- /dev/null +++ b/strings/FAAD01DD @@ -0,0 +1,3 @@ +$FA + LDA $DD01 + +Instruction (reading hardware register) + some part. Trivial - not copyrightable. diff --git a/strings/FCA97F8D0D b/strings/FCA97F8D0D new file mode 100644 index 00000000..99f135b1 --- /dev/null +++ b/strings/FCA97F8D0D @@ -0,0 +1,3 @@ +$FC + LDA #$7F + STA (address does not fully match) + +Instruction + some parts. Trivial - not copyrightable.