mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
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:
parent
c8b9a2095e
commit
48d7007302
@ -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
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user