diff options
Diffstat (limited to 'src/devices/machine/chessmachine.cpp')
-rw-r--r-- | src/devices/machine/chessmachine.cpp | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/src/devices/machine/chessmachine.cpp b/src/devices/machine/chessmachine.cpp index c9a00f33dda..08e45ebb581 100644 --- a/src/devices/machine/chessmachine.cpp +++ b/src/devices/machine/chessmachine.cpp @@ -28,7 +28,7 @@ probably went for this solution to get optimum possible speed for each module. TODO: - PC version still gives a sync error on boot sometimes, probably related to quantum - is interrupt handling correct? -- timer shouldn't be needed for disabling bootstrap, real ARM has already read the next opcode +- timer shouldn't be needed for disabling bootrom, real ARM has already read the next opcode */ @@ -45,9 +45,9 @@ DEFINE_DEVICE_TYPE(CHESSMACHINE, chessmachine_device, "chessmachine", "Tasc Ches chessmachine_device::chessmachine_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, CHESSMACHINE, tag, owner, clock), m_maincpu(*this, "maincpu"), - m_bootstrap(*this, "bootstrap"), + m_bootrom(*this, "bootrom"), m_ram(*this, "ram"), - m_disable_bootstrap(*this, "disable_bootstrap"), + m_disable_bootrom(*this, "disable_bootrom"), m_data_out(*this) { } @@ -63,11 +63,11 @@ void chessmachine_device::device_start() m_data_out.resolve_safe(); // zerofill - m_bootstrap_enabled = false; + m_bootrom_enabled = false; m_latch[0] = m_latch[1] = 0; // register for savestates - save_item(NAME(m_bootstrap_enabled)); + save_item(NAME(m_bootrom_enabled)); save_item(NAME(m_latch)); } @@ -104,8 +104,8 @@ void chessmachine_device::reset_w(int state) { m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); - if (state) - m_bootstrap_enabled = true; + if (!m_bootrom_enabled && state) + install_bootrom(true); } @@ -114,16 +114,24 @@ void chessmachine_device::reset_w(int state) // internal //------------------------------------------------- -u32 chessmachine_device::bootstrap_r(offs_t offset) +void chessmachine_device::install_bootrom(bool enable) { - return (m_bootstrap_enabled) ? m_bootstrap[offset] : m_ram[offset]; + address_space &program = m_maincpu->space(AS_PROGRAM); + program.unmap_readwrite(0, m_bootrom.bytes() - 1); + + if (enable) + program.install_rom(0, m_bootrom.bytes() - 1, m_bootrom); + else + program.install_ram(0, m_ram.bytes() - 1, m_ram); + + m_bootrom_enabled = enable; } -u32 chessmachine_device::disable_bootstrap_r() +u32 chessmachine_device::disable_bootrom_r() { - // disconnect bootstrap rom from the bus after next opcode - if (m_bootstrap_enabled && !m_disable_bootstrap->enabled() && !machine().side_effects_disabled()) - m_disable_bootstrap->adjust(m_maincpu->cycles_to_attotime(5)); + // disconnect bootrom from the bus after next opcode + if (m_bootrom_enabled && !m_disable_bootrom->enabled() && !machine().side_effects_disabled()) + m_disable_bootrom->adjust(m_maincpu->cycles_to_attotime(5)); return 0; } @@ -131,9 +139,8 @@ u32 chessmachine_device::disable_bootstrap_r() void chessmachine_device::main_map(address_map &map) { map(0x00000000, 0x000fffff).ram().share("ram"); - map(0x00000000, 0x0000007f).r(FUNC(chessmachine_device::bootstrap_r)); map(0x00400000, 0x00400003).mirror(0x003ffffc).rw(FUNC(chessmachine_device::internal_r), FUNC(chessmachine_device::internal_w)).umask32(0x000000ff); - map(0x01800000, 0x01800003).r(FUNC(chessmachine_device::disable_bootstrap_r)); + map(0x01800000, 0x01800003).r(FUNC(chessmachine_device::disable_bootrom_r)); } void chessmachine_device::device_add_mconfig(machine_config &config) @@ -142,7 +149,7 @@ void chessmachine_device::device_add_mconfig(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &chessmachine_device::main_map); m_maincpu->set_copro_type(arm_cpu_device::copro_type::VL86C020); - TIMER(config, "disable_bootstrap").configure_generic(FUNC(chessmachine_device::disable_bootstrap)); + TIMER(config, "disable_bootrom").configure_generic(FUNC(chessmachine_device::disable_bootrom)); } @@ -152,7 +159,7 @@ void chessmachine_device::device_add_mconfig(machine_config &config) //------------------------------------------------- ROM_START( chessmachine ) - ROM_REGION32_LE( 0x80, "bootstrap", 0 ) + ROM_REGION32_LE( 0x80, "bootrom", 0 ) ROM_LOAD32_BYTE( "74s288.1", 0x00, 0x20, CRC(284114e2) SHA1(df4037536d505d7240bb1d70dc58f59a34ab77b4) ) ROM_LOAD32_BYTE( "74s288.2", 0x01, 0x20, CRC(9f239c75) SHA1(aafaf30dac90f36b01f9ee89903649fc4ea0480d) ) ROM_LOAD32_BYTE( "74s288.3", 0x02, 0x20, CRC(0455360b) SHA1(f1486142330f2c39a4d6c479646030d31443d1c8) ) |