mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
i86: Add decrypted opcodes space support [O. Galibert]
This commit is contained in:
parent
5766bced1b
commit
2b9d6a3554
@ -154,16 +154,28 @@ i80186_cpu_device::i80186_cpu_device(const machine_config &mconfig, device_type
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
const address_space_config *i80186_cpu_device::memory_space_config(address_spacenum spacenum) const
|
||||
{
|
||||
switch(spacenum)
|
||||
{
|
||||
case AS_PROGRAM: return &m_program_config;
|
||||
case AS_IO: return &m_io_config;
|
||||
case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_opcodes_config : nullptr;
|
||||
default: return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t i80186_cpu_device::fetch_op()
|
||||
{
|
||||
uint8_t data = m_direct->read_byte(pc(), m_fetch_xor);
|
||||
uint8_t data = m_direct_opcodes->read_byte(pc(), m_fetch_xor);
|
||||
m_ip++;
|
||||
return data;
|
||||
}
|
||||
|
||||
uint8_t i80186_cpu_device::fetch()
|
||||
{
|
||||
uint8_t data = m_direct->read_byte(pc(), m_fetch_xor);
|
||||
uint8_t data = m_direct_opcodes->read_byte(pc(), m_fetch_xor);
|
||||
m_ip++;
|
||||
return data;
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ public:
|
||||
DECLARE_WRITE_LINE_MEMBER(int3_w) { external_int(3, state); }
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
|
||||
|
||||
protected:
|
||||
// device_execute_interface overrides
|
||||
@ -120,6 +120,7 @@ private:
|
||||
uint16_t m_reloc;
|
||||
|
||||
address_space_config m_program_config;
|
||||
address_space_config m_opcodes_config;
|
||||
address_space_config m_io_config;
|
||||
|
||||
devcb_read8 m_read_slave_ack_func;
|
||||
|
@ -281,6 +281,17 @@ void i80286_cpu_device::device_start()
|
||||
m_out_shutdown_func.resolve_safe();
|
||||
}
|
||||
|
||||
const address_space_config *i80286_cpu_device::memory_space_config(address_spacenum spacenum) const
|
||||
{
|
||||
switch(spacenum)
|
||||
{
|
||||
case AS_PROGRAM: return &m_program_config;
|
||||
case AS_IO: return &m_io_config;
|
||||
case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_opcodes_config : nullptr;
|
||||
default: return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// state_import - import state into the device,
|
||||
@ -1010,7 +1021,7 @@ uint8_t i80286_cpu_device::fetch_op()
|
||||
if(m_ip > m_limit[CS])
|
||||
throw TRAP(FAULT_GP, 0);
|
||||
|
||||
data = m_direct->read_byte( pc() & m_amask, m_fetch_xor );
|
||||
data = m_direct_opcodes->read_byte( pc() & m_amask, m_fetch_xor );
|
||||
m_ip++;
|
||||
return data;
|
||||
}
|
||||
@ -1021,7 +1032,7 @@ uint8_t i80286_cpu_device::fetch()
|
||||
if(m_ip > m_limit[CS])
|
||||
throw TRAP(FAULT_GP, 0);
|
||||
|
||||
data = m_direct->read_byte( pc() & m_amask, m_fetch_xor );
|
||||
data = m_direct_opcodes->read_byte( pc() & m_amask, m_fetch_xor );
|
||||
m_ip++;
|
||||
return data;
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ public:
|
||||
i80286_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
|
||||
|
||||
typedef delegate<uint32_t (bool)> a20_cb;
|
||||
static void static_set_a20_callback(device_t &device, a20_cb object) { downcast<i80286_cpu_device &>(device).m_a20_callback = object; }
|
||||
@ -134,6 +134,7 @@ private:
|
||||
uint32_t TRAP(uint16_t fault, uint16_t code) { return ((((uint32_t)fault&0xffff)<<16)|(code&0xffff)); }
|
||||
|
||||
address_space_config m_program_config;
|
||||
address_space_config m_opcodes_config;
|
||||
address_space_config m_io_config;
|
||||
static const uint8_t m_i80286_timing[200];
|
||||
|
||||
|
@ -100,6 +100,7 @@ i8088_cpu_device::i8088_cpu_device(const machine_config &mconfig, const char *ta
|
||||
i8086_cpu_device::i8086_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: i8086_common_cpu_device(mconfig, I8086, "I8086", tag, owner, clock, "i8086", __FILE__)
|
||||
, m_program_config("program", ENDIANNESS_LITTLE, 16, 20, 0)
|
||||
, m_opcodes_config("opcodes", ENDIANNESS_LITTLE, 16, 20, 0)
|
||||
, m_io_config("io", ENDIANNESS_LITTLE, 16, 16, 0)
|
||||
{
|
||||
memcpy(m_timing, m_i8086_timing, sizeof(m_i8086_timing));
|
||||
@ -109,14 +110,26 @@ i8086_cpu_device::i8086_cpu_device(const machine_config &mconfig, const char *ta
|
||||
i8086_cpu_device::i8086_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, int data_bus_size)
|
||||
: i8086_common_cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
|
||||
, m_program_config("program", ENDIANNESS_LITTLE, data_bus_size, 20, 0)
|
||||
, m_opcodes_config("opcodes", ENDIANNESS_LITTLE, data_bus_size, 20, 0)
|
||||
, m_io_config("io", ENDIANNESS_LITTLE, data_bus_size, 16, 0)
|
||||
{
|
||||
}
|
||||
|
||||
const address_space_config *i8086_cpu_device::memory_space_config(address_spacenum spacenum) const
|
||||
{
|
||||
switch(spacenum)
|
||||
{
|
||||
case AS_PROGRAM: return &m_program_config;
|
||||
case AS_IO: return &m_io_config;
|
||||
case AS_DECRYPTED_OPCODES: return has_configured_map(AS_DECRYPTED_OPCODES) ? &m_opcodes_config : nullptr;
|
||||
default: return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t i8086_cpu_device::fetch_op()
|
||||
{
|
||||
uint8_t data;
|
||||
data = m_direct->read_byte(pc(), m_fetch_xor);
|
||||
data = m_direct_opcodes->read_byte(pc(), m_fetch_xor);
|
||||
m_ip++;
|
||||
return data;
|
||||
}
|
||||
@ -124,7 +137,7 @@ uint8_t i8086_cpu_device::fetch_op()
|
||||
uint8_t i8086_cpu_device::fetch()
|
||||
{
|
||||
uint8_t data;
|
||||
data = m_direct->read_byte(pc(), m_fetch_xor);
|
||||
data = m_direct_opcodes->read_byte(pc(), m_fetch_xor);
|
||||
m_ip++;
|
||||
return data;
|
||||
}
|
||||
@ -382,7 +395,9 @@ void i8086_common_cpu_device::state_string_export(const device_state_entry &entr
|
||||
void i8086_common_cpu_device::device_start()
|
||||
{
|
||||
m_program = &space(AS_PROGRAM);
|
||||
m_opcodes = has_space(AS_DECRYPTED_OPCODES) ? &space(AS_DECRYPTED_OPCODES) : m_program;
|
||||
m_direct = &m_program->direct();
|
||||
m_direct_opcodes = &m_opcodes->direct();
|
||||
m_io = &space(AS_IO);
|
||||
|
||||
save_item(NAME(m_regs.w));
|
||||
|
@ -297,8 +297,8 @@ protected:
|
||||
uint8_t m_fire_trap;
|
||||
uint8_t m_test_state;
|
||||
|
||||
address_space *m_program;
|
||||
direct_read_data *m_direct;
|
||||
address_space *m_program, *m_opcodes;
|
||||
direct_read_data *m_direct, *m_direct_opcodes;
|
||||
address_space *m_io;
|
||||
offs_t m_fetch_xor;
|
||||
int m_icount;
|
||||
@ -345,7 +345,7 @@ public:
|
||||
i8086_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, int data_bus_size);
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
|
||||
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
|
||||
|
||||
protected:
|
||||
virtual void execute_run() override;
|
||||
@ -356,6 +356,7 @@ protected:
|
||||
uint32_t pc() { return m_pc = (m_sregs[CS] << 4) + m_ip; }
|
||||
|
||||
address_space_config m_program_config;
|
||||
address_space_config m_opcodes_config;
|
||||
address_space_config m_io_config;
|
||||
static const uint8_t m_i8086_timing[200];
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user