mirror of
https://github.com/holub/mame
synced 2025-06-06 04:43:45 +03:00
(nw) studio2 : rearranged memory closer to actual operation
This commit is contained in:
parent
3ad635d94f
commit
44d5b3ddb2
@ -189,6 +189,18 @@ Notes:
|
|||||||
- Visicom always reserves buttons 1,2,3,4,7(Q,W,E,A,Z) for the internal games, which are always available.
|
- Visicom always reserves buttons 1,2,3,4,7(Q,W,E,A,Z) for the internal games, which are always available.
|
||||||
The cartridges use 5(S) to start, except gambler1 which uses 9(C).
|
The cartridges use 5(S) to start, except gambler1 which uses 9(C).
|
||||||
|
|
||||||
|
Memory organisation of the Studio II:
|
||||||
|
- RAM is mirrored everywhere except:
|
||||||
|
(a) when A9 is high;
|
||||||
|
(b) when a rom is active;
|
||||||
|
(c) when the cartridge wants to disable it;
|
||||||
|
so in effect, RAM exists at 0800-09FF then every 0x400 boundary onwards.
|
||||||
|
- The system ROM exists at 0000-03FF and cannot be deactivated.
|
||||||
|
- The inbuilt games exist at 0400-07FF and are always swapped out when a cart is used.
|
||||||
|
- The cart "grandpak" also uses 0C00-0FFF with a 2nd rom.
|
||||||
|
- Some homebrews make use of 0C00-0DFF (asteroids, berzerk, pacman, scramble). The
|
||||||
|
ST2 loader will enable the extra rombank as needed.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
@ -219,6 +231,7 @@ public:
|
|||||||
studio2_state(const machine_config &mconfig, device_type type, const char *tag)
|
studio2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag)
|
: driver_device(mconfig, type, tag)
|
||||||
, m_maincpu(*this, CDP1802_TAG)
|
, m_maincpu(*this, CDP1802_TAG)
|
||||||
|
, m_rom(*this, CDP1802_TAG)
|
||||||
, m_beeper(*this, "beeper")
|
, m_beeper(*this, "beeper")
|
||||||
, m_vdc(*this, CDP1861_TAG)
|
, m_vdc(*this, CDP1861_TAG)
|
||||||
, m_cart(*this, "cartslot")
|
, m_cart(*this, "cartslot")
|
||||||
@ -234,9 +247,13 @@ public:
|
|||||||
DECLARE_INPUT_CHANGED_MEMBER( reset_w );
|
DECLARE_INPUT_CHANGED_MEMBER( reset_w );
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER( cart_400 );
|
DECLARE_READ8_MEMBER( cart_400 );
|
||||||
|
DECLARE_READ8_MEMBER( cart_c00 );
|
||||||
|
DECLARE_READ8_MEMBER( rom_000 );
|
||||||
|
DECLARE_READ8_MEMBER( rom_400 );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
required_device<cosmac_device> m_maincpu;
|
required_device<cosmac_device> m_maincpu;
|
||||||
|
optional_region_ptr<u8> m_rom;
|
||||||
required_device<beep_device> m_beeper;
|
required_device<beep_device> m_beeper;
|
||||||
optional_device<cdp1861_device> m_vdc;
|
optional_device<cdp1861_device> m_vdc;
|
||||||
required_device<generic_slot_device> m_cart;
|
required_device<generic_slot_device> m_cart;
|
||||||
@ -248,9 +265,6 @@ protected:
|
|||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER( cart_a00 );
|
|
||||||
DECLARE_READ8_MEMBER( cart_c00 );
|
|
||||||
DECLARE_READ8_MEMBER( cart_e00 );
|
|
||||||
DECLARE_READ8_MEMBER( dispon_r );
|
DECLARE_READ8_MEMBER( dispon_r );
|
||||||
DECLARE_WRITE8_MEMBER( keylatch_w );
|
DECLARE_WRITE8_MEMBER( keylatch_w );
|
||||||
DECLARE_WRITE8_MEMBER( dispon_w );
|
DECLARE_WRITE8_MEMBER( dispon_w );
|
||||||
@ -308,7 +322,6 @@ private:
|
|||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER( cart_c00 );
|
|
||||||
DECLARE_WRITE8_MEMBER( dma_w );
|
DECLARE_WRITE8_MEMBER( dma_w );
|
||||||
DECLARE_READ_LINE_MEMBER( rdata_r );
|
DECLARE_READ_LINE_MEMBER( rdata_r );
|
||||||
DECLARE_READ_LINE_MEMBER( bdata_r );
|
DECLARE_READ_LINE_MEMBER( bdata_r );
|
||||||
@ -358,8 +371,7 @@ WRITE8_MEMBER( studio2_state::dispon_w )
|
|||||||
void studio2_state::studio2_map(address_map &map)
|
void studio2_state::studio2_map(address_map &map)
|
||||||
{
|
{
|
||||||
map.unmap_value_high();
|
map.unmap_value_high();
|
||||||
map(0x0000, 0x07ff).rom();
|
map(0x0000, 0x01ff).mirror(0xfc00).ram();
|
||||||
map(0x0800, 0x09ff).mirror(0xf400).ram();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void studio2_state::studio2_io_map(address_map &map)
|
void studio2_state::studio2_io_map(address_map &map)
|
||||||
@ -525,11 +537,10 @@ WRITE8_MEMBER( mpt02_state::dma_w )
|
|||||||
/* Machine Initialization */
|
/* Machine Initialization */
|
||||||
|
|
||||||
// trampolines to cartridge
|
// trampolines to cartridge
|
||||||
|
READ8_MEMBER( studio2_state::rom_000 ) { return m_rom[offset]; }
|
||||||
|
READ8_MEMBER( studio2_state::rom_400 ) { return m_rom[offset+0x400]; }
|
||||||
READ8_MEMBER( studio2_state::cart_400 ) { return m_cart->read_rom(offset); }
|
READ8_MEMBER( studio2_state::cart_400 ) { return m_cart->read_rom(offset); }
|
||||||
READ8_MEMBER( studio2_state::cart_a00 ) { return m_cart->read_rom(offset + 0x600); }
|
|
||||||
READ8_MEMBER( studio2_state::cart_c00 ) { return m_cart->read_rom(offset + 0x800); }
|
READ8_MEMBER( studio2_state::cart_c00 ) { return m_cart->read_rom(offset + 0x800); }
|
||||||
READ8_MEMBER( studio2_state::cart_e00 ) { return m_cart->read_rom(offset + 0xa00); }
|
|
||||||
READ8_MEMBER( mpt02_state::cart_c00 ) { return m_cart->read_rom(offset + 0x800); }
|
|
||||||
|
|
||||||
void visicom_state::machine_start()
|
void visicom_state::machine_start()
|
||||||
{
|
{
|
||||||
@ -539,14 +550,16 @@ void visicom_state::machine_start()
|
|||||||
|
|
||||||
void studio2_state::machine_start()
|
void studio2_state::machine_start()
|
||||||
{
|
{
|
||||||
|
m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x0000, 0x07ff);
|
||||||
|
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x03ff, read8_delegate(*this, FUNC(studio2_state::rom_000)));
|
||||||
|
|
||||||
if (m_cart->exists())
|
if (m_cart->exists())
|
||||||
{
|
{
|
||||||
// these have to be installed only if a cart is present, because they partially overlap the built-in game
|
// cart always overlaps the inbuilt game roms
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0400, 0x07ff, read8_delegate(*this, FUNC(studio2_state::cart_400)));
|
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0400, 0x07ff, read8_delegate(*this, FUNC(studio2_state::cart_400)));
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0a00, 0x0bff, read8_delegate(*this, FUNC(studio2_state::cart_a00)));
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0c00, 0x0dff, read8_delegate(*this, FUNC(studio2_state::cart_c00)));
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0e00, 0x0fff, read8_delegate(*this, FUNC(studio2_state::cart_e00)));
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0400, 0x07ff, read8_delegate(*this, FUNC(studio2_state::rom_400)));
|
||||||
|
|
||||||
// register for state saving
|
// register for state saving
|
||||||
save_item(NAME(m_keylatch));
|
save_item(NAME(m_keylatch));
|
||||||
@ -556,9 +569,8 @@ void mpt02_state::machine_start()
|
|||||||
{
|
{
|
||||||
if (m_cart->exists())
|
if (m_cart->exists())
|
||||||
{
|
{
|
||||||
// these have to be installed only if a cart is present, because they partially overlap the built-in game
|
// cart always overlaps the inbuilt game roms
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0400, 0x07ff, read8_delegate(*this, FUNC(studio2_state::cart_400)));
|
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0400, 0x07ff, read8_delegate(*this, FUNC(studio2_state::cart_400)));
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0c00, 0x0fff, read8_delegate(*this, FUNC(mpt02_state::cart_c00)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// register for state saving
|
// register for state saving
|
||||||
@ -631,6 +643,8 @@ DEVICE_IMAGE_LOAD_MEMBER( studio2_state::cart_load )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
logerror("ST2 Reading block %u to 0x%04x\n", block, offset);
|
logerror("ST2 Reading block %u to 0x%04x\n", block, offset);
|
||||||
|
if (pages[block] == 0xC)
|
||||||
|
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0c00, 0x0fff, read8_delegate(*this, FUNC(studio2_state::cart_c00)));
|
||||||
image.fread(m_cart->get_rom_base() + offset - 0x400, 0x100);
|
image.fread(m_cart->get_rom_base() + offset - 0x400, 0x100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -649,16 +663,14 @@ DEVICE_IMAGE_LOAD_MEMBER( studio2_state::cart_load )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Studio II carts might map their data at $400-$7ff, $a00-$bff and $e00-$fff
|
// Studio II and MPT-2 carts might map their data at $400-$7ff and $c00-$fff
|
||||||
// MPT-2 carts might map their data at $400-$7ff and $c00-$fff
|
|
||||||
if (image.get_software_region("rom_400"))
|
if (image.get_software_region("rom_400"))
|
||||||
memcpy(m_cart->get_rom_base() + 0x000, image.get_software_region("rom_400"), image.get_software_region_length("rom_400"));
|
memcpy(m_cart->get_rom_base() + 0x000, image.get_software_region("rom_400"), image.get_software_region_length("rom_400"));
|
||||||
if (image.get_software_region("rom_a00"))
|
|
||||||
memcpy(m_cart->get_rom_base() + 0x600, image.get_software_region("rom_a00"), image.get_software_region_length("rom_a00"));
|
|
||||||
if (image.get_software_region("rom_c00"))
|
if (image.get_software_region("rom_c00"))
|
||||||
|
{
|
||||||
|
m_maincpu->space(AS_PROGRAM).install_read_handler(0x0c00, 0x0fff, read8_delegate(*this, FUNC(studio2_state::cart_c00)));
|
||||||
memcpy(m_cart->get_rom_base() + 0x800, image.get_software_region("rom_c00"), image.get_software_region_length("rom_c00"));
|
memcpy(m_cart->get_rom_base() + 0x800, image.get_software_region("rom_c00"), image.get_software_region_length("rom_c00"));
|
||||||
if (image.get_software_region("rom_e00"))
|
}
|
||||||
memcpy(m_cart->get_rom_base() + 0xa00, image.get_software_region("rom_e00"), image.get_software_region_length("rom_e00"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return image_init_result::PASS;
|
return image_init_result::PASS;
|
||||||
|
Loading…
Reference in New Issue
Block a user