From a40130f6818cf1143a4e515d56ce8908edb3368a Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Mon, 7 Feb 2022 09:28:01 +0200 Subject: [PATCH] abc1600: MAC cleanup. [Curt Coder] --- src/mame/drivers/abc1600.cpp | 12 +- src/mame/includes/abc1600.h | 4 +- src/mame/machine/abc1600mac.cpp | 208 +++++++++++++++++++------------- src/mame/machine/abc1600mac.h | 23 ++-- 4 files changed, 151 insertions(+), 96 deletions(-) diff --git a/src/mame/drivers/abc1600.cpp b/src/mame/drivers/abc1600.cpp index 98a355b924e..2d16c558303 100644 --- a/src/mame/drivers/abc1600.cpp +++ b/src/mame/drivers/abc1600.cpp @@ -478,7 +478,7 @@ void abc1600_state::spec_contr_reg_w(uint8_t data) void abc1600_state::abc1600_mem(address_map &map) { - map(0x00000, 0xfffff).m(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::map)); + map(0x00000, 0xfffff).rw(ABC1600_MAC_TAG, FUNC(abc1600_mac_device::read), FUNC(abc1600_mac_device::write)); } @@ -805,6 +805,13 @@ WRITE_LINE_MEMBER( abc1600_state::nmi_w ) } } +void abc1600_state::buserr_w(offs_t offset, uint8_t data) +{ + m_maincpu->set_buserror_details(offset, data, m_maincpu->get_fc()); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); +} + //************************************************************************** @@ -830,6 +837,7 @@ void abc1600_state::machine_start() save_item(NAME(m_bus0)); save_item(NAME(m_csb)); save_item(NAME(m_atce)); + save_item(NAME(m_btce)); save_item(NAME(m_sccrq_a)); save_item(NAME(m_sccrq_b)); save_item(NAME(m_scc_irq)); @@ -877,7 +885,7 @@ void abc1600_state::abc1600(machine_config &config) ABC1600_MAC(config, m_mac, 0); m_mac->set_addrmap(AS_PROGRAM, &abc1600_state::mac_mem); m_mac->fc_cb().set(m_maincpu, FUNC(m68000_base_device::get_fc)); - m_mac->buserr_cb().set_inputline(m_maincpu, M68K_LINE_BUSERROR); + m_mac->buserr_cb().set(FUNC(abc1600_state::buserr_w)); Z80DMA(config, m_dma0, 64_MHz_XTAL / 16); m_dma0->out_busreq_callback().set(FUNC(abc1600_state::dbrq_w)); diff --git a/src/mame/includes/abc1600.h b/src/mame/includes/abc1600.h index 59a079654b4..674cbc52cc7 100644 --- a/src/mame/includes/abc1600.h +++ b/src/mame/includes/abc1600.h @@ -133,6 +133,7 @@ public: void cio_pc_w(uint8_t data); void nmi_w(int state); + void buserr_w(offs_t offset, uint8_t data); void cpu_space_map(address_map &map); @@ -149,7 +150,6 @@ public: int m_dmadis; int m_sysscc; int m_sysfs; - uint8_t m_cause; int m_partst; // parity test void abc1600(machine_config &config); @@ -164,8 +164,8 @@ public: int m_btce; // V.24 channel B external clock enable bool m_sccrq_a; bool m_sccrq_b; - int m_dart_irq; int m_scc_irq; + int m_dart_irq; }; diff --git a/src/mame/machine/abc1600mac.cpp b/src/mame/machine/abc1600mac.cpp index 03bba2be8fa..91c22246282 100644 --- a/src/mame/machine/abc1600mac.cpp +++ b/src/mame/machine/abc1600mac.cpp @@ -18,28 +18,9 @@ #define LOG 0 #define LOG_MAC 0 #define LOG_DMA 0 -#define LOG_IO 0 - -#define A0 BIT(offset, 0) -#define A1 BIT(offset, 1) -#define A2 BIT(offset, 2) -#define A4 BIT(offset, 4) -#define A7 BIT(offset, 7) #define A8 BIT(offset, 8) -#define X11 BIT(offset, 11) -#define X12 BIT(offset, 12) -#define A17 BIT(offset, 17) -#define A18 BIT(offset, 18) -#define A19 BIT(offset, 19) -#define A10_A9_A8 ((offset >> 8) & 0x07) -#define A2_A1_A0 (offset & 0x07) -#define A1_A2 ((A1 << 1) | A2) -#define A2_A1 ((offset >> 1) & 0x03) - -#define FC0 BIT(fc, 0) -#define FC1 BIT(fc, 1) #define FC2 BIT(fc, 2) #define PAGE_WP BIT(page_data, 14) @@ -54,13 +35,12 @@ DEFINE_DEVICE_TYPE(ABC1600_MAC, abc1600_mac_device, "abc1600mac", "ABC 1600 MAC") -void abc1600_mac_device::map(address_map &map) +void abc1600_mac_device::program_map(address_map &map) { - map(0x00000, 0xfffff).rw(FUNC(abc1600_mac_device::read), FUNC(abc1600_mac_device::write)); + // populated in drivers/abc1600.cpp } - -void abc1600_mac_device::program_map(address_map &map) +void abc1600_mac_device::mac_map(address_map &map) { map(0x80000, 0x80000).mirror(0x006f8).select(0x7f900).rw(FUNC(abc1600_mac_device::page_hi_r), FUNC(abc1600_mac_device::page_hi_w)); map(0x80001, 0x80001).mirror(0x006f8).select(0x7f900).rw(FUNC(abc1600_mac_device::page_lo_r), FUNC(abc1600_mac_device::page_lo_w)); @@ -115,13 +95,13 @@ abc1600_mac_device::abc1600_mac_device(const machine_config &mconfig, const char device_t(mconfig, ABC1600_MAC, tag, owner, clock), device_memory_interface(mconfig, *this), m_program_config("program", ENDIANNESS_BIG, 8, 21, 0, address_map_constructor(FUNC(abc1600_mac_device::program_map), this)), + m_mac_config("mac", ENDIANNESS_BIG, 8, 20, 0, address_map_constructor(FUNC(abc1600_mac_device::mac_map), this)), m_rom(*this, "boot"), m_segment_ram(*this, "segment_ram", 0x400, ENDIANNESS_LITTLE), m_page_ram(*this, "page_ram", 0x800, ENDIANNESS_LITTLE), m_watchdog(*this, "watchdog"), m_read_fc(*this), m_write_buserr(*this), - m_ifc2(0), m_boote(0), m_magic(0), m_task(0), @@ -140,15 +120,16 @@ void abc1600_mac_device::device_start() m_read_fc.resolve_safe(0); m_write_buserr.resolve_safe(); - // HACK fill segment RAM or abcenix won't boot - memset(m_segment_ram, 0xcd, 0x400); - //memset(m_page_ram, 0xcd, 0x400); - // state saving - save_item(NAME(m_ifc2)); + save_item(NAME(m_boote)); + save_item(NAME(m_magic)); save_item(NAME(m_task)); save_item(NAME(m_dmamap)); save_item(NAME(m_cause)); + + // HACK fill segment RAM or abcenix won't boot + memset(m_segment_ram, 0xcd, 0x200); + memset(m_page_ram, 0xcd, 0x800); } @@ -173,23 +154,20 @@ void abc1600_mac_device::device_reset() device_memory_interface::space_config_vector abc1600_mac_device::memory_space_config() const { return space_config_vector { - std::make_pair(AS_PROGRAM, &m_program_config) + std::make_pair(AS_PROGRAM, &m_program_config), + std::make_pair(AS_MAC, &m_mac_config) }; } //------------------------------------------------- -// translate_address - +// get_physical_offset - //------------------------------------------------- -offs_t abc1600_mac_device::translate_address(offs_t offset, int &nonx, int &wp) +inline offs_t abc1600_mac_device::get_physical_offset(offs_t offset, int task, bool &nonx, bool &wp) { // segment - int force_task0 = !(m_ifc2 || A19); - int task = force_task0 ? 0 : m_task; - int sega19 = !(!(A8 || m_ifc2) || !A19); - - offs_t sega = (task << 5) | (sega19 << 4) | ((offset >> 15) & 0x0f); + offs_t sega = (task << 5) | ((offset >> 15) & 0x1f); uint8_t segd = m_segment_ram[sega]; // page @@ -198,17 +176,11 @@ offs_t abc1600_mac_device::translate_address(offs_t offset, int &nonx, int &wp) offs_t virtual_offset = ((page_data & 0x3ff) << 11) | (offset & 0x7ff); - if (PAGE_NONX) - { - logerror("Bus error %06x : %06x\n", offset, virtual_offset); - m_write_buserr(ASSERT_LINE); - m_write_buserr(CLEAR_LINE); - } - nonx = PAGE_NONX; wp = PAGE_WP; - if (LOG_MAC && offset != virtual_offset) logerror("%s MAC %05x:%06x (SEGA %03x SEGD %02x PGA %03x PGD %04x NONX %u WP %u TASK %u FC %u)\n", machine().describe_context(), offset, virtual_offset, sega, segd, pga, m_page_ram[pga], nonx, wp, task, m_read_fc()); + if (LOG && (offset != virtual_offset)) logerror("%s MAC %05x:%06x (SEGA %03x SEGD %02x PGA %03x PGD %04x NONX %u WP %u TASK %u FC %u MAGIC %u)\n", + machine().describe_context(), offset, virtual_offset, sega, segd, pga, page_data, nonx, wp, task, m_read_fc(), m_magic); return virtual_offset; } @@ -220,31 +192,48 @@ offs_t abc1600_mac_device::translate_address(offs_t offset, int &nonx, int &wp) uint8_t abc1600_mac_device::read(offs_t offset) { - uint16_t fc = m_read_fc(); - m_ifc2 = !(!(m_magic || FC0) || FC2); - - uint8_t data = 0; - if (!m_boote && (offset < 0x20000)) { - // _BOOTCE - data = m_rom->base()[offset & 0x3fff]; + return m_rom->base()[offset & 0x3fff]; } - else if ((offset & 0x80000) && !m_ifc2 && !FC1) - { - data = space(AS_PROGRAM).read_byte(offset); - } - else - { - int nonx = 0, wp = 0; - offs_t virtual_offset = translate_address(offset, nonx, wp); - - data = space().read_byte(virtual_offset); + + uint8_t fc = m_read_fc(); + int task = m_task; - if (LOG_IO && virtual_offset >= 0x1fe000) logerror("%s user read %06x:%02x\n", machine().describe_context(), virtual_offset, data); + if (FC2) + { + if (offset & 0x80000) + { + if (LOG_MAC && (offset != 0x80007)) logerror("%s MAC R %05x\n", + machine().describe_context(), offset); + + return space(AS_MAC).read_byte(offset); + } + else + { + task = 0; + } } - return data; + if (!m_magic && (fc == M68K_FC_USER_PROGRAM)) + { + task = 0; + } + + bool nonx, wp; + offs_t virtual_offset = get_physical_offset(offset, task, nonx, wp); + + if (!machine().side_effects_disabled()) + { + if (nonx) + { + logerror("NONX\n"); + dump(); + m_write_buserr(offset, 1); + } + } + + return space().read_byte(virtual_offset); } @@ -254,24 +243,45 @@ uint8_t abc1600_mac_device::read(offs_t offset) void abc1600_mac_device::write(offs_t offset, uint8_t data) { - uint16_t fc = m_read_fc(); - m_ifc2 = !(!(m_magic || FC0) || FC2); + uint8_t fc = m_read_fc(); + int task = m_task; - if ((offset & 0x80000) && !m_ifc2 && !FC1) + if (FC2) { - space(AS_PROGRAM).write_byte(offset, data); + if (offset & 0x80000) + { + if (LOG_MAC) logerror("%s MAC W %05x:%02x\n", + machine().describe_context(), offset, data); + + space(AS_MAC).write_byte(offset, data); + return; + } + else + { + task = 0; + } } - else + + bool nonx, wp; + offs_t virtual_offset = get_physical_offset(offset, task, nonx, wp); + + if (!machine().side_effects_disabled()) { - int nonx = 0, wp = 0; - offs_t virtual_offset = translate_address(offset, nonx, wp); - - if (nonx || !wp) return; - - if (LOG_IO && virtual_offset >= 0x1fe000) logerror("%s user write %06x:%02x\n", machine().describe_context(), virtual_offset, data); - - space().write_byte(virtual_offset, data); + if (nonx) + { + logerror("NONX\n"); + dump(); + m_write_buserr(offset, 0); + } + if (!wp) + { + logerror("WP\n"); + dump(); + m_write_buserr(offset, 0); + } } + + space().write_byte(virtual_offset, data); } @@ -332,8 +342,8 @@ void abc1600_mac_device::task_w(offs_t offset, uint8_t data) m_boote = !BIT(data, 6); m_magic = !BIT(data, 7); - if (LOG) logerror("%s TASK %05x:%02x (TASK %u BOOTE %u MAGIC %u)\n", machine().describe_context(), offset, data, - m_task, m_boote, m_magic); + if (LOG_MAC) logerror("%s TASK W %02x (TASK %u BOOTE %u MAGIC %u)\n", + machine().describe_context(), data, m_task, m_boote, m_magic); } @@ -389,8 +399,9 @@ void abc1600_mac_device::segment_w(offs_t offset, uint8_t data) offs_t sega = (m_task << 5) | A8 << 4 | ((offset >> 15) & 0xf); m_segment_ram[sega] = data & 0x7f; - if (LOG) logerror("%s %05x:%02x TASK %u SEGMENT %u MEM %05x-%05x\n", machine().describe_context(), offset, data, - m_task, sega & 0x1f, (sega & 0x1f) * 0x8000, ((sega & 0x1f) * 0x8000) + 0x7fff); + if (LOG_MAC) logerror("%s SEG W %05x:%02x SEGA %03x SEGD %02x TASK %u\n", + machine().describe_context(), offset, data, + sega, m_segment_ram[sega], m_task); } @@ -491,9 +502,9 @@ void abc1600_mac_device::page_lo_w(offs_t offset, uint8_t data) offs_t pga = ((segd & 0x3f) << 4) | ((offset >> 11) & 0xf); m_page_ram[pga] = (m_page_ram[pga] & 0xff00) | data; - if (LOG) logerror("%s %05x:%02x TASK %u SEGMENT %u PAGE %u MEM %05x-%05x %06x\n", machine().describe_context(), offset, data, - m_task, sega & 0x1f, ((offset >> 11) & 0x0f), ((sega & 0x1f) * 0x8000) + ((offset >> 11) & 0x0f) * 0x800, - ((sega & 0x1f) * 0x8000) + (((offset >> 11) & 0x0f) * 0x800) + 0x7ff, (m_page_ram[pga] & 0x3ff) << 11); + if (LOG_MAC) logerror("%s PAGE W %05x:%02x (SEGA %03x SEGD %02x PGA %03x PGD %04x TASK %u)\n", + machine().describe_context(), offset, data, + sega, segd, pga, m_page_ram[pga], m_task); } @@ -625,3 +636,32 @@ void abc1600_mac_device::dmamap_w(offs_t offset, uint8_t data) m_dmamap[offset & 7] = data; } + + +//------------------------------------------------- +// dump - dump MAC mappings +//------------------------------------------------- + +void abc1600_mac_device::dump() +{ + for (int task = 0; task < 16; task++) { + for (int seg = 0; seg < 32; seg++) { + for (int page = 0; page < 16; page++) { + offs_t logical = (seg * 0x8000) | (page * 0x800); + + offs_t sega = (task << 5) | seg; + uint8_t segd = m_segment_ram[sega]; + + offs_t pga = ((segd & 0x3f) << 4) | page; + uint16_t page_data = m_page_ram[pga]; + + offs_t physical = (page_data & 0x3ff) << 11; + bool nonx = PAGE_NONX; + bool wp = PAGE_WP; + + logerror("TASK %.2u SEGMENT %.2u PAGE %.2u MEM %05x-%05x %06x-%06x %c %c\n", + task, seg, page, logical, logical + 0x7ff, physical, physical + 0x7ff, nonx ? 'X' : ' ', wp ? ' ' : 'W'); + } + } + } +} diff --git a/src/mame/machine/abc1600mac.h b/src/mame/machine/abc1600mac.h index ff6343a97e0..44bc442af61 100644 --- a/src/mame/machine/abc1600mac.h +++ b/src/mame/machine/abc1600mac.h @@ -38,7 +38,8 @@ public: auto fc_cb() { return m_read_fc.bind(); } auto buserr_cb() { return m_write_buserr.bind(); } - virtual void map(address_map &map); + uint8_t read(offs_t offset); + void write(offs_t offset, uint8_t data); uint8_t cause_r(); void task_w(offs_t offset, uint8_t data); @@ -62,6 +63,8 @@ public: void dma2_mreq_w(offs_t offset, uint8_t data) { dma_mreq_w(DMAMAP_R2_LO, offset, data); } uint8_t dma2_iorq_r(offs_t offset) { return dma_iorq_r(DMAMAP_R2_LO, offset); } void dma2_iorq_w(offs_t offset, uint8_t data) { dma_iorq_w(DMAMAP_R2_LO, offset, data); } + + void dump(); protected: // device-level overrides @@ -85,11 +88,9 @@ private: DMAMAP_R0_LO, DMAMAP_R0_HI }; + + offs_t get_physical_offset(offs_t offset, int task, bool &nonx, bool &wp); - uint8_t read(offs_t offset); - void write(offs_t offset, uint8_t data); - - offs_t translate_address(offs_t offset, int &nonx, int &wp); offs_t get_dma_address(int index, uint16_t offset); uint8_t dma_mreq_r(int index, uint16_t offset); void dma_mreq_w(int index, uint16_t offset, uint8_t data); @@ -97,7 +98,9 @@ private: void dma_iorq_w(int index, uint16_t offset, uint8_t data); void program_map(address_map &map); + void mac_map(address_map &map); const address_space_config m_program_config; + const address_space_config m_mac_config; required_memory_region m_rom; memory_share_creator m_segment_ram; @@ -106,17 +109,21 @@ private: required_device m_watchdog; devcb_read8 m_read_fc; - devcb_write_line m_write_buserr; + devcb_write8 m_write_buserr; - bool m_ifc2; bool m_boote; bool m_magic; - bool m_task; + int m_task; + uint8_t m_dmamap[8]; uint8_t m_cause; }; +constexpr int AS_MAC = 1; + + + // device type definition DECLARE_DEVICE_TYPE(ABC1600_MAC, abc1600_mac_device)