i86: Add decrypted opcodes space support [O. Galibert]

This commit is contained in:
Olivier Galibert 2017-04-01 22:09:44 +02:00
parent 5766bced1b
commit 2b9d6a3554
6 changed files with 52 additions and 11 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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];

View File

@ -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));

View File

@ -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];
};