Z8001: Implement separate program/data address spaces [Christian Grössler]

(MESS) m20: Implement memory map correctly.  BASIC now shows its startup banner. [Christian Grössler]
This commit is contained in:
R. Belmont 2012-12-10 00:53:47 +00:00
parent c8b9a2095e
commit 48d7007302
3 changed files with 607 additions and 428 deletions

View File

@ -85,6 +85,7 @@ struct z8000_state
device_irq_acknowledge_callback irq_callback;
legacy_cpu_device *device;
address_space *program;
address_space *data;
direct_read_data *direct;
address_space *io;
int icount;
@ -133,7 +134,7 @@ INLINE UINT32 addr_sub(z8000_state *cpustate, UINT32 addr, UINT32 subtrahend)
INLINE UINT16 RDOP(z8000_state *cpustate)
{
UINT16 res = cpustate->direct->read_decrypted_word(cpustate->pc);
UINT16 res = cpustate->program->read_word(cpustate->pc);
cpustate->pc += 2;
return res;
}
@ -148,7 +149,7 @@ INLINE UINT32 get_operand (z8000_state *cpustate, int opnum)
if (! (cpustate->op_valid & (1 << opnum)))
{
cpustate->op[opnum] = cpustate->direct->read_decrypted_word(cpustate->pc);
cpustate->op[opnum] = cpustate->program->read_word(cpustate->pc);
cpustate->pc += 2;
cpustate->op_valid |= (1 << opnum);
}
@ -165,13 +166,13 @@ INLINE UINT32 get_addr_operand (z8000_state *cpustate, int opnum)
if (! (cpustate->op_valid & (1 << opnum)))
{
UINT32 seg = cpustate->direct->read_decrypted_word(cpustate->pc);
UINT32 seg = cpustate->program->read_word(cpustate->pc);
cpustate->pc += 2;
if (segmented_mode(cpustate))
{
if (seg & 0x8000)
{
cpustate->op[opnum] = ((seg & 0x7f00) << 8) | cpustate->direct->read_decrypted_word(cpustate->pc);
cpustate->op[opnum] = ((seg & 0x7f00) << 8) | cpustate->program->read_word(cpustate->pc);
cpustate->pc += 2;
}
else
@ -194,13 +195,13 @@ INLINE UINT32 get_raw_addr_operand (z8000_state *cpustate, int opnum)
if (! (cpustate->op_valid & (1 << opnum)))
{
UINT32 seg = cpustate->direct->read_decrypted_word(cpustate->pc);
UINT32 seg = cpustate->program->read_word(cpustate->pc);
cpustate->pc += 2;
if (segmented_mode(cpustate))
{
if (seg & 0x8000)
{
cpustate->op[opnum] = (seg << 16) | cpustate->direct->read_decrypted_word(cpustate->pc);
cpustate->op[opnum] = (seg << 16) | cpustate->program->read_word(cpustate->pc);
cpustate->pc += 2;
}
else
@ -213,46 +214,89 @@ INLINE UINT32 get_raw_addr_operand (z8000_state *cpustate, int opnum)
return cpustate->op[opnum];
}
INLINE UINT8 RDMEM_B(z8000_state *cpustate, UINT32 addr)
INLINE UINT32 adjust_addr_for_nonseg_mode(z8000_state *cpustate, UINT32 addr)
{
return cpustate->program->read_byte(addr);
if (cpustate->device->type() == Z8001 && !(cpustate->fcw & F_SEG))
/*return (addr & 0xffff) | (cpustate->pc & 0xffff0000);*/
return (addr & 0xffff) | (cpustate->pc & 0x7f0000);
else
return addr;
}
INLINE UINT16 RDMEM_W(z8000_state *cpustate, UINT32 addr)
INLINE UINT8 RDMEM_B(z8000_state *cpustate, address_spacenum spacenum, UINT32 addr)
{
addr = adjust_addr_for_nonseg_mode(cpustate, addr);
if (spacenum == AS_PROGRAM)
return cpustate->program->read_byte(addr);
else
return cpustate->data->read_byte(addr);
}
INLINE UINT16 RDMEM_W(z8000_state *cpustate, address_spacenum spacenum, UINT32 addr)
{
addr = adjust_addr_for_nonseg_mode(cpustate, addr);
addr &= ~1;
/* hack for m20 driver: BIOS accesses 0x7f0000 and expects a segmentation violation */
if (addr >= 0x7f0000) {
cpustate->irq_req = Z8000_SEGTRAP;
return 0xffff;
}
return cpustate->program->read_word(addr);
if (spacenum == AS_PROGRAM)
return cpustate->program->read_word(addr);
else
return cpustate->data->read_word(addr);
}
INLINE UINT32 RDMEM_L(z8000_state *cpustate, UINT32 addr)
INLINE UINT32 RDMEM_L(z8000_state *cpustate, address_spacenum spacenum, UINT32 addr)
{
UINT32 result;
addr = adjust_addr_for_nonseg_mode(cpustate, addr);
addr &= ~1;
result = cpustate->program->read_word(addr) << 16;
return result + cpustate->program->read_word(addr_add(cpustate, addr, 2));
if (spacenum == AS_PROGRAM)
{
result = cpustate->program->read_word(addr) << 16;
return result + cpustate->program->read_word(addr_add(cpustate, addr, 2));
}
else
{
result = cpustate->data->read_word(addr) << 16;
return result + cpustate->data->read_word(addr_add(cpustate, addr, 2));
}
}
INLINE void WRMEM_B(z8000_state *cpustate, UINT32 addr, UINT8 value)
INLINE void WRMEM_B(z8000_state *cpustate, address_spacenum spacenum, UINT32 addr, UINT8 value)
{
cpustate->program->write_byte(addr, value);
addr = adjust_addr_for_nonseg_mode(cpustate, addr);
if (spacenum == AS_PROGRAM)
cpustate->program->write_byte(addr, value);
else
cpustate->data->write_byte(addr, value);
}
INLINE void WRMEM_W(z8000_state *cpustate, UINT32 addr, UINT16 value)
INLINE void WRMEM_W(z8000_state *cpustate, address_spacenum spacenum, UINT32 addr, UINT16 value)
{
addr = adjust_addr_for_nonseg_mode(cpustate, addr);
addr &= ~1;
cpustate->program->write_word(addr, value);
if (spacenum == AS_PROGRAM)
cpustate->program->write_word(addr, value);
else
cpustate->data->write_word(addr, value);
}
INLINE void WRMEM_L(z8000_state *cpustate, UINT32 addr, UINT32 value)
INLINE void WRMEM_L(z8000_state *cpustate, address_spacenum spacenum, UINT32 addr, UINT32 value)
{
addr = adjust_addr_for_nonseg_mode(cpustate, addr);
addr &= ~1;
cpustate->program->write_word(addr, value >> 16);
cpustate->program->write_word(addr_add(cpustate, addr, 2), value & 0xffff);
if (spacenum == AS_PROGRAM)
{
cpustate->program->write_word(addr, value >> 16);
cpustate->program->write_word(addr_add(cpustate, addr, 2), value & 0xffff);
}
else
{
cpustate->data->write_word(addr, value >> 16);
cpustate->data->write_word(addr_add(cpustate, addr, 2), value & 0xffff);
}
}
INLINE UINT8 RDPORT_B(z8000_state *cpustate, int mode, UINT16 addr)
@ -382,9 +426,9 @@ if (cpustate->device->type() == Z8001) \
PUSHW(cpustate, SP, cpustate->pc); /* save current cpustate->pc */ \
} while (0)
#define GET_PC(VEC) (cpustate->device->type() == Z8001 ? segmented_addr(RDMEM_L(cpustate, VEC + 4)) : RDMEM_W(cpustate, VEC + 2))
#define GET_FCW(VEC) (cpustate->device->type() == Z8001 ? RDMEM_W(cpustate, VEC + 2) : RDMEM_W(cpustate, VEC))
#define GET_PC(VEC) (cpustate->device->type() == Z8001 ? segmented_addr(RDMEM_L(cpustate, AS_PROGRAM, VEC + 4)) : RDMEM_W(cpustate, AS_PROGRAM, VEC + 2))
#define GET_FCW(VEC) (cpustate->device->type() == Z8001 ? RDMEM_W(cpustate, AS_PROGRAM, VEC + 2) : RDMEM_W(cpustate, AS_PROGRAM, VEC))
#define F_SEG_Z8001 (cpustate->device->type() == Z8001 ? F_SEG : 0)
INLINE void Interrupt(z8000_state *cpustate)
{
@ -405,7 +449,7 @@ INLINE void Interrupt(z8000_state *cpustate)
/* trap ? */
if (cpustate->irq_req & Z8000_EPU)
{
CHANGE_FCW(cpustate, fcw | F_S_N);/* swap to system stack */
CHANGE_FCW(cpustate, fcw | F_S_N | F_SEG_Z8001);/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(cpustate, SP, fcw); /* save current cpustate->fcw */
PUSHW(cpustate, SP, cpustate->irq_req); /* save interrupt/trap type tag */
@ -418,7 +462,7 @@ INLINE void Interrupt(z8000_state *cpustate)
else
if (cpustate->irq_req & Z8000_TRAP)
{
CHANGE_FCW(cpustate, fcw | F_S_N);/* swap to system stack */
CHANGE_FCW(cpustate, fcw | F_S_N | F_SEG_Z8001);/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(cpustate, SP, fcw); /* save current cpustate->fcw */
PUSHW(cpustate, SP, cpustate->irq_req); /* save interrupt/trap type tag */
@ -431,7 +475,7 @@ INLINE void Interrupt(z8000_state *cpustate)
else
if (cpustate->irq_req & Z8000_SYSCALL)
{
CHANGE_FCW(cpustate, fcw | F_S_N);/* swap to system stack */
CHANGE_FCW(cpustate, fcw | F_S_N | F_SEG_Z8001);/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(cpustate, SP, fcw); /* save current cpustate->fcw */
PUSHW(cpustate, SP, cpustate->irq_req); /* save interrupt/trap type tag */
@ -444,7 +488,7 @@ INLINE void Interrupt(z8000_state *cpustate)
else
if (cpustate->irq_req & Z8000_SEGTRAP)
{
CHANGE_FCW(cpustate, fcw | F_S_N);/* swap to system stack */
CHANGE_FCW(cpustate, fcw | F_S_N | F_SEG_Z8001);/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(cpustate, SP, fcw); /* save current cpustate->fcw */
PUSHW(cpustate, SP, cpustate->irq_req); /* save interrupt/trap type tag */
@ -457,12 +501,12 @@ INLINE void Interrupt(z8000_state *cpustate)
else
if (cpustate->irq_req & Z8000_NMI)
{
CHANGE_FCW(cpustate, fcw | F_S_N);/* swap to system stack */
CHANGE_FCW(cpustate, fcw | F_S_N | F_SEG_Z8001);/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(cpustate, SP, fcw); /* save current cpustate->fcw */
PUSHW(cpustate, SP, cpustate->irq_req); /* save interrupt/trap type tag */
cpustate->irq_srv = cpustate->irq_req;
cpustate->pc = RDMEM_W(cpustate, NMI);
cpustate->pc = RDMEM_W(cpustate, AS_PROGRAM, NMI);
cpustate->irq_req &= ~Z8000_NMI;
CHANGE_FCW(cpustate, GET_FCW(NMI));
cpustate->pc = GET_PC(NMI);
@ -471,12 +515,12 @@ INLINE void Interrupt(z8000_state *cpustate)
else
if ((cpustate->irq_req & Z8000_NVI) && (cpustate->fcw & F_NVIE))
{
CHANGE_FCW(cpustate, fcw | F_S_N);/* swap to system stack */
CHANGE_FCW(cpustate, fcw | F_S_N | F_SEG_Z8001);/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(cpustate, SP, fcw); /* save current cpustate->fcw */
PUSHW(cpustate, SP, cpustate->irq_req); /* save interrupt/trap type tag */
cpustate->irq_srv = cpustate->irq_req;
cpustate->pc = GET_PC(NVI); //RDMEM_W(cpustate, NVI + 2);
cpustate->pc = GET_PC(NVI);
cpustate->irq_req &= ~Z8000_NVI;
CHANGE_FCW(cpustate, GET_FCW(NVI));
LOG(("Z8K '%s' NVI $%04x\n", cpustate->device->tag(), cpustate->pc));
@ -484,15 +528,15 @@ INLINE void Interrupt(z8000_state *cpustate)
else
if ((cpustate->irq_req & Z8000_VI) && (cpustate->fcw & F_VIE))
{
CHANGE_FCW(cpustate, fcw | F_S_N);/* swap to system stack */
CHANGE_FCW(cpustate, fcw | F_S_N | F_SEG_Z8001);/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(cpustate, SP, fcw); /* save current cpustate->fcw */
PUSHW(cpustate, SP, cpustate->irq_req); /* save interrupt/trap type tag */
cpustate->irq_srv = cpustate->irq_req;
if (cpustate->device->type() == Z8001)
cpustate->pc = segmented_addr(RDMEM_L(cpustate, VEC00 + 4 * (cpustate->irq_req & 0xff)));
cpustate->pc = segmented_addr(RDMEM_L(cpustate, AS_PROGRAM, VEC00 + 4 * (cpustate->irq_req & 0xff)));
else
cpustate->pc = RDMEM_W(cpustate, VEC00 + 2 * (cpustate->irq_req & 0xff));
cpustate->pc = RDMEM_W(cpustate, AS_PROGRAM, VEC00 + 2 * (cpustate->irq_req & 0xff));
cpustate->irq_req &= ~Z8000_VI;
CHANGE_FCW(cpustate, GET_FCW(VI));
//printf ("z8k VI (vec 0x%x)\n", cpustate->irq_req & 0xff);
@ -504,9 +548,17 @@ static CPU_INIT( z8001 )
{
z8000_state *cpustate = get_safe_token(device);
memset(cpustate, 0, sizeof(*cpustate));
cpustate->irq_callback = irqcallback;
cpustate->device = device;
cpustate->program = &device->space(AS_PROGRAM);
/* If the system decodes STn lines to distinguish between data and program memory fetches,
install the data space. If it doesn't, install the program memory into data memory space. */
if (device->has_space(AS_DATA))
cpustate->data = &device->space(AS_DATA);
else
cpustate->data = &device->space(AS_PROGRAM);
cpustate->direct = &cpustate->program->direct();
cpustate->io = &device->space(AS_IO);
@ -519,9 +571,17 @@ static CPU_INIT( z8002 )
{
z8000_state *cpustate = get_safe_token(device);
memset(cpustate, 0, sizeof(*cpustate));
cpustate->irq_callback = irqcallback;
cpustate->device = device;
cpustate->program = &device->space(AS_PROGRAM);
/* If the system decodes STn lines to distinguish between data and program memory fetches,
install the data space. If it doesn't, install the program memory into data memory space. */
if (device->has_space(AS_DATA))
cpustate->data = &device->space(AS_DATA);
else
cpustate->data = &device->space(AS_PROGRAM);
cpustate->direct = &cpustate->program->direct();
cpustate->io = &device->space(AS_IO);
@ -534,21 +594,14 @@ static CPU_RESET( z8001 )
{
z8000_state *cpustate = get_safe_token(device);
device_irq_acknowledge_callback save_irqcallback = cpustate->irq_callback;
memset(cpustate, 0, sizeof(*cpustate));
cpustate->irq_callback = save_irqcallback;
cpustate->device = device;
cpustate->program = &device->space(AS_PROGRAM);
cpustate->direct = &cpustate->program->direct();
cpustate->io = &device->space(AS_IO);
cpustate->fcw = RDMEM_W(cpustate, 2); /* get reset cpustate->fcw */
cpustate->fcw = RDMEM_W(cpustate, AS_PROGRAM, 2); /* get reset cpustate->fcw */
if(cpustate->fcw & F_SEG)
{
cpustate->pc = ((RDMEM_W(cpustate, 4) & 0x0700) << 8) | (RDMEM_W(cpustate, 6) & 0xffff); /* get reset cpustate->pc */
cpustate->pc = ((RDMEM_W(cpustate, AS_PROGRAM, 4) & 0x0700) << 8) | (RDMEM_W(cpustate, AS_PROGRAM, 6) & 0xffff); /* get reset cpustate->pc */
}
else
{
cpustate->pc = RDMEM_W(cpustate, 4); /* get reset cpustate->pc */
cpustate->pc = RDMEM_W(cpustate, AS_PROGRAM, 4); /* get reset cpustate->pc */
}
}
@ -556,15 +609,8 @@ static CPU_RESET( z8002 )
{
z8000_state *cpustate = get_safe_token(device);
device_irq_acknowledge_callback save_irqcallback = cpustate->irq_callback;
memset(cpustate, 0, sizeof(*cpustate));
cpustate->irq_callback = save_irqcallback;
cpustate->device = device;
cpustate->program = &device->space(AS_PROGRAM);
cpustate->direct = &cpustate->program->direct();
cpustate->io = &device->space(AS_IO);
cpustate->fcw = RDMEM_W(cpustate, 2); /* get reset cpustate->fcw */
cpustate->pc = RDMEM_W(cpustate, 4); /* get reset cpustate->pc */
cpustate->fcw = RDMEM_W(cpustate, AS_PROGRAM, 2); /* get reset cpustate->fcw */
cpustate->pc = RDMEM_W(cpustate, AS_PROGRAM, 4); /* get reset cpustate->pc */
}
static CPU_EXIT( z8000 )
@ -591,6 +637,7 @@ static CPU_EXECUTE( z8000 )
else
{
Z8000_exec *exec;
cpustate->op[0] = RDOP(cpustate);
cpustate->op_valid = 1;
exec = &z8000_exec[cpustate->op[0]];
@ -839,6 +886,8 @@ CPU_GET_INFO( z8001 )
{
case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 16; break;
case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 20; break;
case CPUINFO_INT_DATABUS_WIDTH + AS_DATA: info->i = 16; break;
case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA: info->i = 20; break;
case CPUINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 16; break;
case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 16; break;

File diff suppressed because it is too large Load Diff

View File

@ -290,6 +290,7 @@ WRITE_LINE_MEMBER( m20_state::timer_tick_w )
3 Screen bitmap
4 Diagnostics and Bootstrap
*/
#if 0
static ADDRESS_MAP_START(m20_mem, AS_PROGRAM, 16, m20_state)
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE( 0x00000, 0x01fff ) AM_RAM AM_SHARE("mainram")
@ -309,6 +310,107 @@ static ADDRESS_MAP_START(m20_mem, AS_PROGRAM, 16, m20_state)
AM_RANGE( 0xc0000, 0xc3fff ) AM_RAM
// AM_RANGE( 0x34000, 0x37fff ) AM_RAM //extra vram for color mode
ADDRESS_MAP_END
#endif
static ADDRESS_MAP_START(m20_program_mem, AS_PROGRAM, 16, m20_state)
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE( 0x00000, 0x03fff ) AM_RAM AM_SHARE("dram0_4000") //AM_SHARE("mainram")
AM_RANGE( 0x04000, 0x07fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0x08000, 0x0bfff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0x0c000, 0x0ffff ) AM_RAM AM_SHARE("dram0_10000")
AM_RANGE( 0x10000, 0x13fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0x14000, 0x17fff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0x18000, 0x1bfff ) AM_RAM AM_SHARE("dram0_10000")
//AM_RANGE( 0x1c000, 0x1ffff ) AM_RAM AM_SHARE("dram0_10000")
AM_RANGE( 0x20000, 0x23fff ) AM_RAM AM_SHARE("dram0_14000")
AM_RANGE( 0x24000, 0x27fff ) AM_RAM AM_SHARE("dram0_18000")
AM_RANGE( 0x28000, 0x2bfff ) AM_RAM AM_SHARE("dram0_1c000")
AM_RANGE( 0x2c000, 0x2ffff ) AM_RAM AM_SHARE("dram1_0000")
AM_RANGE( 0x30000, 0x33fff ) AM_RAM AM_SHARE("p_videoram")
AM_RANGE( 0x40000, 0x41fff ) AM_ROM AM_REGION("maincpu", 0x00000)
//AM_RANGE( 0x40000, 0x41fff ) AM_ROM AM_SHARE("maincpu")
AM_RANGE( 0x60000, 0x63fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0x64000, 0x67fff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0x68000, 0x6bfff ) AM_RAM AM_SHARE("dram0_10000")
AM_RANGE( 0x80000, 0x83fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0x84000, 0x87fff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0x88000, 0x8bfff ) AM_RAM AM_SHARE("dram1_4000")
AM_RANGE( 0x8c000, 0x8ffff ) AM_RAM AM_SHARE("dram2_0000")
AM_RANGE( 0x90000, 0x93fff ) AM_RAM AM_SHARE("dram0_18000")
AM_RANGE( 0x94000, 0x97fff ) AM_RAM AM_SHARE("dram0_1c000")
AM_RANGE( 0x98000, 0x9bfff ) AM_RAM AM_SHARE("dram2_4000")
AM_RANGE( 0x9c000, 0x9ffff ) AM_RAM AM_SHARE("dram3_0000")
AM_RANGE( 0xa0000, 0xa3fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0xa4000, 0xa7fff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0xa8000, 0xabfff ) AM_RAM AM_SHARE("dram1_4000")
AM_RANGE( 0xac000, 0xaffff ) AM_RAM AM_SHARE("dram2_0000")
AM_RANGE( 0xb0000, 0xb3fff ) AM_RAM AM_SHARE("dram3_4000")
ADDRESS_MAP_END
static ADDRESS_MAP_START(m20_data_mem, AS_DATA, 16, m20_state)
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE( 0x00000, 0x03fff ) AM_RAM AM_SHARE("dram0_4000")
AM_RANGE( 0x04000, 0x07fff ) AM_RAM AM_SHARE("dram1_4000")
AM_RANGE( 0x08000, 0x0bfff ) AM_RAM AM_SHARE("dram2_0000")
AM_RANGE( 0x0c000, 0x0ffff ) AM_RAM AM_SHARE("dram2_4000")
AM_RANGE( 0x10000, 0x13fff ) AM_RAM AM_SHARE("dram0_14000")
AM_RANGE( 0x14000, 0x17fff ) AM_RAM AM_SHARE("dram0_18000")
AM_RANGE( 0x18000, 0x1bfff ) AM_RAM AM_SHARE("dram0_1c000")
AM_RANGE( 0x1c000, 0x1ffff ) AM_RAM AM_SHARE("dram1_0000")
AM_RANGE( 0x20000, 0x23fff ) AM_RAM AM_SHARE("dram0_14000")
AM_RANGE( 0x24000, 0x27fff ) AM_RAM AM_SHARE("dram0_18000")
AM_RANGE( 0x28000, 0x2bfff ) AM_RAM AM_SHARE("dram0_1c000")
AM_RANGE( 0x2c000, 0x2ffff ) AM_RAM AM_SHARE("dram1_0000")
AM_RANGE( 0x30000, 0x33fff ) AM_RAM AM_SHARE("p_videoram")
//AM_RANGE( 0x40000, 0x41fff ) AM_ROM AM_SHARE("maincpu")
AM_RANGE( 0x40000, 0x41fff ) AM_ROM AM_REGION("maincpu", 0x00000)
AM_RANGE( 0x44000, 0x47fff ) AM_RAM AM_SHARE("dram3_0000")
AM_RANGE( 0x48000, 0x4bfff ) AM_RAM AM_SHARE("dram3_4000")
AM_RANGE( 0x50000, 0x53fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0x54000, 0x57fff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0x58000, 0x5bfff ) AM_RAM AM_SHARE("dram0_10000")
AM_RANGE( 0x60000, 0x63fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0x64000, 0x67fff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0x68000, 0x6bfff ) AM_RAM AM_SHARE("dram0_10000")
AM_RANGE( 0x80000, 0x83fff ) AM_RAM AM_SHARE("dram0_18000")
AM_RANGE( 0x84000, 0x87fff ) AM_RAM AM_SHARE("dram0_1c000")
AM_RANGE( 0x88000, 0x8bfff ) AM_RAM AM_SHARE("dram2_4000")
AM_RANGE( 0x8c000, 0x8ffff ) AM_RAM AM_SHARE("dram3_0000")
AM_RANGE( 0x90000, 0x93fff ) AM_RAM AM_SHARE("dram0_18000")
AM_RANGE( 0x94000, 0x97fff ) AM_RAM AM_SHARE("dram0_1c000")
AM_RANGE( 0x98000, 0x9bfff ) AM_RAM AM_SHARE("dram2_4000")
AM_RANGE( 0x9c000, 0x9ffff ) AM_RAM AM_SHARE("dram3_0000")
AM_RANGE( 0xa0000, 0xa3fff ) AM_RAM AM_SHARE("dram0_8000")
AM_RANGE( 0xa4000, 0xa7fff ) AM_RAM AM_SHARE("dram0_c000")
AM_RANGE( 0xa8000, 0xabfff ) AM_RAM AM_SHARE("dram1_4000")
AM_RANGE( 0xac000, 0xaffff ) AM_RAM AM_SHARE("dram2_0000")
AM_RANGE( 0xb0000, 0xb3fff ) AM_RAM AM_SHARE("dram3_4000")
AM_RANGE( 0xc0000, 0xc3fff ) AM_RAM AM_SHARE("dram3_4000")
ADDRESS_MAP_END
static ADDRESS_MAP_START(m20_io, AS_IO, 16, m20_state)
ADDRESS_MAP_UNMAP_HIGH
@ -373,9 +475,10 @@ void m20_state::machine_start()
void m20_state::machine_reset()
{
UINT8 *ROM = machine().root_device().memregion("maincpu")->base();
UINT8 *RAM = (UINT8 *)machine().root_device().memshare("mainram")->ptr();
// UINT8 *RAM = (UINT8 *)machine().root_device().memshare("mainram")->ptr();
UINT8 *RAM = (UINT8 *)machine().root_device().memshare("dram0_4000")->ptr();
ROM += 0x10000; // don't know why they load at an offset, but let's go with it
//ROM += 0x10000; // don't know why they load at an offset, but let's go with it
m_port21 = 0xff;
@ -521,7 +624,8 @@ FLOPPY_FORMATS_END
static MACHINE_CONFIG_START( m20, m20_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z8001, MAIN_CLOCK)
MCFG_CPU_PROGRAM_MAP(m20_mem)
MCFG_CPU_PROGRAM_MAP(m20_program_mem)
MCFG_CPU_DATA_MAP(m20_data_mem)
MCFG_CPU_IO_MAP(m20_io)
#if 0
@ -556,7 +660,21 @@ static MACHINE_CONFIG_START( m20, m20_state )
MACHINE_CONFIG_END
ROM_START(m20)
ROM_REGION(0x12000,"maincpu", 0)
ROM_REGION(0x2000,"maincpu", 0)
//ROM_REGION(0x12000,"maincpu", 0)
ROM_SYSTEM_BIOS( 0, "m20", "M20 1.0" )
ROMX_LOAD("m20.bin", 0x0000, 0x2000, CRC(5c93d931) SHA1(d51025e087a94c55529d7ee8fd18ff4c46d93230), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 1, "m20-20d", "M20 2.0d" )
ROMX_LOAD("m20-20d.bin", 0x0000, 0x2000, CRC(cbe265a6) SHA1(c7cb9d9900b7b5014fcf1ceb2e45a66a91c564d0), ROM_BIOS(2))
ROM_SYSTEM_BIOS( 2, "m20-20f", "M20 2.0f" )
ROMX_LOAD("m20-20f.bin", 0x0000, 0x2000, CRC(db7198d8) SHA1(149d8513867081d31c73c2965dabb36d5f308041), ROM_BIOS(3))
ROM_END
#if 0
ROM_START(m20)
ROM_REGION(0x2000,"maincpu", 0)
//ROM_REGION(0x12000,"maincpu", 0)
ROM_SYSTEM_BIOS( 0, "m20", "M20 1.0" )
ROMX_LOAD("m20.bin", 0x10000, 0x2000, CRC(5c93d931) SHA1(d51025e087a94c55529d7ee8fd18ff4c46d93230), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 1, "m20-20d", "M20 2.0d" )
@ -567,6 +685,7 @@ ROM_START(m20)
ROM_REGION(0x4000,"apb_bios", 0) // Processor board with 8086
ROM_LOAD( "apb-1086-2.0.bin", 0x0000, 0x4000, CRC(8c05be93) SHA1(2bb424afd874cc6562e9642780eaac2391308053))
ROM_END
#endif
ROM_START(m40)
ROM_REGION(0x14000,"maincpu", 0)