diff options
Diffstat (limited to 'src/devices/bus/ti99/internal/998board.cpp')
-rw-r--r-- | src/devices/bus/ti99/internal/998board.cpp | 155 |
1 files changed, 77 insertions, 78 deletions
diff --git a/src/devices/bus/ti99/internal/998board.cpp b/src/devices/bus/ti99/internal/998board.cpp index 49533d97c29..684c531895d 100644 --- a/src/devices/bus/ti99/internal/998board.cpp +++ b/src/devices/bus/ti99/internal/998board.cpp @@ -107,24 +107,24 @@ #include "998board.h" #include "cpu/tms9900/tms99com.h" -#define LOG_DETAIL (1U<<1) // More detail -#define LOG_CRU (1U<<2) // CRU logging -#define LOG_ADDRESS (1U<<3) // Address bus -#define LOG_MEM (1U<<4) // Memory access -#define LOG_MAP (1U<<5) // Mapper -#define LOG_READY (1U<<6) // READY line -#define LOG_CLOCK (1U<<7) // CLKOUT -#define LOG_MOFETTA (1U<<8) // Mofetta operation -#define LOG_AMIGO (1U<<9) // Amigo operation -#define LOG_OSO (1U<<10) // Oso operation -#define LOG_HEXBUS (1U<<11) // Hexbus operation -#define LOG_WS (1U<<12) // Wait states -#define LOG_CPURY (1U<<13) // Combined ready line -#define LOG_GROM (1U<<14) // GROM operation -#define LOG_PUNMAP (1U<<15) // Unmapped physical addresss -#define LOG_WARN (1U<<31) // Warnings - -#define VERBOSE ( LOG_WARN ) +#define LOG_DETAIL (1U << 1) // More detail +#define LOG_CRU (1U << 2) // CRU logging +#define LOG_ADDRESS (1U << 3) // Address bus +#define LOG_MEM (1U << 4) // Memory access +#define LOG_MAP (1U << 5) // Mapper +#define LOG_READY (1U << 6) // READY line +#define LOG_CLOCK (1U << 7) // CLKOUT +#define LOG_MOFETTA (1U << 8) // Mofetta operation +#define LOG_AMIGO (1U << 9) // Amigo operation +#define LOG_OSO (1U << 10) // Oso operation +#define LOG_HEXBUS (1U << 11) // Hexbus operation +#define LOG_WS (1U << 12) // Wait states +#define LOG_CPURY (1U << 13) // Combined ready line +#define LOG_GROM (1U << 14) // GROM operation +#define LOG_PUNMAP (1U << 15) // Unmapped physical addresss +#define LOG_WARN (1U << 31) // Warnings + +#define VERBOSE (LOG_WARN) #include "logmacro.h" @@ -189,6 +189,7 @@ mainboard8_device::mainboard8_device(const machine_config &mconfig, const char * m_p3grom0(*owner, TI998_GLIB30_TAG), m_p3grom1(*owner, TI998_GLIB31_TAG), m_p3grom2(*owner, TI998_GLIB32_TAG), + m_tms9901(*owner, TI998_TMS9901_TAG), m_sgrom_idle(true), m_tsgrom_idle(true), m_p8grom_idle(true), @@ -383,6 +384,10 @@ void mainboard8_device::setaddress(offs_t offset, uint8_t busctrl) m_logical_address = offset; m_physical_address = 0; + // Trigger the 9901's clock if S0=1 + if ((offset & 0x0020) != 0) + m_tms9901->update_clock(); + // In TI's bit order, A14 is the second line from the right side (2^1) m_A14_set = ((m_logical_address & 2)!=0); // Needed for clock_in @@ -409,12 +414,12 @@ void mainboard8_device::setaddress(offs_t offset, uint8_t busctrl) m_ready(m_amigo->cpury_out()); } -WRITE_LINE_MEMBER( mainboard8_device::reset_console ) +void mainboard8_device::reset_console(int state) { m_console_reset(state); } -WRITE_LINE_MEMBER( mainboard8_device::hold_cpu ) +void mainboard8_device::hold_cpu(int state) { m_hold_line(state); } @@ -422,7 +427,7 @@ WRITE_LINE_MEMBER( mainboard8_device::hold_cpu ) /* HOLD Acknowledge from the CPU */ -WRITE_LINE_MEMBER( mainboard8_device::holda_line ) +void mainboard8_device::holda_line(int state) { m_amigo->holda_in(state); } @@ -430,7 +435,7 @@ WRITE_LINE_MEMBER( mainboard8_device::holda_line ) /* Clock line from the CPU. Forward to the custom chips. */ -WRITE_LINE_MEMBER( mainboard8_device::clock_in ) +void mainboard8_device::clock_in(int state) { LOGMASKED(LOG_CLOCK, "CLKOUT = %d\n", state); @@ -681,7 +686,7 @@ void mainboard8_device::set_paddress(int address) m_ioport->setaddress_dbin(address, m_dbin_level); } -WRITE_LINE_MEMBER( mainboard8_device::msast_in ) +void mainboard8_device::msast_in(int state) { LOGMASKED(LOG_DETAIL, "msast = %d\n", state); @@ -955,7 +960,7 @@ void mainboard8_device::write(offs_t offset, uint8_t data) /* Set 99/4A compatibility mode (CRUS=1) */ -WRITE_LINE_MEMBER( mainboard8_device::crus_in ) +void mainboard8_device::crus_in(int state) { LOGMASKED(LOG_CRU, "%s CRUS\n", (state==1)? "Assert" : "Clear"); m_vaquerro->crus_in(state); @@ -967,7 +972,7 @@ WRITE_LINE_MEMBER( mainboard8_device::crus_in ) Set mapper /PTGEN line ("Pascal and Text-to-speech GROMs enable"). Note that PTGEN is negative logic. */ -WRITE_LINE_MEMBER( mainboard8_device::ptgen_in ) +void mainboard8_device::ptgen_in(int state) { LOGMASKED(LOG_CRU, "%s PTGEN*\n", (state==0)? "Assert" : "Clear"); m_vaquerro->crusgl_in((state==0)? ASSERT_LINE : CLEAR_LINE); @@ -977,54 +982,49 @@ WRITE_LINE_MEMBER( mainboard8_device::ptgen_in ) /* READY lines, to be combined */ -WRITE_LINE_MEMBER( mainboard8_device::system_grom_ready ) +void mainboard8_device::system_grom_ready(int state) { m_vaquerro->sgmry(state); } -WRITE_LINE_MEMBER( mainboard8_device::ptts_grom_ready ) +void mainboard8_device::ptts_grom_ready(int state) { m_vaquerro->tsgry(state); } -WRITE_LINE_MEMBER( mainboard8_device::p8_grom_ready ) +void mainboard8_device::p8_grom_ready(int state) { m_vaquerro->p8gry(state); } -WRITE_LINE_MEMBER( mainboard8_device::p3_grom_ready ) +void mainboard8_device::p3_grom_ready(int state) { m_vaquerro->p3gry(state); } -WRITE_LINE_MEMBER( mainboard8_device::sound_ready ) +void mainboard8_device::sound_ready(int state) { m_sound_ready = state; } -WRITE_LINE_MEMBER( mainboard8_device::speech_ready ) +void mainboard8_device::speech_ready(int state) { // The TMS5200 implementation uses true/false, not ASSERT/CLEAR semantics m_speech_ready = (state==false)? ASSERT_LINE : CLEAR_LINE; } -WRITE_LINE_MEMBER( mainboard8_device::pbox_ready ) +void mainboard8_device::pbox_ready(int state) { m_pbox_ready = state; } -WRITE_LINE_MEMBER( mainboard8_device::ggrdy_in ) +void mainboard8_device::ggrdy_in(int state) { m_amigo->srdy_in((state==ASSERT_LINE && m_speech_ready && m_sound_ready && m_pbox_ready)? ASSERT_LINE : CLEAR_LINE); } void mainboard8_device::device_start() { - // Lines going to the main driver class, then to the CPU - m_ready.resolve_safe(); // READY - m_console_reset.resolve_safe(); // RESET - m_hold_line.resolve_safe(); // HOLD - m_rom0 = machine().root_device().memregion(TI998_ROM0_REG)->base(); m_rom1 = machine().root_device().memregion(TI998_ROM1_REG)->base(); m_pascalrom = machine().root_device().memregion(TI998_PASCAL_REG)->base(); @@ -1249,17 +1249,17 @@ void vaquerro_device::set_address(offs_t offset, int state) } } -WRITE_LINE_MEMBER( vaquerro_device::crusgl_in ) +void vaquerro_device::crusgl_in(int state) { m_crugl = (state==ASSERT_LINE); } -WRITE_LINE_MEMBER( vaquerro_device::crus_in ) +void vaquerro_device::crus_in(int state) { m_crus = (line_state)state; } -WRITE_LINE_MEMBER( vaquerro_device::memen_in ) +void vaquerro_device::memen_in(int state) { m_memen = (state==ASSERT_LINE); } @@ -1267,7 +1267,7 @@ WRITE_LINE_MEMBER( vaquerro_device::memen_in ) /* Called by Mofetta */ -READ_LINE_MEMBER( vaquerro_device::lascsq_out ) +int vaquerro_device::lascsq_out() { return (m_lasreq && m_memen)? ASSERT_LINE : CLEAR_LINE; } @@ -1275,25 +1275,25 @@ READ_LINE_MEMBER( vaquerro_device::lascsq_out ) /* Incoming ready lines from the GROM library */ -WRITE_LINE_MEMBER( vaquerro_device::sgmry ) +void vaquerro_device::sgmry(int state) { LOGMASKED(LOG_READY, "Incoming SGMRY = %d\n", state); m_sgmws.ready_in((line_state)state); } -WRITE_LINE_MEMBER( vaquerro_device::tsgry ) +void vaquerro_device::tsgry(int state) { LOGMASKED(LOG_READY, "Incoming TSGRY = %d\n", state); m_tsgws.ready_in((line_state)state); } -WRITE_LINE_MEMBER( vaquerro_device::p8gry ) +void vaquerro_device::p8gry(int state) { LOGMASKED(LOG_READY, "Incoming 8GRY = %d\n", state); m_p8gws.ready_in((line_state)state); } -WRITE_LINE_MEMBER( vaquerro_device::p3gry ) +void vaquerro_device::p3gry(int state) { LOGMASKED(LOG_READY, "Incoming P3GRY = %d\n", state); m_p3gws.ready_in((line_state)state); @@ -1302,7 +1302,7 @@ WRITE_LINE_MEMBER( vaquerro_device::p3gry ) /* Outgoing READY */ -READ_LINE_MEMBER( vaquerro_device::ggrdy_out ) +int vaquerro_device::ggrdy_out() { LOGMASKED(LOG_READY, "GGRDY out = %d\n", m_ggrdy); return m_ggrdy; @@ -1321,32 +1321,32 @@ int vaquerro_device::gromcs_out() // ========================= -READ_LINE_MEMBER( vaquerro_device::vdprd_out ) +int vaquerro_device::vdprd_out() { return (m_vdprd && m_memen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( vaquerro_device::vdpwt_out ) +int vaquerro_device::vdpwt_out() { return (m_vdpwt && m_memen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( vaquerro_device::sprd_out ) +int vaquerro_device::sprd_out() { return (m_sprd && m_memen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( vaquerro_device::spwt_out ) +int vaquerro_device::spwt_out() { return (m_spwt && m_memen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( vaquerro_device::sromcs_out ) +int vaquerro_device::sromcs_out() { return (m_sromcs && m_memen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( vaquerro_device::sccs_out ) +int vaquerro_device::sccs_out() { return (m_sccs && m_memen)? ASSERT_LINE : CLEAR_LINE; } @@ -1361,7 +1361,7 @@ READ_LINE_MEMBER( vaquerro_device::sccs_out ) access occurs, the system READY line will be cleared, triggering wait states in the CPU. */ -WRITE_LINE_MEMBER( vaquerro_device::clock_in ) +void vaquerro_device::clock_in(int state) { line_state level = (line_state)state; @@ -1657,7 +1657,7 @@ void mofetta_device::set_address(offs_t offset, int state) Mofetta delivers the GROMCLK. In the 99/4A, this clock is produced by the VDP. Apart from that, Mofetta does not need the CLKOUT. */ -WRITE_LINE_MEMBER( mofetta_device::clock_in ) +void mofetta_device::clock_in(int state) { if (state == CLEAR_LINE) // TODO: Correct edge? { @@ -1670,37 +1670,37 @@ WRITE_LINE_MEMBER( mofetta_device::clock_in ) } } -READ_LINE_MEMBER( mofetta_device::alccs_out ) +int mofetta_device::alccs_out() { return (m_alccs && m_pmemen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( mofetta_device::gromclk_out ) +int mofetta_device::gromclk_out() { return m_gromclk_up? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( mofetta_device::rom1cs_out ) +int mofetta_device::rom1cs_out() { return (m_rom1cs && m_pmemen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( mofetta_device::rom1am_out ) +int mofetta_device::rom1am_out() { return (m_rom1am && m_pmemen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( mofetta_device::rom1al_out ) +int mofetta_device::rom1al_out() { return (m_rom1al && m_pmemen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( mofetta_device::prcs_out ) +int mofetta_device::prcs_out() { return (m_prcs && m_pmemen)? ASSERT_LINE : CLEAR_LINE; } -READ_LINE_MEMBER( mofetta_device::cmas_out ) +int mofetta_device::cmas_out() { return (m_cmas && m_pmemen)? ASSERT_LINE : CLEAR_LINE; } @@ -1708,7 +1708,7 @@ READ_LINE_MEMBER( mofetta_device::cmas_out ) /* Asserted when a PEB access occurs */ -READ_LINE_MEMBER( mofetta_device::dbc_out ) +int mofetta_device::dbc_out() { return (m_lasreq || m_cmas || m_rom1cs || m_skdrcs || !m_pmemen)? CLEAR_LINE : ASSERT_LINE; } @@ -1757,7 +1757,7 @@ void mofetta_device::cruwrite(offs_t offset, uint8_t data) /* Setting or clearing the MSAST line. */ -WRITE_LINE_MEMBER( mofetta_device::msast_in ) +void mofetta_device::msast_in(int state) { if (state == ASSERT_LINE) { @@ -1772,17 +1772,17 @@ WRITE_LINE_MEMBER( mofetta_device::msast_in ) m_msast = (line_state)state; } -WRITE_LINE_MEMBER( mofetta_device::pmemen_in ) +void mofetta_device::pmemen_in(int state) { m_pmemen = (state==ASSERT_LINE); } -WRITE_LINE_MEMBER( mofetta_device::lascs_in ) +void mofetta_device::lascs_in(int state) { m_lasreq = (state==ASSERT_LINE); } -WRITE_LINE_MEMBER( mofetta_device::skdrcs_in ) +void mofetta_device::skdrcs_in(int state) { m_skdrcs = (state==ASSERT_LINE); } @@ -1919,7 +1919,7 @@ int amigo_device::get_physical_address_debug(offs_t offset) /* Incoming READY line (SRDY) */ -WRITE_LINE_MEMBER( amigo_device::srdy_in ) +void amigo_device::srdy_in(int state) { LOGMASKED(LOG_READY, "Incoming SRDY = %d\n", state); m_srdy = (line_state)state; @@ -1932,7 +1932,7 @@ WRITE_LINE_MEMBER( amigo_device::srdy_in ) } } -WRITE_LINE_MEMBER( amigo_device::memen_in ) +void amigo_device::memen_in(int state) { m_memen = (state==ASSERT_LINE); } @@ -1940,7 +1940,7 @@ WRITE_LINE_MEMBER( amigo_device::memen_in ) /* Polled from the mainboard */ -READ_LINE_MEMBER( amigo_device::cpury_out ) +int amigo_device::cpury_out() { return m_ready_out; } @@ -1948,7 +1948,7 @@ READ_LINE_MEMBER( amigo_device::cpury_out ) /* Polled from the mainboard */ -READ_LINE_MEMBER( amigo_device::sramcs_out ) +int amigo_device::sramcs_out() { return m_sram_accessed && m_memen? ASSERT_LINE : CLEAR_LINE; } @@ -1959,7 +1959,7 @@ READ_LINE_MEMBER( amigo_device::sramcs_out ) This is actually more than needed because we only have 64K DRAM (which would only need a 16 bit address), and Amigo itself selects it. */ -READ_LINE_MEMBER( amigo_device::skdrcs_out ) +int amigo_device::skdrcs_out() { return m_dram_accessed && (m_amstate == IDLE) && m_memen? ASSERT_LINE : CLEAR_LINE; } @@ -1967,7 +1967,7 @@ READ_LINE_MEMBER( amigo_device::skdrcs_out ) /* Incoming CRUS line. Needed to set the mapper config addresses. */ -WRITE_LINE_MEMBER( amigo_device::crus_in ) +void amigo_device::crus_in(int state) { m_crus = (line_state)state; } @@ -1975,7 +1975,7 @@ WRITE_LINE_MEMBER( amigo_device::crus_in ) /* Incoming LASCS line. */ -WRITE_LINE_MEMBER( amigo_device::lascs_in ) +void amigo_device::lascs_in(int state) { m_logical_space = (state==ASSERT_LINE); } @@ -2071,7 +2071,7 @@ void amigo_device::write(uint8_t data) else LOGMASKED(LOG_WARN, "Invalid value written to Amigo: %02x\n", data); } -WRITE_LINE_MEMBER( amigo_device::clock_in ) +void amigo_device::clock_in(int state) { if (state==CLEAR_LINE) { @@ -2179,7 +2179,7 @@ void amigo_device::mapper_access_debug(int data) } } -WRITE_LINE_MEMBER( amigo_device::holda_in ) +void amigo_device::holda_in(int state) { LOGMASKED(LOG_MAP, "HOLD acknowledged = %d\n", state); m_hold_acknowledged = (state==ASSERT_LINE); @@ -2378,7 +2378,7 @@ void oso_device::clear_int_status() /* Phi3 incoming clock pulse */ -WRITE_LINE_MEMBER( oso_device::clock_in ) +void oso_device::clock_in(int state) { m_phi3 = state; if (state==ASSERT_LINE) @@ -2734,7 +2734,6 @@ void oso_device::hexbus_value_changed(uint8_t data) void oso_device::device_start() { m_status = m_xmit = m_control = m_data = 0; - m_int.resolve_safe(); // Establish the downstream link in the parent class hexbus_chained_device set_outbound_hexbus(m_hexbusout); |