Check-point

This commit is contained in:
Angelo Salese 2013-03-23 17:30:53 +00:00
parent a41a17c4b5
commit 30346a8b60

View File

@ -28,6 +28,8 @@ public:
UINT8 *m_work_ram;
UINT8 *m_shared_ram;
UINT8 m_ma,m_mo,m_ms,m_me2,m_me1;
DECLARE_READ8_MEMBER(mz3500_master_mem_r);
DECLARE_WRITE8_MEMBER(mz3500_master_mem_w);
DECLARE_READ8_MEMBER(mz3500_ipl_r);
@ -36,6 +38,8 @@ public:
DECLARE_WRITE8_MEMBER(mz3500_work_ram_w);
DECLARE_READ8_MEMBER(mz3500_shared_ram_r);
DECLARE_WRITE8_MEMBER(mz3500_shared_ram_w);
DECLARE_READ8_MEMBER(mz3500_io_r);
DECLARE_WRITE8_MEMBER(mz3500_io_w);
// screen updates
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -81,26 +85,121 @@ WRITE8_MEMBER(mz3500_state::mz3500_work_ram_w)
READ8_MEMBER(mz3500_state::mz3500_master_mem_r)
{
if((offset & 0xe000) == 0x0000) { return mz3500_ipl_r(space,(offset & 0xfff) | 0x1000); }
if((offset & 0xe000) == 0x2000) { return mz3500_basic_r(space,offset & 0x1fff); }
if((offset & 0xe000) == 0x4000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0x4000); }
if((offset & 0xe000) == 0x6000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0x6000); }
if((offset & 0xe000) == 0x8000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0x8000); }
if((offset & 0xe000) == 0xa000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0xa000); }
if((offset & 0xe000) == 0xc000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0xc000); }
if((offset & 0xe000) == 0xe000) { return mz3500_work_ram_r(space,(offset & 0x1fff) | 0xe000); }
if(m_ms == 0)
{
if((offset & 0xe000) == 0x0000) { return mz3500_ipl_r(space,(offset & 0xfff) | 0x1000); }
if((offset & 0xe000) == 0x2000) { return mz3500_basic_r(space,(offset & 0x1fff) | 0x2000); }
if((offset & 0xc000) == 0x4000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x4000); }
if((offset & 0xc000) == 0x8000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x8000); }
if((offset & 0xc000) == 0xc000)
{
if(m_ma == 0x0) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0xc000); }
if(m_ma == 0x1) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x0000); }
if(m_ma == 0xf) { return mz3500_shared_ram_r(space,(offset & 0x7ff)); }
}
printf("Error: read with unmapped memory bank offset %04x MS %02x MA %02x\n",offset,m_ms,m_ma);
}
else if(m_ms == 1)
{
return ((offset & 0xf800) == 0xf800) ? mz3500_shared_ram_r(space,(offset & 0x7ff)) : mz3500_work_ram_r(space,offset);
}
else if(m_ms == 2) // ROM based BASIC
{
if((offset & 0xe000) == 0x0000) { return mz3500_basic_r(space,offset & 0x1fff); }
if((offset & 0xe000) == 0x2000)
{
switch(m_mo)
{
case 0x0: return mz3500_basic_r(space,(offset & 0x1fff) | 0x2000);
case 0x1: return mz3500_basic_r(space,(offset & 0x1fff) | 0x4000);
case 0x2: return mz3500_basic_r(space,(offset & 0x1fff) | 0x6000);
}
printf("Error: read with unmapped memory bank offset %04x MS %02x MO %02x\n",offset,m_ms,m_mo);
}
if((offset & 0xc000) == 0x4000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x4000); }
if((offset & 0xc000) == 0x8000) { return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x8000); }
if((offset & 0xc000) == 0xc000)
{
switch(m_ma)
{
case 0x0: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x0c000);
case 0x1: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x00000);
case 0x2: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x10000);
case 0x3: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x14000);
case 0x4: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x18000);
case 0x5: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x1c000);
case 0x6: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x20000);
case 0x7: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x24000);
case 0x8: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x28000);
case 0x9: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x2c000);
case 0xa: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x30000);
case 0xb: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x34000);
case 0xc: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x38000);
case 0xd: return mz3500_work_ram_r(space,(offset & 0x3fff) | 0x3c000);
case 0xf: return mz3500_shared_ram_r(space,(offset & 0x7ff));
}
}
printf("Error: read with unmapped memory bank offset %04x MS %02x MA %02x\n",offset,m_ms,m_ma);
}
return 0xff;
}
WRITE8_MEMBER(mz3500_state::mz3500_master_mem_w)
{
if((offset & 0xe000) == 0x4000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0x4000,data); return; }
if((offset & 0xe000) == 0x6000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0x6000,data); return; }
if((offset & 0xe000) == 0x8000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0x8000,data); return; }
if((offset & 0xe000) == 0xa000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0xa000,data); return; }
if((offset & 0xe000) == 0xc000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0xc000,data); return; }
if((offset & 0xe000) == 0xe000) { mz3500_work_ram_w(space,(offset & 0x1fff) | 0xe000,data); return; }
if(m_ms == 0) // Initialize State
{
if((offset & 0xc000) == 0x4000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x4000,data); return; }
if((offset & 0xc000) == 0x8000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x8000,data); return; }
if((offset & 0xc000) == 0xc000)
{
if(m_ma == 0x0) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0xc000,data); return; }
if(m_ma == 0x1) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x0000,data); return; }
if(m_ma == 0xf) { mz3500_shared_ram_w(space,(offset & 0x7ff),data); return; }
}
printf("Error: write with unmapped memory bank offset %04x data %02x MS %02x MA %02x\n",offset,data,m_ms,m_ma);
}
else if(m_ms == 1) // System Loading & CP/M
{
if((offset & 0xf800) == 0xf800)
mz3500_shared_ram_w(space,(offset & 0x7ff),data);
else
mz3500_work_ram_w(space,offset,data);
return;
}
else if(m_ms == 2) // ROM based BASIC
{
if((offset & 0xc000) == 0x4000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x4000,data); return; }
if((offset & 0xc000) == 0x8000) { mz3500_work_ram_w(space,(offset & 0x3fff) | 0x8000,data); return; }
if((offset & 0xc000) == 0xc000)
{
switch(m_ma)
{
case 0x0: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x0c000,data); return;
case 0x1: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x00000,data); return;
case 0x2: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x10000,data); return;
case 0x3: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x14000,data); return;
case 0x4: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x18000,data); return;
case 0x5: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x1c000,data); return;
case 0x6: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x20000,data); return;
case 0x7: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x24000,data); return;
case 0x8: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x28000,data); return;
case 0x9: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x2c000,data); return;
case 0xa: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x30000,data); return;
case 0xb: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x34000,data); return;
case 0xc: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x38000,data); return;
case 0xd: mz3500_work_ram_w(space,(offset & 0x3fff) | 0x3c000,data); return;
case 0xf: mz3500_shared_ram_w(space,(offset & 0x7ff),data); return;
}
}
printf("Error: write with unmapped memory bank offset %04x data %02x MS %02x MA %02x\n",offset,data,m_ms,m_ma);
}
}
@ -114,6 +213,55 @@ WRITE8_MEMBER(mz3500_state::mz3500_shared_ram_w)
m_shared_ram[offset] = data;
}
READ8_MEMBER(mz3500_state::mz3500_io_r)
{
/*
[2]
---x xxx- system assign switch
---- ---x "SEC" FD assign
[3]
xxx- ---- FD assign
---x ---- slave CPU Ready signal
---- x--- slave CPU ack signal
---- -xxx interrupt status
*/
return 0;
}
WRITE8_MEMBER(mz3500_state::mz3500_io_w)
{
/*
[0]
---- --x- SRQ bus request from master to slave
---- ---x E1
[1]
x--- ---- slave reset signal
---- --xx memory system define
[2]
xxxx ---- ma bank (memory 0xc000-0xffff)
---- -xxx mo bank (memory 0x2000-0x3fff)
[3]
x--- ---- me2 bank (memory 0x8000-0xbfff)
-x-- ---- me1 bank (memory 0x4000-0x7fff)
*/
switch(offset)
{
case 1:
m_ms = data & 3;
break;
case 2:
m_ma = (data & 0xf0) >> 4;
m_mo = (data & 0x07);
break;
case 3:
m_me2 = (data & 0x80) >> 7;
m_me1 = (data & 0x40) >> 6;
break;
}
}
static ADDRESS_MAP_START( mz3500_master_map, AS_PROGRAM, 8, mz3500_state )
AM_RANGE(0x0000, 0xffff) AM_READWRITE(mz3500_master_mem_r,mz3500_master_mem_w)
ADDRESS_MAP_END
@ -125,7 +273,7 @@ static ADDRESS_MAP_START( mz3500_master_io, AS_IO, 8, mz3500_state )
// AM_RANGE(0xec, 0xef) irq signal from slave to master CPU
// AM_RANGE(0xf4, 0xf7) MFD upd765
// AM_RANGE(0xf8, 0xfb) MFD I/O port
// AM_RANGE(0xfc, 0xff) memory mapper
AM_RANGE(0xfc, 0xff) AM_READWRITE(mz3500_io_r,mz3500_io_w) // memory mapper
ADDRESS_MAP_END
static ADDRESS_MAP_START( mz3500_slave_map, AS_PROGRAM, 8, mz3500_state )
@ -228,6 +376,13 @@ void mz3500_state::machine_start()
void mz3500_state::machine_reset()
{
/* init memory bank states */
m_ms = 0;
m_ma = 0;
m_mo = 0;
m_me1 = 0;
m_me2 = 0;
m_slave->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}