From a632d6b6255b25e9bd533d5997259439604da018 Mon Sep 17 00:00:00 2001 From: nino-porcino Date: Wed, 15 Jul 2020 16:11:38 +0200 Subject: [PATCH 1/6] fix keyboard matrix --- systems/vic20.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/systems/vic20.h b/systems/vic20.h index da3e4f0c..85f1b135 100644 --- a/systems/vic20.h +++ b/systems/vic20.h @@ -596,15 +596,15 @@ static void _vic20_init_key_map(vic20_t* sys) { "7YGVBHU8" // row 3 "9IJNMKO0" // row 4 "+PL,.:@-" // row 5 - "~*;/ = " // row 6, ~ is british pound + "~*;/ =^ " // row 6, ~ is british pound " " // row 7 /* shift */ "! q\"" "#wa zse$" - "%rdxcft^" - "&ygvbhu*" - "(ijnmko)" + "%rdxcft&" + "'ygvbhu(" + ")ijnmko " " pl<>[ " "$ ]? " " "; @@ -633,6 +633,11 @@ static void _vic20_init_key_map(vic20_t* sys) { kbd_register_key(&sys->kbd, 0x01, 0, 7, 0); /* delete */ kbd_register_key(&sys->kbd, 0x0D, 1, 7, 0); /* return */ kbd_register_key(&sys->kbd, 0x03, 3, 0, 0); /* stop */ + kbd_register_key(&sys->kbd, 0x04, 1, 0, 0); /* left arrow */ + kbd_register_key(&sys->kbd, 0x05, 7, 6, 0); /* home */ + kbd_register_key(&sys->kbd, 0x06, 7, 6, 1); /* clr */ + kbd_register_key(&sys->kbd, 0x0E, 2, 0, 0); /* ctrl */ + kbd_register_key(&sys->kbd, 0x0F, 5, 0, 0); /* C= key */ kbd_register_key(&sys->kbd, 0xF1, 4, 7, 0); kbd_register_key(&sys->kbd, 0xF2, 4, 7, 1); kbd_register_key(&sys->kbd, 0xF3, 5, 7, 0); From 5299a466307553c2f7cfc8a4d2527dbfb1ecef12 Mon Sep 17 00:00:00 2001 From: nino-porcino Date: Wed, 15 Jul 2020 16:12:13 +0200 Subject: [PATCH 2/6] add INST and DEL keys --- systems/vic20.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/systems/vic20.h b/systems/vic20.h index 85f1b135..7ce0545d 100644 --- a/systems/vic20.h +++ b/systems/vic20.h @@ -630,7 +630,8 @@ static void _vic20_init_key_map(vic20_t* sys) { kbd_register_key(&sys->kbd, 0x09, 2, 7, 0); /* cursor right */ kbd_register_key(&sys->kbd, 0x0A, 3, 7, 0); /* cursor down */ kbd_register_key(&sys->kbd, 0x0B, 3, 7, 1); /* cursor up */ - kbd_register_key(&sys->kbd, 0x01, 0, 7, 0); /* delete */ + kbd_register_key(&sys->kbd, 0x07, 0, 7, 1); /* inst */ + kbd_register_key(&sys->kbd, 0x01, 0, 7, 0); /* del */ kbd_register_key(&sys->kbd, 0x0D, 1, 7, 0); /* return */ kbd_register_key(&sys->kbd, 0x03, 3, 0, 0); /* stop */ kbd_register_key(&sys->kbd, 0x04, 1, 0, 0); /* left arrow */ From efa87f8c33d2925a4b405161f08e6709e6ebe514 Mon Sep 17 00:00:00 2001 From: nino-porcino Date: Wed, 15 Jul 2020 18:48:36 +0200 Subject: [PATCH 3/6] emulate RESTORE key --- systems/vic20.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/systems/vic20.h b/systems/vic20.h index 7ce0545d..09aae75b 100644 --- a/systems/vic20.h +++ b/systems/vic20.h @@ -472,7 +472,7 @@ static uint64_t _vic20_tick(vic20_t* sys, uint64_t pins) { PA6: in: CASS SENSE PA7: SERIAL ATN OUT (???) - CA1: in: RESTORE KEY(???) + CA1: in: RESTORE KEY CA2: out: CASS MOTOR VIA1 Port B input: @@ -482,11 +482,13 @@ static uint64_t _vic20_tick(vic20_t* sys, uint64_t pins) { */ { // FIXME: SERIAL PORT - // FIXME: RESTORE key to M6522_CA1 via1_pins |= sys->via1_joy_mask | (M6522_PA0|M6522_PA1|M6522_PA7); if (sys->cas_port & VIC20_CASPORT_SENSE) { via1_pins |= M6522_PA6; } + if(sys->kbd.scanout_column_masks[8] & 1) { + via1_pins |= M6522_CA1; /* RESTORE key is pressed */ + } via1_pins = m6522_tick(&sys->via_1, via1_pins); if (via1_pins & M6522_CA2) { sys->cas_port |= VIC20_CASPORT_MOTOR; @@ -647,6 +649,9 @@ static void _vic20_init_key_map(vic20_t* sys) { kbd_register_key(&sys->kbd, 0xF6, 6, 7, 1); kbd_register_key(&sys->kbd, 0xF7, 7, 7, 0); kbd_register_key(&sys->kbd, 0xF8, 7, 7, 1); + + kbd_register_key(&sys->kbd, 0xFF, 0, 8, 0); /* restore key is mapped on a separate line outside */ + /* the keyboard matrix and routed to VIA1 pin CA1 */ } bool vic20_quickload(vic20_t* sys, const uint8_t* ptr, int num_bytes) { From fc8804d0bec78a17d7ce04d3d0a4d6352d6340ec Mon Sep 17 00:00:00 2001 From: nino-porcino Date: Fri, 17 Jul 2020 10:49:29 +0200 Subject: [PATCH 4/6] allow VIC to access rom_char in the range 0x4000-0x4FFF --- systems/vic20.h | 1 + 1 file changed, 1 insertion(+) diff --git a/systems/vic20.h b/systems/vic20.h index 09aae75b..bb4add6f 100644 --- a/systems/vic20.h +++ b/systems/vic20.h @@ -362,6 +362,7 @@ void vic20_init(vic20_t* sys, const vic20_desc_t* desc) { mem_map_rom(&sys->mem_vic, 0, 0x2400, 0x0C00, sys->ram_3k); /* CPU: 0400..0FFF */ } mem_map_rom(&sys->mem_vic, 0, 0x3000, 0x1000, sys->ram1); /* CPU: 1000..1FFF */ + mem_map_rom(&sys->mem_vic, 0, 0x4000, 0x1000, sys->rom_char); /* CPU: 8000..8FFF */ /* A special memory mapping used to copy ROM cartridge PRG files From 9074810c05047a6705132e65e6861418af4410d2 Mon Sep 17 00:00:00 2001 From: nino-porcino Date: Sat, 18 Jul 2020 11:48:10 +0200 Subject: [PATCH 5/6] fix repeated joystick direction --- systems/vic20.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/systems/vic20.h b/systems/vic20.h index bb4add6f..6b2990b5 100644 --- a/systems/vic20.h +++ b/systems/vic20.h @@ -737,7 +737,7 @@ static void _vic20_update_joymasks(vic20_t* sys) { uint8_t jm = sys->kbd_joy_mask | sys->joy_joy_mask; sys->via1_joy_mask = M6522_PA2|M6522_PA3|M6522_PA4|M6522_PA5; sys->via2_joy_mask = M6522_PB7; - if (jm & VIC20_JOYSTICK_LEFT) { + if (jm & VIC20_JOYSTICK_UP) { sys->via1_joy_mask &= ~M6522_PA2; } if (jm & VIC20_JOYSTICK_DOWN) { From 7d8256319abaaed30cf7d9c197b58d5394a5b761 Mon Sep 17 00:00:00 2001 From: nino-porcino Date: Mon, 20 Jul 2020 17:40:38 +0200 Subject: [PATCH 6/6] allow 3K memory expansion configuration --- systems/vic20.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/systems/vic20.h b/systems/vic20.h index 6b2990b5..7d4f5562 100644 --- a/systems/vic20.h +++ b/systems/vic20.h @@ -75,6 +75,7 @@ typedef enum { /* memory configuration (used in vic20_desc_t.mem_config) */ typedef enum { VIC20_MEMCONFIG_STANDARD, /* unexpanded */ + VIC20_MEMCONFIG_3K, /* Block 0 (3KB at 0400..0FFF) */ VIC20_MEMCONFIG_8K, /* Block 1 */ VIC20_MEMCONFIG_16K, /* Block 1+2 */ VIC20_MEMCONFIG_24K, /* Block 1+2+3 */ @@ -324,7 +325,7 @@ void vic20_init(vic20_t* sys, const vic20_desc_t* desc) { */ mem_init(&sys->mem_cpu); mem_map_ram(&sys->mem_cpu, 1, 0x0000, 0x0400, sys->ram0); - if (desc->mem_config == VIC20_MEMCONFIG_MAX) { + if (desc->mem_config == VIC20_MEMCONFIG_3K || desc->mem_config == VIC20_MEMCONFIG_MAX) { mem_map_ram(&sys->mem_cpu, 1, 0x0400, 0x0C00, sys->ram_3k); } mem_map_ram(&sys->mem_cpu, 1, 0x1000, 0x1000, sys->ram1);