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 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++; m_ip++;
return data; return data;
} }
uint8_t i80186_cpu_device::fetch() 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++; m_ip++;
return data; return data;
} }

View File

@ -31,7 +31,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(int3_w) { external_int(3, state); } DECLARE_WRITE_LINE_MEMBER(int3_w) { external_int(3, state); }
// device_memory_interface overrides // 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: protected:
// device_execute_interface overrides // device_execute_interface overrides
@ -120,6 +120,7 @@ private:
uint16_t m_reloc; uint16_t m_reloc;
address_space_config m_program_config; address_space_config m_program_config;
address_space_config m_opcodes_config;
address_space_config m_io_config; address_space_config m_io_config;
devcb_read8 m_read_slave_ack_func; 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(); 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, // state_import - import state into the device,
@ -1010,7 +1021,7 @@ uint8_t i80286_cpu_device::fetch_op()
if(m_ip > m_limit[CS]) if(m_ip > m_limit[CS])
throw TRAP(FAULT_GP, 0); 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++; m_ip++;
return data; return data;
} }
@ -1021,7 +1032,7 @@ uint8_t i80286_cpu_device::fetch()
if(m_ip > m_limit[CS]) if(m_ip > m_limit[CS])
throw TRAP(FAULT_GP, 0); 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++; m_ip++;
return data; 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); i80286_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device_memory_interface overrides // 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; 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; } 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)); } 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_program_config;
address_space_config m_opcodes_config;
address_space_config m_io_config; address_space_config m_io_config;
static const uint8_t m_i80286_timing[200]; 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_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__) : i8086_common_cpu_device(mconfig, I8086, "I8086", tag, owner, clock, "i8086", __FILE__)
, m_program_config("program", ENDIANNESS_LITTLE, 16, 20, 0) , 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) , m_io_config("io", ENDIANNESS_LITTLE, 16, 16, 0)
{ {
memcpy(m_timing, m_i8086_timing, sizeof(m_i8086_timing)); 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_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) : i8086_common_cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_LITTLE, data_bus_size, 20, 0) , 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) , 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 i8086_cpu_device::fetch_op()
{ {
uint8_t data; uint8_t data;
data = m_direct->read_byte(pc(), m_fetch_xor); data = m_direct_opcodes->read_byte(pc(), m_fetch_xor);
m_ip++; m_ip++;
return data; return data;
} }
@ -124,7 +137,7 @@ uint8_t i8086_cpu_device::fetch_op()
uint8_t i8086_cpu_device::fetch() uint8_t i8086_cpu_device::fetch()
{ {
uint8_t data; uint8_t data;
data = m_direct->read_byte(pc(), m_fetch_xor); data = m_direct_opcodes->read_byte(pc(), m_fetch_xor);
m_ip++; m_ip++;
return data; 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() void i8086_common_cpu_device::device_start()
{ {
m_program = &space(AS_PROGRAM); 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 = &m_program->direct();
m_direct_opcodes = &m_opcodes->direct();
m_io = &space(AS_IO); m_io = &space(AS_IO);
save_item(NAME(m_regs.w)); save_item(NAME(m_regs.w));

View File

@ -297,8 +297,8 @@ protected:
uint8_t m_fire_trap; uint8_t m_fire_trap;
uint8_t m_test_state; uint8_t m_test_state;
address_space *m_program; address_space *m_program, *m_opcodes;
direct_read_data *m_direct; direct_read_data *m_direct, *m_direct_opcodes;
address_space *m_io; address_space *m_io;
offs_t m_fetch_xor; offs_t m_fetch_xor;
int m_icount; 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); 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 // 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: protected:
virtual void execute_run() override; virtual void execute_run() override;
@ -356,6 +356,7 @@ protected:
uint32_t pc() { return m_pc = (m_sregs[CS] << 4) + m_ip; } uint32_t pc() { return m_pc = (m_sregs[CS] << 4) + m_ip; }
address_space_config m_program_config; address_space_config m_program_config;
address_space_config m_opcodes_config;
address_space_config m_io_config; address_space_config m_io_config;
static const uint8_t m_i8086_timing[200]; static const uint8_t m_i8086_timing[200];
}; };