mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
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:
parent
25789eda48
commit
b90375bf65
@ -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));
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user