From d07c7c4e1894d4e2502e1f67744b06b8692364db Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 26 Dec 2024 13:03:33 +0100 Subject: [PATCH 01/33] Created skeleton for IBM System/23 --- src/mame/ibm/system23.cpp | 61 +++++++++++++++++++++++++++++++++++++++ src/mame/mame.lst | 2 ++ 2 files changed, 63 insertions(+) create mode 100644 src/mame/ibm/system23.cpp diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp new file mode 100644 index 0000000000000..fa42d0135c849 --- /dev/null +++ b/src/mame/ibm/system23.cpp @@ -0,0 +1,61 @@ +#include "emu.h" +#include "cpu/i8085/i8085.h" +#include "machine/i8255.h" + +namespace system23 +{ + class system23_state: public driver_device + { + public: + system23_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_ppi8255(*this,"ppi8255"), + m_diag_digits(*this, "digit%u", 0U) + { + + } + + void system23(machine_config &config); + + protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + + private: + required_device m_ppi8255; + output_finder<2> m_diag_digits; + + void diag_digits_w(uint8_t data); + + void system23_io(address_map &map) ATTR_COLD; + void system23_mem(address_map &map) ATTR_COLD; + } + + void system23_state::diag_digits_w(uint8_t data) + { + m_diag_digits[0] = val & 0x0f; + m_diag_digits[1] = (val >> 4) & 0x0f; + } + + void system23_state::system23_io(address_map &map) + { + map.unmap_value_high(); + map(0x43, 0x43).w(FUNC(diag_digits_w)); + } + + void system23_state::system23_mem(address_map &map) + { + map.unmap_value_high(); + map(0x0000, 0x3fff).rom.region("ros_unpaged"); + } + + ROM_START( system23 ) + ROM_REGION(0x1800, "ros_unpaged", 0) + ROM_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(3b51a6b72d2ccae2459ddb2e16fbd21b19dfa2b8) ) + ROM_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(078405ad202e26b7bac7132b06682fb01270af63) ) + ROM_END + + + COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_SKELETON | MACHINE_NO_SOUND | MACHINE_NOT_WORKING) + +} diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 9152bbe0472d4..01fa1045fae73 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -20069,6 +20069,8 @@ rtpc020 // IBM RT PC Model 020 rtpc025 // IBM RT PC Model 025 rtpca25 // IBM RT PC Model A25 +@source:ibm/system23.cpp //IBM System/23 Datamaster + @source:ibm/thinkpad600.cpp thinkpad600 // IBM Thinkpad 600 thinkpad600e // IBM Thinkpad 600E From 0d23f4597c921921d1412477874e79c22d90cfc0 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 26 Dec 2024 17:03:55 +0100 Subject: [PATCH 02/33] Corrected errors at system23.cpp; created layout --- src/mame/ibm/system23.cpp | 26 ++++++++++++++++++++------ src/mame/layout/ibmsystem23.lay | 20 ++++++++++++++++++++ src/mame/mame.lst | 3 ++- 3 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 src/mame/layout/ibmsystem23.lay diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index fa42d0135c849..cad341bfabb8b 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -2,6 +2,8 @@ #include "cpu/i8085/i8085.h" #include "machine/i8255.h" +#include "ibmsystem23.lh" + namespace system23 { class system23_state: public driver_device @@ -29,12 +31,12 @@ namespace system23 void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; - } + }; void system23_state::diag_digits_w(uint8_t data) { - m_diag_digits[0] = val & 0x0f; - m_diag_digits[1] = (val >> 4) & 0x0f; + m_diag_digits[0] = data & 0x0f; + m_diag_digits[1] = (data >> 4) & 0x0f; } void system23_state::system23_io(address_map &map) @@ -46,16 +48,28 @@ namespace system23 void system23_state::system23_mem(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x3fff).rom.region("ros_unpaged"); + map(0x0000, 0x3fff).rom().region("ros_unpaged",0); + } + + void system23_state::system23(machine_config &config) + { + i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6_MHz_XTAL)); //frequency needs to be adjusted + maincpu.set_addrmap(AS_PROGRAM, &system23_state::system23_mem); + maincpu.set_addrmap(AS_IO, &system23_state::system23_io); + + config.set_perfect_quantum("maincpu"); + config.set_default_layout(layout_ibmsystem23); + + } ROM_START( system23 ) - ROM_REGION(0x1800, "ros_unpaged", 0) + ROM_REGION(0x4000, "ros_unpaged", 0) ROM_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(3b51a6b72d2ccae2459ddb2e16fbd21b19dfa2b8) ) ROM_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(078405ad202e26b7bac7132b06682fb01270af63) ) ROM_END - COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_SKELETON | MACHINE_NO_SOUND | MACHINE_NOT_WORKING) + COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) } diff --git a/src/mame/layout/ibmsystem23.lay b/src/mame/layout/ibmsystem23.lay new file mode 100644 index 0000000000000..5058979ff2092 --- /dev/null +++ b/src/mame/layout/ibmsystem23.lay @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 01fa1045fae73..3d77f3cf9bb0a 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -20069,7 +20069,8 @@ rtpc020 // IBM RT PC Model 020 rtpc025 // IBM RT PC Model 025 rtpca25 // IBM RT PC Model A25 -@source:ibm/system23.cpp //IBM System/23 Datamaster +@source:ibm/system23.cpp // IBM System/23 Datamaster +system23 @source:ibm/thinkpad600.cpp thinkpad600 // IBM Thinkpad 600 From f625fbb8bd24cb4906c5017f09b0a4c314d40bfa Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 26 Dec 2024 20:29:35 +0100 Subject: [PATCH 03/33] Corrected further errors into the driver; driver now compiles! --- src/mame/ibm/system23.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index cad341bfabb8b..7c995c63353f0 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -4,13 +4,14 @@ #include "ibmsystem23.lh" -namespace system23 +namespace { class system23_state: public driver_device { public: system23_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), m_ppi8255(*this,"ppi8255"), m_diag_digits(*this, "digit%u", 0U) { @@ -24,6 +25,7 @@ namespace system23 virtual void machine_reset() override ATTR_COLD; private: + required_device m_maincpu; required_device m_ppi8255; output_finder<2> m_diag_digits; @@ -59,17 +61,25 @@ namespace system23 config.set_perfect_quantum("maincpu"); config.set_default_layout(layout_ibmsystem23); + } + + void system23_state::machine_start() + { + + } + void system23_state::machine_reset() + { } ROM_START( system23 ) ROM_REGION(0x4000, "ros_unpaged", 0) - ROM_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(3b51a6b72d2ccae2459ddb2e16fbd21b19dfa2b8) ) - ROM_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(078405ad202e26b7bac7132b06682fb01270af63) ) + ROM_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b) ) + ROM_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e) ) ROM_END +} COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -} From 90fda0fa828848b6df831469913dee83ea01c3ef Mon Sep 17 00:00:00 2001 From: RetroAND Date: Fri, 27 Dec 2024 18:40:17 +0100 Subject: [PATCH 04/33] Added cpu test register; --- src/mame/ibm/system23.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 7c995c63353f0..92273b5e2d985 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -12,7 +12,7 @@ namespace system23_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_ppi8255(*this,"ppi8255"), + m_ppi_kbd(*this, "ppi_kbd"), m_diag_digits(*this, "digit%u", 0U) { @@ -26,11 +26,16 @@ namespace private: required_device m_maincpu; - required_device m_ppi8255; + required_device m_ppi_kbd; output_finder<2> m_diag_digits; + uint8_t m_cpu_test_register = 0; + void diag_digits_w(uint8_t data); + void cpu_test_register_w(uint8_t data); + uint8_t cpu_test_register_r(); + void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; }; @@ -41,10 +46,21 @@ namespace m_diag_digits[1] = (data >> 4) & 0x0f; } + void system23_state::cpu_test_register_w(uint8_t data) + { + m_cpu_test_register = data; + } + + uint8_t system23_state::cpu_test_register_r() + { + return m_cpu_test_register; + } + void system23_state::system23_io(address_map &map) { map.unmap_value_high(); - map(0x43, 0x43).w(FUNC(diag_digits_w)); + map(0x41, 0x41).w(FUNC(diag_digits_w)); + map(0x4c, 0x4c).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } void system23_state::system23_mem(address_map &map) @@ -59,13 +75,16 @@ namespace maincpu.set_addrmap(AS_PROGRAM, &system23_state::system23_mem); maincpu.set_addrmap(AS_IO, &system23_state::system23_io); + I8255(config, m_ppi_kbd); + m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); + m_ppi_kbd->out_pa_callback().set(FUNC(system23_state::cpu_test_register_w)); config.set_perfect_quantum("maincpu"); config.set_default_layout(layout_ibmsystem23); } void system23_state::machine_start() { - + m_diag_digits.resolve(); } void system23_state::machine_reset() @@ -82,4 +101,3 @@ namespace } COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) - From 65c9dcc3bd8111edf24aa726f6619d702487a82a Mon Sep 17 00:00:00 2001 From: RetroAND Date: Sun, 29 Dec 2024 13:39:11 +0100 Subject: [PATCH 05/33] Added diagnostics PPI; added keyboard PPI; fixed seven segment displays; --- src/mame/ibm/system23.cpp | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 92273b5e2d985..d6de9d2a63849 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -1,3 +1,6 @@ +// license:BSD-3-Clause +// copyright-holders: Jaume López + #include "emu.h" #include "cpu/i8085/i8085.h" #include "machine/i8255.h" @@ -13,6 +16,7 @@ namespace : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_ppi_kbd(*this, "ppi_kbd"), + m_ppi_diag(*this, "ppi_diag"), m_diag_digits(*this, "digit%u", 0U) { @@ -27,40 +31,43 @@ namespace private: required_device m_maincpu; required_device m_ppi_kbd; + required_device m_ppi_diag; output_finder<2> m_diag_digits; - uint8_t m_cpu_test_register = 0; + uint8_t m_bus_test_register = 0; + uint8_t hex_seven_segment[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; void diag_digits_w(uint8_t data); void cpu_test_register_w(uint8_t data); uint8_t cpu_test_register_r(); + void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; }; void system23_state::diag_digits_w(uint8_t data) { - m_diag_digits[0] = data & 0x0f; - m_diag_digits[1] = (data >> 4) & 0x0f; + m_diag_digits[0] = system23_state::hex_seven_segment[data & 0x0f]; + m_diag_digits[1] = system23_state::hex_seven_segment[(data >> 4) & 0x0f]; } void system23_state::cpu_test_register_w(uint8_t data) { - m_cpu_test_register = data; + m_bus_test_register = data; } uint8_t system23_state::cpu_test_register_r() { - return m_cpu_test_register; + return m_bus_test_register; } void system23_state::system23_io(address_map &map) { map.unmap_value_high(); - map(0x41, 0x41).w(FUNC(diag_digits_w)); - map(0x4c, 0x4c).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } void system23_state::system23_mem(address_map &map) @@ -78,6 +85,10 @@ namespace I8255(config, m_ppi_kbd); m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); m_ppi_kbd->out_pa_callback().set(FUNC(system23_state::cpu_test_register_w)); + + I8255(config, m_ppi_diag); + m_ppi_diag->out_pb_callback().set(FUNC(system23_state::diag_digits_w)); + config.set_perfect_quantum("maincpu"); config.set_default_layout(layout_ibmsystem23); } @@ -100,4 +111,4 @@ namespace } - COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) From a4ae513a4d28cb7bba21ab8e6eca5c4eedfffda3 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Mon, 30 Dec 2024 14:59:08 +0100 Subject: [PATCH 06/33] Tied SID to high; added RAM --- src/mame/ibm/system23.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index d6de9d2a63849..cedb07a484953 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -17,7 +17,10 @@ namespace m_maincpu(*this, "maincpu"), m_ppi_kbd(*this, "ppi_kbd"), m_ppi_diag(*this, "ppi_diag"), + m_ram(*this, "ram"), + m_paged_ram(*this, "paged_ram"), m_diag_digits(*this, "digit%u", 0U) + { } @@ -32,6 +35,8 @@ namespace required_device m_maincpu; required_device m_ppi_kbd; required_device m_ppi_diag; + required_shared_ptr m_ram; + required_shared_ptr m_paged_ram; output_finder<2> m_diag_digits; uint8_t m_bus_test_register = 0; @@ -42,6 +47,9 @@ namespace void cpu_test_register_w(uint8_t data); uint8_t cpu_test_register_r(); + uint8_t sid_sod_connection; + void sod_w(int state); + int sid_r(); void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; @@ -63,6 +71,16 @@ namespace return m_bus_test_register; } + int system23_state::sid_r() + { + return ASSERT_LINE; // patch to bypass the test + } + + void system23_state::sod_w(int state) + { + sid_sod_connection = state; + } + void system23_state::system23_io(address_map &map) { map.unmap_value_high(); @@ -74,6 +92,8 @@ namespace { map.unmap_value_high(); map(0x0000, 0x3fff).rom().region("ros_unpaged",0); + map(0x8000, 0xbfff).ram().share("ram"); + map(0xC000, 0xffff).ram().share("paged_ram"); } void system23_state::system23(machine_config &config) @@ -81,6 +101,8 @@ namespace i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6_MHz_XTAL)); //frequency needs to be adjusted maincpu.set_addrmap(AS_PROGRAM, &system23_state::system23_mem); maincpu.set_addrmap(AS_IO, &system23_state::system23_io); + maincpu.in_sid_func().set(FUNC(system23_state::sid_r)); + maincpu.out_sod_func().set(FUNC(system23_state::sod_w)); I8255(config, m_ppi_kbd); m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); From 9497c50e95d5d1d5f72cb6b5d8768bee7fb73f1b Mon Sep 17 00:00:00 2001 From: RetroAND Date: Tue, 31 Dec 2024 19:32:43 +0100 Subject: [PATCH 07/33] Implemented test 4; --- src/mame/ibm/system23.cpp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index cedb07a484953..114ddca21f2dd 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -4,6 +4,8 @@ #include "emu.h" #include "cpu/i8085/i8085.h" #include "machine/i8255.h" +#include "machine/i8257.h" +#include "machine/ram.h" #include "ibmsystem23.lh" @@ -17,8 +19,9 @@ namespace m_maincpu(*this, "maincpu"), m_ppi_kbd(*this, "ppi_kbd"), m_ppi_diag(*this, "ppi_diag"), - m_ram(*this, "ram"), - m_paged_ram(*this, "paged_ram"), + m_ppi_settings(*this, "ppi_settings"), + m_dma(*this,"dma"), + m_ram(*this, RAM_TAG), m_diag_digits(*this, "digit%u", 0U) { @@ -35,8 +38,9 @@ namespace required_device m_maincpu; required_device m_ppi_kbd; required_device m_ppi_diag; - required_shared_ptr m_ram; - required_shared_ptr m_paged_ram; + required_device m_ppi_settings; + required_device m_dma; + required_device m_ram; output_finder<2> m_diag_digits; uint8_t m_bus_test_register = 0; @@ -47,6 +51,8 @@ namespace void cpu_test_register_w(uint8_t data); uint8_t cpu_test_register_r(); + uint8_t memory_settings_r(); + uint8_t sid_sod_connection; void sod_w(int state); int sid_r(); @@ -71,9 +77,14 @@ namespace return m_bus_test_register; } + uint8_t system23_state::memory_settings_r() + { + return 0; //Patch to make the memory test work while port 2e is being studied + } + int system23_state::sid_r() { - return ASSERT_LINE; // patch to bypass the test + return ASSERT_LINE; // Actually, SID is tied to VCC at the motherboard } void system23_state::sod_w(int state) @@ -84,6 +95,8 @@ namespace void system23_state::system23_io(address_map &map) { map.unmap_value_high(); + map(0x00, 0x0f).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write)); + map(0x2c, 0x2f).rw(m_ppi_settings, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } @@ -92,13 +105,13 @@ namespace { map.unmap_value_high(); map(0x0000, 0x3fff).rom().region("ros_unpaged",0); - map(0x8000, 0xbfff).ram().share("ram"); - map(0xC000, 0xffff).ram().share("paged_ram"); + map(0x8000, 0xbfff).ram(); + //map(0xC000, 0xffff).ram(); } void system23_state::system23(machine_config &config) { - i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6_MHz_XTAL)); //frequency needs to be adjusted + i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6.144_MHz_XTAL)); //frequency needs to be adjusted maincpu.set_addrmap(AS_PROGRAM, &system23_state::system23_mem); maincpu.set_addrmap(AS_IO, &system23_state::system23_io); maincpu.in_sid_func().set(FUNC(system23_state::sid_r)); @@ -111,6 +124,13 @@ namespace I8255(config, m_ppi_diag); m_ppi_diag->out_pb_callback().set(FUNC(system23_state::diag_digits_w)); + I8255(config, m_ppi_settings); + m_ppi_settings->in_pc_callback().set(FUNC(system23_state::memory_settings_r)); + + I8257(config, m_dma); + + RAM(config, m_ram).set_default_size("16k"); + config.set_perfect_quantum("maincpu"); config.set_default_layout(layout_ibmsystem23); } From dcb63e7553f9b550edef1a0f8fb2862ffe637f6c Mon Sep 17 00:00:00 2001 From: RetroAND Date: Wed, 1 Jan 2025 12:27:17 +0100 Subject: [PATCH 08/33] Added 8257 DMA --- src/mame/ibm/system23.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 114ddca21f2dd..ceeedc196e7ef 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -127,7 +127,7 @@ namespace I8255(config, m_ppi_settings); m_ppi_settings->in_pc_callback().set(FUNC(system23_state::memory_settings_r)); - I8257(config, m_dma); + I8257(config, m_dma, 6.144_MHz_XTAL / 2); //frequency needs to be adjusted RAM(config, m_ram).set_default_size("16k"); From 7eae688623461c797d6552ae980db2c15abcd057 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 2 Jan 2025 13:20:20 +0100 Subject: [PATCH 09/33] Added 8275 device --- src/mame/ibm/system23.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index ceeedc196e7ef..60565f3953abd 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -5,6 +5,7 @@ #include "cpu/i8085/i8085.h" #include "machine/i8255.h" #include "machine/i8257.h" +#include "video/i8275.h" #include "machine/ram.h" #include "ibmsystem23.lh" @@ -21,6 +22,7 @@ namespace m_ppi_diag(*this, "ppi_diag"), m_ppi_settings(*this, "ppi_settings"), m_dma(*this,"dma"), + m_crtc(*this,"crtc"), m_ram(*this, RAM_TAG), m_diag_digits(*this, "digit%u", 0U) @@ -40,6 +42,7 @@ namespace required_device m_ppi_diag; required_device m_ppi_settings; required_device m_dma; + required_device m_crtc; required_device m_ram; output_finder<2> m_diag_digits; @@ -98,6 +101,7 @@ namespace map(0x00, 0x0f).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write)); map(0x2c, 0x2f).rw(m_ppi_settings, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x44, 0x47).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } @@ -106,7 +110,7 @@ namespace map.unmap_value_high(); map(0x0000, 0x3fff).rom().region("ros_unpaged",0); map(0x8000, 0xbfff).ram(); - //map(0xC000, 0xffff).ram(); + } void system23_state::system23(machine_config &config) @@ -129,6 +133,8 @@ namespace I8257(config, m_dma, 6.144_MHz_XTAL / 2); //frequency needs to be adjusted + I8275(config, m_crtc, (18'432'000 / 8)); + RAM(config, m_ram).set_default_size("16k"); config.set_perfect_quantum("maincpu"); From b2daf97a2cf50165257aba083ba5e1045cc5b643 Mon Sep 17 00:00:00 2001 From: rfka01 Date: Fri, 3 Jan 2025 13:06:59 +0100 Subject: [PATCH 10/33] First extensions to the comments --- src/mame/ta/alphatpx.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mame/ta/alphatpx.cpp b/src/mame/ta/alphatpx.cpp index a6a53191afb18..6f7b482042294 100644 --- a/src/mame/ta/alphatpx.cpp +++ b/src/mame/ta/alphatpx.cpp @@ -5,10 +5,16 @@ Triumph-Adler Alphatronic Px series =================================== - The Px series was designed by SKS (Steinmetz-Krischke Systemtechnik), like the ITT3030 and the SKS Nano, + The Px series was an OEM design by SKS (Steinmetz-Krischke Systemtechnik), like the ITT3030 and the SKS Nano 2500, the boards are closely related. + + The series originated in the SKS KISS series of computers which were shipped in a bright orange case, typical for + SKS' lineup of computers. SKS had a strong foothold in the typesetting business, as seen in the last of the SKS KISS + descentants, the Hell DS 2069 typesetting terminal. - Keyboard and floppy stuff was copypasted from ITT3030 and adapted to the best of knowledge. + SKS KISS + ======== + OEM version of the Alphatronic P1 (see below), of which a few were sold independently starting in 1979. P1, P2 and P2S: no paging Lower 16K for P1, P2 and P2 S: @@ -23,7 +29,7 @@ == Upper 32K: 0x4000 - 0x400a reserved - 0x4010 - 0xc000 32K RAM + 0x4010 - 0xc000 32K RAM 1x 160K, single sided, 40 tracks, 16 sectors/track, 256 bytes/sector floppy disk drive P2, P2S @@ -59,6 +65,10 @@ =========== Those were P3 and P4's with an additional 8088 card, a 128K RAM card (some with an extra 32K graphics extension) to support MS-DOS. + Keyboard and floppy stuff was copypasted from ITT3030, which is an evolution of the SKS KISS design, as is the SKS Nano 2500 portable and the Hell DS 2069 + typesetting terminal. + + SKS information at https://www.homecomputermuseum.de/historie/mittlere-datentechnik/steinmetz-krischke-systemtechnik-sks comments, testing, modification: rfka01, helwie44 From d857834b48d1664aba6e58b259ec92750101c88e Mon Sep 17 00:00:00 2001 From: RetroAND Date: Fri, 3 Jan 2025 17:19:13 +0100 Subject: [PATCH 11/33] Video enabled; layout changes; --- src/mame/ibm/system23.cpp | 89 ++++++++++++++++++++++++++++++--- src/mame/layout/ibmsystem23.lay | 5 +- 2 files changed, 87 insertions(+), 7 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 60565f3953abd..0b652e57299f0 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -7,6 +7,8 @@ #include "machine/i8257.h" #include "video/i8275.h" #include "machine/ram.h" +#include "screen.h" +#include "emupal.h" #include "ibmsystem23.lh" @@ -21,9 +23,12 @@ namespace m_ppi_kbd(*this, "ppi_kbd"), m_ppi_diag(*this, "ppi_diag"), m_ppi_settings(*this, "ppi_settings"), - m_dma(*this,"dma"), - m_crtc(*this,"crtc"), + m_dmac(*this,"dma"), + m_crtc(*this, "crtc"), + m_palette(*this, "palette"), + m_chargen(*this, "chargen"), m_ram(*this, RAM_TAG), + m_screen(*this, "screen"), m_diag_digits(*this, "digit%u", 0U) { @@ -41,9 +46,13 @@ namespace required_device m_ppi_kbd; required_device m_ppi_diag; required_device m_ppi_settings; - required_device m_dma; + required_device m_dmac; required_device m_crtc; + required_device m_palette; + required_region_ptr m_chargen; required_device m_ram; + required_device m_screen; + output_finder<2> m_diag_digits; uint8_t m_bus_test_register = 0; @@ -60,6 +69,14 @@ namespace void sod_w(int state); int sid_r(); + uint8_t dmac_mem_r(offs_t offset); + void dmac_mem_w(offs_t offset, uint8_t data); + + void dmac_hrq_w(int state); + + void crtc_dack_w(offs_t offset, uint8_t data); + I8275_DRAW_CHARACTER_MEMBER(display_pixels); + void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; }; @@ -95,10 +112,52 @@ namespace sid_sod_connection = state; } + uint8_t system23_state::dmac_mem_r(offs_t offset) + { + return m_maincpu->space(AS_PROGRAM).read_byte(offset); + } + + void system23_state::dmac_mem_w(offs_t offset, uint8_t data) + { + m_maincpu->space(AS_PROGRAM).write_byte(offset, data); + } + + void system23_state::dmac_hrq_w(int state) + { + m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + m_dmac->hlda_w(state); + } + + I8275_DRAW_CHARACTER_MEMBER( system23_state::display_pixels ) + { + const rgb_t *palette = m_palette->palette()->entry_list_raw(); + uint8_t gfx = 0; + + using namespace i8275_attributes; + + if (!BIT(attrcode, VSP)) + gfx = m_chargen[(linecount & 15) | (charcode << 4)]; + + if (BIT(attrcode, LTEN)) + gfx = 0xff; + + if (BIT(attrcode, RVV)) + gfx ^= 0xff; + + // Highlight not used + bitmap.pix(y, x++) = BIT(gfx, 1) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 2) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 3) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 4) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 5) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 6) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 7) ? palette[1] : palette[0]; + } + void system23_state::system23_io(address_map &map) { map.unmap_value_high(); - map(0x00, 0x0f).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write)); + map(0x00, 0x08).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)); map(0x2c, 0x2f).rw(m_ppi_settings, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x44, 0x47).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); @@ -115,7 +174,7 @@ namespace void system23_state::system23(machine_config &config) { - i8085a_cpu_device &maincpu(I8085A(config, "maincpu", 6.144_MHz_XTAL)); //frequency needs to be adjusted + i8085a_cpu_device &maincpu(I8085A(config, "maincpu", (18'432'000 / 3))); //frequency needs to be adjusted maincpu.set_addrmap(AS_PROGRAM, &system23_state::system23_mem); maincpu.set_addrmap(AS_IO, &system23_state::system23_io); maincpu.in_sid_func().set(FUNC(system23_state::sid_r)); @@ -131,9 +190,23 @@ namespace I8255(config, m_ppi_settings); m_ppi_settings->in_pc_callback().set(FUNC(system23_state::memory_settings_r)); - I8257(config, m_dma, 6.144_MHz_XTAL / 2); //frequency needs to be adjusted + I8257(config, m_dmac, (18'432'000 / 6)); //frequency needs to be adjusted + m_dmac->out_memw_cb().set(FUNC(system23_state::dmac_mem_w)); + m_dmac->in_memr_cb().set(FUNC(system23_state::dmac_mem_r)); + m_dmac->out_iow_cb<2>().set(m_crtc, FUNC(i8275_device::dack_w)); + m_dmac->out_hrq_cb().set(FUNC(dmac_hrq_w)); + + PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green()); + m_screen->set_raw(18'432'000, 800, 0, 640, 324, 0, 300); + m_screen->set_screen_update(m_crtc, FUNC(i8275_device::screen_update)); + m_screen->set_palette(m_palette); I8275(config, m_crtc, (18'432'000 / 8)); + m_crtc->set_character_width(8); + m_crtc->set_screen(m_screen); + m_crtc->set_display_callback(FUNC(system23_state::display_pixels)); RAM(config, m_ram).set_default_size("16k"); @@ -151,10 +224,14 @@ namespace } + ROM_START( system23 ) ROM_REGION(0x4000, "ros_unpaged", 0) ROM_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b) ) ROM_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e) ) + + ROM_REGION(0x2000, "chargen", 0) + ROM_LOAD("chr_73783bc7_8519412.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a)) ROM_END } diff --git a/src/mame/layout/ibmsystem23.lay b/src/mame/layout/ibmsystem23.lay index 5058979ff2092..e5a8a47c6453a 100644 --- a/src/mame/layout/ibmsystem23.lay +++ b/src/mame/layout/ibmsystem23.lay @@ -9,7 +9,10 @@ license:CC0-1.0 - + + + + From 4cc2f76cb2309de5d4cccc9932379d922f88f620 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Sat, 4 Jan 2025 15:37:31 +0100 Subject: [PATCH 12/33] Added 1980 BIOS; fixed layout; --- src/mame/ibm/system23.cpp | 56 +++++++++++++++++++++++++++------ src/mame/layout/ibmsystem23.lay | 4 +-- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 0b652e57299f0..3009333b27698 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -74,6 +74,8 @@ namespace void dmac_hrq_w(int state); + uint8_t language_r(); + void crtc_dack_w(offs_t offset, uint8_t data); I8275_DRAW_CHARACTER_MEMBER(display_pixels); @@ -81,12 +83,16 @@ namespace void system23_mem(address_map &map) ATTR_COLD; }; + //This routine deals with the diagnostics "miniprobe" that signals the test where the computer remains stuck + void system23_state::diag_digits_w(uint8_t data) { m_diag_digits[0] = system23_state::hex_seven_segment[data & 0x0f]; m_diag_digits[1] = system23_state::hex_seven_segment[(data >> 4) & 0x0f]; } + //Those routines deal with a register used only to verify the data bus + void system23_state::cpu_test_register_w(uint8_t data) { m_bus_test_register = data; @@ -97,21 +103,29 @@ namespace return m_bus_test_register; } + //This routine deals with an unknown register whose purpose is still to be discovered. The memory test fails if it does not return 0 + uint8_t system23_state::memory_settings_r() { return 0; //Patch to make the memory test work while port 2e is being studied } + //This routine deals with the SID signal being read. The CPU test fails if the line is not asserted high + int system23_state::sid_r() { return ASSERT_LINE; // Actually, SID is tied to VCC at the motherboard } + //This routine deals with the SOD signal being written. As of writting this comment there is no known purpose for SOD + void system23_state::sod_w(int state) { sid_sod_connection = state; } + //Those routines deal with the DMA controller accesses to memory and I/O devices + uint8_t system23_state::dmac_mem_r(offs_t offset) { return m_maincpu->space(AS_PROGRAM).read_byte(offset); @@ -128,6 +142,8 @@ namespace m_dmac->hlda_w(state); } + //This routine deals with the responsability of writing a character to the screen + I8275_DRAW_CHARACTER_MEMBER( system23_state::display_pixels ) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); @@ -145,7 +161,7 @@ namespace gfx ^= 0xff; // Highlight not used - bitmap.pix(y, x++) = BIT(gfx, 1) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 1) ? 1 : 0; bitmap.pix(y, x++) = BIT(gfx, 2) ? palette[1] : palette[0]; bitmap.pix(y, x++) = BIT(gfx, 3) ? palette[1] : palette[0]; bitmap.pix(y, x++) = BIT(gfx, 4) ? palette[1] : palette[0]; @@ -154,6 +170,13 @@ namespace bitmap.pix(y, x++) = BIT(gfx, 7) ? palette[1] : palette[0]; } + uint8_t system23_state::language_r() + { + return 3; //hack to set region to Spain + } + + //This routine describes the computer's I/O map + void system23_state::system23_io(address_map &map) { map.unmap_value_high(); @@ -164,6 +187,8 @@ namespace map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } + //This routine describes the computer's memory map + void system23_state::system23_mem(address_map &map) { map.unmap_value_high(); @@ -172,13 +197,15 @@ namespace } + //This is the constructor of the class + void system23_state::system23(machine_config &config) { - i8085a_cpu_device &maincpu(I8085A(config, "maincpu", (18'432'000 / 3))); //frequency needs to be adjusted - maincpu.set_addrmap(AS_PROGRAM, &system23_state::system23_mem); - maincpu.set_addrmap(AS_IO, &system23_state::system23_io); - maincpu.in_sid_func().set(FUNC(system23_state::sid_r)); - maincpu.out_sod_func().set(FUNC(system23_state::sod_w)); + I8085A(config, m_maincpu, (18'432'000 / 3)); + m_maincpu->set_addrmap(AS_PROGRAM, &system23_state::system23_mem); + m_maincpu->set_addrmap(AS_IO, &system23_state::system23_io); + m_maincpu->in_sid_func().set(FUNC(system23_state::sid_r)); + m_maincpu->out_sod_func().set(FUNC(system23_state::sod_w)); I8255(config, m_ppi_kbd); m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); @@ -189,6 +216,7 @@ namespace I8255(config, m_ppi_settings); m_ppi_settings->in_pc_callback().set(FUNC(system23_state::memory_settings_r)); + m_ppi_settings->in_pa_callback().set(FUNC(system23_state::language_r)); I8257(config, m_dmac, (18'432'000 / 6)); //frequency needs to be adjusted m_dmac->out_memw_cb().set(FUNC(system23_state::dmac_mem_w)); @@ -207,10 +235,12 @@ namespace m_crtc->set_character_width(8); m_crtc->set_screen(m_screen); m_crtc->set_display_callback(FUNC(system23_state::display_pixels)); + m_crtc->drq_wr_callback().set(m_dmac, FUNC(i8257_device::dreq2_w)); + //m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_RST55_LINE); // Only when jumper J1 is bridged RAM(config, m_ram).set_default_size("16k"); - config.set_perfect_quantum("maincpu"); + config.set_perfect_quantum(m_maincpu); config.set_default_layout(layout_ibmsystem23); } @@ -226,12 +256,18 @@ namespace ROM_START( system23 ) + ROM_SYSTEM_BIOS(0, "R Set", "1982?") + ROM_SYSTEM_BIOS(1, "TM Set", "1981?") + ROM_REGION(0x4000, "ros_unpaged", 0) - ROM_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b) ) - ROM_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e) ) + ROMX_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b),ROM_BIOS(0)) + ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(0)) + + ROMX_LOAD("02_081AE664_8493746.bin", 0x0000, 0x2000, CRC(081AE664) SHA1(82561e33012f21918927c85527531f21d66deba8),ROM_BIOS(1)) + ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(1)) ROM_REGION(0x2000, "chargen", 0) - ROM_LOAD("chr_73783bc7_8519412.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a)) + ROM_LOAD("chr_73783bc7_8519412.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a) ) ROM_END } diff --git a/src/mame/layout/ibmsystem23.lay b/src/mame/layout/ibmsystem23.lay index e5a8a47c6453a..ddd156386fb7a 100644 --- a/src/mame/layout/ibmsystem23.lay +++ b/src/mame/layout/ibmsystem23.lay @@ -14,10 +14,10 @@ license:CC0-1.0 - + - + From 8907baff12584eba3ebc64e5ff7cac46ba41aee4 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Sun, 5 Jan 2025 15:07:06 +0100 Subject: [PATCH 13/33] Added DIP settings; --- src/mame/ibm/system23.cpp | 51 ++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 3009333b27698..33ae5ad9d3f17 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -29,6 +29,7 @@ namespace m_chargen(*this, "chargen"), m_ram(*this, RAM_TAG), m_screen(*this, "screen"), + m_language(*this,"lang"), m_diag_digits(*this, "digit%u", 0U) { @@ -52,7 +53,7 @@ namespace required_region_ptr m_chargen; required_device m_ram; required_device m_screen; - + required_ioport m_language; output_finder<2> m_diag_digits; uint8_t m_bus_test_register = 0; @@ -74,8 +75,6 @@ namespace void dmac_hrq_w(int state); - uint8_t language_r(); - void crtc_dack_w(offs_t offset, uint8_t data); I8275_DRAW_CHARACTER_MEMBER(display_pixels); @@ -170,11 +169,6 @@ namespace bitmap.pix(y, x++) = BIT(gfx, 7) ? palette[1] : palette[0]; } - uint8_t system23_state::language_r() - { - return 3; //hack to set region to Spain - } - //This routine describes the computer's I/O map void system23_state::system23_io(address_map &map) @@ -216,7 +210,8 @@ namespace I8255(config, m_ppi_settings); m_ppi_settings->in_pc_callback().set(FUNC(system23_state::memory_settings_r)); - m_ppi_settings->in_pa_callback().set(FUNC(system23_state::language_r)); + //m_ppi_settings->in_pa_callback().set(FUNC(system23_state::language_r)); + m_ppi_settings->in_pa_callback().set_ioport(m_language); I8257(config, m_dmac, (18'432'000 / 6)); //frequency needs to be adjusted m_dmac->out_memw_cb().set(FUNC(system23_state::dmac_mem_w)); @@ -254,16 +249,48 @@ namespace } + static INPUT_PORTS_START(system23) + PORT_START("ce") + PORT_DIPNAME( 0x01, 0x00, "A1") + PORT_DIPSETTING( 0x01, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x02, 0x00, "A2") + PORT_DIPSETTING( 0x02, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x04, 0x00, "A3") + PORT_DIPSETTING( 0x04, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + + PORT_START("lang") + PORT_DIPNAME( 0x01, 0x00, "B1") + PORT_DIPSETTING( 0x01, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x02, 0x00, "B2") + PORT_DIPSETTING( 0x02, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x04, 0x00, "B3") + PORT_DIPSETTING( 0x04, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x08, 0x00, "B4") + PORT_DIPSETTING( 0x08, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x10, 0x00, "B5") + PORT_DIPSETTING( 0x10, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + + + INPUT_PORTS_END + ROM_START( system23 ) - ROM_SYSTEM_BIOS(0, "R Set", "1982?") - ROM_SYSTEM_BIOS(1, "TM Set", "1981?") + ROM_SYSTEM_BIOS(0, "r set", "1982?") + ROM_SYSTEM_BIOS(1, "tm set", "1981?") ROM_REGION(0x4000, "ros_unpaged", 0) ROMX_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b),ROM_BIOS(0)) ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(0)) - ROMX_LOAD("02_081AE664_8493746.bin", 0x0000, 0x2000, CRC(081AE664) SHA1(82561e33012f21918927c85527531f21d66deba8),ROM_BIOS(1)) + ROMX_LOAD("02_081ae664_8493746.bin", 0x0000, 0x2000, CRC(081ae664) SHA1(82561e33012f21918927c85527531f21d66deba8),ROM_BIOS(1)) ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(1)) ROM_REGION(0x2000, "chargen", 0) From 8140e3d0b297db59358492644b59fe2bc22cc04c Mon Sep 17 00:00:00 2001 From: RetroAND Date: Mon, 6 Jan 2025 18:19:24 +0100 Subject: [PATCH 14/33] Fixed dipswitches --- src/mame/ibm/system23.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 33ae5ad9d3f17..c5f31da9bcc65 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -30,6 +30,7 @@ namespace m_ram(*this, RAM_TAG), m_screen(*this, "screen"), m_language(*this,"lang"), + m_cedip(*this,"ce"), m_diag_digits(*this, "digit%u", 0U) { @@ -54,6 +55,7 @@ namespace required_device m_ram; required_device m_screen; required_ioport m_language; + required_ioport m_cedip; output_finder<2> m_diag_digits; uint8_t m_bus_test_register = 0; @@ -177,7 +179,7 @@ namespace map(0x00, 0x08).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)); map(0x2c, 0x2f).rw(m_ppi_settings, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x44, 0x47).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); + map(0x44, 0x45).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } @@ -186,7 +188,7 @@ namespace void system23_state::system23_mem(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x3fff).rom().region("ros_unpaged",0); + map(0x0000, 0x3fff).rom(); map(0x8000, 0xbfff).ram(); } @@ -210,14 +212,14 @@ namespace I8255(config, m_ppi_settings); m_ppi_settings->in_pc_callback().set(FUNC(system23_state::memory_settings_r)); - //m_ppi_settings->in_pa_callback().set(FUNC(system23_state::language_r)); m_ppi_settings->in_pa_callback().set_ioport(m_language); + m_ppi_settings->in_pb_callback().set_ioport(m_cedip); I8257(config, m_dmac, (18'432'000 / 6)); //frequency needs to be adjusted m_dmac->out_memw_cb().set(FUNC(system23_state::dmac_mem_w)); m_dmac->in_memr_cb().set(FUNC(system23_state::dmac_mem_r)); m_dmac->out_iow_cb<2>().set(m_crtc, FUNC(i8275_device::dack_w)); - m_dmac->out_hrq_cb().set(FUNC(dmac_hrq_w)); + m_dmac->out_hrq_cb().set(FUNC(system23_state::dmac_hrq_w)); PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT); @@ -277,20 +279,18 @@ namespace PORT_DIPNAME( 0x10, 0x00, "B5") PORT_DIPSETTING( 0x10, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - - INPUT_PORTS_END ROM_START( system23 ) - ROM_SYSTEM_BIOS(0, "r set", "1982?") - ROM_SYSTEM_BIOS(1, "tm set", "1981?") + ROM_SYSTEM_BIOS(0, "r_set", "1982?") + ROM_SYSTEM_BIOS(1, "tm_set", "1981?") - ROM_REGION(0x4000, "ros_unpaged", 0) + ROM_REGION(0x4000, "maincpu", 0) ROMX_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b),ROM_BIOS(0)) ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(0)) - ROMX_LOAD("02_081ae664_8493746.bin", 0x0000, 0x2000, CRC(081ae664) SHA1(82561e33012f21918927c85527531f21d66deba8),ROM_BIOS(1)) + ROMX_LOAD("02_765abd93_8493746.bin", 0x0000, 0x2000, CRC(765abd93) SHA1(1ec489f1d2f72bf7e9ddc5ef642a8336b3ff67e3),ROM_BIOS(1)) ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(1)) ROM_REGION(0x2000, "chargen", 0) @@ -299,4 +299,4 @@ namespace } -COMP( 1981, system23, 0, 0, system23, 0, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +COMP( 1981, system23, 0, 0, system23, system23, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) From 74eb646db03bded164e9f703b538e22b7872e5f7 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Wed, 8 Jan 2025 15:42:10 +0100 Subject: [PATCH 15/33] Fixed 8275 behaviour before initialization; added light pen test circuit; --- src/devices/video/i8275.cpp | 10 +++++++++- src/mame/ibm/system23.cpp | 22 +++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp index 3da93ce26e641..35b0f5b347e7b 100644 --- a/src/devices/video/i8275.cpp +++ b/src/devices/video/i8275.cpp @@ -36,7 +36,7 @@ #include "screen.h" -//#define VERBOSE 1 +#define VERBOSE 1 #include "logmacro.h" @@ -145,6 +145,13 @@ void i8275_device::device_start() m_scanline_timer = timer_alloc(FUNC(i8275_device::scanline_tick), this); } + //preinitialize the device with valid data (in real hardware parameters initialize to random) + m_param[REG_SCN1] = 0x4f; + m_param[REG_SCN2] = 0x58; + m_param[REG_SCN3] = 0x89; + m_param[REG_SCN4] = 0xd9; + recompute_parameters(); + // state saving save_item(NAME(m_status)); save_item(NAME(m_param)); @@ -300,6 +307,7 @@ TIMER_CALLBACK_MEMBER(i8275_device::scanline_tick) { if ((crtc->m_status & ST_IE) && !(crtc->m_status & ST_IR)) { + LOG("I8275 IRQ Set\n"); crtc->m_status |= ST_IR; crtc->m_write_irq(ASSERT_LINE); } diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index c5f31da9bcc65..f3633db683713 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -9,6 +9,7 @@ #include "machine/ram.h" #include "screen.h" #include "emupal.h" +#include "logmacro.h" #include "ibmsystem23.lh" @@ -68,7 +69,6 @@ namespace uint8_t memory_settings_r(); - uint8_t sid_sod_connection; void sod_w(int state); int sid_r(); @@ -122,7 +122,7 @@ namespace void system23_state::sod_w(int state) { - sid_sod_connection = state; + // At this point, it is unknown what SOD is attached to } //Those routines deal with the DMA controller accesses to memory and I/O devices @@ -161,6 +161,16 @@ namespace if (BIT(attrcode, RVV)) gfx ^= 0xff; + if (BIT(attrcode, GPA0) && BIT(attrcode, GPA1)) + { + m_crtc->lpen_w(ASSERT_LINE); //hack to test the light pen at test 05 + LOG("Sytem/23: Light pen asserted\n"); + } + else + { + m_crtc->lpen_w(CLEAR_LINE); + } + // Highlight not used bitmap.pix(y, x++) = BIT(gfx, 1) ? 1 : 0; bitmap.pix(y, x++) = BIT(gfx, 2) ? palette[1] : palette[0]; @@ -235,6 +245,7 @@ namespace m_crtc->drq_wr_callback().set(m_dmac, FUNC(i8257_device::dreq2_w)); //m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_RST55_LINE); // Only when jumper J1 is bridged + RAM(config, m_ram).set_default_size("16k"); config.set_perfect_quantum(m_maincpu); @@ -283,8 +294,8 @@ namespace ROM_START( system23 ) - ROM_SYSTEM_BIOS(0, "r_set", "1982?") - ROM_SYSTEM_BIOS(1, "tm_set", "1981?") + ROM_SYSTEM_BIOS(0, "r_set", "\"R\" Set - 1982?") + ROM_SYSTEM_BIOS(1, "tm_set", "\"TM\" Set - 1981?") ROM_REGION(0x4000, "maincpu", 0) ROMX_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b),ROM_BIOS(0)) @@ -294,7 +305,8 @@ namespace ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(1)) ROM_REGION(0x2000, "chargen", 0) - ROM_LOAD("chr_73783bc7_8519412.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a) ) + ROMX_LOAD("chr_73783bc7_8519412.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a),ROM_BIOS(0)) + ROMX_LOAD("chr_73783bc7_6842372.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a),ROM_BIOS(1)) ROM_END } From 9a643132e4ce4e4d434522217118184206f43481 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Wed, 8 Jan 2025 17:12:57 +0100 Subject: [PATCH 16/33] Commented verbose define; --- src/devices/video/i8275.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp index 35b0f5b347e7b..1f0d9146a3fa2 100644 --- a/src/devices/video/i8275.cpp +++ b/src/devices/video/i8275.cpp @@ -36,7 +36,7 @@ #include "screen.h" -#define VERBOSE 1 +//#define VERBOSE 1 #include "logmacro.h" From c25242a26ded46b7ca270f0d4628144e04d57b95 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 9 Jan 2025 08:22:37 +0100 Subject: [PATCH 17/33] Fixed 8275 bug where it didn't output the correct GG pins; test 05 asserts lpen --- src/devices/video/i8275.cpp | 2 +- src/mame/ibm/system23.cpp | 34 ++++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp index 1f0d9146a3fa2..dbcb1ae622f94 100644 --- a/src/devices/video/i8275.cpp +++ b/src/devices/video/i8275.cpp @@ -27,7 +27,6 @@ TODO: - double spaced rows - - preset counters - how it affects DMA and HRTC? */ @@ -418,6 +417,7 @@ std::pair i8275_device::char_from_buffer(int n, int sx, int rc { // simply blank the attribute character itself attr = FAC_B; + attr |= (data & FAC_GG); // add the GG attributes } } else if (data >= 0xf0 || BIT(end_of_row, n)) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index f3633db683713..e4e4475a14f8c 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -1,6 +1,8 @@ // license:BSD-3-Clause // copyright-holders: Jaume López +#define VERBOSE 1 + #include "emu.h" #include "cpu/i8085/i8085.h" #include "machine/i8255.h" @@ -8,7 +10,6 @@ #include "video/i8275.h" #include "machine/ram.h" #include "screen.h" -#include "emupal.h" #include "logmacro.h" #include "ibmsystem23.lh" @@ -26,12 +27,12 @@ namespace m_ppi_settings(*this, "ppi_settings"), m_dmac(*this,"dma"), m_crtc(*this, "crtc"), - m_palette(*this, "palette"), m_chargen(*this, "chargen"), m_ram(*this, RAM_TAG), m_screen(*this, "screen"), m_language(*this,"lang"), m_cedip(*this,"ce"), + m_j1(*this,"j1"), m_diag_digits(*this, "digit%u", 0U) { @@ -51,12 +52,12 @@ namespace required_device m_ppi_settings; required_device m_dmac; required_device m_crtc; - required_device m_palette; required_region_ptr m_chargen; required_device m_ram; required_device m_screen; required_ioport m_language; required_ioport m_cedip; + required_ioport m_j1; output_finder<2> m_diag_digits; uint8_t m_bus_test_register = 0; @@ -147,7 +148,7 @@ namespace I8275_DRAW_CHARACTER_MEMBER( system23_state::display_pixels ) { - const rgb_t *palette = m_palette->palette()->entry_list_raw(); + //const rgb_t *palette = m_palette->palette()->entry_list_raw(); uint8_t gfx = 0; using namespace i8275_attributes; @@ -161,6 +162,7 @@ namespace if (BIT(attrcode, RVV)) gfx ^= 0xff; + //if (BIT(attrcode, GPA0) || BIT(attrcode, GPA1)) printf("GPA0: %u GPA1: %u\n", BIT(attrcode, GPA0), BIT(attrcode, GPA1)); if (BIT(attrcode, GPA0) && BIT(attrcode, GPA1)) { m_crtc->lpen_w(ASSERT_LINE); //hack to test the light pen at test 05 @@ -171,14 +173,16 @@ namespace m_crtc->lpen_w(CLEAR_LINE); } + LOG("x=%x y=%x attrcode=%x\n",x,y,attrcode); + // Highlight not used bitmap.pix(y, x++) = BIT(gfx, 1) ? 1 : 0; - bitmap.pix(y, x++) = BIT(gfx, 2) ? palette[1] : palette[0]; - bitmap.pix(y, x++) = BIT(gfx, 3) ? palette[1] : palette[0]; - bitmap.pix(y, x++) = BIT(gfx, 4) ? palette[1] : palette[0]; - bitmap.pix(y, x++) = BIT(gfx, 5) ? palette[1] : palette[0]; - bitmap.pix(y, x++) = BIT(gfx, 6) ? palette[1] : palette[0]; - bitmap.pix(y, x++) = BIT(gfx, 7) ? palette[1] : palette[0]; + bitmap.pix(y, x++) = BIT(gfx, 2) ? 1 : 0; + bitmap.pix(y, x++) = BIT(gfx, 3) ? 1 : 0; + bitmap.pix(y, x++) = BIT(gfx, 4) ? 1 : 0; + bitmap.pix(y, x++) = BIT(gfx, 5) ? 1 : 0; + bitmap.pix(y, x++) = BIT(gfx, 6) ? 1 : 0; + bitmap.pix(y, x++) = BIT(gfx, 7) ? 1 : 0; } //This routine describes the computer's I/O map @@ -231,19 +235,16 @@ namespace m_dmac->out_iow_cb<2>().set(m_crtc, FUNC(i8275_device::dack_w)); m_dmac->out_hrq_cb().set(FUNC(system23_state::dmac_hrq_w)); - PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT); - SCREEN(config, m_screen, SCREEN_TYPE_RASTER, rgb_t::green()); m_screen->set_raw(18'432'000, 800, 0, 640, 324, 0, 300); m_screen->set_screen_update(m_crtc, FUNC(i8275_device::screen_update)); - m_screen->set_palette(m_palette); I8275(config, m_crtc, (18'432'000 / 8)); m_crtc->set_character_width(8); m_crtc->set_screen(m_screen); m_crtc->set_display_callback(FUNC(system23_state::display_pixels)); m_crtc->drq_wr_callback().set(m_dmac, FUNC(i8257_device::dreq2_w)); - //m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_RST55_LINE); // Only when jumper J1 is bridged + m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_RST55_LINE); // Only when jumper J1 is bridged RAM(config, m_ram).set_default_size("16k"); @@ -263,6 +264,11 @@ namespace } static INPUT_PORTS_START(system23) + PORT_START("j1") + PORT_DIPNAME(0x01, 0x00, "J1") + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x01, DEF_STR( On )) + PORT_START("ce") PORT_DIPNAME( 0x01, 0x00, "A1") PORT_DIPSETTING( 0x01, DEF_STR( Off )) From 32eb06489a315db16902d1ca38182faeda395269 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 9 Jan 2025 10:34:25 +0100 Subject: [PATCH 18/33] Revert "First extensions to the comments" This reverts commit b2daf97a2cf50165257aba083ba5e1045cc5b643. --- src/mame/ta/alphatpx.cpp | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/mame/ta/alphatpx.cpp b/src/mame/ta/alphatpx.cpp index 6f7b482042294..a6a53191afb18 100644 --- a/src/mame/ta/alphatpx.cpp +++ b/src/mame/ta/alphatpx.cpp @@ -5,16 +5,10 @@ Triumph-Adler Alphatronic Px series =================================== - The Px series was an OEM design by SKS (Steinmetz-Krischke Systemtechnik), like the ITT3030 and the SKS Nano 2500, + The Px series was designed by SKS (Steinmetz-Krischke Systemtechnik), like the ITT3030 and the SKS Nano, the boards are closely related. - - The series originated in the SKS KISS series of computers which were shipped in a bright orange case, typical for - SKS' lineup of computers. SKS had a strong foothold in the typesetting business, as seen in the last of the SKS KISS - descentants, the Hell DS 2069 typesetting terminal. - SKS KISS - ======== - OEM version of the Alphatronic P1 (see below), of which a few were sold independently starting in 1979. + Keyboard and floppy stuff was copypasted from ITT3030 and adapted to the best of knowledge. P1, P2 and P2S: no paging Lower 16K for P1, P2 and P2 S: @@ -29,7 +23,7 @@ == Upper 32K: 0x4000 - 0x400a reserved - 0x4010 - 0xc000 32K RAM + 0x4010 - 0xc000 32K RAM 1x 160K, single sided, 40 tracks, 16 sectors/track, 256 bytes/sector floppy disk drive P2, P2S @@ -65,10 +59,6 @@ =========== Those were P3 and P4's with an additional 8088 card, a 128K RAM card (some with an extra 32K graphics extension) to support MS-DOS. - Keyboard and floppy stuff was copypasted from ITT3030, which is an evolution of the SKS KISS design, as is the SKS Nano 2500 portable and the Hell DS 2069 - typesetting terminal. - - SKS information at https://www.homecomputermuseum.de/historie/mittlere-datentechnik/steinmetz-krischke-systemtechnik-sks comments, testing, modification: rfka01, helwie44 From e14c918bb6f40e9150e3ab089642bc4d536099b8 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Fri, 10 Jan 2025 13:27:00 +0100 Subject: [PATCH 19/33] added column attribute to CRTC; corrected light pen write strobe; added light pen test to system23.cpp; added methods to check retraces and pixel data; system23 now halts at test 08; --- src/devices/video/i8275.cpp | 9 +++-- src/devices/video/i8275.h | 1 + src/mame/ibm/system23.cpp | 62 ++++++++++++++++++++++++++------- src/mame/layout/ibmsystem23.lay | 2 ++ 4 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp index dbcb1ae622f94..9450fdc7d14f9 100644 --- a/src/devices/video/i8275.cpp +++ b/src/devices/video/i8275.cpp @@ -35,7 +35,7 @@ #include "screen.h" -//#define VERBOSE 1 +#define VERBOSE 1 #include "logmacro.h" @@ -95,6 +95,7 @@ i8275_device::i8275_device(const machine_config &mconfig, device_type type, cons m_buffer_dma(0), m_lpen(0), m_scanline(0), + m_column(0), m_dma_stop(false), m_end_of_screen(false), m_preset(false), @@ -167,6 +168,7 @@ void i8275_device::device_start() save_item(NAME(m_buffer_dma)); save_item(NAME(m_lpen)); save_item(NAME(m_scanline)); + save_item(NAME(m_column)); save_item(NAME(m_irq_scanline)); save_item(NAME(m_vrtc_scanline)); save_item(NAME(m_vrtc_drq_scanline)); @@ -365,6 +367,7 @@ TIMER_CALLBACK_MEMBER(i8275_device::scanline_tick) auto [data, attr] = crtc->char_from_buffer(n, sx, rc, lc, end_of_row, blank_row); charcode |= uint32_t(data) << (n * 8); attrcode |= uint32_t(attr) << (n * 8); + crtc->m_column = sx; } m_display_cb(m_bitmap, @@ -724,8 +727,8 @@ void i8275_device::lpen_w(int state) { if (!m_lpen && state) { - m_param[REG_LPEN_COL] = screen().hpos() / m_hpixels_per_column; - m_param[REG_LPEN_ROW] = screen().vpos() / scanlines_per_row(); + m_param[REG_LPEN_COL] = m_column + 3; //According to the datasheet the column is at least three positions off + m_param[REG_LPEN_ROW] = m_scanline / scanlines_per_row(); m_status |= ST_LP; } diff --git a/src/devices/video/i8275.h b/src/devices/video/i8275.h index 17ae5aa462b5c..96970a17bfa09 100644 --- a/src/devices/video/i8275.h +++ b/src/devices/video/i8275.h @@ -233,6 +233,7 @@ class i8275_device : public device_t, int m_lpen; int m_scanline; + int m_column; int m_irq_scanline; int m_vrtc_scanline; int m_vrtc_drq_scanline; diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index e4e4475a14f8c..880a297918166 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -63,6 +63,12 @@ namespace uint8_t m_bus_test_register = 0; uint8_t hex_seven_segment[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; + uint8_t lpen_ct = 0; + + uint8_t m_hrtc = 0; + uint8_t m_vrtc = 0; + uint8_t m_pixel = 0; + void diag_digits_w(uint8_t data); void cpu_test_register_w(uint8_t data); @@ -80,6 +86,9 @@ namespace void crtc_dack_w(offs_t offset, uint8_t data); I8275_DRAW_CHARACTER_MEMBER(display_pixels); + uint8_t crtc_test_vars_r(); + void hrtc_r(uint8_t data); + void vrtc_r(uint8_t data); void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; @@ -156,33 +165,57 @@ namespace if (!BIT(attrcode, VSP)) gfx = m_chargen[(linecount & 15) | (charcode << 4)]; - if (BIT(attrcode, LTEN)) - gfx = 0xff; + // if (BIT(attrcode, LTEN)) + // gfx = 0xff; if (BIT(attrcode, RVV)) gfx ^= 0xff; //if (BIT(attrcode, GPA0) || BIT(attrcode, GPA1)) printf("GPA0: %u GPA1: %u\n", BIT(attrcode, GPA0), BIT(attrcode, GPA1)); - if (BIT(attrcode, GPA0) && BIT(attrcode, GPA1)) + if (BIT(attrcode, GPA0) && BIT(attrcode, GPA1) && !lpen_ct) { - m_crtc->lpen_w(ASSERT_LINE); //hack to test the light pen at test 05 LOG("Sytem/23: Light pen asserted\n"); + lpen_ct = 1; + } + else if(lpen_ct == 1) + { + m_crtc->lpen_w(ASSERT_LINE); + lpen_ct = 0; } else { m_crtc->lpen_w(CLEAR_LINE); } - LOG("x=%x y=%x attrcode=%x\n",x,y,attrcode); + //Pixel reference saved for test 06 usage + m_pixel = BIT(gfx, 1); + //LOG("x=%x y=%x attrcode=%x\n",x,y,attrcode); // Highlight not used - bitmap.pix(y, x++) = BIT(gfx, 1) ? 1 : 0; - bitmap.pix(y, x++) = BIT(gfx, 2) ? 1 : 0; - bitmap.pix(y, x++) = BIT(gfx, 3) ? 1 : 0; - bitmap.pix(y, x++) = BIT(gfx, 4) ? 1 : 0; - bitmap.pix(y, x++) = BIT(gfx, 5) ? 1 : 0; - bitmap.pix(y, x++) = BIT(gfx, 6) ? 1 : 0; - bitmap.pix(y, x++) = BIT(gfx, 7) ? 1 : 0; + bitmap.pix(y, x++) = (BIT(gfx, 7)? rgb_t::green() : rgb_t::black()); + bitmap.pix(y, x++) = (BIT(gfx, 6)? rgb_t::green() : rgb_t::black()); + bitmap.pix(y, x++) = (BIT(gfx, 5)? rgb_t::green() : rgb_t::black()); + bitmap.pix(y, x++) = (BIT(gfx, 4)? rgb_t::green() : rgb_t::black()); + bitmap.pix(y, x++) = (BIT(gfx, 3)? rgb_t::green() : rgb_t::black()); + bitmap.pix(y, x++) = (BIT(gfx, 2)? rgb_t::green() : rgb_t::black()); + bitmap.pix(y, x++) = (BIT(gfx, 1)? rgb_t::green() : rgb_t::black()); + bitmap.pix(y, x++) = (BIT(gfx, 0)? rgb_t::green() : rgb_t::black()); + } + + //This routine compiles the retraces and pixel data from the CRTC into a single byte + uint8_t system23_state::crtc_test_vars_r() + { + return m_hrtc << 4 | m_vrtc << 3 | m_pixel << 2; + } + + void system23_state::hrtc_r(uint8_t data) + { + m_hrtc = data; + } + + void system23_state::vrtc_r(uint8_t data) + { + m_vrtc = data; } //This routine describes the computer's I/O map @@ -220,6 +253,7 @@ namespace I8255(config, m_ppi_kbd); m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); m_ppi_kbd->out_pa_callback().set(FUNC(system23_state::cpu_test_register_w)); + m_ppi_kbd->in_pb_callback().set(FUNC(system23_state::crtc_test_vars_r)); I8255(config, m_ppi_diag); m_ppi_diag->out_pb_callback().set(FUNC(system23_state::diag_digits_w)); @@ -244,7 +278,9 @@ namespace m_crtc->set_screen(m_screen); m_crtc->set_display_callback(FUNC(system23_state::display_pixels)); m_crtc->drq_wr_callback().set(m_dmac, FUNC(i8257_device::dreq2_w)); - m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_RST55_LINE); // Only when jumper J1 is bridged + //m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_RST55_LINE); // Only when jumper J1 is bridged + m_crtc->hrtc_wr_callback().set(FUNC(system23_state::hrtc_r)); + m_crtc->vrtc_wr_callback().set(FUNC(system23_state::vrtc_r)); RAM(config, m_ram).set_default_size("16k"); diff --git a/src/mame/layout/ibmsystem23.lay b/src/mame/layout/ibmsystem23.lay index ddd156386fb7a..31bbef3ee71e3 100644 --- a/src/mame/layout/ibmsystem23.lay +++ b/src/mame/layout/ibmsystem23.lay @@ -13,11 +13,13 @@ license:CC0-1.0 + + From 83b092ef2df842772fbe424d5d0618a766b60540 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Fri, 10 Jan 2025 17:38:32 +0100 Subject: [PATCH 20/33] Added more rom definitions for Set "R"; --- src/mame/ibm/system23.cpp | 108 +++++++++++++++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 8 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 880a297918166..8a9dd0724c4bb 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -22,6 +22,7 @@ namespace system23_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), + m_ros(*this, "ros"), m_ppi_kbd(*this, "ppi_kbd"), m_ppi_diag(*this, "ppi_diag"), m_ppi_settings(*this, "ppi_settings"), @@ -47,6 +48,7 @@ namespace private: required_device m_maincpu; + required_memory_bank m_ros; required_device m_ppi_kbd; required_device m_ppi_diag; required_device m_ppi_settings; @@ -69,6 +71,11 @@ namespace uint8_t m_vrtc = 0; uint8_t m_pixel = 0; + uint8_t m_ros_page; + uint8_t m_ram_r_page; + uint8_t m_ram_w_page; + uint8_t m_dma_page; + void diag_digits_w(uint8_t data); void cpu_test_register_w(uint8_t data); @@ -90,6 +97,15 @@ namespace void hrtc_r(uint8_t data); void vrtc_r(uint8_t data); + uint8_t ros_page_r(); + void ros_page_w(uint8_t data); + uint8_t ram_read_page_r(); + void ram_read_page_w(uint8_t data); + uint8_t ram_write_page_r(); + void ram_write_page_w(uint8_t data); + uint8_t dma_page_r(); + void dma_page_w(uint8_t data); + void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; }; @@ -165,8 +181,8 @@ namespace if (!BIT(attrcode, VSP)) gfx = m_chargen[(linecount & 15) | (charcode << 4)]; - // if (BIT(attrcode, LTEN)) - // gfx = 0xff; + if (BIT(attrcode, LTEN)) + gfx = 0xff; if (BIT(attrcode, RVV)) gfx ^= 0xff; @@ -218,12 +234,58 @@ namespace m_vrtc = data; } + uint8_t system23_state::ros_page_r() + { + return m_ros_page; + } + + void system23_state::ros_page_w(uint8_t data) + { + m_ros_page = data; + m_ros->set_entry(data & 0xf); + } + + + uint8_t system23_state::ram_read_page_r() + { + return m_ram_r_page; + } + + void system23_state::ram_read_page_w(uint8_t data) + { + m_ram_r_page = data; + } + + uint8_t system23_state::ram_write_page_r() + { + return m_ram_w_page; + } + + void system23_state::ram_write_page_w(uint8_t data) + { + m_ram_w_page = data; + } + + uint8_t system23_state::dma_page_r() + { + return m_dma_page; + } + + void system23_state::dma_page_w(uint8_t data) + { + m_dma_page = data; + } + //This routine describes the computer's I/O map void system23_state::system23_io(address_map &map) { map.unmap_value_high(); map(0x00, 0x08).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)); + map(0x20, 0x20).rw(FUNC(system23_state::ram_read_page_r),FUNC(system23_state::ram_read_page_w)); + map(0x21, 0x21).rw(FUNC(system23_state::ram_write_page_r),FUNC(system23_state::ram_write_page_w)); + map(0x22, 0x22).rw(FUNC(system23_state::dma_page_r),FUNC(system23_state::dma_page_w)); + map(0x23, 0x23).rw(FUNC(system23_state::ros_page_r),FUNC(system23_state::ros_page_w)); map(0x2c, 0x2f).rw(m_ppi_settings, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x44, 0x45).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); @@ -236,6 +298,7 @@ namespace { map.unmap_value_high(); map(0x0000, 0x3fff).rom(); + map(0x4000, 0x7fff).bankr(m_ros); map(0x8000, 0xbfff).ram(); } @@ -315,6 +378,21 @@ namespace PORT_DIPNAME( 0x04, 0x00, "A3") PORT_DIPSETTING( 0x04, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x08, 0x00, "A4") + PORT_DIPSETTING( 0x08, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x10, 0x00, "A5") + PORT_DIPSETTING( 0x10, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x20, 0x00, "A6") + PORT_DIPSETTING( 0x20, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x40, 0x40, "A7") + PORT_DIPSETTING( 0x08, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x80, 0x00, "A8") + PORT_DIPSETTING( 0x80, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) PORT_START("lang") PORT_DIPNAME( 0x01, 0x00, "B1") @@ -339,12 +417,26 @@ namespace ROM_SYSTEM_BIOS(0, "r_set", "\"R\" Set - 1982?") ROM_SYSTEM_BIOS(1, "tm_set", "\"TM\" Set - 1981?") - ROM_REGION(0x4000, "maincpu", 0) - ROMX_LOAD("02_61c9866a_4481186.bin", 0x0000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b),ROM_BIOS(0)) - ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(0)) - - ROMX_LOAD("02_765abd93_8493746.bin", 0x0000, 0x2000, CRC(765abd93) SHA1(1ec489f1d2f72bf7e9ddc5ef642a8336b3ff67e3),ROM_BIOS(1)) - ROMX_LOAD("09_07843020_8493747.bin", 0x2000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(1)) + ROM_REGION(0x48000, "maincpu", 0) + //"R" Set (1982?) + ROMX_LOAD("02_61c9866a_4481186.bin", 0x00000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b), ROM_BIOS(0)) + ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e), ROM_BIOS(0)) + + ROMX_LOAD("0a_b9569153_8519402.bin", 0x04000, 0x2000, CRC(b9569153) SHA1(92ccf91766557bc565ad36fc131396aff28b8999), ROM_BIOS(0)) + ROMX_LOAD("0b_4f631183_8519404.bin", 0x06000, 0x2000, CRC(4f631183) SHA1(5f7b011129616bae46c70133309a70c29cc0f127), ROM_BIOS(0)) + ROMX_LOAD("0c_48646293_8519403.bin", 0x14000, 0x2000, CRC(48646293) SHA1(3d7eaf2c143499757681fbedbc3716829ef9bd25), ROM_BIOS(0)) + ROMX_LOAD("0d_bea5a812_8519405.bin", 0x16000, 0x2000, CRC(bea5a812) SHA1(5da3a9231c5d456fa7a26ab36b9d5380e096af59), ROM_BIOS(0)) + //ROM E is empty + //ROM F is empty + ROMX_LOAD("10_41e6c232_8519411.bin", 0x34000, 0x2000, CRC(41e6c232) SHA1(6711000a0c6836a411997de15274b990dd2c0ed0), ROM_BIOS(0)) + ROMX_LOAD("11_b17f5c6e_8519407.bin", 0x36000, 0x2000, CRC(b17f5c6e) SHA1(1d5c2f33de6d1efa2b27b7c43b30268946ef5920), ROM_BIOS(0)) + ROMX_LOAD("12_04dcc52f_8519408.bin", 0x44000, 0x2000, CRC(04dcc52f) SHA1(feba4f189a8bb442c241dadb1fa1f2cb4f344fa3), ROM_BIOS(0)) + ROMX_LOAD("13_9a3f70c7_8519414.bin", 0x46000, 0x2000, CRC(9a3f70c7) SHA1(2dc509b8fa0f84a12df2ee6e91e5fbb29ce7c541), ROM_BIOS(0)) + + + //"TM" Set (1981?) + ROMX_LOAD("02_765abd93_8493746.bin", 0x00000, 0x2000, CRC(765abd93) SHA1(1ec489f1d2f72bf7e9ddc5ef642a8336b3ff67e3),ROM_BIOS(1)) + ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(1)) ROM_REGION(0x2000, "chargen", 0) ROMX_LOAD("chr_73783bc7_8519412.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a),ROM_BIOS(0)) From 26d0401b072ab68bfe1ee343a35c8f18886531a0 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Sat, 11 Jan 2025 18:22:50 +0100 Subject: [PATCH 21/33] Moved diagnostics probe; added ROM definitions; added PIT, PIC and USART; --- src/mame/ibm/system23.cpp | 96 ++++++++++++++++++++++++++------- src/mame/layout/ibmsystem23.lay | 4 +- 2 files changed, 80 insertions(+), 20 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 8a9dd0724c4bb..31f8cb8238336 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -5,11 +5,16 @@ #include "emu.h" #include "cpu/i8085/i8085.h" +#include "machine/i8251.h" +#include "machine/pit8253.h" #include "machine/i8255.h" #include "machine/i8257.h" +#include "machine/pic8259.h" #include "video/i8275.h" #include "machine/ram.h" +#include "sound/beep.h" #include "screen.h" +#include "speaker.h" #include "logmacro.h" #include "ibmsystem23.lh" @@ -28,9 +33,14 @@ namespace m_ppi_settings(*this, "ppi_settings"), m_dmac(*this,"dma"), m_crtc(*this, "crtc"), + m_pit(*this, "pit"), + m_pic(*this, "pic"), + m_usart(*this, "usart"), m_chargen(*this, "chargen"), m_ram(*this, RAM_TAG), + m_paged_ram(*this, "paged_ram"), m_screen(*this, "screen"), + m_beep(*this, "beeper"), m_language(*this,"lang"), m_cedip(*this,"ce"), m_j1(*this,"j1"), @@ -54,9 +64,14 @@ namespace required_device m_ppi_settings; required_device m_dmac; required_device m_crtc; + required_device m_pit; + required_device m_pic; + required_device m_usart; required_region_ptr m_chargen; required_device m_ram; + required_device m_paged_ram; required_device m_screen; + required_device m_beep; required_ioport m_language; required_ioport m_cedip; required_ioport m_j1; @@ -281,14 +296,17 @@ namespace void system23_state::system23_io(address_map &map) { map.unmap_value_high(); - map(0x00, 0x08).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)); + map(0x00, 0x0f).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)); map(0x20, 0x20).rw(FUNC(system23_state::ram_read_page_r),FUNC(system23_state::ram_read_page_w)); map(0x21, 0x21).rw(FUNC(system23_state::ram_write_page_r),FUNC(system23_state::ram_write_page_w)); map(0x22, 0x22).rw(FUNC(system23_state::dma_page_r),FUNC(system23_state::dma_page_w)); map(0x23, 0x23).rw(FUNC(system23_state::ros_page_r),FUNC(system23_state::ros_page_w)); + map(0x24, 0x27).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + map(0x28, 0x2b).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x2c, 0x2f).rw(m_ppi_settings, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x44, 0x45).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); + map(0x48,0x49).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } @@ -300,6 +318,7 @@ namespace map(0x0000, 0x3fff).rom(); map(0x4000, 0x7fff).bankr(m_ros); map(0x8000, 0xbfff).ram(); + map(0xc000, 0xffff).ram(); } @@ -345,21 +364,42 @@ namespace m_crtc->hrtc_wr_callback().set(FUNC(system23_state::hrtc_r)); m_crtc->vrtc_wr_callback().set(FUNC(system23_state::vrtc_r)); + I8251(config, m_usart, 0); + SPEAKER(config, "mono").front_center(); + BEEP(config, m_beep, 1000).add_route(ALL_OUTPUTS, "mono", 0.50); + + PIT8253(config, m_pit, 0); + m_pit->set_clk<0>(18'432'000 / 6); + m_pit->set_clk<1>(18'432'000 / 6); + m_pit->set_clk<2>(18'432'000 / 6); + //m_pit->out_handler<0>().set(m_usart, FUNC(i8251_device::clock)); + //m_pit->out_handler<1>().set(FUNC(system23_state::update_beeper)); + m_pit->out_handler<2>().set_inputline(m_maincpu, I8085_RST75_LINE); + + PIC8259(config, m_pic, 0); + //m_maincpu->set_irq_acknowledge_callback(m_pic, pic8259_device::inta_cb); + + RAM(config, m_ram).set_default_size("16k"); + RAM(config, m_paged_ram).set_default_size("16k").set_extra_options("16k,48k,96k"); config.set_perfect_quantum(m_maincpu); config.set_default_layout(layout_ibmsystem23); + + } void system23_state::machine_start() { m_diag_digits.resolve(); + m_ros->configure_entries(0, 16, memregion("maincpu")->base() + 0x4000, 0x4000); } void system23_state::machine_reset() { - + m_beep->set_state(1); + m_beep->set_clock(0); } static INPUT_PORTS_START(system23) @@ -387,8 +427,8 @@ namespace PORT_DIPNAME( 0x20, 0x00, "A6") PORT_DIPSETTING( 0x20, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x40, 0x40, "A7") - PORT_DIPSETTING( 0x08, DEF_STR( Off )) + PORT_DIPNAME( 0x40, 0x00, "A7")//Needs to be closed in order for the PIT to be detected! + PORT_DIPSETTING( 0x40, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) PORT_DIPNAME( 0x80, 0x00, "A8") PORT_DIPSETTING( 0x80, DEF_STR( Off )) @@ -415,28 +455,48 @@ namespace ROM_START( system23 ) ROM_SYSTEM_BIOS(0, "r_set", "\"R\" Set - 1982?") - ROM_SYSTEM_BIOS(1, "tm_set", "\"TM\" Set - 1981?") + ROM_SYSTEM_BIOS(1, "pp_set", "\"PP\" Set - 1980") - ROM_REGION(0x48000, "maincpu", 0) + ROM_REGION(0x24000, "maincpu", 0) //"R" Set (1982?) ROMX_LOAD("02_61c9866a_4481186.bin", 0x00000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b), ROM_BIOS(0)) ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e), ROM_BIOS(0)) - ROMX_LOAD("0a_b9569153_8519402.bin", 0x04000, 0x2000, CRC(b9569153) SHA1(92ccf91766557bc565ad36fc131396aff28b8999), ROM_BIOS(0)) ROMX_LOAD("0b_4f631183_8519404.bin", 0x06000, 0x2000, CRC(4f631183) SHA1(5f7b011129616bae46c70133309a70c29cc0f127), ROM_BIOS(0)) - ROMX_LOAD("0c_48646293_8519403.bin", 0x14000, 0x2000, CRC(48646293) SHA1(3d7eaf2c143499757681fbedbc3716829ef9bd25), ROM_BIOS(0)) - ROMX_LOAD("0d_bea5a812_8519405.bin", 0x16000, 0x2000, CRC(bea5a812) SHA1(5da3a9231c5d456fa7a26ab36b9d5380e096af59), ROM_BIOS(0)) + ROMX_LOAD("0c_48646293_8519403.bin", 0x08000, 0x2000, CRC(48646293) SHA1(3d7eaf2c143499757681fbedbc3716829ef9bd25), ROM_BIOS(0)) + ROMX_LOAD("0d_bea5a812_8519405.bin", 0x0a000, 0x2000, CRC(bea5a812) SHA1(5da3a9231c5d456fa7a26ab36b9d5380e096af59), ROM_BIOS(0)) //ROM E is empty //ROM F is empty - ROMX_LOAD("10_41e6c232_8519411.bin", 0x34000, 0x2000, CRC(41e6c232) SHA1(6711000a0c6836a411997de15274b990dd2c0ed0), ROM_BIOS(0)) - ROMX_LOAD("11_b17f5c6e_8519407.bin", 0x36000, 0x2000, CRC(b17f5c6e) SHA1(1d5c2f33de6d1efa2b27b7c43b30268946ef5920), ROM_BIOS(0)) - ROMX_LOAD("12_04dcc52f_8519408.bin", 0x44000, 0x2000, CRC(04dcc52f) SHA1(feba4f189a8bb442c241dadb1fa1f2cb4f344fa3), ROM_BIOS(0)) - ROMX_LOAD("13_9a3f70c7_8519414.bin", 0x46000, 0x2000, CRC(9a3f70c7) SHA1(2dc509b8fa0f84a12df2ee6e91e5fbb29ce7c541), ROM_BIOS(0)) - - - //"TM" Set (1981?) - ROMX_LOAD("02_765abd93_8493746.bin", 0x00000, 0x2000, CRC(765abd93) SHA1(1ec489f1d2f72bf7e9ddc5ef642a8336b3ff67e3),ROM_BIOS(1)) - ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e),ROM_BIOS(1)) + ROMX_LOAD("10_41e6c232_8519411.bin", 0x10000, 0x2000, CRC(41e6c232) SHA1(6711000a0c6836a411997de15274b990dd2c0ed0), ROM_BIOS(0)) + ROMX_LOAD("11_b17f5c6e_8519407.bin", 0x12000, 0x2000, CRC(b17f5c6e) SHA1(1d5c2f33de6d1efa2b27b7c43b30268946ef5920), ROM_BIOS(0)) + ROMX_LOAD("12_04dcc52f_8519408.bin", 0x14000, 0x2000, CRC(04dcc52f) SHA1(feba4f189a8bb442c241dadb1fa1f2cb4f344fa3), ROM_BIOS(0)) + ROMX_LOAD("13_9a3f70c7_8519414.bin", 0x16000, 0x2000, CRC(9a3f70c7) SHA1(2dc509b8fa0f84a12df2ee6e91e5fbb29ce7c541), ROM_BIOS(0)) + ROMX_LOAD("14_91b2969e_8519406.bin", 0x18000, 0x2000, CRC(91b2969e) SHA1(dedac0b9b3e607bcb03bc16653c2c002eb67b633), ROM_BIOS(0)) + ROMX_LOAD("15_0f9a99fa_8519416.bin", 0x1a000, 0x2000, CRC(0f9a99fa) SHA1(ba174188167482997694b84f68b9d45e55187212), ROM_BIOS(0)) + ROMX_LOAD("16_e451a5e2_8519409.bin", 0x1c000, 0x2000, CRC(e451a5e2) SHA1(f41d2493f696387a2c729420ad8beafac96e604d), ROM_BIOS(0)) + ROMX_LOAD("17_b9fb8bf1_8519410.bin", 0x1e000, 0x2000, CRC(b9fb8bf1) SHA1(e5de770db73ac4c30fad5c03445b5239c133d84a), ROM_BIOS(0)) + ROMX_LOAD("18_22cb6de4_8519417.bin", 0x20000, 0x2000, CRC(22cb6de4) SHA1(ae050de1dd20afc25fe97012f6b088be0ae47878), ROM_BIOS(0)) + ROMX_LOAD("19_2e665945_4481711.bin", 0x22000, 0x2000, CRC(2e665945) SHA1(4ae61c13786b44b28a02055c104ef63355a629b9), ROM_BIOS(0)) + + //"PP" Set (1980) + ROMX_LOAD("02_765abd93_8493746.bin", 0x00000, 0x2000, CRC(765abd93) SHA1(1ec489f1d2f72bf7e9ddc5ef642a8336b3ff67e3), ROM_BIOS(1)) + ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e), ROM_BIOS(1)) + ROMX_LOAD("0a_b9569153_8493748.bin", 0x04000, 0x2000, CRC(b9569153) SHA1(92ccf91766557bc565ad36fc131396aff28b8999), ROM_BIOS(1)) + ROMX_LOAD("0b_4f631183_8493754.bin", 0x06000, 0x2000, CRC(4f631183) SHA1(5f7b011129616bae46c70133309a70c29cc0f127), ROM_BIOS(1)) + ROMX_LOAD("0c_48646293_8493749.bin", 0x08000, 0x2000, CRC(48646293) SHA1(3d7eaf2c143499757681fbedbc3716829ef9bd25), ROM_BIOS(1)) + ROMX_LOAD("0d_bea5a812_8493755.bin", 0x0a000, 0x2000, CRC(bea5a812) SHA1(5da3a9231c5d456fa7a26ab36b9d5380e096af59), ROM_BIOS(1)) + //ROM E is empty + //ROM F is empty + //ROM 10 is empty + //ROM 11 is empty + ROMX_LOAD("12_04dcc52f_8493760.bin", 0x14000, 0x2000, CRC(04dcc52f) SHA1(feba4f189a8bb442c241dadb1fa1f2cb4f344fa3), ROM_BIOS(1)) + ROMX_LOAD("13_26869666_8493761.bin", 0x16000, 0x2000, CRC(26869666) SHA1(9fae28fe3613218a6f8d7fb7a88bbc29a3f75a0f), ROM_BIOS(1)) + ROMX_LOAD("14_91b2969e_8493756.bin", 0x18000, 0x2000, CRC(91b2969e) SHA1(dedac0b9b3e607bcb03bc16653c2c002eb67b633), ROM_BIOS(1)) + ROMX_LOAD("15_269db39d_8493762.bin", 0x1a000, 0x2000, CRC(269db39d) SHA1(f32c3754cff5a8bbfc76fc23040731cb7ff343fa), ROM_BIOS(1)) + ROMX_LOAD("16_e451a5e2_8493763.bin", 0x1c000, 0x2000, CRC(e451a5e2) SHA1(f41d2493f696387a2c729420ad8beafac96e604d), ROM_BIOS(1)) + ROMX_LOAD("17_b9fb8bf1_8493764.bin", 0x1e000, 0x2000, CRC(b9fb8bf1) SHA1(e5de770db73ac4c30fad5c03445b5239c133d84a), ROM_BIOS(1)) + ROMX_LOAD("18_41e6c232_8493765.bin", 0x20000, 0x2000, CRC(41e6c232) SHA1(6711000a0c6836a411997de15274b990dd2c0ed0), ROM_BIOS(1)) + ROMX_LOAD("19_73aeeb56_8493727.bin", 0x22000, 0x2000, CRC(73aeeb56) SHA1(abfce66d49662731d9e41e06c54c63cd40f9caac), ROM_BIOS(1)) ROM_REGION(0x2000, "chargen", 0) ROMX_LOAD("chr_73783bc7_8519412.bin", 0x0000, 0x2000, CRC(73783bc7) SHA1(45ee2a9acbb577b281ad8181b7ec0c5ef05c346a),ROM_BIOS(0)) diff --git a/src/mame/layout/ibmsystem23.lay b/src/mame/layout/ibmsystem23.lay index 31bbef3ee71e3..4b825ae6ee508 100644 --- a/src/mame/layout/ibmsystem23.lay +++ b/src/mame/layout/ibmsystem23.lay @@ -15,10 +15,10 @@ license:CC0-1.0 - + - + From ae30897ac0da49a03688cd5c76fe895289704c2d Mon Sep 17 00:00:00 2001 From: RetroAND Date: Sun, 19 Jan 2025 14:07:24 +0100 Subject: [PATCH 22/33] Added memory definition lines; fixed "A" dipswitches, cleared all errors except 34 and 35 --- src/mame/ibm/system23.cpp | 158 ++++++++++++++++++++++++++------------ 1 file changed, 109 insertions(+), 49 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 31f8cb8238336..13ee714345590 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -12,9 +12,9 @@ #include "machine/pic8259.h" #include "video/i8275.h" #include "machine/ram.h" -#include "sound/beep.h" #include "screen.h" #include "speaker.h" +#include "sound/spkrdev.h" #include "logmacro.h" #include "ibmsystem23.lh" @@ -38,14 +38,15 @@ namespace m_usart(*this, "usart"), m_chargen(*this, "chargen"), m_ram(*this, RAM_TAG), - m_paged_ram(*this, "paged_ram"), + m_ram_bank_r(*this, "ram_bank_read"), + m_ram_bank_w(*this, "ram_bank_write"), + //m_ram_bank_dma(*this, "ram_bank_dma"), m_screen(*this, "screen"), - m_beep(*this, "beeper"), + m_speaker(*this,"beeper"), m_language(*this,"lang"), m_cedip(*this,"ce"), m_j1(*this,"j1"), m_diag_digits(*this, "digit%u", 0U) - { } @@ -69,9 +70,11 @@ namespace required_device m_usart; required_region_ptr m_chargen; required_device m_ram; - required_device m_paged_ram; + required_memory_bank m_ram_bank_r; + required_memory_bank m_ram_bank_w; + //required_memory_bank m_ram_bank_dma; required_device m_screen; - required_device m_beep; + required_device m_speaker; required_ioport m_language; required_ioport m_cedip; required_ioport m_j1; @@ -91,14 +94,23 @@ namespace uint8_t m_ram_w_page; uint8_t m_dma_page; + uint8_t m_port_4e; + + //uint8_t ram_r(offs_t offset); + //void ram_w(offs_t offset, uint8_t data); + uint8_t *m_ram_ptr; + uint32_t m_ram_size; + void diag_digits_w(uint8_t data); + void port_4e_w(uint8_t data); + uint8_t port_4e_r(); + void cpu_test_register_w(uint8_t data); uint8_t cpu_test_register_r(); uint8_t memory_settings_r(); - void sod_w(int state); int sid_r(); uint8_t dmac_mem_r(offs_t offset); @@ -112,6 +124,10 @@ namespace void hrtc_r(uint8_t data); void vrtc_r(uint8_t data); + void update_speaker(uint32_t state); + void rst75(uint32_t state); + void rst55(uint32_t state); + uint8_t ros_page_r(); void ros_page_w(uint8_t data); uint8_t ram_read_page_r(); @@ -149,7 +165,7 @@ namespace uint8_t system23_state::memory_settings_r() { - return 0; //Patch to make the memory test work while port 2e is being studied + return 0;//return 0; //Patch to make the memory test work while port 2e is being studied } //This routine deals with the SID signal being read. The CPU test fails if the line is not asserted high @@ -159,13 +175,6 @@ namespace return ASSERT_LINE; // Actually, SID is tied to VCC at the motherboard } - //This routine deals with the SOD signal being written. As of writting this comment there is no known purpose for SOD - - void system23_state::sod_w(int state) - { - // At this point, it is unknown what SOD is attached to - } - //Those routines deal with the DMA controller accesses to memory and I/O devices uint8_t system23_state::dmac_mem_r(offs_t offset) @@ -205,7 +214,7 @@ namespace //if (BIT(attrcode, GPA0) || BIT(attrcode, GPA1)) printf("GPA0: %u GPA1: %u\n", BIT(attrcode, GPA0), BIT(attrcode, GPA1)); if (BIT(attrcode, GPA0) && BIT(attrcode, GPA1) && !lpen_ct) { - LOG("Sytem/23: Light pen asserted\n"); + //LOG("Sytem/23: Light pen asserted\n"); lpen_ct = 1; } else if(lpen_ct == 1) @@ -256,7 +265,8 @@ namespace void system23_state::ros_page_w(uint8_t data) { - m_ros_page = data; + LOG("ROS page: %x\n", data); + m_ros_page = data | 0xf0; m_ros->set_entry(data & 0xf); } @@ -268,7 +278,9 @@ namespace void system23_state::ram_read_page_w(uint8_t data) { - m_ram_r_page = data; + LOG("RAM read page: %x\n",data); + m_ram_r_page = data | 0xf0; + m_ram_bank_r->set_entry(data & 0xf); } uint8_t system23_state::ram_write_page_r() @@ -278,7 +290,9 @@ namespace void system23_state::ram_write_page_w(uint8_t data) { - m_ram_w_page = data; + LOG("RAM write page: %x\n", data); + m_ram_w_page = data | 0xf0; + m_ram_bank_w->set_entry(data & 0xf); } uint8_t system23_state::dma_page_r() @@ -288,7 +302,37 @@ namespace void system23_state::dma_page_w(uint8_t data) { - m_dma_page = data; + LOG("DMA page: %x\n",data); + m_dma_page = data | 0xf0; + //m_ram_bank_dma->set_entry(data & 0xf); + } + + void system23_state::port_4e_w(uint8_t data) + { + m_port_4e = data; + } + + uint8_t system23_state::port_4e_r() + { + return m_port_4e; + } + + void system23_state::update_speaker(uint32_t state) + { + uint32_t speaker_state = !(state && !(m_port_4e && 0x01)); + m_speaker->level_w(speaker_state); + } + + void system23_state::rst75(uint32_t state) + { + LOG("RST7.5\n"); + m_maincpu->set_input_line(I8085_RST75_LINE, state); + } + + void system23_state::rst55(uint32_t state) + { + LOG("RST5.5\n"); + m_maincpu->set_input_line(I8085_RST55_LINE, state & m_j1->read()); } //This routine describes the computer's I/O map @@ -297,16 +341,16 @@ namespace { map.unmap_value_high(); map(0x00, 0x0f).rw(m_dmac, FUNC(i8257_device::read), FUNC(i8257_device::write)); - map(0x20, 0x20).rw(FUNC(system23_state::ram_read_page_r),FUNC(system23_state::ram_read_page_w)); + map(0x22, 0x22).rw(FUNC(system23_state::ram_read_page_r),FUNC(system23_state::ram_read_page_w)); map(0x21, 0x21).rw(FUNC(system23_state::ram_write_page_r),FUNC(system23_state::ram_write_page_w)); - map(0x22, 0x22).rw(FUNC(system23_state::dma_page_r),FUNC(system23_state::dma_page_w)); + map(0x20, 0x20).rw(FUNC(system23_state::dma_page_r),FUNC(system23_state::dma_page_w)); map(0x23, 0x23).rw(FUNC(system23_state::ros_page_r),FUNC(system23_state::ros_page_w)); map(0x24, 0x27).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0x28, 0x2b).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); map(0x2c, 0x2f).rw(m_ppi_settings, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x44, 0x45).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); - map(0x48,0x49).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x48, 0x49).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); } @@ -318,8 +362,8 @@ namespace map(0x0000, 0x3fff).rom(); map(0x4000, 0x7fff).bankr(m_ros); map(0x8000, 0xbfff).ram(); - map(0xc000, 0xffff).ram(); - + map(0xc000, 0xffff).bankr(m_ram_bank_r); + map(0xc000, 0xffff).bankw(m_ram_bank_w); } //This is the constructor of the class @@ -330,12 +374,14 @@ namespace m_maincpu->set_addrmap(AS_PROGRAM, &system23_state::system23_mem); m_maincpu->set_addrmap(AS_IO, &system23_state::system23_io); m_maincpu->in_sid_func().set(FUNC(system23_state::sid_r)); - m_maincpu->out_sod_func().set(FUNC(system23_state::sod_w)); + //m_maincpu->out_sod_func().set_inputline(m_maincpu, I8085_TRAP_LINE); I8255(config, m_ppi_kbd); m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); m_ppi_kbd->out_pa_callback().set(FUNC(system23_state::cpu_test_register_w)); m_ppi_kbd->in_pb_callback().set(FUNC(system23_state::crtc_test_vars_r)); + m_ppi_kbd->in_pc_callback().set(FUNC(system23_state::port_4e_r)); + m_ppi_kbd->out_pc_callback().set(FUNC(system23_state::port_4e_w)); I8255(config, m_ppi_diag); m_ppi_diag->out_pb_callback().set(FUNC(system23_state::diag_digits_w)); @@ -360,46 +406,51 @@ namespace m_crtc->set_screen(m_screen); m_crtc->set_display_callback(FUNC(system23_state::display_pixels)); m_crtc->drq_wr_callback().set(m_dmac, FUNC(i8257_device::dreq2_w)); - //m_crtc->irq_wr_callback().set_inputline(m_maincpu, I8085_RST55_LINE); // Only when jumper J1 is bridged + m_crtc->irq_wr_callback().set(FUNC(system23_state::rst55)); m_crtc->hrtc_wr_callback().set(FUNC(system23_state::hrtc_r)); m_crtc->vrtc_wr_callback().set(FUNC(system23_state::vrtc_r)); I8251(config, m_usart, 0); SPEAKER(config, "mono").front_center(); - BEEP(config, m_beep, 1000).add_route(ALL_OUTPUTS, "mono", 0.50); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); PIT8253(config, m_pit, 0); - m_pit->set_clk<0>(18'432'000 / 6); - m_pit->set_clk<1>(18'432'000 / 6); + m_pit->set_clk<0>(18'432'000 / 12); + m_pit->set_clk<1>(18'432'000 / 12); m_pit->set_clk<2>(18'432'000 / 6); - //m_pit->out_handler<0>().set(m_usart, FUNC(i8251_device::clock)); - //m_pit->out_handler<1>().set(FUNC(system23_state::update_beeper)); - m_pit->out_handler<2>().set_inputline(m_maincpu, I8085_RST75_LINE); + m_pit->out_handler<0>().set(m_usart, FUNC(i8251_device::write_txc)); + m_pit->out_handler<1>().set(FUNC(system23_state::update_speaker)); + m_pit->out_handler<2>().set(FUNC(system23_state::rst75)); PIC8259(config, m_pic, 0); - //m_maincpu->set_irq_acknowledge_callback(m_pic, pic8259_device::inta_cb); - - + m_maincpu->set_irq_acknowledge_callback(m_pic, FUNC(pic8259_device::inta_cb)); + m_usart->rxrdy_handler().set(m_pic, FUNC(pic8259_device::ir1_w)); + m_usart->txrdy_handler().set(m_pic, FUNC(pic8259_device::ir2_w)); - RAM(config, m_ram).set_default_size("16k"); - RAM(config, m_paged_ram).set_default_size("16k").set_extra_options("16k,48k,96k"); + RAM(config, m_ram).set_default_size("128k"); config.set_perfect_quantum(m_maincpu); config.set_default_layout(layout_ibmsystem23); + } void system23_state::machine_start() { m_diag_digits.resolve(); m_ros->configure_entries(0, 16, memregion("maincpu")->base() + 0x4000, 0x4000); + m_ram_ptr = m_ram->pointer(); + m_ram_size = m_ram->size(); + m_ram_bank_r->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x4000); + m_ram_bank_w->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x4000); + //m_ram_bank_dma->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x4000); } void system23_state::machine_reset() { - m_beep->set_state(1); - m_beep->set_clock(0); + } static INPUT_PORTS_START(system23) @@ -409,28 +460,28 @@ namespace PORT_DIPSETTING( 0x01, DEF_STR( On )) PORT_START("ce") - PORT_DIPNAME( 0x01, 0x00, "A1") + PORT_DIPNAME( 0x01, 0x00, "RAM Base installed") PORT_DIPSETTING( 0x01, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x02, 0x00, "A2") + PORT_DIPNAME( 0x02, 0x00, "RAM Expansion installed") PORT_DIPSETTING( 0x02, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x04, 0x00, "A3") + PORT_DIPNAME( 0x04, 0x00, "RAM Base 32/64KB") PORT_DIPSETTING( 0x04, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x08, 0x00, "A4") + PORT_DIPNAME( 0x08, 0x00, "RAM Expansion 32/64KB") PORT_DIPSETTING( 0x08, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x10, 0x00, "A5") + PORT_DIPNAME( 0x10, 0x00, "A1 - CE Loop on test") PORT_DIPSETTING( 0x10, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x20, 0x00, "A6") + PORT_DIPNAME( 0x20, 0x00, "A2 - CE Stop on error") PORT_DIPSETTING( 0x20, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x40, 0x00, "A7")//Needs to be closed in order for the PIT to be detected! + PORT_DIPNAME( 0x40, 0x00, "A3 - Machine update card installed") PORT_DIPSETTING( 0x40, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x80, 0x00, "A8") + PORT_DIPNAME( 0x80, 0x00, "A4") PORT_DIPSETTING( 0x80, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) @@ -450,6 +501,15 @@ namespace PORT_DIPNAME( 0x10, 0x00, "B5") PORT_DIPSETTING( 0x10, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x20, 0x00, "B6") + PORT_DIPSETTING( 0x20, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x40, 0x00, "B7") + PORT_DIPSETTING( 0x40, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) + PORT_DIPNAME( 0x80, 0x00, "B8") + PORT_DIPSETTING( 0x80, DEF_STR( Off )) + PORT_DIPSETTING( 0x00, DEF_STR( On )) INPUT_PORTS_END @@ -505,4 +565,4 @@ namespace } -COMP( 1981, system23, 0, 0, system23, system23, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +COMP( 1981, system23, 0, 0, system23, system23, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NOT_WORKING) From 8dac684f4d430e283fbb4dff33318fc2e04ca0db Mon Sep 17 00:00:00 2001 From: RetroAND Date: Sat, 1 Feb 2025 09:12:12 +0100 Subject: [PATCH 23/33] All tests pass; keyboard skeleton --- src/mame/ibm/system23.cpp | 100 ++++++++++++++++++++++++++++---- src/mame/ibm/system23_kbd.cpp | 106 ++++++++++++++++++++++++++++++++++ src/mame/ibm/system23_kbd.h | 35 +++++++++++ 3 files changed, 230 insertions(+), 11 deletions(-) create mode 100644 src/mame/ibm/system23_kbd.cpp create mode 100644 src/mame/ibm/system23_kbd.h diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 13ee714345590..5b96dfe9de094 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -15,6 +15,8 @@ #include "screen.h" #include "speaker.h" #include "sound/spkrdev.h" +#include "machine/clock.h" +#include "system23_kbd.h" #include "logmacro.h" #include "ibmsystem23.lh" @@ -43,6 +45,8 @@ namespace //m_ram_bank_dma(*this, "ram_bank_dma"), m_screen(*this, "screen"), m_speaker(*this,"beeper"), + m_keyboard(*this, "kbd"), + m_pit_clock(*this, "pit_clk"), m_language(*this,"lang"), m_cedip(*this,"ce"), m_j1(*this,"j1"), @@ -75,6 +79,8 @@ namespace //required_memory_bank m_ram_bank_dma; required_device m_screen; required_device m_speaker; + required_device m_keyboard; + required_device m_pit_clock; required_ioport m_language; required_ioport m_cedip; required_ioport m_j1; @@ -101,6 +107,8 @@ namespace uint8_t *m_ram_ptr; uint32_t m_ram_size; + uint32_t m_rst75_enabled; + void diag_digits_w(uint8_t data); void port_4e_w(uint8_t data); @@ -137,6 +145,17 @@ namespace uint8_t dma_page_r(); void dma_page_w(uint8_t data); + void reset_keyboard(uint8_t data); + uint8_t read_keyboard(); + void data_strobe_w(int state); + + void usart_ck_w(int state); + + void trap(int state); + + void pit_clk2(int state); + void rst75_enable(uint8_t data); + void system23_io(address_map &map) ATTR_COLD; void system23_mem(address_map &map) ATTR_COLD; }; @@ -319,7 +338,8 @@ namespace void system23_state::update_speaker(uint32_t state) { - uint32_t speaker_state = !(state && !(m_port_4e && 0x01)); + uint32_t speaker_enable = (m_port_4e && BIT(m_port_4e, 1)) ? CLEAR_LINE : ASSERT_LINE; + uint32_t speaker_state = (speaker_enable ? CLEAR_LINE : ASSERT_LINE) & state; m_speaker->level_w(speaker_state); } @@ -335,6 +355,54 @@ namespace m_maincpu->set_input_line(I8085_RST55_LINE, state & m_j1->read()); } + void system23_state::reset_keyboard(uint8_t data) + { + if(BIT(data,7)) + { + m_keyboard->reset_w(CLEAR_LINE); + } + else + { + m_keyboard->reset_w(ASSERT_LINE); + } + m_pic->ir0_w(BIT(data,3)); + m_keyboard->t0_w(BIT(data,5)); + } + + uint8_t system23_state::read_keyboard() + { + return m_keyboard->read_keyboard(); + } + + void system23_state::usart_ck_w(int state) + { + m_usart->write_rxc(state); + m_usart->write_txc(state); + } + + void system23_state::data_strobe_w(int state) + { + //LOG("KBD Data strobe: %d\n", state); + m_ppi_diag->pc4_w(state); + } + + void system23_state::trap(int state) + { + int new_state = state & CLEAR_LINE;//Dummy value, SOD gates a 4-input NAND output (RESET OUT, Memory Parity Error) + LOG("TRAP: %d", new_state); + m_maincpu->set_input_line(I8085_RST75_LINE, new_state); + } + + void system23_state::pit_clk2(int state) + { + m_pit->write_clk2(!(state & m_rst75_enabled)); + } + + void system23_state::rst75_enable(uint8_t data) + { + m_rst75_enabled = BIT(data,3); + } + //This routine describes the computer's I/O map void system23_state::system23_io(address_map &map) @@ -374,7 +442,8 @@ namespace m_maincpu->set_addrmap(AS_PROGRAM, &system23_state::system23_mem); m_maincpu->set_addrmap(AS_IO, &system23_state::system23_io); m_maincpu->in_sid_func().set(FUNC(system23_state::sid_r)); - //m_maincpu->out_sod_func().set_inputline(m_maincpu, I8085_TRAP_LINE); + m_maincpu->out_sod_func().set(FUNC(system23_state::trap)); + m_maincpu->set_irq_acknowledge_callback(m_pic, FUNC(pic8259_device::inta_cb)); I8255(config, m_ppi_kbd); m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); @@ -384,12 +453,15 @@ namespace m_ppi_kbd->out_pc_callback().set(FUNC(system23_state::port_4e_w)); I8255(config, m_ppi_diag); + m_ppi_diag->in_pa_callback().set(FUNC(system23_state::read_keyboard)); m_ppi_diag->out_pb_callback().set(FUNC(system23_state::diag_digits_w)); + m_ppi_diag->out_pc_callback().set(FUNC(system23_state::reset_keyboard)); I8255(config, m_ppi_settings); m_ppi_settings->in_pc_callback().set(FUNC(system23_state::memory_settings_r)); m_ppi_settings->in_pa_callback().set_ioport(m_language); m_ppi_settings->in_pb_callback().set_ioport(m_cedip); + m_ppi_settings->out_pc_callback().set(FUNC(system23_state::rst75_enable)); I8257(config, m_dmac, (18'432'000 / 6)); //frequency needs to be adjusted m_dmac->out_memw_cb().set(FUNC(system23_state::dmac_mem_w)); @@ -411,6 +483,9 @@ namespace m_crtc->vrtc_wr_callback().set(FUNC(system23_state::vrtc_r)); I8251(config, m_usart, 0); + m_usart->rxrdy_handler().set(m_pic, FUNC(pic8259_device::ir1_w)); + m_usart->txrdy_handler().set(m_pic, FUNC(pic8259_device::ir2_w)); + SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker); m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); @@ -418,22 +493,25 @@ namespace PIT8253(config, m_pit, 0); m_pit->set_clk<0>(18'432'000 / 12); m_pit->set_clk<1>(18'432'000 / 12); - m_pit->set_clk<2>(18'432'000 / 6); - m_pit->out_handler<0>().set(m_usart, FUNC(i8251_device::write_txc)); + //m_pit->set_clk<2>(18'432'000 / 12); + m_pit->out_handler<0>().set(FUNC(system23_state::usart_ck_w)); m_pit->out_handler<1>().set(FUNC(system23_state::update_speaker)); m_pit->out_handler<2>().set(FUNC(system23_state::rst75)); - PIC8259(config, m_pic, 0); - m_maincpu->set_irq_acknowledge_callback(m_pic, FUNC(pic8259_device::inta_cb)); - m_usart->rxrdy_handler().set(m_pic, FUNC(pic8259_device::ir1_w)); - m_usart->txrdy_handler().set(m_pic, FUNC(pic8259_device::ir2_w)); + PIC8259(config, m_pic); + m_pic->out_int_callback().set_inputline(m_maincpu, I8085_INTR_LINE); RAM(config, m_ram).set_default_size("128k"); - config.set_perfect_quantum(m_maincpu); - config.set_default_layout(layout_ibmsystem23); + SYSTEM23_KEYBOARD(config, m_keyboard, 0); + m_keyboard->scancode_export().set(FUNC(system23_state::data_strobe_w)); + + CLOCK(config, m_pit_clock, 18'432'000 / 12); + m_pit_clock->signal_handler().set(FUNC(system23_state::pit_clk2)); + config.set_perfect_quantum(m_maincpu); + config.set_default_layout(layout_ibmsystem23); } @@ -565,4 +643,4 @@ namespace } -COMP( 1981, system23, 0, 0, system23, system23, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NOT_WORKING) +COMP( 1981, system23, 0, 0, system23, system23, system23_state, empty_init, "IBM", "IBM System/23 Datamaster", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_IMPERFECT_CONTROLS | MACHINE_IMPERFECT_GRAPHICS) diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp new file mode 100644 index 0000000000000..9115b7ab79da0 --- /dev/null +++ b/src/mame/ibm/system23_kbd.cpp @@ -0,0 +1,106 @@ +//#define VERBOSE 1 + +#include "emu.h" +#include "system23_kbd.h" +#include "cpu/mcs48/mcs48.h" + +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(SYSTEM23_KEYBOARD, system23_kbd_device, "system23_kbd","IBM System/23 Keyboard") + +ROM_START(system23_kbd) +ROM_REGION(0x400, "i8048", 0) +ROM_LOAD("kbd_3e88d3bf_8048.bin", 0x0000, 0x0400, CRC(3e88d3bf) SHA1(04884f5d43a940c76bc4d53d2dbd970b80f11fa6)) +ROM_END + +void system23_kbd_device::device_start() +{ + +} + +void system23_kbd_device::device_reset() +{ + m_reset = ASSERT_LINE; + m_t0 = CLEAR_LINE; + m_t1 = CLEAR_LINE; +} + +const tiny_rom_entry *system23_kbd_device::device_rom_region() const +{ + return ROM_NAME(system23_kbd); +} + +system23_kbd_device::system23_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) +: device_t(mconfig, SYSTEM23_KEYBOARD, tag, owner, clock), + m_mcu(*this, "i8048"), + m_bus_write(*this) +{ +} + +void system23_kbd_device::device_add_mconfig(machine_config &config) +{ + I8048(config, m_mcu, 4'350'000);//Oscillation between 4.17 and 4.35 MHz + m_mcu->bus_out_cb().set(FUNC(system23_kbd_device::bus_w)); + m_mcu->p2_out_cb().set(FUNC(system23_kbd_device::data_strobe)); + m_mcu->t0_in_cb().set(FUNC(system23_kbd_device::t0_r)); + m_mcu->t1_in_cb().set(FUNC(system23_kbd_device::t1_r)); + +} + +void system23_kbd_device::reset_w(int state) +{ + if (m_reset ^ state) + { + LOG("Reset changed to %d\n", state); + m_reset = state; + if (state) + { + m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + m_mcu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + } + } +} + +void system23_kbd_device::bus_w(uint8_t data) +{ + m_bus = 0; + if(BIT(data,0)) m_bus |= 0x40; + if(BIT(data,1)) m_bus |= 0x20; + if(BIT(data,2)) m_bus |= 0x10; + if(BIT(data,3)) m_bus |= 0x08; + if(BIT(data,4)) m_bus |= 0x04; + if(BIT(data,5)) m_bus |= 0x02; + if(BIT(data,6)) m_bus |= 0x01; +} + +uint8_t system23_kbd_device::read_keyboard() +{ + LOG("Read Keyboard %02x\n", m_bus); + return m_bus; +} + +void system23_kbd_device::data_strobe(uint8_t data) +{ + m_bus_write(BIT(data,7)); + m_t1 = BIT(data, 3); + LOG("T1: %d\n", m_t1); +} + +void system23_kbd_device::t0_w(int state) +{ + if(m_t0 ^ state) + { + m_t0 = state; + LOG("Delay strobe %d\n", state); + } +} + +int system23_kbd_device::t0_r() +{ + return m_t0; +} + +int system23_kbd_device::t1_r() +{ + return m_t1; +} diff --git a/src/mame/ibm/system23_kbd.h b/src/mame/ibm/system23_kbd.h new file mode 100644 index 0000000000000..40e98c34c8b70 --- /dev/null +++ b/src/mame/ibm/system23_kbd.h @@ -0,0 +1,35 @@ +#include "cpu/mcs48/mcs48.h" + +class system23_kbd_device : public device_t +{ + public: + system23_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + void reset_w(int state); + uint8_t read_keyboard(); + void t0_w(int state); + + auto scancode_export() {return m_bus_write.bind();}; + + protected: + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + private: + required_device m_mcu; + + devcb_write_line m_bus_write; + + uint8_t m_bus; + + int m_reset; + int m_t0, m_t1; + + void bus_w(uint8_t data); + int t0_r(); + int t1_r(); + void data_strobe(uint8_t data); + +}; + +DECLARE_DEVICE_TYPE(SYSTEM23_KEYBOARD, system23_kbd_device) From 1a886aec073c8bd65b9e23bae7c1b634ef28398b Mon Sep 17 00:00:00 2001 From: RetroAND Date: Tue, 4 Feb 2025 15:09:35 +0100 Subject: [PATCH 24/33] Keyboard implementation - still need fixes --- src/mame/ibm/system23.cpp | 7 +- src/mame/ibm/system23_kbd.cpp | 166 +++++++++++++++++++++++++++++++++- src/mame/ibm/system23_kbd.h | 10 +- 3 files changed, 174 insertions(+), 9 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 5b96dfe9de094..1e9686528d526 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -218,11 +218,12 @@ namespace { //const rgb_t *palette = m_palette->palette()->entry_list_raw(); uint8_t gfx = 0; + //uint8_t chr_bank = m_bus_test_register & 0x03; using namespace i8275_attributes; if (!BIT(attrcode, VSP)) - gfx = m_chargen[(linecount & 15) | (charcode << 4)]; + gfx = m_chargen[(linecount & 15) | (charcode << 4) /*| (chr_bank << 10)*/]; if (BIT(attrcode, LTEN)) gfx = 0xff; @@ -592,8 +593,8 @@ namespace ROM_START( system23 ) - ROM_SYSTEM_BIOS(0, "r_set", "\"R\" Set - 1982?") - ROM_SYSTEM_BIOS(1, "pp_set", "\"PP\" Set - 1980") + ROM_SYSTEM_BIOS(0, "ros_104", "ROS 1.04 - 1982?") + ROM_SYSTEM_BIOS(1, "ros_101", "ROS 1.01 - 1980") ROM_REGION(0x24000, "maincpu", 0) //"R" Set (1982?) diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp index 9115b7ab79da0..7471e5e505c1a 100644 --- a/src/mame/ibm/system23_kbd.cpp +++ b/src/mame/ibm/system23_kbd.cpp @@ -1,4 +1,4 @@ -//#define VERBOSE 1 +#define VERBOSE 1 #include "emu.h" #include "system23_kbd.h" @@ -23,6 +23,8 @@ void system23_kbd_device::device_reset() m_reset = ASSERT_LINE; m_t0 = CLEAR_LINE; m_t1 = CLEAR_LINE; + m_cs = CLEAR_LINE; + m_scan_r = false; } const tiny_rom_entry *system23_kbd_device::device_rom_region() const @@ -33,6 +35,7 @@ const tiny_rom_entry *system23_kbd_device::device_rom_region() const system23_kbd_device::system23_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, SYSTEM23_KEYBOARD, tag, owner, clock), m_mcu(*this, "i8048"), + m_columns(*this, "CL.%u",0), m_bus_write(*this) { } @@ -41,7 +44,8 @@ void system23_kbd_device::device_add_mconfig(machine_config &config) { I8048(config, m_mcu, 4'350'000);//Oscillation between 4.17 and 4.35 MHz m_mcu->bus_out_cb().set(FUNC(system23_kbd_device::bus_w)); - m_mcu->p2_out_cb().set(FUNC(system23_kbd_device::data_strobe)); + m_mcu->p1_out_cb().set(FUNC(system23_kbd_device::p1_w)); + m_mcu->p2_out_cb().set(FUNC(system23_kbd_device::p2_w)); m_mcu->t0_in_cb().set(FUNC(system23_kbd_device::t0_r)); m_mcu->t1_in_cb().set(FUNC(system23_kbd_device::t1_r)); @@ -71,6 +75,7 @@ void system23_kbd_device::bus_w(uint8_t data) if(BIT(data,4)) m_bus |= 0x04; if(BIT(data,5)) m_bus |= 0x02; if(BIT(data,6)) m_bus |= 0x01; + m_cs = BIT(data, 7); } uint8_t system23_kbd_device::read_keyboard() @@ -79,11 +84,24 @@ uint8_t system23_kbd_device::read_keyboard() return m_bus; } -void system23_kbd_device::data_strobe(uint8_t data) +void system23_kbd_device::p2_w(uint8_t data) { m_bus_write(BIT(data,7)); m_t1 = BIT(data, 3); - LOG("T1: %d\n", m_t1); + int data_to_write = ((data & 0x70) << 4); + m_scan_r = true; + m_counter &= 0xff; + m_counter |= data_to_write; + m_select = data & 0x07; + LOG("Port 2 Counter: %04x Select: %d\n", m_counter, m_select); +} + +void system23_kbd_device::p1_w(uint8_t data) +{ + m_scan_r = true; + m_counter &= 0x700; + m_counter |= data; + LOG("Port 1 counter: %04x\n", m_counter); } void system23_kbd_device::t0_w(int state) @@ -100,7 +118,145 @@ int system23_kbd_device::t0_r() return m_t0; } +//This routine has the responsibility to process the keyboard matrix and extract the sense line, then feed it to the microcontroller int system23_kbd_device::t1_r() { - return m_t1; + m_scan_r = false; + if(m_cs) + { + uint8_t kbd_data = m_columns[translate_columns()]->read(); + LOG("Counter: %d Select: %d Value: %02x\n", translate_columns(), m_select, kbd_data); + return BIT(kbd_data, m_select); + } + else + { + return m_t1; + } +} + + +INPUT_PORTS_START( system23_kbd ) + PORT_START("CL.0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.5") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.6") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.7") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.8") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.9") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_START("CL.10") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) +INPUT_PORTS_END + +ioport_constructor system23_kbd_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( system23_kbd ); +} + +int system23_kbd_device::translate_columns() +{ + switch(m_counter) + { + case 0x001: return 0; + case 0x002: return 1; + case 0x004: return 2; + case 0x008: return 3; + case 0x010: return 4; + case 0x020: return 5; + case 0x040: return 6; + case 0x080: return 7; + case 0x100: return 8; + case 0x200: return 9; + case 0x400: return 10; + default: return 0; + } } diff --git a/src/mame/ibm/system23_kbd.h b/src/mame/ibm/system23_kbd.h index 40e98c34c8b70..028cde533ba05 100644 --- a/src/mame/ibm/system23_kbd.h +++ b/src/mame/ibm/system23_kbd.h @@ -15,8 +15,10 @@ class system23_kbd_device : public device_t virtual void device_reset() override ATTR_COLD; virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD; virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; private: required_device m_mcu; + required_ioport_array<11> m_columns; devcb_write_line m_bus_write; @@ -24,11 +26,17 @@ class system23_kbd_device : public device_t int m_reset; int m_t0, m_t1; + int m_select; + int m_cs; + int m_counter; + bool m_scan_r; void bus_w(uint8_t data); int t0_r(); int t1_r(); - void data_strobe(uint8_t data); + void p2_w(uint8_t data); + void p1_w(uint8_t data); + int translate_columns(); }; From 74be3184b17364e0bd79d882719877ae6bbfde17 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Tue, 4 Feb 2025 16:24:33 +0100 Subject: [PATCH 25/33] Stabilization of counter and sense select signals; --- src/mame/ibm/system23_kbd.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp index 7471e5e505c1a..d7208bddcf0d5 100644 --- a/src/mame/ibm/system23_kbd.cpp +++ b/src/mame/ibm/system23_kbd.cpp @@ -76,6 +76,7 @@ void system23_kbd_device::bus_w(uint8_t data) if(BIT(data,5)) m_bus |= 0x02; if(BIT(data,6)) m_bus |= 0x01; m_cs = BIT(data, 7); + LOG("m_cs: %d\n",m_cs); } uint8_t system23_kbd_device::read_keyboard() @@ -88,19 +89,23 @@ void system23_kbd_device::p2_w(uint8_t data) { m_bus_write(BIT(data,7)); m_t1 = BIT(data, 3); - int data_to_write = ((data & 0x70) << 4); - m_scan_r = true; - m_counter &= 0xff; - m_counter |= data_to_write; - m_select = data & 0x07; + if(!m_cs) + { + int data_to_write = ((data & 0x70) << 4); + m_counter &= 0xff; + m_counter |= data_to_write; + m_select &= data & 0x07; + } LOG("Port 2 Counter: %04x Select: %d\n", m_counter, m_select); } void system23_kbd_device::p1_w(uint8_t data) { - m_scan_r = true; - m_counter &= 0x700; - m_counter |= data; + if(!m_cs) + { + m_counter &= 0x700; + m_counter |= data; + } LOG("Port 1 counter: %04x\n", m_counter); } @@ -121,11 +126,12 @@ int system23_kbd_device::t0_r() //This routine has the responsibility to process the keyboard matrix and extract the sense line, then feed it to the microcontroller int system23_kbd_device::t1_r() { - m_scan_r = false; if(m_cs) { uint8_t kbd_data = m_columns[translate_columns()]->read(); LOG("Counter: %d Select: %d Value: %02x\n", translate_columns(), m_select, kbd_data); + m_counter = 0; + m_select = 7; return BIT(kbd_data, m_select); } else From 45c6a94111e037d1ed4e0715540e38141e557b33 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 6 Feb 2025 08:37:17 +0100 Subject: [PATCH 26/33] Stabilized ROM errors; assigned some keys in the keyboard; --- src/mame/ibm/system23.cpp | 6 +-- src/mame/ibm/system23_kbd.cpp | 92 ++++++++++++++++++----------------- 2 files changed, 50 insertions(+), 48 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 1e9686528d526..0b80c3dff286c 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -596,8 +596,8 @@ namespace ROM_SYSTEM_BIOS(0, "ros_104", "ROS 1.04 - 1982?") ROM_SYSTEM_BIOS(1, "ros_101", "ROS 1.01 - 1980") - ROM_REGION(0x24000, "maincpu", 0) - //"R" Set (1982?) + ROM_REGION(0x24000, "maincpu", ROMREGION_ERASEFF) + //ROS 1.04 (1982?) ROMX_LOAD("02_61c9866a_4481186.bin", 0x00000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b), ROM_BIOS(0)) ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e), ROM_BIOS(0)) ROMX_LOAD("0a_b9569153_8519402.bin", 0x04000, 0x2000, CRC(b9569153) SHA1(92ccf91766557bc565ad36fc131396aff28b8999), ROM_BIOS(0)) @@ -617,7 +617,7 @@ namespace ROMX_LOAD("18_22cb6de4_8519417.bin", 0x20000, 0x2000, CRC(22cb6de4) SHA1(ae050de1dd20afc25fe97012f6b088be0ae47878), ROM_BIOS(0)) ROMX_LOAD("19_2e665945_4481711.bin", 0x22000, 0x2000, CRC(2e665945) SHA1(4ae61c13786b44b28a02055c104ef63355a629b9), ROM_BIOS(0)) - //"PP" Set (1980) + //ROS 1.01 (1980) ROMX_LOAD("02_765abd93_8493746.bin", 0x00000, 0x2000, CRC(765abd93) SHA1(1ec489f1d2f72bf7e9ddc5ef642a8336b3ff67e3), ROM_BIOS(1)) ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e), ROM_BIOS(1)) ROMX_LOAD("0a_b9569153_8493748.bin", 0x04000, 0x2000, CRC(b9569153) SHA1(92ccf91766557bc565ad36fc131396aff28b8999), ROM_BIOS(1)) diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp index d7208bddcf0d5..013c5ab8e7bad 100644 --- a/src/mame/ibm/system23_kbd.cpp +++ b/src/mame/ibm/system23_kbd.cpp @@ -82,6 +82,7 @@ void system23_kbd_device::bus_w(uint8_t data) uint8_t system23_kbd_device::read_keyboard() { LOG("Read Keyboard %02x\n", m_bus); + printf("Scan Code: %02x\n", m_bus); return m_bus; } @@ -126,24 +127,25 @@ int system23_kbd_device::t0_r() //This routine has the responsibility to process the keyboard matrix and extract the sense line, then feed it to the microcontroller int system23_kbd_device::t1_r() { - if(m_cs) - { + // if(m_cs) + // { uint8_t kbd_data = m_columns[translate_columns()]->read(); LOG("Counter: %d Select: %d Value: %02x\n", translate_columns(), m_select, kbd_data); + int sense = BIT(kbd_data, m_select); m_counter = 0; m_select = 7; - return BIT(kbd_data, m_select); - } - else - { - return m_t1; - } + return sense; + // } + // else + // { + // return m_t1; + // } } INPUT_PORTS_START( system23_kbd ) PORT_START("CL.0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) @@ -153,25 +155,25 @@ INPUT_PORTS_START( system23_kbd ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_START("CL.1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_START("CL.2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) // ERROR 94 (RESET ERROR + SOMETHING ELSE?) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) // ERROR 94 (RESET ERROR + SOMETHING ELSE?) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_START("CL.3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Reset Error") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) @@ -179,7 +181,7 @@ INPUT_PORTS_START( system23_kbd ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_START("CL.4") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) @@ -192,52 +194,52 @@ INPUT_PORTS_START( system23_kbd ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // < > PORT_START("CL.6") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_START("CL.7") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //OPTION 10 START 4000 PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //OPTION 10 START 4000 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_START("CL.8") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) // 4 keypad? + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_START("CL.9") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) // left arrow? PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //gj? WTF! + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //"'", incorrect PORT_START("CL.10") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('/') //scancode 4c + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // "'" correct PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) From 0df83e81f104b6c1b73398425c44b7561e10923d Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 6 Feb 2025 17:29:22 +0100 Subject: [PATCH 27/33] Key assignation --- src/mame/ibm/system23_kbd.cpp | 187 ++++++++++++++++------------------ 1 file changed, 90 insertions(+), 97 deletions(-) diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp index 013c5ab8e7bad..c9788a9cbc261 100644 --- a/src/mame/ibm/system23_kbd.cpp +++ b/src/mame/ibm/system23_kbd.cpp @@ -67,14 +67,7 @@ void system23_kbd_device::reset_w(int state) void system23_kbd_device::bus_w(uint8_t data) { - m_bus = 0; - if(BIT(data,0)) m_bus |= 0x40; - if(BIT(data,1)) m_bus |= 0x20; - if(BIT(data,2)) m_bus |= 0x10; - if(BIT(data,3)) m_bus |= 0x08; - if(BIT(data,4)) m_bus |= 0x04; - if(BIT(data,5)) m_bus |= 0x02; - if(BIT(data,6)) m_bus |= 0x01; + m_bus = bitswap<7>(data, 0, 1, 2, 3, 4, 5, 6); m_cs = BIT(data, 7); LOG("m_cs: %d\n",m_cs); } @@ -82,7 +75,7 @@ void system23_kbd_device::bus_w(uint8_t data) uint8_t system23_kbd_device::read_keyboard() { LOG("Read Keyboard %02x\n", m_bus); - printf("Scan Code: %02x\n", m_bus); + printf("Scan Code: %02x\n", (m_bus ^ 0x7f)); return m_bus; } @@ -145,104 +138,104 @@ int system23_kbd_device::t1_r() INPUT_PORTS_START( system23_kbd ) PORT_START("CL.0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') //29 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('{') PORT_CHAR('}') //59 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //61 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') //31 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') //39 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') //49 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') //19 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code PORT_START("CL.1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') //01 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') //21 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') //41 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //51 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') //11 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) //71 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') //09 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //69 PORT_START("CL.2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) // ERROR 94 (RESET ERROR + SOMETHING ELSE?) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) // ERROR 94 (RESET ERROR + SOMETHING ELSE?) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //0b 0f + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //68 6f + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //35 37 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //4d 4f + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //5a + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') //1a + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LAlt") PORT_CODE(KEYCODE_LALT) //5e + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code PORT_START("CL.3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Reset Error") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') //28 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') //48 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Backslash") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') //2c + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Inq") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) //6c + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //6a + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') //2a + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Reset Error") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) //6e + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //1e PORT_START("CL.4") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') //08 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) //70 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //0c + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') //4c + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') //4a + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') //0a + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Field -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') //4e + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //2e PORT_START("CL.5") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // < > + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Field Exit") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) //78 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //30 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) //74 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) //72 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('<') PORT_CHAR('>') //0e PORT_START("CL.6") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //10 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //50 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') //34 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) //54 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //52 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') //32 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //76 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') //36 PORT_START("CL.7") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //OPTION 10 START 4000 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //OPTION 10 START 4000 - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') //20 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //60 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') //14 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //64 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //62 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') //12 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(ENTER)) //56 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') //16 PORT_START("CL.8") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) // 4 keypad? - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') //40 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') //38 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') //24 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') //44 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(2) //42 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') //22 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //66 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') //26 PORT_START("CL.9") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) // left arrow? - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //gj? WTF! - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //"'", incorrect + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //3f 3d + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //67 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') //07 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //75 77 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //75 77 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') //02 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //3e PORT_START("CL.10") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('/') //scancode 4c - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // "'" correct - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') //27 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') //47 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //5f + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') //3b + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // 1b "'" + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) //5b + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //1f + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //7b 7f INPUT_PORTS_END ioport_constructor system23_kbd_device::device_input_ports() const From 3696b98c970ebebd2cb15d95ce57709d93b27bfe Mon Sep 17 00:00:00 2001 From: RetroAND Date: Tue, 11 Feb 2025 13:51:53 +0100 Subject: [PATCH 28/33] Key assignation correction; --- src/mame/ibm/system23.cpp | 69 +++++++++------ src/mame/ibm/system23_kbd.cpp | 157 +++++++++++++++++----------------- 2 files changed, 123 insertions(+), 103 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 0b80c3dff286c..9af02a5214ff9 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -30,7 +30,7 @@ namespace : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_ros(*this, "ros"), - m_ppi_kbd(*this, "ppi_kbd"), + m_ppi_crtc(*this, "ppi_kbd"), m_ppi_diag(*this, "ppi_diag"), m_ppi_settings(*this, "ppi_settings"), m_dmac(*this,"dma"), @@ -64,7 +64,7 @@ namespace private: required_device m_maincpu; required_memory_bank m_ros; - required_device m_ppi_kbd; + required_device m_ppi_crtc; required_device m_ppi_diag; required_device m_ppi_settings; required_device m_dmac; @@ -109,6 +109,9 @@ namespace uint32_t m_rst75_enabled; + int m_sod; + int m_ros_w; + void diag_digits_w(uint8_t data); void port_4e_w(uint8_t data); @@ -151,7 +154,9 @@ namespace void usart_ck_w(int state); - void trap(int state); + void trap(); + void sod_trap(int state); + void ros_w_trap(uint8_t data); void pit_clk2(int state); void rst75_enable(uint8_t data); @@ -372,7 +377,7 @@ namespace uint8_t system23_state::read_keyboard() { - return m_keyboard->read_keyboard(); + return m_keyboard->read_keyboard() & 0x7f; } void system23_state::usart_ck_w(int state) @@ -387,11 +392,24 @@ namespace m_ppi_diag->pc4_w(state); } - void system23_state::trap(int state) + void system23_state::trap() + { + int error = !(m_ros_w); + int state = m_sod & error;//SOD gates a 4-input NAND output (RESET OUT, Memory Parity Error, ROS write Error) + LOG("TRAP: %d", state); + m_maincpu->set_input_line(I8085_RST75_LINE, state); + } + + void system23_state::sod_trap(int state) { - int new_state = state & CLEAR_LINE;//Dummy value, SOD gates a 4-input NAND output (RESET OUT, Memory Parity Error) - LOG("TRAP: %d", new_state); - m_maincpu->set_input_line(I8085_RST75_LINE, new_state); + m_sod = state; + trap(); + } + + void system23_state::ros_w_trap(uint8_t data) + { + m_ros_w = CLEAR_LINE; + trap(); } void system23_state::pit_clk2(int state) @@ -420,7 +438,7 @@ namespace map(0x40, 0x43).rw(m_ppi_diag, FUNC(i8255_device::read), FUNC(i8255_device::write)); map(0x44, 0x45).rw(m_crtc, FUNC(i8275_device::read), FUNC(i8275_device::write)); map(0x48, 0x49).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); - map(0x4c, 0x4f).rw(m_ppi_kbd, FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x4c, 0x4f).rw(m_ppi_crtc, FUNC(i8255_device::read), FUNC(i8255_device::write)); } //This routine describes the computer's memory map @@ -428,8 +446,8 @@ namespace void system23_state::system23_mem(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x7fff).bankr(m_ros); + map(0x0000, 0x3fff).rom().w(FUNC(system23_state::ros_w_trap)); + map(0x4000, 0x7fff).bankr(m_ros).w(FUNC(system23_state::ros_w_trap)); map(0x8000, 0xbfff).ram(); map(0xc000, 0xffff).bankr(m_ram_bank_r); map(0xc000, 0xffff).bankw(m_ram_bank_w); @@ -443,15 +461,15 @@ namespace m_maincpu->set_addrmap(AS_PROGRAM, &system23_state::system23_mem); m_maincpu->set_addrmap(AS_IO, &system23_state::system23_io); m_maincpu->in_sid_func().set(FUNC(system23_state::sid_r)); - m_maincpu->out_sod_func().set(FUNC(system23_state::trap)); + m_maincpu->out_sod_func().set(FUNC(system23_state::sod_trap)); m_maincpu->set_irq_acknowledge_callback(m_pic, FUNC(pic8259_device::inta_cb)); - I8255(config, m_ppi_kbd); - m_ppi_kbd->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); - m_ppi_kbd->out_pa_callback().set(FUNC(system23_state::cpu_test_register_w)); - m_ppi_kbd->in_pb_callback().set(FUNC(system23_state::crtc_test_vars_r)); - m_ppi_kbd->in_pc_callback().set(FUNC(system23_state::port_4e_r)); - m_ppi_kbd->out_pc_callback().set(FUNC(system23_state::port_4e_w)); + I8255(config, m_ppi_crtc); + m_ppi_crtc->in_pa_callback().set(FUNC(system23_state::cpu_test_register_r)); + m_ppi_crtc->out_pa_callback().set(FUNC(system23_state::cpu_test_register_w)); + m_ppi_crtc->in_pb_callback().set(FUNC(system23_state::crtc_test_vars_r)); + m_ppi_crtc->in_pc_callback().set(FUNC(system23_state::port_4e_r)); + m_ppi_crtc->out_pc_callback().set(FUNC(system23_state::port_4e_w)); I8255(config, m_ppi_diag); m_ppi_diag->in_pa_callback().set(FUNC(system23_state::read_keyboard)); @@ -510,7 +528,6 @@ namespace CLOCK(config, m_pit_clock, 18'432'000 / 12); m_pit_clock->signal_handler().set(FUNC(system23_state::pit_clk2)); - config.set_perfect_quantum(m_maincpu); config.set_default_layout(layout_ibmsystem23); @@ -525,6 +542,8 @@ namespace m_ram_bank_r->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x4000); m_ram_bank_w->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x4000); //m_ram_bank_dma->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x4000); + m_sod = CLEAR_LINE; + m_ros_w = ASSERT_LINE; } void system23_state::machine_reset() @@ -604,8 +623,8 @@ namespace ROMX_LOAD("0b_4f631183_8519404.bin", 0x06000, 0x2000, CRC(4f631183) SHA1(5f7b011129616bae46c70133309a70c29cc0f127), ROM_BIOS(0)) ROMX_LOAD("0c_48646293_8519403.bin", 0x08000, 0x2000, CRC(48646293) SHA1(3d7eaf2c143499757681fbedbc3716829ef9bd25), ROM_BIOS(0)) ROMX_LOAD("0d_bea5a812_8519405.bin", 0x0a000, 0x2000, CRC(bea5a812) SHA1(5da3a9231c5d456fa7a26ab36b9d5380e096af59), ROM_BIOS(0)) - //ROM E is empty - //ROM F is empty + ROMX_FILL(0xc000, 0x2000, 0xff, ROM_BIOS(0))//ROM E is empty + ROMX_FILL(0xe000, 0x2000, 0xff, ROM_BIOS(0))//ROM F is empty ROMX_LOAD("10_41e6c232_8519411.bin", 0x10000, 0x2000, CRC(41e6c232) SHA1(6711000a0c6836a411997de15274b990dd2c0ed0), ROM_BIOS(0)) ROMX_LOAD("11_b17f5c6e_8519407.bin", 0x12000, 0x2000, CRC(b17f5c6e) SHA1(1d5c2f33de6d1efa2b27b7c43b30268946ef5920), ROM_BIOS(0)) ROMX_LOAD("12_04dcc52f_8519408.bin", 0x14000, 0x2000, CRC(04dcc52f) SHA1(feba4f189a8bb442c241dadb1fa1f2cb4f344fa3), ROM_BIOS(0)) @@ -624,10 +643,10 @@ namespace ROMX_LOAD("0b_4f631183_8493754.bin", 0x06000, 0x2000, CRC(4f631183) SHA1(5f7b011129616bae46c70133309a70c29cc0f127), ROM_BIOS(1)) ROMX_LOAD("0c_48646293_8493749.bin", 0x08000, 0x2000, CRC(48646293) SHA1(3d7eaf2c143499757681fbedbc3716829ef9bd25), ROM_BIOS(1)) ROMX_LOAD("0d_bea5a812_8493755.bin", 0x0a000, 0x2000, CRC(bea5a812) SHA1(5da3a9231c5d456fa7a26ab36b9d5380e096af59), ROM_BIOS(1)) - //ROM E is empty - //ROM F is empty - //ROM 10 is empty - //ROM 11 is empty + ROMX_FILL(0x0c000, 0x2000, 0xff, ROM_BIOS(1))//ROM E is empty + ROMX_FILL(0x0e000, 0x2000, 0xff, ROM_BIOS(1))//ROM F is empty + ROMX_FILL(0x10000, 0x2000, 0xff, ROM_BIOS(1))//ROM 10 is empty + ROMX_FILL(0x10000, 0x2000, 0xff, ROM_BIOS(1))//ROM 11 is empty ROMX_LOAD("12_04dcc52f_8493760.bin", 0x14000, 0x2000, CRC(04dcc52f) SHA1(feba4f189a8bb442c241dadb1fa1f2cb4f344fa3), ROM_BIOS(1)) ROMX_LOAD("13_26869666_8493761.bin", 0x16000, 0x2000, CRC(26869666) SHA1(9fae28fe3613218a6f8d7fb7a88bbc29a3f75a0f), ROM_BIOS(1)) ROMX_LOAD("14_91b2969e_8493756.bin", 0x18000, 0x2000, CRC(91b2969e) SHA1(dedac0b9b3e607bcb03bc16653c2c002eb67b633), ROM_BIOS(1)) diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp index c9788a9cbc261..83276b74730a7 100644 --- a/src/mame/ibm/system23_kbd.cpp +++ b/src/mame/ibm/system23_kbd.cpp @@ -67,7 +67,8 @@ void system23_kbd_device::reset_w(int state) void system23_kbd_device::bus_w(uint8_t data) { - m_bus = bitswap<7>(data, 0, 1, 2, 3, 4, 5, 6); + //m_bus = bitswap<7>(data, 0, 1, 2, 3, 4, 5, 6); + m_bus = data; m_cs = BIT(data, 7); LOG("m_cs: %d\n",m_cs); } @@ -75,7 +76,7 @@ void system23_kbd_device::bus_w(uint8_t data) uint8_t system23_kbd_device::read_keyboard() { LOG("Read Keyboard %02x\n", m_bus); - printf("Scan Code: %02x\n", (m_bus ^ 0x7f)); + printf("Scan Code: %02x\n", (m_bus ^ 0xff) & 0x7f); return m_bus; } @@ -138,104 +139,104 @@ int system23_kbd_device::t1_r() INPUT_PORTS_START( system23_kbd ) PORT_START("CL.0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') //29 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('{') PORT_CHAR('}') //59 - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //61 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') //31 - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') //39 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_CODE(KEYCODE_PAD) PORT_CHAR('.') //4a dot from pad + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Field +") PORT_CODE(KEYCODE_PLUS_PAD) //55 4d + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') //43 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') //46 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Field -") PORT_CODE(KEYCODE_ENTER_PAD) //55 4e PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') //49 - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') //19 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') //4c PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code PORT_START("CL.1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') //01 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') //21 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') //40 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') //42 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') //41 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //51 - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') //11 - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) //71 - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') //09 - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //69 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') //45 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') //44 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') //47 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') //48 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_CODE(KEYCODE_PLUS_PAD) //4b PORT_START("CL.2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //0b 0f - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //68 6f - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //35 37 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //4d 4f - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //5a - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') //1a - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LAlt") PORT_CODE(KEYCODE_LALT) //5e + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Field Exit") PORT_CODE(KEYCODE_RALT) //68 78 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RShift") PORT_CODE(KEYCODE_RSHIFT) //0b 7b + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Carriage Return") PORT_CODE(KEYCODE_RCONTROL) //56 76 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) // 59 79 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(ENTER)) //2d + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR(UCHAR_MAMEKEY(SLASH)) //2c + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(BACKSPACE)) //3d PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code PORT_START("CL.3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') //28 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') //48 - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Backslash") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') //2c - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Inq") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) //6c - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //6a + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) //09 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') //1a + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_NAME("'") PORT_CODE(KEYCODE_) //1b + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_NAME("Cent") PORT_CODE(KEYCODE_) //2b PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') //2a - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Reset Error") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) //6e - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //1e + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') //3b + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') //3c PORT_START("CL.4") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') //08 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) //70 - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //0c - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') //4c - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') //4a - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') //0a - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Field -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') //4e - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //2e + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') //07 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') //18 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') //19 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') //29 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') //28 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') //39 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') //3a PORT_START("CL.5") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Field Exit") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) //78 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //30 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(UCHAR_MAMEKEY(SPACE)) //0f + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') //06 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) //74 - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) //72 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') //17 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') //27 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) // No scan code - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('<') PORT_CHAR('>') //0e + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') //38 PORT_START("CL.6") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //10 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //50 - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') //34 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) //54 - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //52 - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') //32 - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //76 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') //04 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') //05 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') //16 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') //15 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') //25 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') //26 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') //37 PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') //36 PORT_START("CL.7") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') //20 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //60 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') //02 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') //03 PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') //14 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //64 - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //62 - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') //12 - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(UCHAR_MAMEKEY(ENTER)) //56 - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') //16 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') //13 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') //23 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') //24 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') //35 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') //34 PORT_START("CL.8") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') //40 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') //38 - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') //24 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') //44 - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(2) //42 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') //01 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CHAR('<') PORT_CHAR('>') //0e + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') //12 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') //11 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') //21 PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') //22 - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //66 - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') //26 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') //33 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') //32 PORT_START("CL.9") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) //3f 3d - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) //67 - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') //07 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) //75 77 - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) //75 77 - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') //02 - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //3e + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LAlt") PORT_CODE(KEYCODE_LALT)//7e 5e + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) //73 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) //70 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("LShift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)//57 77 + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))//54 74 + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') //20 + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') //31 + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //3e TODO PORT_START("CL.10") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') //27 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') //47 - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) //5f - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') //3b - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) // 1b "'" - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) //5b - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) //1f - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) //7b 7f + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) //72 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) //71 + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Test") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) //7d + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Restore / Error") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) //6e + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Inq") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) //6c + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Hold") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) //6d + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Erase / Attention") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) //7c + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Command") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) //6f 7f INPUT_PORTS_END ioport_constructor system23_kbd_device::device_input_ports() const From b4da514191c2fc36e94b031af9d9bf372d1823b7 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Tue, 11 Feb 2025 14:23:29 +0100 Subject: [PATCH 29/33] Logging disabled --- src/devices/video/i8275.cpp | 2 +- src/mame/ibm/system23.cpp | 2 +- src/mame/ibm/system23_kbd.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp index 9450fdc7d14f9..18eefac2bf44b 100644 --- a/src/devices/video/i8275.cpp +++ b/src/devices/video/i8275.cpp @@ -35,7 +35,7 @@ #include "screen.h" -#define VERBOSE 1 +//#define VERBOSE 1 #include "logmacro.h" diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 9af02a5214ff9..922c7615c2383 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders: Jaume López -#define VERBOSE 1 +//#define VERBOSE 1 #include "emu.h" #include "cpu/i8085/i8085.h" diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp index 83276b74730a7..b04a96c3b0361 100644 --- a/src/mame/ibm/system23_kbd.cpp +++ b/src/mame/ibm/system23_kbd.cpp @@ -1,4 +1,4 @@ -#define VERBOSE 1 +//#define VERBOSE 1 #include "emu.h" #include "system23_kbd.h" From e71aeb14c426d540f7865cc1d0e6673a9b2d5b01 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Wed, 12 Feb 2025 10:28:32 +0100 Subject: [PATCH 30/33] Printf disabled --- src/mame/ibm/system23_kbd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/ibm/system23_kbd.cpp b/src/mame/ibm/system23_kbd.cpp index b04a96c3b0361..a5eae00bad095 100644 --- a/src/mame/ibm/system23_kbd.cpp +++ b/src/mame/ibm/system23_kbd.cpp @@ -76,7 +76,7 @@ void system23_kbd_device::bus_w(uint8_t data) uint8_t system23_kbd_device::read_keyboard() { LOG("Read Keyboard %02x\n", m_bus); - printf("Scan Code: %02x\n", (m_bus ^ 0xff) & 0x7f); + //printf("Scan Code: %02x\n", (m_bus ^ 0xff) & 0x7f); return m_bus; } From beb1046344b63af1b863c1dcae464e7ed1c60a54 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Mon, 24 Feb 2025 11:58:42 +0100 Subject: [PATCH 31/33] Initialized variables --- src/mame/ibm/system23.cpp | 45 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 922c7615c2383..911e3f8f46962 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders: Jaume López -//#define VERBOSE 1 +#define VERBOSE 1 #include "emu.h" #include "cpu/i8085/i8085.h" @@ -95,12 +95,12 @@ namespace uint8_t m_vrtc = 0; uint8_t m_pixel = 0; - uint8_t m_ros_page; - uint8_t m_ram_r_page; - uint8_t m_ram_w_page; - uint8_t m_dma_page; + uint8_t m_ros_page = 0; + uint8_t m_ram_r_page = 0; + uint8_t m_ram_w_page = 0; + uint8_t m_dma_page = 0; - uint8_t m_port_4e; + uint8_t m_port_4e = 0; //uint8_t ram_r(offs_t offset); //void ram_w(offs_t offset, uint8_t data); @@ -109,8 +109,8 @@ namespace uint32_t m_rst75_enabled; - int m_sod; - int m_ros_w; + int m_sod = 0; + int m_ros_w = 0; void diag_digits_w(uint8_t data); @@ -137,6 +137,7 @@ namespace void update_speaker(uint32_t state); void rst75(uint32_t state); + //void rst65(uint32_t state); void rst55(uint32_t state); uint8_t ros_page_r(); @@ -227,8 +228,14 @@ namespace using namespace i8275_attributes; + int hi_char = BIT(charcode,6); + int char_page = 0; + char_page |= ((hi_char && BIT(m_bus_test_register, 1)) << 0); + char_page |= ((hi_char && BIT(m_bus_test_register, 2)) << 1); + char_page |= ((hi_char && BIT(m_bus_test_register, 3)) << 2); + if (!BIT(attrcode, VSP)) - gfx = m_chargen[(linecount & 15) | (charcode << 4) /*| (chr_bank << 10)*/]; + gfx = m_chargen[(linecount & 0x0f) | ((charcode & 0x7f) << 4) /* | (char_page << 10) */]; if (BIT(attrcode, LTEN)) gfx = 0xff; @@ -344,8 +351,7 @@ namespace void system23_state::update_speaker(uint32_t state) { - uint32_t speaker_enable = (m_port_4e && BIT(m_port_4e, 1)) ? CLEAR_LINE : ASSERT_LINE; - uint32_t speaker_state = (speaker_enable ? CLEAR_LINE : ASSERT_LINE) & state; + uint32_t speaker_state = BIT(m_port_4e, 1) && state; m_speaker->level_w(speaker_state); } @@ -355,6 +361,12 @@ namespace m_maincpu->set_input_line(I8085_RST75_LINE, state); } + // void system23_state::rst65(uint32_t state) + // { + // LOG("RST6.5\n"); + // m_maincpu->set_input_line(I8085_RST65_LINE, state); + // } + void system23_state::rst55(uint32_t state) { LOG("RST5.5\n"); @@ -363,14 +375,7 @@ namespace void system23_state::reset_keyboard(uint8_t data) { - if(BIT(data,7)) - { - m_keyboard->reset_w(CLEAR_LINE); - } - else - { - m_keyboard->reset_w(ASSERT_LINE); - } + m_keyboard->reset_w(!BIT(data,7)); m_pic->ir0_w(BIT(data,3)); m_keyboard->t0_w(BIT(data,5)); } @@ -615,7 +620,7 @@ namespace ROM_SYSTEM_BIOS(0, "ros_104", "ROS 1.04 - 1982?") ROM_SYSTEM_BIOS(1, "ros_101", "ROS 1.01 - 1980") - ROM_REGION(0x24000, "maincpu", ROMREGION_ERASEFF) + ROM_REGION(0x34000, "maincpu", ROMREGION_ERASEFF) //ROS 1.04 (1982?) ROMX_LOAD("02_61c9866a_4481186.bin", 0x00000, 0x2000, CRC(61c9866a) SHA1(43f2bed5cc2374c7fde4632948329062e57e994b), ROM_BIOS(0)) ROMX_LOAD("09_07843020_8493747.bin", 0x02000, 0x2000, CRC(07843020) SHA1(828ca0199af1246f6caf58bcb785f791c3a7e34e), ROM_BIOS(0)) From 624320ac4ebfe4366d059c0d18cca37204a55f21 Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 10 Apr 2025 13:06:36 +0200 Subject: [PATCH 32/33] Added IBM 4178629 video device; switched to IBM CRTC from i8275; --- src/devices/video/i8275.cpp | 11 +++++++-- src/devices/video/i8275.h | 9 +++++++ src/mame/ibm/system23.cpp | 49 +++++++++++++++++++++++++------------ 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp index 18eefac2bf44b..931e2cb535e3c 100644 --- a/src/devices/video/i8275.cpp +++ b/src/devices/video/i8275.cpp @@ -61,7 +61,7 @@ const int i8275_device::character_attribute[3][16] = // device type definitions DEFINE_DEVICE_TYPE(I8275, i8275_device, "i8275", "Intel 8275 CRTC") DEFINE_DEVICE_TYPE(I8276, i8276_device, "i8276", "Intel 8276 CRTC") - +DEFINE_DEVICE_TYPE(IBM4178629, ibm4178629_device, "ibm4178629", "IBM 418629 CRTC") //************************************************************************** @@ -102,7 +102,8 @@ i8275_device::i8275_device(const machine_config &mconfig, device_type type, cons m_cursor_blink(0), m_char_blink(0), m_stored_attr(0), - m_field_attr(0) + m_field_attr(0), + m_ibmCRTC(false) { memset(m_param, 0x00, sizeof(m_param)); } @@ -117,6 +118,12 @@ i8276_device::i8276_device(const machine_config &mconfig, const char *tag, devic { } +ibm4178629_device::ibm4178629_device(const machine_config &mconfig, const char * tag, device_t *owner, uint32_t clock) : + i8275_device(mconfig, IBM4178629, tag, owner, clock) +{ + this->m_ibmCRTC = true; +} + void i8275_device::device_resolve_objects() { diff --git a/src/devices/video/i8275.h b/src/devices/video/i8275.h index 96970a17bfa09..9ec0cbf3268bd 100644 --- a/src/devices/video/i8275.h +++ b/src/devices/video/i8275.h @@ -246,6 +246,8 @@ class i8275_device : public device_t, uint8_t m_stored_attr; uint8_t m_field_attr; + bool m_ibmCRTC; + // timers emu_timer *m_hrtc_on_timer; emu_timer *m_drq_on_timer; @@ -259,9 +261,16 @@ class i8276_device : public i8275_device i8276_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); }; +class ibm4178629_device : public i8275_device +{ +public: + ibm4178629_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + // device type definition DECLARE_DEVICE_TYPE(I8275, i8275_device) DECLARE_DEVICE_TYPE(I8276, i8276_device) +DECLARE_DEVICE_TYPE(IBM4178629, ibm4178629_device) #endif // MAME_VIDEO_I8275_H diff --git a/src/mame/ibm/system23.cpp b/src/mame/ibm/system23.cpp index 911e3f8f46962..dfd509e0df5f3 100644 --- a/src/mame/ibm/system23.cpp +++ b/src/mame/ibm/system23.cpp @@ -68,7 +68,7 @@ namespace required_device m_ppi_diag; required_device m_ppi_settings; required_device m_dmac; - required_device m_crtc; + required_device m_crtc; required_device m_pit; required_device m_pic; required_device m_usart; @@ -228,11 +228,11 @@ namespace using namespace i8275_attributes; - int hi_char = BIT(charcode,6); - int char_page = 0; - char_page |= ((hi_char && BIT(m_bus_test_register, 1)) << 0); - char_page |= ((hi_char && BIT(m_bus_test_register, 2)) << 1); - char_page |= ((hi_char && BIT(m_bus_test_register, 3)) << 2); + // int hi_char = BIT(charcode,6); + // int char_page = 0; + // char_page |= ((hi_char && BIT(m_bus_test_register, 1)) << 0); + // char_page |= ((hi_char && BIT(m_bus_test_register, 2)) << 1); + // char_page |= ((hi_char && BIT(m_bus_test_register, 3)) << 2); if (!BIT(attrcode, VSP)) gfx = m_chargen[(linecount & 0x0f) | ((charcode & 0x7f) << 4) /* | (char_page << 10) */]; @@ -264,14 +264,19 @@ namespace //LOG("x=%x y=%x attrcode=%x\n",x,y,attrcode); // Highlight not used - bitmap.pix(y, x++) = (BIT(gfx, 7)? rgb_t::green() : rgb_t::black()); - bitmap.pix(y, x++) = (BIT(gfx, 6)? rgb_t::green() : rgb_t::black()); - bitmap.pix(y, x++) = (BIT(gfx, 5)? rgb_t::green() : rgb_t::black()); - bitmap.pix(y, x++) = (BIT(gfx, 4)? rgb_t::green() : rgb_t::black()); - bitmap.pix(y, x++) = (BIT(gfx, 3)? rgb_t::green() : rgb_t::black()); - bitmap.pix(y, x++) = (BIT(gfx, 2)? rgb_t::green() : rgb_t::black()); - bitmap.pix(y, x++) = (BIT(gfx, 1)? rgb_t::green() : rgb_t::black()); - bitmap.pix(y, x++) = (BIT(gfx, 0)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 7)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 6)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 5)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 4)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 3)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 2)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 1)? rgb_t::green() : rgb_t::black()); + // bitmap.pix(y, x++) = (BIT(gfx, 0)? rgb_t::green() : rgb_t::black()); + + for(int pixel=7; pixel >= 0; pixel--) + { + bitmap.pix(y, x++) = (BIT(gfx, pixel)? rgb_t::green() : rgb_t::black()); + } } //This routine compiles the retraces and pixel data from the CRTC into a single byte @@ -497,7 +502,7 @@ namespace m_screen->set_raw(18'432'000, 800, 0, 640, 324, 0, 300); m_screen->set_screen_update(m_crtc, FUNC(i8275_device::screen_update)); - I8275(config, m_crtc, (18'432'000 / 8)); + IBM4178629(config, m_crtc, (18'432'000 / 8)); m_crtc->set_character_width(8); m_crtc->set_screen(m_screen); m_crtc->set_display_callback(FUNC(system23_state::display_pixels)); @@ -549,6 +554,20 @@ namespace //m_ram_bank_dma->configure_entries(0, 16, m_ram->pointer() + 0x4000, 0x4000); m_sod = CLEAR_LINE; m_ros_w = ASSERT_LINE; + + save_item(NAME(m_bus_test_register)); + save_item(NAME(lpen_ct)); + + save_item(NAME(m_hrtc)); + save_item(NAME(m_vrtc)); + save_item(NAME(m_pixel)); + + save_item(NAME(m_ros_page)); + save_item(NAME(m_ram_r_page)); + save_item(NAME(m_ram_w_page)); + save_item(NAME(m_dma_page)); + + save_item(NAME(m_port_4e)); } void system23_state::machine_reset() From 0873a3cbda41a7a7863838c17bf0ad3c6c80dedf Mon Sep 17 00:00:00 2001 From: RetroAND Date: Thu, 10 Apr 2025 13:18:56 +0200 Subject: [PATCH 33/33] Defined different behaviours at the interrupt generation for both the standard 8275 and the IBM CRTC; --- src/devices/video/i8275.cpp | 10 +++++++--- src/devices/video/i8275.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/devices/video/i8275.cpp b/src/devices/video/i8275.cpp index 931e2cb535e3c..5cf6b265e059c 100644 --- a/src/devices/video/i8275.cpp +++ b/src/devices/video/i8275.cpp @@ -103,7 +103,8 @@ i8275_device::i8275_device(const machine_config &mconfig, device_type type, cons m_char_blink(0), m_stored_attr(0), m_field_attr(0), - m_ibmCRTC(false) + m_ibmCRTC(false), + m_init(false) { memset(m_param, 0x00, sizeof(m_param)); } @@ -186,6 +187,8 @@ void i8275_device::device_start() save_item(NAME(m_char_blink)); save_item(NAME(m_stored_attr)); save_item(NAME(m_field_attr)); + save_item(NAME(m_ibmCRTC)); + save_item(NAME(m_init)); } @@ -313,7 +316,8 @@ TIMER_CALLBACK_MEMBER(i8275_device::scanline_tick) { for (i8275_device *crtc = this; crtc != nullptr; crtc = crtc->m_next_crtc) { - if ((crtc->m_status & ST_IE) && !(crtc->m_status & ST_IR)) + // If either the IC is initialized or it is an IBM CRTC the interrupt is set if the EI flag is set + if ((crtc->m_status & ST_IE) && !(crtc->m_status & ST_IR) && (crtc->m_init || crtc->m_ibmCRTC)) { LOG("I8275 IRQ Set\n"); crtc->m_status |= ST_IR; @@ -580,7 +584,7 @@ void i8275_device::write(offs_t offset, uint8_t data) */ case CMD_RESET: LOG("I8275 Reset\n"); - + m_init = true; m_status &= ~(ST_IE | ST_IR | ST_VE); LOG("I8275 IRQ 0\n"); m_write_irq(CLEAR_LINE); diff --git a/src/devices/video/i8275.h b/src/devices/video/i8275.h index 9ec0cbf3268bd..912beadb388ae 100644 --- a/src/devices/video/i8275.h +++ b/src/devices/video/i8275.h @@ -247,6 +247,7 @@ class i8275_device : public device_t, uint8_t m_field_attr; bool m_ibmCRTC; + bool m_init; // timers emu_timer *m_hrtc_on_timer;