z88: fixed expanded video addressing in RAM carts

This commit is contained in:
Nigel Barnes 2017-02-10 22:30:30 +00:00
parent 52fb4ea49b
commit 78ba1daa9f
4 changed files with 54 additions and 24 deletions

View File

@ -203,3 +203,16 @@ WRITE8_MEMBER(z88cart_slot_device::write)
if (m_cart)
m_cart->write(space, offset, data);
}
/*-------------------------------------------------
get_cart_base
-------------------------------------------------*/
uint8_t* z88cart_slot_device::get_cart_base()
{
if (m_cart)
return m_cart->get_cart_base();
else
return nullptr;
}

View File

@ -116,7 +116,7 @@ public:
// reading and writing
virtual DECLARE_READ8_MEMBER(read);
virtual DECLARE_WRITE8_MEMBER(write);
virtual uint8_t* get_cart_base();
private:
static const device_timer_id TIMER_FLP_CLEAR = 0;

View File

@ -10,6 +10,7 @@
TODO:
- speaker controlled by txd
- cartridges should be hot swappable
- expansion interface
- serial port
@ -607,14 +608,14 @@ READ8_MEMBER(z88_state::kb_r)
}
static SLOT_INTERFACE_START(z88_cart)
SLOT_INTERFACE("32krom", Z88_32K_ROM) // 32KB ROM cart
SLOT_INTERFACE("128krom", Z88_128K_ROM) // 128KB ROM cart
SLOT_INTERFACE("256krom", Z88_256K_ROM) // 256KB ROM cart
SLOT_INTERFACE("32kram", Z88_32K_RAM) // 32KB RAM cart
SLOT_INTERFACE("128kram", Z88_128K_RAM) // 128KB RAM cart
SLOT_INTERFACE("512kram", Z88_512K_RAM) // 512KB RAM cart
SLOT_INTERFACE("1024kram",Z88_1024K_RAM) // 1024KB RAM cart
SLOT_INTERFACE("1024kflash",Z88_1024K_FLASH) // 1024KB Flash cart
SLOT_INTERFACE("32krom", Z88_32K_ROM) // 32KB ROM cart
SLOT_INTERFACE("128krom", Z88_128K_ROM) // 128KB ROM cart
SLOT_INTERFACE("256krom", Z88_256K_ROM) // 256KB ROM cart
SLOT_INTERFACE("32kram", Z88_32K_RAM) // 32KB RAM cart
SLOT_INTERFACE("128kram", Z88_128K_RAM) // 128KB RAM cart
SLOT_INTERFACE("512kram", Z88_512K_RAM) // 512KB RAM cart
SLOT_INTERFACE("1024kram", Z88_1024K_RAM) // 1024KB RAM cart
SLOT_INTERFACE("1024kflash", Z88_1024K_FLASH) // 1024KB Flash cart
SLOT_INTERFACE_END
static MACHINE_CONFIG_START( z88, z88_state )
@ -650,12 +651,12 @@ static MACHINE_CONFIG_START( z88, z88_state )
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
// internal ram
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("128K")
MCFG_RAM_EXTRA_OPTIONS("32K,64K,256K,512k")
// cartridges
/* cartridges */
MCFG_DEVICE_ADD("slot1", Z88CART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(z88_cart, nullptr, false)
MCFG_Z88CART_SLOT_OUT_FLP_CB(DEVWRITELINE("blink", upd65031_device, flp_w))
@ -665,6 +666,9 @@ static MACHINE_CONFIG_START( z88, z88_state )
MCFG_DEVICE_ADD("slot3", Z88CART_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(z88_cart, nullptr, false)
MCFG_Z88CART_SLOT_OUT_FLP_CB(DEVWRITELINE("blink", upd65031_device, flp_w))
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list", "z88_cart")
MACHINE_CONFIG_END
@ -745,15 +749,15 @@ ROM_START(z88tr)
ROMX_LOAD("z88v317tk.rom", 0x00000, 0x20000, CRC(9468d677) SHA1(8d76e94f43846c736bf257d15d531c2df1e20fae), ROM_BIOS(1) )
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
COMP( 1988, z88 , 0, 0, z88, z88 , driver_device, 0, "Cambridge Computers", "Z88" , MACHINE_NOT_WORKING)
COMP( 1988, z88de, z88, 0, z88, z88de, driver_device, 0, "Cambridge Computers", "Z88 (German)" , MACHINE_NOT_WORKING)
COMP( 1988, z88es, z88, 0, z88, z88es, driver_device, 0, "Cambridge Computers", "Z88 (Spanish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88fr, z88, 0, z88, z88fr, driver_device, 0, "Cambridge Computers", "Z88 (French)" , MACHINE_NOT_WORKING)
COMP( 1988, z88it, z88, 0, z88, z88it, driver_device, 0, "Cambridge Computers", "Z88 (Italian)" , MACHINE_NOT_WORKING)
COMP( 1988, z88se, z88, 0, z88, z88se, driver_device, 0, "Cambridge Computers", "Z88 (Swedish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88fi, z88, 0, z88, z88se, driver_device, 0, "Cambridge Computers", "Z88 (Finnish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88no, z88, 0, z88, z88no, driver_device, 0, "Cambridge Computers", "Z88 (Norwegian)", MACHINE_NOT_WORKING)
COMP( 1988, z88dk, z88, 0, z88, z88no, driver_device, 0, "Cambridge Computers", "Z88 (Danish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88ch, z88, 0, z88, z88ch, driver_device, 0, "Cambridge Computers", "Z88 (Swiss)" , MACHINE_NOT_WORKING)
COMP( 1988, z88tr, z88, 0, z88, z88tr, driver_device, 0, "Cambridge Computers", "Z88 (Turkish)" , MACHINE_NOT_WORKING)
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP( 1988, z88 , 0, 0, z88, z88 , driver_device, 0, "Cambridge Computers", "Z88" , MACHINE_NOT_WORKING)
COMP( 1988, z88de, z88, 0, z88, z88de, driver_device, 0, "Cambridge Computers", "Z88 (German)" , MACHINE_NOT_WORKING)
COMP( 1988, z88es, z88, 0, z88, z88es, driver_device, 0, "Cambridge Computers", "Z88 (Spanish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88fr, z88, 0, z88, z88fr, driver_device, 0, "Cambridge Computers", "Z88 (French)" , MACHINE_NOT_WORKING)
COMP( 1988, z88it, z88, 0, z88, z88it, driver_device, 0, "Cambridge Computers", "Z88 (Italian)" , MACHINE_NOT_WORKING)
COMP( 1988, z88se, z88, 0, z88, z88se, driver_device, 0, "Cambridge Computers", "Z88 (Swedish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88fi, z88, 0, z88, z88se, driver_device, 0, "Cambridge Computers", "Z88 (Finnish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88no, z88, 0, z88, z88no, driver_device, 0, "Cambridge Computers", "Z88 (Norwegian)", MACHINE_NOT_WORKING)
COMP( 1988, z88dk, z88, 0, z88, z88no, driver_device, 0, "Cambridge Computers", "Z88 (Danish)" , MACHINE_NOT_WORKING)
COMP( 1988, z88ch, z88, 0, z88, z88ch, driver_device, 0, "Cambridge Computers", "Z88 (Swiss)" , MACHINE_NOT_WORKING)
COMP( 1988, z88tr, z88, 0, z88, z88tr, driver_device, 0, "Cambridge Computers", "Z88 (Turkish)" , MACHINE_NOT_WORKING)

View File

@ -21,7 +21,20 @@ inline void z88_state::plot_pixel(bitmap_ind16 &bitmap, int x, int y, uint16_t c
// convert absolute offset into correct address to get data from
inline uint8_t* z88_state::convert_address(uint32_t offset)
{
return (offset < 0x80000 ? m_bios : m_ram_base) + (offset & 0x7ffff);
uint8_t *ptr = nullptr;
if (offset < 0x080000) // rom
ptr = m_bios + (offset & 0x7ffff);
else if (offset < 0x100000) // slot0
ptr = m_ram_base + (offset & 0x7ffff);
else if (offset < 0x200000) // slot1
ptr = m_carts[1]->get_cart_base() + (offset & 0xfffff);
else if (offset < 0x300000) // slot2
ptr = m_carts[2]->get_cart_base() + (offset & 0xfffff);
else if (offset < 0x400000) // slot3
ptr = m_carts[3]->get_cart_base() + (offset & 0xfffff);
return ptr;
}
/***************************************************************************