summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2017-02-10 22:30:30 +0000
committer Nigel Barnes <Pernod70@users.noreply.github.com>2017-02-14 12:28:37 +0000
commit78ba1daa9f41ba185b1cc342725cb10751494d27 (patch)
tree72039fed480580805f1e1f15f4ffd0cf960d496b /src
parent52fb4ea49b3f91d2505e8a0094dceb4d34e4e2cf (diff)
z88: fixed expanded video addressing in RAM carts
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/z88/z88.cpp13
-rw-r--r--src/devices/bus/z88/z88.h2
-rw-r--r--src/mame/drivers/z88.cpp48
-rw-r--r--src/mame/video/z88.cpp15
4 files changed, 54 insertions, 24 deletions
diff --git a/src/devices/bus/z88/z88.cpp b/src/devices/bus/z88/z88.cpp
index ac6b1b7d101..193d483a147 100644
--- a/src/devices/bus/z88/z88.cpp
+++ b/src/devices/bus/z88/z88.cpp
@@ -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;
+}
diff --git a/src/devices/bus/z88/z88.h b/src/devices/bus/z88/z88.h
index 9d6a76c4edd..05d5a7fbca7 100644
--- a/src/devices/bus/z88/z88.h
+++ b/src/devices/bus/z88/z88.h
@@ -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;
diff --git a/src/mame/drivers/z88.cpp b/src/mame/drivers/z88.cpp
index 601af78ddba..647ac4affe9 100644
--- a/src/mame/drivers/z88.cpp
+++ b/src/mame/drivers/z88.cpp
@@ -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)
diff --git a/src/mame/video/z88.cpp b/src/mame/video/z88.cpp
index ede51b5ee1e..d0f405d3e1c 100644
--- a/src/mame/video/z88.cpp
+++ b/src/mame/video/z88.cpp
@@ -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;
}
/***************************************************************************