diff --git a/src/emu/cpu/i8089/i8089.c b/src/emu/cpu/i8089/i8089.c index c4ad5e35824..15cee81dd1b 100644 --- a/src/emu/cpu/i8089/i8089.c +++ b/src/emu/cpu/i8089/i8089.c @@ -37,10 +37,10 @@ i8089_device::i8089_device(const machine_config &mconfig, const char *tag, devic m_ch2(*this, "2"), m_write_sintr1(*this), m_write_sintr2(*this), - m_16bit_system(false), - m_16bit_remote(false), + m_sysbus(0), + m_scb(0), + m_soc(0), m_master(false), - m_request_grant(false), m_current_tp(0), m_ca(0), m_sel(0) @@ -61,37 +61,40 @@ void i8089_device::device_start() m_write_sintr2.resolve_safe(); // register debugger states - state_add(i8089_channel::GA, "CH1 GA", m_ch1->m_r[i8089_channel::GA].w).mask(0xfffff); - state_add(i8089_channel::GB, "CH1 GB", m_ch1->m_r[i8089_channel::GB].w).mask(0xfffff); - state_add(i8089_channel::GC, "CH1 GC", m_ch1->m_r[i8089_channel::GC].w).mask(0xfffff); - state_add(i8089_channel::TP, "CH1 TP", m_ch1->m_r[i8089_channel::TP].w).mask(0xfffff); - state_add(i8089_channel::BC, "CH1 BC", m_ch1->m_r[i8089_channel::BC].w).mask(0xffff); - state_add(i8089_channel::IX, "CH1 IX", m_ch1->m_r[i8089_channel::IX].w).mask(0xffff); - state_add(i8089_channel::CC, "CH1 CC", m_ch1->m_r[i8089_channel::CC].w).mask(0xffff); - state_add(i8089_channel::MC, "CH1 MC", m_ch1->m_r[i8089_channel::MC].w).mask(0xffff); - state_add(i8089_channel::CP, "CH1 CP", m_ch1->m_r[i8089_channel::CP].w).mask(0xfffff); - state_add(i8089_channel::PP, "CH1 PP", m_ch1->m_r[i8089_channel::PP].w).mask(0xfffff); - state_add(i8089_channel::PSW, "CH1 PSW", m_ch1->m_r[i8089_channel::PSW].w).callimport().callexport().formatstr("%12s"); - - state_add(i8089_channel::GA + i8089_channel::NUM_REGS, "CH2 GA", m_ch2->m_r[i8089_channel::GA].w).mask(0xfffff); - state_add(i8089_channel::GB + i8089_channel::NUM_REGS, "CH2 GB", m_ch2->m_r[i8089_channel::GB].w).mask(0xfffff); - state_add(i8089_channel::GC + i8089_channel::NUM_REGS, "CH2 GC", m_ch2->m_r[i8089_channel::GC].w).mask(0xfffff); - state_add(i8089_channel::TP + i8089_channel::NUM_REGS, "CH2 TP", m_ch2->m_r[i8089_channel::TP].w).mask(0xfffff); - state_add(i8089_channel::BC + i8089_channel::NUM_REGS, "CH2 BC", m_ch2->m_r[i8089_channel::BC].w).mask(0xffff); - state_add(i8089_channel::IX + i8089_channel::NUM_REGS, "CH2 IX", m_ch2->m_r[i8089_channel::IX].w).mask(0xffff); - state_add(i8089_channel::CC + i8089_channel::NUM_REGS, "CH2 CC", m_ch2->m_r[i8089_channel::CC].w).mask(0xffff); - state_add(i8089_channel::MC + i8089_channel::NUM_REGS, "CH2 MC", m_ch2->m_r[i8089_channel::MC].w).mask(0xffff); - state_add(i8089_channel::CP + i8089_channel::NUM_REGS, "CH2 CP", m_ch2->m_r[i8089_channel::CP].w).mask(0xfffff); - state_add(i8089_channel::PP + i8089_channel::NUM_REGS, "CH2 PP", m_ch2->m_r[i8089_channel::PP].w).mask(0xfffff); - state_add(i8089_channel::PSW + i8089_channel::NUM_REGS, "CH2 PSW", m_ch2->m_r[i8089_channel::PSW].w).callimport().callexport().formatstr("%12s"); - + state_add(SYSBUS, "SYSBUS", m_sysbus).mask(0x01).formatstr("%1s"); + state_add(SCB, "SCB", m_scb).mask(0xfffff); + state_add(SOC, "SOC", m_soc).mask(0x03).formatstr("%2s"); + state_add_divider(DIVIDER1); + state_add(CH1_GA, "CH1 GA", m_ch1->m_r[i8089_channel::GA].w).mask(0xfffff).formatstr("%8s"); + state_add(CH1_GB, "CH1 GB", m_ch1->m_r[i8089_channel::GB].w).mask(0xfffff).formatstr("%8s"); + state_add(CH1_GC, "CH1 GC", m_ch1->m_r[i8089_channel::GC].w).mask(0xfffff).formatstr("%8s"); + state_add(CH1_TP, "CH1 TP", m_ch1->m_r[i8089_channel::TP].w).mask(0xfffff).formatstr("%8s"); + state_add(CH1_BC, "CH1 BC", m_ch1->m_r[i8089_channel::BC].w).mask(0xffff); + state_add(CH1_IX, "CH1 IX", m_ch1->m_r[i8089_channel::IX].w).mask(0xffff); + state_add(CH1_CC, "CH1 CC", m_ch1->m_r[i8089_channel::CC].w).mask(0xffff); + state_add(CH1_MC, "CH1 MC", m_ch1->m_r[i8089_channel::MC].w).mask(0xffff); + state_add(CH1_CP, "CH1 CP", m_ch1->m_r[i8089_channel::CP].w).mask(0xfffff); + state_add(CH1_PP, "CH1 PP", m_ch1->m_r[i8089_channel::PP].w).mask(0xfffff); + state_add(CH1_PSW, "CH1 PSW", m_ch1->m_r[i8089_channel::PSW].w).callimport().callexport().formatstr("%12s"); + state_add_divider(DIVIDER2); + state_add(CH2_GA, "CH2 GA", m_ch2->m_r[i8089_channel::GA].w).mask(0xfffff).formatstr("%8s"); + state_add(CH2_GB, "CH2 GB", m_ch2->m_r[i8089_channel::GB].w).mask(0xfffff).formatstr("%8s"); + state_add(CH2_GC, "CH2 GC", m_ch2->m_r[i8089_channel::GC].w).mask(0xfffff).formatstr("%8s"); + state_add(CH2_TP, "CH2 TP", m_ch2->m_r[i8089_channel::TP].w).mask(0xfffff).formatstr("%8s"); + state_add(CH2_BC, "CH2 BC", m_ch2->m_r[i8089_channel::BC].w).mask(0xffff); + state_add(CH2_IX, "CH2 IX", m_ch2->m_r[i8089_channel::IX].w).mask(0xffff); + state_add(CH2_CC, "CH2 CC", m_ch2->m_r[i8089_channel::CC].w).mask(0xffff); + state_add(CH2_MC, "CH2 MC", m_ch2->m_r[i8089_channel::MC].w).mask(0xffff); + state_add(CH2_CP, "CH2 CP", m_ch2->m_r[i8089_channel::CP].w).mask(0xfffff); + state_add(CH2_PP, "CH2 PP", m_ch2->m_r[i8089_channel::PP].w).mask(0xfffff); + state_add(CH2_PSW, "CH2 PSW", m_ch2->m_r[i8089_channel::PSW].w).callimport().callexport().formatstr("%12s"); state_add(STATE_GENPC, "GENPC", m_current_tp).mask(0xfffff).noshow(); // register for save states - save_item(NAME(m_16bit_system)); - save_item(NAME(m_16bit_remote)); + save_item(NAME(m_sysbus)); + save_item(NAME(m_scb)); + save_item(NAME(m_soc)); save_item(NAME(m_master)); - save_item(NAME(m_request_grant)); save_item(NAME(m_ca)); save_item(NAME(m_sel)); @@ -153,31 +156,47 @@ offs_t i8089_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *op void i8089_device::state_string_export(const device_state_entry &entry, astring &string) { + i8089_channel *ch = m_ch1; + + if (entry.index() >= CH2_GA && entry.index() <= CH2_PSW) + ch = m_ch2; + switch (entry.index()) { - case i8089_channel::PSW: - string.printf("%c%s%c%s%s%s%c%c", - BIT(m_ch1->m_r[i8089_channel::PSW].w, 7) ? 'P':'.', - BIT(m_ch1->m_r[i8089_channel::PSW].w, 6) ? "XF":"..", - BIT(m_ch1->m_r[i8089_channel::PSW].w, 5) ? 'B':'.', - BIT(m_ch1->m_r[i8089_channel::PSW].w, 4) ? "IS":"..", - BIT(m_ch1->m_r[i8089_channel::PSW].w, 3) ? "IC":"..", - BIT(m_ch1->m_r[i8089_channel::PSW].w, 2) ? "TB":"..", - BIT(m_ch1->m_r[i8089_channel::PSW].w, 1) ? 'S':'.', - BIT(m_ch1->m_r[i8089_channel::PSW].w, 0) ? 'D':'.'); - break; - - case i8089_channel::PSW + i8089_channel::NUM_REGS: - string.printf("%c%s%c%s%s%s%c%c", - BIT(m_ch2->m_r[i8089_channel::PSW].w, 7) ? 'P':'.', - BIT(m_ch2->m_r[i8089_channel::PSW].w, 6) ? "XF":"..", - BIT(m_ch2->m_r[i8089_channel::PSW].w, 5) ? 'B':'.', - BIT(m_ch2->m_r[i8089_channel::PSW].w, 4) ? "IS":"..", - BIT(m_ch2->m_r[i8089_channel::PSW].w, 3) ? "IC":"..", - BIT(m_ch2->m_r[i8089_channel::PSW].w, 2) ? "TB":"..", - BIT(m_ch2->m_r[i8089_channel::PSW].w, 1) ? 'S':'.', - BIT(m_ch2->m_r[i8089_channel::PSW].w, 0) ? 'D':'.'); - break; + case SYSBUS: + string.printf("%c", sysbus_width() ? 'W' : '.'); + break; + case SOC: + string.printf("%c%c", remotebus_width() ? 'I' : '.', request_grant() ? 'R' : '.'); + break; + case CH1_GA: + case CH2_GA: + string.printf("%d %05X", ch->m_r[i8089_channel::GA].t & 1, ch->m_r[i8089_channel::GA].w); + break; + case CH1_GB: + case CH2_GB: + string.printf("%d %05X", ch->m_r[i8089_channel::GB].t & 1, ch->m_r[i8089_channel::GB].w); + break; + case CH1_GC: + case CH2_GC: + string.printf("%d %05X", ch->m_r[i8089_channel::GC].t & 1, ch->m_r[i8089_channel::GC].w); + break; + case CH1_TP: + case CH2_TP: + string.printf("%d %05X", ch->m_r[i8089_channel::TP].t & 1, ch->m_r[i8089_channel::TP].w); + break; + case CH1_PSW: + case CH2_PSW: + string.printf("%c%s%c%s%s%s%c%c", + BIT(ch->m_r[i8089_channel::PSW].w, 7) ? 'P':'.', + BIT(ch->m_r[i8089_channel::PSW].w, 6) ? "XF":"..", + BIT(ch->m_r[i8089_channel::PSW].w, 5) ? 'B':'.', + BIT(ch->m_r[i8089_channel::PSW].w, 4) ? "IS":"..", + BIT(ch->m_r[i8089_channel::PSW].w, 3) ? "IC":"..", + BIT(ch->m_r[i8089_channel::PSW].w, 2) ? "TB":"..", + BIT(ch->m_r[i8089_channel::PSW].w, 1) ? 'S':'.', + BIT(ch->m_r[i8089_channel::PSW].w, 0) ? 'D':'.'); + break; } } @@ -216,23 +235,20 @@ void i8089_device::initialize() assert(!m_initialized); // get system bus width - UINT8 sys_bus = m_mem->read_byte(0xffff6); - m_16bit_system = BIT(sys_bus, 0); + m_sysbus = m_mem->read_byte(0xffff6); // get system configuration block address UINT16 scb_offset = read_word(0xffff8); UINT16 scb_segment = read_word(0xffffa); - offs_t scb_address = ((scb_segment << 4) + scb_offset) & 0x0fffff; + m_scb = ((scb_segment << 4) + scb_offset) & 0x0fffff; // get system operation command - UINT16 soc = read_word(scb_address); - m_16bit_remote = BIT(soc, 0); - m_request_grant = BIT(soc, 1); + m_soc = read_byte(m_scb); m_master = !m_sel; // get control block address - UINT16 cb_offset = read_word(scb_address + 2); - UINT16 cb_segment = read_word(scb_address + 4); + UINT16 cb_offset = read_word(m_scb + 2); + UINT16 cb_segment = read_word(m_scb + 4); offs_t cb_address = ((cb_segment << 4) + cb_offset) & 0x0fffff; // initialize channels @@ -250,10 +266,10 @@ void i8089_device::initialize() if (VERBOSE) { logerror("%s('%s'): ---- initializing ----\n", shortname(), basetag()); - logerror("%s('%s'): %s system bus\n", shortname(), basetag(), m_16bit_system ? "16-bit" : "8-bit"); - logerror("%s('%s'): system configuration block location: %06x\n", shortname(), basetag(), scb_address); - logerror("%s('%s'): %s remote bus\n", shortname(), basetag(), m_16bit_remote ? "16-bit" : "8-bit"); - logerror("%s('%s'): request/grant: %d\n", shortname(), basetag(), m_request_grant); + logerror("%s('%s'): %s system bus\n", shortname(), basetag(), sysbus_width() ? "16-bit" : "8-bit"); + logerror("%s('%s'): system configuration block location: %06x\n", shortname(), basetag(), m_scb); + logerror("%s('%s'): %s remote bus\n", shortname(), basetag(), remotebus_width() ? "16-bit" : "8-bit"); + logerror("%s('%s'): request/grant: %d\n", shortname(), basetag(), request_grant()); logerror("%s('%s'): is %s\n", shortname(), basetag(), m_master ? "master" : "slave"); logerror("%s('%s'): channel control block location: %06x\n", shortname(), basetag(), cb_address); } @@ -271,7 +287,7 @@ UINT16 i8089_device::read_word(offs_t address) UINT16 data = 0xffff; - if (m_16bit_system && !(address & 1)) + if (sysbus_width() && !(address & 1)) { data = m_mem->read_word(address); } @@ -294,7 +310,7 @@ void i8089_device::write_word(offs_t address, UINT16 data) { assert(m_initialized); - if (m_16bit_system && !(address & 1)) + if (sysbus_width() && !(address & 1)) { m_mem->write_word(address, data); } diff --git a/src/emu/cpu/i8089/i8089.h b/src/emu/cpu/i8089/i8089.h index c758d9e9f52..0ae522d4591 100644 --- a/src/emu/cpu/i8089/i8089.h +++ b/src/emu/cpu/i8089/i8089.h @@ -91,6 +91,10 @@ protected: virtual machine_config_constructor device_mconfig_additions() const; private: + bool sysbus_width() { return BIT(m_sysbus, 0); } + bool remotebus_width() { return BIT(m_soc, 0); } + bool request_grant() { return BIT(m_soc, 1); } + UINT8 read_byte(offs_t address); UINT16 read_word(offs_t address); void write_byte(offs_t address, UINT8 data); @@ -108,12 +112,31 @@ private: address_space *m_mem; address_space *m_io; + // register indexes for the debugger state + enum + { + SYSBUS, + SCB, + SOC, + DIVIDER1, + CH1_GA, CH1_GB, CH1_GC, + CH1_TP, CH1_BC, CH1_IX, + CH1_CC, CH1_MC, CH1_CP, + CH1_PP, CH1_PSW, + DIVIDER2, + CH2_GA, CH2_GB, CH2_GC, + CH2_TP, CH2_BC, CH2_IX, + CH2_CC, CH2_MC, CH2_CP, + CH2_PP, CH2_PSW + }; + // system configuration + UINT8 m_sysbus; + offs_t m_scb; + UINT8 m_soc; + bool m_initialized; - bool m_16bit_system; - bool m_16bit_remote; bool m_master; - bool m_request_grant; // task pointer for the currently executing channel offs_t m_current_tp; diff --git a/src/emu/debug/dvstate.c b/src/emu/debug/dvstate.c index fafaefaa842..503a8e31c0a 100644 --- a/src/emu/debug/dvstate.c +++ b/src/emu/debug/dvstate.c @@ -171,7 +171,12 @@ void debug_view_state::recompute() // add all registers into it for (const device_state_entry *entry = source.m_stateintf->state_first(); entry != NULL; entry = entry->next()) - if (entry->visible()) + if (entry->divider()) + { + *tailptr = auto_alloc(machine(), state_item(REG_DIVIDER, "", 0)); + tailptr = &(*tailptr)->m_next; + } + else if (entry->visible()) { *tailptr = auto_alloc(machine(), state_item(entry->index(), entry->symbol(), source.m_stateintf->state_string_max_length(entry->index()))); tailptr = &(*tailptr)->m_next; diff --git a/src/emu/distate.c b/src/emu/distate.c index c79cad327b0..64af80179fa 100644 --- a/src/emu/distate.c +++ b/src/emu/distate.c @@ -115,6 +115,19 @@ device_state_entry::device_state_entry(int index, const char *symbol, void *data m_symbol.cpy("CURFLAGS"); } +device_state_entry::device_state_entry(int index) + : m_next(NULL), + m_index(index), + m_dataptr(NULL), + m_datamask(0), + m_datasize(0), + m_flags(DSF_DIVIDER), + m_symbol(), + m_default_format(true), + m_sizemask(0) +{ +} + //------------------------------------------------- // formatstr - specify a format string @@ -526,6 +539,21 @@ device_state_entry &device_state_interface::state_add(int index, const char *sym return *entry; } +//------------------------------------------------- +// state_add_divider - add a simple divider +// entry +//------------------------------------------------- + +device_state_entry &device_state_interface::state_add_divider(int index) +{ + // allocate new entry + device_state_entry *entry = global_alloc(device_state_entry(index)); + + // append to the end of the list + m_state_list.append(*entry); + + return *entry; +} //------------------------------------------------- // state_import - called after new state is diff --git a/src/emu/distate.h b/src/emu/distate.h index 6047435841c..82b440b2d71 100644 --- a/src/emu/distate.h +++ b/src/emu/distate.h @@ -78,6 +78,7 @@ class device_state_entry private: // construction/destruction device_state_entry(int index, const char *symbol, void *dataptr, UINT8 size); + device_state_entry(int index); public: // post-construction modifiers @@ -96,6 +97,7 @@ public: void *dataptr() const { return m_dataptr.v; } const char *symbol() const { return m_symbol; } bool visible() const { return ((m_flags & DSF_NOSHOW) == 0); } + bool divider() const { return m_flags & DSF_DIVIDER; } protected: // device state flags @@ -104,6 +106,7 @@ protected: static const UINT8 DSF_IMPORT_SEXT = 0x04; // sign-extend the data when writing new data static const UINT8 DSF_EXPORT = 0x08; // call the export function prior to fetching the data static const UINT8 DSF_CUSTOM_STRING = 0x10; // set if the format has a custom string + static const UINT8 DSF_DIVIDER = 0x20; // set if this is a divider entry // helpers bool needs_custom_string() const { return ((m_flags & DSF_CUSTOM_STRING) != 0); } @@ -179,6 +182,9 @@ public: // protected eventually } device_state_entry &state_add(int index, const char *symbol, void *data, UINT8 size); + // add a new divider entry + device_state_entry &state_add_divider(int index); + protected: // derived class overrides virtual void state_import(const device_state_entry &entry);