Update disassembly if IP or CS are changed in the debugger. Also update IP & CS when PC or CURPC changes (currently using a simple algorithm that may need to be improved). [smf]

This commit is contained in:
smf- 2016-12-03 00:00:38 +00:00
parent 25789eda48
commit b90375bf65
5 changed files with 82 additions and 67 deletions

View File

@ -549,14 +549,14 @@ void i80186_cpu_device::execute_run()
void i80186_cpu_device::device_start()
{
i8086_common_cpu_device::device_start();
state_add( I8086_ES, "ES", m_sregs[ES] ).callimport().callexport().formatstr("%04X");
state_add( I8086_CS, "CS", m_sregs[CS] ).callimport().callexport().formatstr("%04X");
state_add( I8086_SS, "SS", m_sregs[SS] ).callimport().callexport().formatstr("%04X");
state_add( I8086_DS, "DS", m_sregs[DS] ).callimport().callexport().formatstr("%04X");
state_add( I8086_VECTOR, "V", m_int_vector).callimport().callexport().formatstr("%02X");
state_add( I8086_ES, "ES", m_sregs[ES] ).formatstr("%04X");
state_add( I8086_CS, "CS", m_sregs[CS] ).callimport().formatstr("%04X");
state_add( I8086_SS, "SS", m_sregs[SS] ).formatstr("%04X");
state_add( I8086_DS, "DS", m_sregs[DS] ).formatstr("%04X");
state_add( I8086_VECTOR, "V", m_int_vector).formatstr("%02X");
state_add(STATE_GENPC, "GENPC", m_pc).formatstr("%05X");
state_add(STATE_GENPCBASE, "CURPC", m_pc).formatstr("%05X");
state_add(STATE_GENPC, "PC", m_pc).formatstr("%05X");
state_add(STATE_GENPCBASE, "CURPC", m_pc).callimport().formatstr("%05X");
// register for savestates
save_item(NAME(m_timer[0].control));

View File

@ -242,39 +242,39 @@ void i80286_cpu_device::device_start()
save_item(NAME(m_amask));
save_item(NAME(m_shutdown));
state_add( I286_ES, "ES", m_sregs[ES] ).callimport().callexport().formatstr("%04X");
state_add( I286_ES_BASE, "ESBASE", m_base[ES]).callimport().callexport().formatstr("%06X");
state_add( I286_ES_LIMIT, "ESLIMIT", m_limit[ES]).callimport().callexport().formatstr("%04X");
state_add( I286_ES_FLAGS, "ESFLAGS", m_rights[ES]).callimport().callexport().formatstr("%02X");
state_add( I286_CS, "CS", m_sregs[CS] ).callimport().callexport().formatstr("%04X");
state_add( I286_CS_BASE, "CSBASE", m_base[CS]).callimport().callexport().formatstr("%06X");
state_add( I286_CS_LIMIT, "CSLIMIT", m_limit[CS]).callimport().callexport().formatstr("%04X");
state_add( I286_CS_FLAGS, "CSFLAGS", m_rights[CS]).callimport().callexport().formatstr("%02X");
state_add( I286_SS, "SS", m_sregs[SS] ).callimport().callexport().formatstr("%04X");
state_add( I286_SS_BASE, "SSBASE", m_base[SS]).callimport().callexport().formatstr("%06X");
state_add( I286_SS_LIMIT, "SSLIMIT", m_limit[SS]).callimport().callexport().formatstr("%04X");
state_add( I286_SS_FLAGS, "SSFLAGS", m_rights[SS]).callimport().callexport().formatstr("%02X");
state_add( I286_DS, "DS", m_sregs[DS] ).callimport().callexport().formatstr("%04X");
state_add( I286_DS_BASE, "DSBASE", m_base[DS]).callimport().callexport().formatstr("%06X");
state_add( I286_DS_LIMIT, "DSLIMIT", m_limit[DS]).callimport().callexport().formatstr("%04X");
state_add( I286_DS_FLAGS, "DSFLAGS", m_rights[DS]).callimport().callexport().formatstr("%02X");
state_add( I286_GDTR_BASE, "GDTRBASE", m_gdtr.base).callimport().callexport().formatstr("%06X");
state_add( I286_GDTR_LIMIT, "GDTRLIMIT", m_gdtr.limit).callimport().callexport().formatstr("%04X");
state_add( I286_IDTR_BASE, "IDTRBASE", m_idtr.base).callimport().callexport().formatstr("%06X");
state_add( I286_IDTR_LIMIT, "IDTRLIMIT", m_idtr.limit).callimport().callexport().formatstr("%04X");
state_add( I286_LDTR, "LDTR", m_ldtr.sel ).callimport().callexport().formatstr("%04X");
state_add( I286_LDTR_BASE, "LDTRBASE", m_ldtr.base).callimport().callexport().formatstr("%06X");
state_add( I286_LDTR_LIMIT, "LDTRLIMIT", m_ldtr.limit).callimport().callexport().formatstr("%04X");
state_add( I286_LDTR_FLAGS, "LDTRFLAGS", m_ldtr.rights).callimport().callexport().formatstr("%02X");
state_add( I286_TR, "TR", m_tr.sel ).callimport().callexport().formatstr("%04X");
state_add( I286_TR_BASE, "TRBASE", m_tr.base).callimport().callexport().formatstr("%06X");
state_add( I286_TR_LIMIT, "TRLIMIT", m_tr.limit).callimport().callexport().formatstr("%04X");
state_add( I286_TR_FLAGS, "TRFLAGS", m_tr.rights).callimport().callexport().formatstr("%02X");
state_add( I286_MSW, "MSW", m_msw ).callimport().callexport().formatstr("%04X");
state_add( I286_VECTOR, "V", m_int_vector).callimport().callexport().formatstr("%02X");
state_add( I286_ES, "ES", m_sregs[ES] ).formatstr("%04X");
state_add( I286_ES_BASE, "ESBASE", m_base[ES]).formatstr("%06X");
state_add( I286_ES_LIMIT, "ESLIMIT", m_limit[ES]).formatstr("%04X");
state_add( I286_ES_FLAGS, "ESFLAGS", m_rights[ES]).formatstr("%02X");
state_add( I286_CS, "CS", m_sregs[CS] ).callimport().formatstr("%04X");
state_add( I286_CS_BASE, "CSBASE", m_base[CS]).formatstr("%06X");
state_add( I286_CS_LIMIT, "CSLIMIT", m_limit[CS]).formatstr("%04X");
state_add( I286_CS_FLAGS, "CSFLAGS", m_rights[CS]).formatstr("%02X");
state_add( I286_SS, "SS", m_sregs[SS] ).formatstr("%04X");
state_add( I286_SS_BASE, "SSBASE", m_base[SS]).formatstr("%06X");
state_add( I286_SS_LIMIT, "SSLIMIT", m_limit[SS]).formatstr("%04X");
state_add( I286_SS_FLAGS, "SSFLAGS", m_rights[SS]).formatstr("%02X");
state_add( I286_DS, "DS", m_sregs[DS] ).formatstr("%04X");
state_add( I286_DS_BASE, "DSBASE", m_base[DS]).formatstr("%06X");
state_add( I286_DS_LIMIT, "DSLIMIT", m_limit[DS]).formatstr("%04X");
state_add( I286_DS_FLAGS, "DSFLAGS", m_rights[DS]).formatstr("%02X");
state_add( I286_GDTR_BASE, "GDTRBASE", m_gdtr.base).formatstr("%06X");
state_add( I286_GDTR_LIMIT, "GDTRLIMIT", m_gdtr.limit).formatstr("%04X");
state_add( I286_IDTR_BASE, "IDTRBASE", m_idtr.base).formatstr("%06X");
state_add( I286_IDTR_LIMIT, "IDTRLIMIT", m_idtr.limit).formatstr("%04X");
state_add( I286_LDTR, "LDTR", m_ldtr.sel ).formatstr("%04X");
state_add( I286_LDTR_BASE, "LDTRBASE", m_ldtr.base).formatstr("%06X");
state_add( I286_LDTR_LIMIT, "LDTRLIMIT", m_ldtr.limit).formatstr("%04X");
state_add( I286_LDTR_FLAGS, "LDTRFLAGS", m_ldtr.rights).formatstr("%02X");
state_add( I286_TR, "TR", m_tr.sel ).formatstr("%04X");
state_add( I286_TR_BASE, "TRBASE", m_tr.base).formatstr("%06X");
state_add( I286_TR_LIMIT, "TRLIMIT", m_tr.limit).formatstr("%04X");
state_add( I286_TR_FLAGS, "TRFLAGS", m_tr.rights).formatstr("%02X");
state_add( I286_MSW, "MSW", m_msw ).formatstr("%04X");
state_add( I286_VECTOR, "V", m_int_vector).formatstr("%02X");
state_add(STATE_GENPC, "GENPC", m_pc).callexport().formatstr("%06X");
state_add(STATE_GENPCBASE, "CURPC", m_pc).callexport().formatstr("%06X");
state_add(STATE_GENPC, "PC", m_pc).formatstr("%06X");
state_add(STATE_GENPCBASE, "CURPC", m_pc).callimport().formatstr("%06X");
m_out_shutdown_func.resolve_safe();
}
@ -282,11 +282,6 @@ void i80286_cpu_device::state_string_export(const device_state_entry &entry, std
{
switch (entry.index())
{
case STATE_GENPC:
case STATE_GENPCBASE:
str = string_format("%08X", m_base[CS] + m_ip);
break;
case STATE_GENFLAGS:
{
uint16_t flags = CompressFlags();

View File

@ -77,7 +77,10 @@ protected:
virtual void execute_run() override;
virtual void device_reset() override;
virtual void device_start() override;
// device_state_interface overrides
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual uint32_t execute_input_lines() const override { return 1; }
virtual void execute_set_input(int inputnum, int state) override;
bool memory_translate(address_spacenum spacenum, int intention, offs_t &address) override;

View File

@ -267,14 +267,14 @@ void i8086_cpu_device::execute_run()
void i8086_cpu_device::device_start()
{
i8086_common_cpu_device::device_start();
state_add( I8086_ES, "ES", m_sregs[ES] ).callimport().callexport().formatstr("%04X");
state_add( I8086_CS, "CS", m_sregs[CS] ).callimport().callexport().formatstr("%04X");
state_add( I8086_SS, "SS", m_sregs[SS] ).callimport().callexport().formatstr("%04X");
state_add( I8086_DS, "DS", m_sregs[DS] ).callimport().callexport().formatstr("%04X");
state_add( I8086_VECTOR, "V", m_int_vector).callimport().callexport().formatstr("%02X");
state_add( I8086_ES, "ES", m_sregs[ES] ).formatstr("%04X");
state_add( I8086_CS, "CS", m_sregs[CS] ).callimport().formatstr("%04X");
state_add( I8086_SS, "SS", m_sregs[SS] ).formatstr("%04X");
state_add( I8086_DS, "DS", m_sregs[DS] ).formatstr("%04X");
state_add( I8086_VECTOR, "V", m_int_vector).formatstr("%02X");
state_add(STATE_GENPC, "GENPC", m_pc).callexport().formatstr("%05X");
state_add(STATE_GENPCBASE, "CURPC", m_pc).callexport().formatstr("%05X");
state_add(STATE_GENPC, "PC", m_pc).formatstr("%05X");
state_add(STATE_GENPCBASE, "CURPC", m_pc).callimport().formatstr("%05X");
}
i8086_common_cpu_device::i8086_common_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
@ -319,15 +319,32 @@ i8086_common_cpu_device::i8086_common_cpu_device(const machine_config &mconfig,
memset(m_sregs, 0x00, sizeof(m_sregs));
}
//-------------------------------------------------
// state_import - import state into the device,
// after it has been set
//-------------------------------------------------
void i8086_common_cpu_device::state_import(const device_state_entry &entry)
{
switch (entry.index())
{
case I8086_IP:
case I8086_CS:
m_pc = (m_sregs[CS] << 4) + m_ip;
break;
case STATE_GENPC:
case STATE_GENPCBASE:
m_sregs[CS] = m_pc >> 4;
m_ip = m_pc & 0xf;
break;
}
}
void i8086_common_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
{
case STATE_GENPC:
case STATE_GENPCBASE:
str = string_format("%08X", (m_sregs[CS] << 4) + m_ip);
break;
case STATE_GENFLAGS:
{
uint16_t flags = CompressFlags();
@ -385,18 +402,17 @@ void i8086_common_cpu_device::device_start()
save_item(NAME(m_halt));
// Register state for debugger
// state_add( I8086_PC, "PC", m_PC ).callimport().callexport().formatstr("%04X");
state_add( I8086_IP, "IP", m_ip ).callimport().callexport().formatstr("%04X");
state_add( I8086_AX, "AX", m_regs.w[AX] ).callimport().callexport().formatstr("%04X");
state_add( I8086_CX, "CX", m_regs.w[CS] ).callimport().callexport().formatstr("%04X");
state_add( I8086_DX, "DX", m_regs.w[DX] ).callimport().callexport().formatstr("%04X");
state_add( I8086_BX, "BX", m_regs.w[BX] ).callimport().callexport().formatstr("%04X");
state_add( I8086_SP, "SP", m_regs.w[SP] ).callimport().callexport().formatstr("%04X");
state_add( I8086_BP, "BP", m_regs.w[BP] ).callimport().callexport().formatstr("%04X");
state_add( I8086_SI, "SI", m_regs.w[SI] ).callimport().callexport().formatstr("%04X");
state_add( I8086_DI, "DI", m_regs.w[DI] ).callimport().callexport().formatstr("%04X");
state_add( I8086_IP, "IP", m_ip ).callimport().formatstr("%04X");
state_add( I8086_AX, "AX", m_regs.w[AX] ).formatstr("%04X");
state_add( I8086_CX, "CX", m_regs.w[CS] ).formatstr("%04X");
state_add( I8086_DX, "DX", m_regs.w[DX] ).formatstr("%04X");
state_add( I8086_BX, "BX", m_regs.w[BX] ).formatstr("%04X");
state_add( I8086_SP, "SP", m_regs.w[SP] ).formatstr("%04X");
state_add( I8086_BP, "BP", m_regs.w[BP] ).formatstr("%04X");
state_add( I8086_SI, "SI", m_regs.w[SI] ).formatstr("%04X");
state_add( I8086_DI, "DI", m_regs.w[DI] ).formatstr("%04X");
state_add(STATE_GENFLAGS, "GENFLAGS", m_TF).callimport().callexport().formatstr("%16s").noshow();
state_add(STATE_GENFLAGS, "GENFLAGS", m_TF).formatstr("%16s").noshow();
m_icountptr = &m_icount;

View File

@ -127,6 +127,7 @@ protected:
virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
// device_state_interface overrides
virtual void state_import(const device_state_entry &entry) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
virtual void interrupt(int int_num, int trap = 1);