mem16/24bit accesses are word-aligned (not counting opcode args of course)

This commit is contained in:
Michaël Banaan Ananas 2014-02-05 23:59:48 +00:00
parent 239c24c223
commit ebba16890d
2 changed files with 81 additions and 201 deletions

View File

@ -13,9 +13,6 @@
#define log_write(...)
#define log_event(...)
#define MEM_BYTE (0)
#define MEM_WORD (1)
enum mn10200_flag
{
FLAG_ZF = 0x0001, // zero flag
@ -38,129 +35,20 @@ enum mn10200_flag
const device_type MN10200 = &device_creator<mn10200_device>;
static ADDRESS_MAP_START( mn1020012_internal_map, AS_PROGRAM, 16, mn10200_device )
AM_RANGE(0x00fc00, 0x00ffff) AM_READWRITE8(io_control_r, io_control_w, 0xffff)
ADDRESS_MAP_END
mn10200_device::mn10200_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: cpu_device(mconfig, MN10200, "MN10200", tag, owner, clock, "mn10200", __FILE__)
, m_program_config("program", ENDIANNESS_LITTLE, 16, 24, 0)
, m_io_config("data", ENDIANNESS_LITTLE, 8, 8, 0)
: cpu_device(mconfig, MN10200, "MN10200", tag, owner, clock, "mn10200", __FILE__),
m_program_config("program", ENDIANNESS_LITTLE, 16, 24, 0, ADDRESS_MAP_NAME(mn1020012_internal_map)),
m_io_config("data", ENDIANNESS_LITTLE, 8, 8, 0)
{
}
UINT8 mn10200_device::read_arg8(UINT32 address)
{
address &= 0xffffff;
if (address >= 0xfc00 && address < 0x10000)
{
return mn10200_r(address-0xfc00, MEM_BYTE);
}
return m_program->read_byte(address);
}
UINT16 mn10200_device::read_arg16(UINT32 address)
{
address &= 0xffffff;
if (address >= 0xfc00 && address < 0x10000)
{
return mn10200_r(address-0xfc00, MEM_WORD);
}
if (address & 1)
{
return m_program->read_byte(address) | (m_program->read_byte(address+1)<<8);
}
return m_program->read_word(address);
}
void mn10200_device::write_mem8(UINT32 address, UINT8 data)
{
address &= 0xffffff;
if (address >= 0xfc00 && address < 0x10000)
{
mn10200_w(address-0xfc00, data, MEM_BYTE);
return;
}
m_program->write_byte(address, data);
}
void mn10200_device::write_mem16(UINT32 address, UINT16 data)
{
address &= 0xffffff;
if (address >= 0xfc00 && address < 0x10000)
{
mn10200_w(address-0xfc00, data, MEM_WORD);
return;
}
if (address & 1)
{
m_program->write_byte(address, data&0xff);
m_program->write_byte(address+1, (data>>8)&0xff);
return;
}
m_program->write_word(address, data);
}
UINT32 mn10200_device::read_arg24(UINT32 address)
{
address &= 0xffffff;
return read_arg16(address)|(read_arg8(address+2)<<16);
}
void mn10200_device::write_mem24(UINT32 address, UINT32 data)
{
address &= 0xffffff;
/* if(adr == 0x4075aa || adr == 0x40689a || adr == 0x4075a2) {
log_write("TRACE", adr, val, MEM_LONG);
}*/
write_mem8(address, data);
write_mem8(address+1, data>>8);
write_mem8(address+2, data>>16);
}
UINT8 mn10200_device::read_mem8(UINT32 address)
{
address &= 0xffffff;
if (address >= 0xfc00 && address < 0x10000)
{
return mn10200_r(address-0xfc00, MEM_BYTE);
}
return m_program->read_byte(address);
}
UINT16 mn10200_device::read_mem16(UINT32 address)
{
address &= 0xffffff;
if (address >= 0xfc00 && address < 0x10000)
{
return mn10200_r(address-0xfc00, MEM_WORD);
}
if (address & 1)
{
return m_program->read_byte(address) | (m_program->read_byte(address+1)<<8);
}
return m_program->read_word(address);
}
UINT32 mn10200_device::read_mem24(UINT32 address)
{
address &= 0xffffff;
return read_mem16(address)|(read_mem8(address+2)<<16);
}
void mn10200_device::mn102_change_pc(UINT32 pc)
{
m_pc = pc & 0xffffff;
}
void mn10200_device::mn102_take_irq(int level, int group)
void mn10200_device::take_irq(int level, int group)
{
if(!(m_psw & FLAG_IE))
{
@ -171,9 +59,9 @@ void mn10200_device::mn102_take_irq(int level, int group)
// if (group != 8) printf("MN10200: Taking irq L %d G %d pc=%x, a3=%x\n", level, group, m_pc, m_a[3]);
m_a[3] -= 6;
write_mem24(m_a[3]+2, m_pc);
write_mem24(m_a[3] + 2, m_pc);
write_mem16(m_a[3], m_psw);
mn102_change_pc(0x80008);
change_pc(0x80008);
m_psw = (m_psw & 0xf0ff) | (level << 8);
m_iagr = group << 1;
}
@ -255,7 +143,7 @@ void mn10200_device::timer_tick_simple(int tmr)
{
// printf("Timer %d IRQ! (Group %d in_grp %d ICRH %x ICRL %x\n", tmr, group, irq_in_grp, m_icrh[group], m_icrl[group]);
// try to take it now
mn102_take_irq(level, group + 1);
take_irq(level, group + 1);
}
}
}
@ -475,7 +363,7 @@ void mn10200_device::device_reset()
memset(m_d, 0, sizeof(m_d));
memset(m_a, 0, sizeof(m_a));
mn102_change_pc(0x80000);
change_pc(0x80000);
m_psw = 0;
m_nmicr = 0;
memset(m_icrl, 0, sizeof(m_icrl));
@ -564,7 +452,7 @@ void mn10200_device::test_nz16(UINT16 v)
void mn10200_device::do_jsr(UINT32 to, UINT32 ret)
{
mn102_change_pc(to);
change_pc(to);
m_a[3] -= 4;
write_mem24(m_a[3], ret);
}
@ -574,7 +462,7 @@ void mn10200_device::do_branch(int offset, bool state)
if (state)
{
m_cycles -= offset + 1;
mn102_change_pc(m_pc + offset + 1 + (INT8)read_arg8(m_pc + offset));
change_pc(m_pc + offset + 1 + (INT8)read_arg8(m_pc + offset));
}
else
{
@ -604,7 +492,7 @@ void mn10200_device::execute_set_input(int irqnum, int state)
if (m_icrl[7] & (1 << irqnum))
{
// try to take it now
mn102_take_irq(level, 8);
take_irq(level, 8);
}
}
}
@ -858,7 +746,7 @@ void mn10200_device::execute_run()
case 0xeb:
m_cycles -= 6;
m_psw = read_mem16(m_a[3]);
mn102_change_pc(read_mem24(m_a[3] + 2));
change_pc(read_mem24(m_a[3] + 2));
m_a[3] += 6;
break;
@ -877,7 +765,7 @@ void mn10200_device::execute_run()
// jmp (an)
case 0x00: case 0x04: case 0x08: case 0x0c:
m_cycles -= 3;
mn102_change_pc(m_a[opcode >> 2 & 3]);
change_pc(m_a[opcode >> 2 & 3]);
break;
// jsr (an)
@ -1480,7 +1368,7 @@ void mn10200_device::execute_run()
// jmp imm24
case 0xe0:
m_cycles -= 4;
mn102_change_pc(m_pc + 5 + read_arg24(m_pc + 2));
change_pc(m_pc + 5 + read_arg24(m_pc + 2));
break;
// jsr label24
@ -1757,7 +1645,7 @@ void mn10200_device::execute_run()
// jmp label16
case 0xfc:
m_cycles -= 2;
mn102_change_pc(m_pc + 3 + (INT16)read_arg16(m_pc + 1));
change_pc(m_pc + 3 + (INT16)read_arg16(m_pc + 1));
break;
// jsr label16
@ -1769,7 +1657,7 @@ void mn10200_device::execute_run()
// rts
case 0xfe:
m_cycles -= 5;
mn102_change_pc(read_mem24(m_a[3]));
change_pc(read_mem24(m_a[3]));
m_a[3] += 4;
break;
@ -1793,15 +1681,9 @@ static const char *const inames[10][4] = {
{ "key", "a/d", "?", "?" }
};
void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
WRITE8_MEMBER(mn10200_device::io_control_w)
{
if(type == MEM_WORD) {
mn10200_w(adr, data & 0xff, MEM_BYTE);
mn10200_w(adr+1, (data>>8) & 0xff, MEM_BYTE);
return;
}
switch(adr) {
switch(offset) {
case 0x000:
if(data & 12) {
log_event("CPU", "Stop request");
@ -1832,13 +1714,13 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
case 0x04c: case 0x04e: case 0x050: case 0x052: case 0x054:
{
// note: writes here ack interrupts
m_icrl[((adr & 0x3f)>>1)-1] = data;
m_icrl[((offset & 0x3f)>>1)-1] = data;
}
break;
case 0x043: case 0x045: case 0x047: case 0x049: case 0x04b:
case 0x04d: case 0x04f: case 0x051: case 0x053: case 0x055: {
int irq = ((adr & 0x3f)>>1)-1;
int irq = ((offset & 0x3f)>>1)-1;
#if 0
if((m_icrh[irq] != data) && (data & 15)) {
printf("MN10200: irq %d enabled, level=%x, enable= %s %s %s %s\n", irq+1, (data >> 4) & 7,
@ -1873,7 +1755,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
break;
case 0x180: case 0x190: {
int ser = (adr-0x180) >> 4;
int ser = (offset-0x180) >> 4;
// const char *parity[8] = { "no", "1", "2", "3", "l", "h", "even", "odd" };
// const char *source[4] = { "sbt0", "timer 8", "2", "timer 9" };
m_serial[ser].ctrll = data;
@ -1886,7 +1768,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
}
case 0x181: case 0x191: {
int ser = (adr-0x180) >> 4;
int ser = (offset-0x180) >> 4;
m_serial[ser].ctrlh = data;
// log_event("MN102", "Serial %d transmit=%s, receive=%s, break=%s, proto=%s, order=%s",
// ser,
@ -1897,7 +1779,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
}
case 0x182: case 0x192: {
int ser = (adr-0x180) >> 4;
int ser = (offset-0x180) >> 4;
m_serial[ser].buf = data;
log_event("MN102", "Serial %d buffer=%02x", ser, data);
break;
@ -1915,9 +1797,9 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
case 0x210: case 0x211: case 0x212: case 0x213: case 0x214:
case 0x215: case 0x216: case 0x217: case 0x218: case 0x219:
m_simple_timer[adr-0x210].base = data + 1;
// printf("MN10200: Timer %d value set %02x\n", adr-0x210, data);
refresh_timer(adr-0x210);
m_simple_timer[offset-0x210].base = data + 1;
// printf("MN10200: Timer %d value set %02x\n", offset-0x210, data);
refresh_timer(offset-0x210);
break;
case 0x21a:
@ -1934,15 +1816,15 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
case 0x225: case 0x226: case 0x227: case 0x228: case 0x229:
{
// const char *source[4] = { "TMxIO", "cascade", "prescale 0", "prescale 1" };
m_simple_timer[adr-0x220].mode = data;
// printf("MN10200: Timer %d %s b6=%d, source=%s\n", adr-0x220, data & 0x80 ? "on" : "off", (data & 0x40) != 0, source[data & 3]);
m_simple_timer[offset-0x220].mode = data;
// printf("MN10200: Timer %d %s b6=%d, source=%s\n", offset-0x220, data & 0x80 ? "on" : "off", (data & 0x40) != 0, source[data & 3]);
if (data & 0x40)
{
// printf("MN10200: loading timer %d\n", adr-0x220);
m_simple_timer[adr-0x220].cur = m_simple_timer[adr-0x220].base;
// printf("MN10200: loading timer %d\n", offset-0x220);
m_simple_timer[offset-0x220].cur = m_simple_timer[offset-0x220].base;
}
refresh_timer(adr-0x220);
refresh_timer(offset-0x220);
break;
}
@ -1963,7 +1845,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
// const char *modes[4] = { "single", "double", "ioa", "iob" };
// const char *sources[8] = { "pres.0", "pres.1", "iob", "sysclk", "*4", "*1", "6", "7" };
// printf("MN10200: Timer %d comp=%s on_1=%s on_match=%s phase=%s source=%s\n",
// 10 + ((adr-0x230) >> 4),
// 10 + ((offset-0x230) >> 4),
// modes[data >> 6], data & 0x20 ? "cleared" : "not cleared", data & 0x10 ? "cleared" : "not cleared",
// data & 8 ? "tff" : "rsff", sources[data & 7]);
break;
@ -1973,7 +1855,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
{
// const char *modes[4] = { "up", "down", "up on ioa", "up on iob" };
// printf("MN10200: Timer %d %s ff=%s op=%s ext_trig=%s %s\n",
// 10 + ((adr-0x230) >> 4),
// 10 + ((offset-0x230) >> 4),
// data & 0x80 ? "enable" : "disable", data & 0x40 ? "operate" : "clear",
// modes[(data >> 4) & 3], data & 2 ? "on" : "off", data & 1 ? "one-shot" : "repeat");
@ -1981,29 +1863,29 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
}
case 0x234: case 0x244: case 0x254:
log_event("MN102", "Timer %d ca=--%02x", 10 + ((adr-0x230) >> 4), data);
log_event("MN102", "Timer %d ca=--%02x", 10 + ((offset-0x230) >> 4), data);
break;
case 0x235: case 0x245: case 0x255:
log_event("MN102", "Timer %d ca=%02x--", 10 + ((adr-0x230) >> 4), data);
log_event("MN102", "Timer %d ca=%02x--", 10 + ((offset-0x230) >> 4), data);
break;
case 0x236: case 0x246: case 0x256:
log_event("MN102", "Timer %d ca read trigger", 10 + ((adr-0x230) >> 4));
log_event("MN102", "Timer %d ca read trigger", 10 + ((offset-0x230) >> 4));
break;
case 0x237: case 0x247: case 0x257: break;
case 0x238: case 0x248: case 0x258:
log_event("MN102", "Timer %d cb=--%02x", 10 + ((adr-0x230) >> 4), data);
log_event("MN102", "Timer %d cb=--%02x", 10 + ((offset-0x230) >> 4), data);
break;
case 0x239: case 0x249: case 0x259:
log_event("MN102", "Timer %d cb=%02x--", 10 + ((adr-0x230) >> 4), data);
log_event("MN102", "Timer %d cb=%02x--", 10 + ((offset-0x230) >> 4), data);
break;
case 0x23a: case 0x24a: case 0x25a:
log_event("MN102", "Timer %d cb read trigger", 10 + ((adr-0x230) >> 4));
log_event("MN102", "Timer %d cb read trigger", 10 + ((offset-0x230) >> 4));
break;
case 0x23b: case 0x24b: case 0x25b: break;
@ -2011,7 +1893,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
case 0x260: case 0x261: {
// const char *mode[4] = { "sysbuf", "4-phase", "4-phase 1/2", "3" };
// log_event("MN102", "Sync Output %c timing=%s out=%s dir=%s mode=%s",
// adr == 0x261 ? 'B' : 'A',
// offset == 0x261 ? 'B' : 'A',
// data & 0x10 ? "12A" : "1", data & 8 ? "sync a" :"P13-10",
// data & 4 ? "ccw" : "cw", mode[data & 3]);
break;
@ -2026,21 +1908,21 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
break;
case 0x280: case 0x290: case 0x2a0: case 0x2b0: case 0x2c0: case 0x2d0: case 0x2e0: case 0x2f0: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].adr = (m_dma[dma].adr & 0x00ffff00) | data;
logerror("MN10200: DMA %d adr=%06x\n", dma, m_dma[dma].adr);
break;
}
case 0x281: case 0x291: case 0x2a1: case 0x2b1: case 0x2c1: case 0x2d1: case 0x2e1: case 0x2f1: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].adr = (m_dma[dma].adr & 0x00ff00ff) | (data << 8);
logerror("MN10200: DMA %d adr=%06x\n", dma, m_dma[dma].adr);
break;
}
case 0x282: case 0x292: case 0x2a2: case 0x2b2: case 0x2c2: case 0x2d2: case 0x2e2: case 0x2f2: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].adr = (m_dma[dma].adr & 0x0000ffff) | (data << 16);
logerror("MN10200: DMA %d adr=%06x\n", dma, m_dma[dma].adr);
break;
@ -2050,21 +1932,21 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
break;
case 0x284: case 0x294: case 0x2a4: case 0x2b4: case 0x2c4: case 0x2d4: case 0x2e4: case 0x2f4: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].count = (m_dma[dma].count & 0x00ffff00) | data;
logerror("MN10200: DMA %d count=%06x\n", dma, m_dma[dma].count);
break;
}
case 0x285: case 0x295: case 0x2a5: case 0x2b5: case 0x2c5: case 0x2d5: case 0x2e5: case 0x2f5: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].count = (m_dma[dma].count & 0x00ff00ff) | (data << 8);
logerror("MN10200: DMA %d count=%06x\n", dma, m_dma[dma].count);
break;
}
case 0x286: case 0x296: case 0x2a6: case 0x2b6: case 0x2c6: case 0x2d6: case 0x2e6: case 0x2f6: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].count = (m_dma[dma].count & 0x0000ffff) | (data << 16);
logerror("MN10200: DMA %d count=%06x\n", dma, m_dma[dma].count);
break;
@ -2074,14 +1956,14 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
break;
case 0x288: case 0x298: case 0x2a8: case 0x2b8: case 0x2c8: case 0x2d8: case 0x2e8: case 0x2f8: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].iadr = (m_dma[dma].iadr & 0xff00) | data;
logerror("MN10200: DMA %d iadr=%03x\n", dma, m_dma[dma].iadr);
break;
}
case 0x289: case 0x299: case 0x2a9: case 0x2b9: case 0x2c9: case 0x2d9: case 0x2e9: case 0x2f9: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].iadr = (m_dma[dma].iadr & 0x00ff) | ((data & 3) << 8);
logerror("MN10200: DMA %d iadr=%03x\n", dma, m_dma[dma].iadr);
break;
@ -2099,7 +1981,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
"X0e", "X1e", "X0l", "X1l"
};
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].ctrll = data;
logerror("MN10200: DMA %d control ack=%s, trans=%s, start=%s\n",
dma,
@ -2111,7 +1993,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
case 0x28b: case 0x29b: case 0x2ab: case 0x2bb: case 0x2cb: case 0x2db: case 0x2eb: case 0x2fb: {
static const char *const tradr[4] = { "inc", "dec", "fixed", "reserved" };
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].ctrlh = data;
logerror("MN10200: DMA %d control %s irq=%s %s %s dir=%s %s %s\n",
dma,
@ -2126,7 +2008,7 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
}
case 0x28c: case 0x29c: case 0x2ac: case 0x2bc: case 0x2cc: case 0x2dc: case 0x2ec: case 0x2fc: {
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
m_dma[dma].irq = data & 7;
logerror("MN10200: DMA %d irq=%d\n", dma, data & 7);
break;
@ -2214,19 +2096,14 @@ void mn10200_device::mn10200_w(UINT32 adr, UINT32 data, int type)
default:
log_event("MN102", "internal_w %04x, %02x (%03x)", adr+0xfc00, data, adr);
log_event("MN102", "internal_w %04x, %02x (%03x)", offset+0xfc00, data, adr);
break;
}
}
UINT32 mn10200_device::mn10200_r(UINT32 adr, int type)
READ8_MEMBER(mn10200_device::io_control_r)
{
if(type == MEM_WORD)
{
return mn10200_r(adr, MEM_BYTE) | (mn10200_r(adr+1, MEM_BYTE) << 8);
}
switch(adr) {
switch(offset) {
case 0x00e:
return m_iagr;
@ -2235,11 +2112,11 @@ UINT32 mn10200_device::mn10200_r(UINT32 adr, int type)
case 0x042: case 0x044: case 0x046: case 0x048: case 0x04a:
case 0x04c: case 0x04e: case 0x050: case 0x052: case 0x054:
return m_icrl[((adr & 0x3f)>>1)-1];
return m_icrl[((offset & 0x3f)>>1)-1];
case 0x043: case 0x045: case 0x047: case 0x049: case 0x04b:
case 0x04d: case 0x04f: case 0x051: case 0x053: case 0x055:
return m_icrh[((adr & 0x3f)>>1)-1];
return m_icrh[((offset & 0x3f)>>1)-1];
case 0x056:
return 0;
@ -2249,10 +2126,10 @@ UINT32 mn10200_device::mn10200_r(UINT32 adr, int type)
return 0x20;
case 0x180: case 0x190:
return m_serial[(adr-0x180) >> 4].ctrll;
return m_serial[(offset-0x180) >> 4].ctrll;
case 0x181: case 0x191:
return m_serial[(adr-0x180) >> 4].ctrlh;
return m_serial[(offset-0x180) >> 4].ctrlh;
case 0x182: {
static int zz;
@ -2264,15 +2141,15 @@ UINT32 mn10200_device::mn10200_r(UINT32 adr, int type)
case 0x200: case 0x201: case 0x202: case 0x203: case 0x204:
case 0x205: case 0x206: case 0x207: case 0x208: case 0x209:
// printf("MN10200: timer %d value read = %d\n", adr-0x200, m_simple_timer[adr-0x200].cur);
return m_simple_timer[adr-0x200].cur;
// printf("MN10200: timer %d value read = %d\n", offset-0x200, m_simple_timer[offset-0x200].cur);
return m_simple_timer[offset-0x200].cur;
case 0x264: // port 1 data
return m_io->read_byte(MN10200_PORT1);
case 0x28c: case 0x29c: case 0x2ac: case 0x2bc: case 0x2cc: case 0x2dc: case 0x2ec: case 0x2fc:
{
int dma = (adr-0x280) >> 4;
int dma = (offset-0x280) >> 4;
return m_dma[dma].irq;
}
@ -2286,7 +2163,7 @@ UINT32 mn10200_device::mn10200_r(UINT32 adr, int type)
return m_io->read_byte(MN10200_PORT3);
default:
log_event("MN102", "internal_r %04x (%03x)", adr+0xfc00, adr);
log_event("MN102", "internal_r %04x (%03x)", offset+0xfc00, adr);
}
return 0;

View File

@ -60,6 +60,9 @@ public:
// construction/destruction
mn10200_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
DECLARE_READ8_MEMBER(io_control_r);
DECLARE_WRITE8_MEMBER(io_control_w);
protected:
// device-level overrides
virtual void device_start();
@ -137,20 +140,22 @@ private:
address_space *m_program;
address_space *m_io;
UINT8 read_arg8(UINT32 address);
UINT16 read_arg16(UINT32 address);
UINT32 read_arg24(UINT32 address);
// internal read/write
inline UINT8 read_arg8(UINT32 address) { return m_program->read_byte(address); }
inline UINT16 read_arg16(UINT32 address) { return m_program->read_byte(address) | m_program->read_byte(address + 1) << 8; }
inline UINT32 read_arg24(UINT32 address) { return m_program->read_byte(address) | m_program->read_byte(address + 1) << 8 | m_program->read_byte(address + 2) << 16; }
UINT8 read_mem8(UINT32 address);
UINT16 read_mem16(UINT32 address);
UINT32 read_mem24(UINT32 address);
inline UINT8 read_mem8(UINT32 address) { return m_program->read_byte(address); }
inline UINT16 read_mem16(UINT32 address) { return m_program->read_word(address & ~1); }
inline UINT32 read_mem24(UINT32 address) { return m_program->read_word(address & ~1) | m_program->read_byte((address & ~1) + 2) << 16; }
void write_mem8(UINT32 address, UINT8 data);
void write_mem16(UINT32 address, UINT16 data);
void write_mem24(UINT32 address, UINT32 data);
inline void write_mem8(UINT32 address, UINT8 data) { m_program->write_byte(address, data); }
inline void write_mem16(UINT32 address, UINT16 data) { m_program->write_word(address & ~1, data); }
inline void write_mem24(UINT32 address, UINT32 data) { m_program->write_word(address & ~1, data); m_program->write_byte((address & ~1) + 2, data >> 16); }
void mn102_change_pc(UINT32 pc);
void mn102_take_irq(int level, int group);
inline void change_pc(UINT32 pc) { m_pc = pc & 0xffffff; }
void take_irq(int level, int group);
void refresh_timer(int tmr);
void timer_tick_simple(int tmr);
TIMER_CALLBACK_MEMBER( simple_timer_cb );
@ -160,8 +165,6 @@ private:
void test_nz16(UINT16 v);
void do_jsr(UINT32 to, UINT32 ret);
void do_branch(int offset, bool state);
void mn10200_w(UINT32 adr, UINT32 data, int type);
UINT32 mn10200_r(UINT32 adr, int type);
};