Last memory change fixes (nw)

This commit is contained in:
Olivier Galibert 2020-05-25 19:42:13 +02:00
parent 8bc3040e21
commit dbfff24288
10 changed files with 38 additions and 95 deletions

View File

@ -37,16 +37,19 @@ m6502_device::m6502_device(const machine_config &mconfig, device_type type, cons
void m6502_device::device_start()
{
mintf = std::make_unique<mi_default>();
mintf = space(AS_PROGRAM).addr_width() > 14 ? std::make_unique<mi_default>() : std::make_unique<mi_default14>();
init();
}
void m6502_device::init()
{
{
space(AS_PROGRAM).cache(mintf->cprogram);
space(AS_PROGRAM).specific(mintf->program);
space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).cache(mintf->csprogram);
if(space(AS_PROGRAM).addr_width() > 14)
space(AS_PROGRAM).specific(mintf->program);
else
space(AS_PROGRAM).specific(mintf->program14);
sync_w.resolve_safe();
@ -544,6 +547,15 @@ void m6502_device::mi_default::write(uint16_t adr, uint8_t val)
program.write_byte(adr, val);
}
uint8_t m6502_device::mi_default14::read(uint16_t adr)
{
return program14.read_byte(adr);
}
void m6502_device::mi_default14::write(uint16_t adr, uint8_t val)
{
program14.write_byte(adr, val);
}
m6502_mcu_device::m6502_mcu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
m6502_device(mconfig, type, tag, owner, clock)

View File

@ -35,8 +35,9 @@ protected:
public:
memory_access<16, 0, 0, ENDIANNESS_LITTLE>::cache cprogram, csprogram;
memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific program;
memory_access<14, 0, 0, ENDIANNESS_LITTLE>::specific program14;
virtual ~memory_interface() {}
virtual ~memory_interface() = default;
virtual uint8_t read(uint16_t adr) = 0;
virtual uint8_t read_9(uint16_t adr);
virtual uint8_t read_sync(uint16_t adr) = 0;
@ -47,13 +48,20 @@ protected:
class mi_default : public memory_interface {
public:
virtual ~mi_default() {}
virtual ~mi_default() = default;
virtual uint8_t read(uint16_t adr) override;
virtual uint8_t read_sync(uint16_t adr) override;
virtual uint8_t read_arg(uint16_t adr) override;
virtual void write(uint16_t adr, uint8_t val) override;
};
class mi_default14 : public mi_default {
public:
virtual ~mi_default14() = default;
virtual uint8_t read(uint16_t adr) override;
virtual void write(uint16_t adr, uint8_t val) override;
};
enum {
STATE_RESET = 0xff00
};

View File

@ -19,30 +19,3 @@ m6504_device::m6504_device(const machine_config &mconfig, const char *tag, devic
program_config.m_addr_width = 13;
sprogram_config.m_addr_width = 13;
}
void m6504_device::device_start()
{
mintf = std::make_unique<mi_6504>();
init();
}
uint8_t m6504_device::mi_6504::read(uint16_t adr)
{
return program.read_byte(adr & 0x1fff);
}
uint8_t m6504_device::mi_6504::read_sync(uint16_t adr)
{
return csprogram.read_byte(adr & 0x1fff);
}
uint8_t m6504_device::mi_6504::read_arg(uint16_t adr)
{
return cprogram.read_byte(adr & 0x1fff);
}
void m6504_device::mi_6504::write(uint16_t adr, uint8_t val)
{
program.write_byte(adr & 0x1fff, val);
}

View File

@ -16,18 +16,6 @@
class m6504_device : public m6502_device {
public:
m6504_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
class mi_6504 : public memory_interface {
public:
virtual ~mi_6504() {}
virtual uint8_t read(uint16_t adr) override;
virtual uint8_t read_sync(uint16_t adr) override;
virtual uint8_t read_arg(uint16_t adr) override;
virtual void write(uint16_t adr, uint8_t val) override;
};
virtual void device_start() override;
};

View File

@ -19,30 +19,3 @@ m6507_device::m6507_device(const machine_config &mconfig, const char *tag, devic
program_config.m_addr_width = 13;
sprogram_config.m_addr_width = 13;
}
void m6507_device::device_start()
{
mintf = std::make_unique<mi_6507>();
init();
}
uint8_t m6507_device::mi_6507::read(uint16_t adr)
{
return program.read_byte(adr & 0x1fff);
}
uint8_t m6507_device::mi_6507::read_sync(uint16_t adr)
{
return csprogram.read_byte(adr & 0x1fff);
}
uint8_t m6507_device::mi_6507::read_arg(uint16_t adr)
{
return cprogram.read_byte(adr & 0x1fff);
}
void m6507_device::mi_6507::write(uint16_t adr, uint8_t val)
{
program.write_byte(adr & 0x1fff, val);
}

View File

@ -16,18 +16,6 @@
class m6507_device : public m6502_device {
public:
m6507_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
class mi_6507 : public memory_interface {
public:
virtual ~mi_6507() {}
virtual uint8_t read(uint16_t adr) override;
virtual uint8_t read_sync(uint16_t adr) override;
virtual uint8_t read_arg(uint16_t adr) override;
virtual void write(uint16_t adr, uint8_t val) override;
};
virtual void device_start() override;
};

View File

@ -599,25 +599,25 @@ public:
// native read
NativeType read_native(offs_t offset, NativeType mask)
{
return dispatch_read<Level, Width, AddrShift, Endian>(m_addrmask, offset, mask, m_dispatch_read);;
return dispatch_read<Level, Width, AddrShift, Endian>(offs_t(-1), offset & m_addrmask, mask, m_dispatch_read);;
}
// mask-less native read
NativeType read_native(offs_t offset)
{
return dispatch_read<Level, Width, AddrShift, Endian>(m_addrmask, offset, uX(0xffffffffffffffffU), m_dispatch_read);
return dispatch_read<Level, Width, AddrShift, Endian>(offs_t(-1), offset & m_addrmask, uX(0xffffffffffffffffU), m_dispatch_read);
}
// native write
void write_native(offs_t offset, NativeType data, NativeType mask)
{
dispatch_write<Level, Width, AddrShift, Endian>(m_addrmask, offset, data, mask, m_dispatch_write);;
dispatch_write<Level, Width, AddrShift, Endian>(offs_t(-1), offset & m_addrmask, data, mask, m_dispatch_write);;
}
// mask-less native write
void write_native(offs_t offset, NativeType data)
{
dispatch_write<Level, Width, AddrShift, Endian>(m_addrmask, offset, data, uX(0xffffffffffffffffU), m_dispatch_write);;
dispatch_write<Level, Width, AddrShift, Endian>(offs_t(-1), offset & m_addrmask, data, uX(0xffffffffffffffffU), m_dispatch_write);;
}
// virtual access to these functions

View File

@ -1053,11 +1053,11 @@ private:
const handler_entry_write<Width, AddrShift, Endian> *const *m_dispatch_write;
NativeType read_native(offs_t address, NativeType mask = ~NativeType(0)) {
return dispatch_read<Level, Width, AddrShift, Endian>(m_addrmask, address, mask, m_dispatch_read);;
return dispatch_read<Level, Width, AddrShift, Endian>(offs_t(-1), address & m_addrmask, mask, m_dispatch_read);;
}
void write_native(offs_t address, NativeType data, NativeType mask = ~NativeType(0)) {
dispatch_write<Level, Width, AddrShift, Endian>(m_addrmask, address, data, mask, m_dispatch_write);;
dispatch_write<Level, Width, AddrShift, Endian>(offs_t(-1), address & m_addrmask, data, mask, m_dispatch_write);;
}
void set(address_space *space, std::pair<const void *, const void *> rw);
@ -1272,7 +1272,7 @@ public:
template<int Level, int Width, int AddrShift, endianness_t Endian> void specific(emu::detail::memory_access_specific<Level, Width, AddrShift, Endian> &v) {
if(Level != emu::detail::handler_entry_dispatch_level(m_config.addr_width()))
fatalerror("Requesting specific() with wrong level, bad address witdh (the config says %d\n", m_config.addr_width());
fatalerror("Requesting specific() with wrong level, bad address width (the config says %d)\n", m_config.addr_width());
if(AddrShift != m_config.addr_shift())
fatalerror("Requesting specific() with address shift %d while the config says %d\n", AddrShift, m_config.addr_shift());
if(8 << Width != m_config.data_width())

View File

@ -355,7 +355,7 @@ void DebuggerMemView::mousePressEvent(QMouseEvent* event)
const offs_t address = memView->addressAtCursorPosition(clickViewPosition);
const debug_view_memory_source* source = downcast<const debug_view_memory_source*>(memView->source());
address_space* addressSpace = source->space();
offs_t a = address & space->logaddrmask();
offs_t a = address & addressSpace->logaddrmask();
if (!addressSpace->device().memory().translate(addressSpace->spacenum(), TRANSLATE_READ_DEBUG, a))
{
QToolTip::showText(QCursor::pos(), "Bad address", nullptr);
@ -367,19 +367,19 @@ void DebuggerMemView::mousePressEvent(QMouseEvent* event)
switch (addressSpace->data_width())
{
case 8:
memValue = space->read_byte(a);
memValue = addressSpace->read_byte(a);
break;
case 16:
memValue = space->read_word_unaligned(a);
memValue = addressSpace->read_word_unaligned(a);
break;
case 32:
memValue = space->read_dword_unaligned(a);
memValue = addressSpace->read_dword_unaligned(a);
break;
case 64:
memValue = space->read_qword_unaligned(a);
memValue = addressSpace->read_qword_unaligned(a);
break;
}

View File

@ -12,6 +12,7 @@
#include "deviceswindow.h"
#include "debug/debugcpu.h"
#include "debug/debugcon.h"
bool WindowQt::s_refreshAll = false;
bool WindowQt::s_hideAll = false;