Merge pull request #612 from dlabi/master

Sord m5 driver update [Ales Dlabac]
added support for RAM expansions EM-5,64KBI,64KBF,64KRX
added m5p_brno mod Sord m5+1024kB ramdisk+cp/m
2 cart slots
This commit is contained in:
Miodrag Milanović 2016-02-08 18:42:21 +01:00
commit a880c4fce7
9 changed files with 1672 additions and 92 deletions

View File

@ -57,8 +57,8 @@ Learning Soft:
Programming Languages:
- FLAC
- FLAC-II
- FALC
- FALC-II
- BASIC-I
- BASIC-G
- BASIC-F
@ -97,7 +97,7 @@ and why some of the dumps below have weird size?
<info name="usage" value="Requires 36k RAM" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="tank battlaion (1980)(namco)(jp).bin" size="8192" crc="daa0d610" sha1="5867090fbe2584654dd2c2aaa215e69243f2f599" offset="00000" status="baddump" />
<rom name="tank battalion (1980)(namco)(jp).bin" size="8192" crc="daa0d610" sha1="5867090fbe2584654dd2c2aaa215e69243f2f599" offset="00000"/>
</dataarea>
</part>
</software>
@ -162,7 +162,7 @@ and why some of the dumps below have weird size?
<info name="alt_title" value="スーパーコブラ" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="super cobra (1981)(konami)(jp).bin" size="8192" crc="55cbd90b" sha1="d29f1d1d88a0b6738b68cf8d2406fbf1f05ba39b" offset="00000" status="baddump" />
<rom name="super cobra (1981)(konami)(jp).bin" size="8192" crc="55cbd90b" sha1="d29f1d1d88a0b6738b68cf8d2406fbf1f05ba39b" offset="00000"/>
</dataarea>
</part>
</software>
@ -232,14 +232,14 @@ and why some of the dumps below have weird size?
</software>
<software name="pooyana" cloneof="pooyan">
<description>Pooyan (Alt)</description>
<description>Pooyan (Alt)Modified version cooperating with 64kB RAM</description>
<year>1982</year>
<publisher>Konami</publisher>
<info name="serial" value="11" />
<info name="alt_title" value="プーヤン" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="pooyan (1982)(konami)(jp).bin" size="8192" crc="ded8b4f4" sha1="4c9e58e52d336b4c01a24e3ca2e62fb7757407fd" offset="00000" status="baddump" />
<rom name="pooyan (1982)(konami)(jp).bin" size="8192" crc="ded8b4f4" sha1="4c9e58e52d336b4c01a24e3ca2e62fb7757407fd" offset="00000"/>
</dataarea>
</part>
</software>
@ -252,7 +252,7 @@ and why some of the dumps below have weird size?
<info name="alt_title" value="ヘビーボクシング" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="heavy boxing (1983)(takara)(jp).bin" size="8192" crc="19540dce" sha1="388838ed501bcc3a9fd18e32488f13a6ce6a0689" offset="00000" status="baddump" />
<rom name="heavy boxing (1983)(takara)(jp).bin" size="8192" crc="19540dce" sha1="388838ed501bcc3a9fd18e32488f13a6ce6a0689" offset="00000"/>
</dataarea>
</part>
</software>
@ -265,7 +265,7 @@ and why some of the dumps below have weird size?
<info name="alt_title" value="リアルテニス" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="real tennis (1983)(takara)(jp).bin" size="8192" crc="ed80d6c9" sha1="03f3385b360c3573edab1fca53f82b4d6a4f8736" offset="00000" status="baddump" />
<rom name="real tennis (1983)(takara)(jp).bin" size="8192" crc="ed80d6c9" sha1="03f3385b360c3573edab1fca53f82b4d6a4f8736" offset="00000"/>
</dataarea>
</part>
</software>
@ -278,7 +278,7 @@ and why some of the dumps below have weird size?
<info name="alt_title" value="ワードメイズ" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="word maze (19xx)(sord)(jp).bin" size="8192" crc="fda88e0d" sha1="a0fbe727bfca773d3cc193eb7a9c77e7b418b0a2" offset="00000" status="baddump" />
<rom name="word maze (19xx)(sord)(jp).bin" size="8192" crc="fda88e0d" sha1="a0fbe727bfca773d3cc193eb7a9c77e7b418b0a2" offset="00000"/>
</dataarea>
</part>
</software>
@ -344,7 +344,7 @@ and why some of the dumps below have weird size?
<info name="alt_title" value="エスキモン" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="eskimon (1984)(takara)(jp).bin" size="8192" crc="96931021" sha1="115eee645e5213c16ad4a27bbeed5e2f3fa4be22" offset="00000" status="baddump" />
<rom name="eskimon (1984)(takara)(jp).bin" size="8192" crc="96931021" sha1="115eee645e5213c16ad4a27bbeed5e2f3fa4be22" offset="00000" />
</dataarea>
</part>
</software>
@ -357,7 +357,7 @@ and why some of the dumps below have weird size?
<info name="alt_title" value="ファニーマウス" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="funny mouse (1983)(takara)(jp).bin" size="8192" crc="94145074" sha1="43c2a1a5959ab8057c7d149472512a0c7996c798" offset="00000" status="baddump" />
<rom name="funny mouse (1983)(takara)(jp).bin" size="8192" crc="94145074" sha1="43c2a1a5959ab8057c7d149472512a0c7996c798" offset="00000" />
</dataarea>
</part>
</software>
@ -394,7 +394,7 @@ and why some of the dumps below have weird size?
<publisher>Takara</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="4096">
<rom name="dragon attack (1983)(takara)(jp).bin" size="4096" crc="5862d06c" sha1="f2707ad6dd564df01e7f81a21a00842e17cd49a4" offset="00000" status="baddump" />
<rom name="dragon attack (1983)(takara)(jp).bin" size="4096" crc="5862d06c" sha1="f2707ad6dd564df01e7f81a21a00842e17cd49a4" offset="00000" />
</dataarea>
</part>
</software>
@ -405,7 +405,7 @@ and why some of the dumps below have weird size?
<publisher>Takara</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="4096">
<rom name="fruit search (1983)(takara)(jp).bin" size="4096" crc="333ac50f" sha1="a838fbf0bc4513d3b6bcc3165f1eac33ca27d6fa" offset="00000" status="baddump" />
<rom name="fruit search (1983)(takara)(jp).bin" size="4096" crc="333ac50f" sha1="a838fbf0bc4513d3b6bcc3165f1eac33ca27d6fa" offset="00000"/>
</dataarea>
</part>
</software>
@ -431,7 +431,7 @@ and why some of the dumps below have weird size?
<publisher>Sord</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="20480">
<rom name="basic-f (198x)(sord)(jp).bin" size="20480" crc="47be051f" sha1="9942b8f05a441b5dee7ab31ec5b8a643f7e268b8" offset="00000" status="baddump" />
<rom name="basic-f (198x)(sord)(jp).bin" size="20480" crc="47be051f" sha1="9942b8f05a441b5dee7ab31ec5b8a643f7e268b8" offset="00000"/>
</dataarea>
</part>
</software>
@ -442,7 +442,7 @@ and why some of the dumps below have weird size?
<publisher>Sord</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="16384">
<rom name="basic-g (198x)(sord)(jp).bin" size="16384" crc="107b5ddc" sha1="071fa84c7b10d9d7841c504564825609ebf66140" offset="00000" status="baddump" />
<rom name="basic-g (198x)(sord)(jp).bin" size="16384" crc="107b5ddc" sha1="071fa84c7b10d9d7841c504564825609ebf66140" offset="00000"/>
</dataarea>
</part>
</software>
@ -453,7 +453,7 @@ and why some of the dumps below have weird size?
<publisher>Sord</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="basic-i (198x)(sord)(jp).bin" size="8192" crc="9a98e6ce" sha1="d11f7623919ee593e275e9f00f8a4acf7aed3cf5" offset="00000" status="baddump" />
<rom name="basic-i (198x)(sord)(jp).bin" size="8192" crc="9a98e6ce" sha1="d11f7623919ee593e275e9f00f8a4acf7aed3cf5" offset="00000"/>
</dataarea>
</part>
</software>
@ -465,7 +465,7 @@ and why some of the dumps below have weird size?
<info name="usage" value="Requires 36k RAM" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="16384">
<rom name="falc (198x)(sord)(jp).bin" size="16384" crc="78037f97" sha1="4cd917388a626d38dd8b16834c2e610d0ba6d505" offset="00000" status="baddump" />
<rom name="falc (198x)(sord)(jp).bin" size="16384" crc="78037f97" sha1="4cd917388a626d38dd8b16834c2e610d0ba6d505" offset="00000" />
</dataarea>
</part>
</software>
@ -476,32 +476,32 @@ and why some of the dumps below have weird size?
<publisher>Sord</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="16384">
<rom name="zzz-unk-pdesigne.bin" size="16384" crc="af987f7b" sha1="3a4cffc8d81a384f8bb2dfebf5e02cda1f0c7e21" offset="00000" status="baddump" />
<rom name="zzz-unk-pdesigner.bin" size="16384" crc="af987f7b" sha1="3a4cffc8d81a384f8bb2dfebf5e02cda1f0c7e21" offset="00000"/>
</dataarea>
</part>
</software>
<!-- Unidentified items -->
<software name="basicw">
<!-- is this legit?!? might it be Disk BASIC? -->
<!-- Modified Basic-F with floppy support(WD2797B) -->
<description>BASIC-W</description>
<year>198?</year>
<publisher>Sord?</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="20480">
<rom name="basic-w (198x)(sord)(jp).bin" size="20480" crc="2b1087cf" sha1="aa8d7c6c405e1360f074590abdc3d82df07cb564" offset="00000" status="baddump" />
<rom name="basic-w (198x)(sord)(jp).bin" size="20480" crc="2b1087cf" sha1="aa8d7c6c405e1360f074590abdc3d82df07cb564" offset="00000"/>
</dataarea>
</part>
</software>
<software name="m5term">
<!-- is this legit?!? might it be M-Editor? -->
<!-- Terminal for serial interface -->
<description>M5 Terminal</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="7168">
<rom name="m5 terminal (19xx)(-).bin" size="7168" crc="2b73c483" sha1="53c093d4c3c5ba990bf8673963f9ff529e99a252" offset="00000" status="baddump" />
<rom name="m5 terminal (19xx)(-).bin" size="7168" crc="2b73c483" sha1="53c093d4c3c5ba990bf8673963f9ff529e99a252" offset="00000" />
</dataarea>
</part>
</software>
@ -512,7 +512,7 @@ and why some of the dumps below have weird size?
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="4400">
<rom name="zac banic (19xx)(-).bin" size="4400" crc="fd421eea" sha1="6c3d5c15817617508de5f994c0a980ff6c6ca303" offset="00000" status="baddump" />
<rom name="zac banic (19xx)(-).bin" size="4400" crc="fd421eea" sha1="6c3d5c15817617508de5f994c0a980ff6c6ca303" offset="00000"/>
</dataarea>
</part>
</software>
@ -536,7 +536,7 @@ and why some of the dumps below have weird size?
<info name="usage" value="Requires 36k RAM" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="6176">
<rom name="drops (1986)(spc)(jp).bin" size="6176" crc="fa321348" sha1="e9a44e12eed9d51cdb40ce4b6f1cb19a1ebed35d" offset="00000" status="baddump" />
<rom name="drops (1986)(spc)(jp).bin" size="6176" crc="fa321348" sha1="e9a44e12eed9d51cdb40ce4b6f1cb19a1ebed35d" offset="00000" />
</dataarea>
</part>
</software>
@ -548,7 +548,7 @@ and why some of the dumps below have weird size?
<info name="usage" value="Requires 36k RAM" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="5920">
<rom name="jumping jack (1986)(spc)(jp).bin" size="5920" crc="49030973" sha1="c8716276fe6c4b0808078086f505efce1137afc9" offset="00000" status="baddump" />
<rom name="jumping jack (1986)(spc)(jp).bin" size="5920" crc="49030973" sha1="c8716276fe6c4b0808078086f505efce1137afc9" offset="00000"/>
</dataarea>
</part>
</software>
@ -560,7 +560,7 @@ and why some of the dumps below have weird size?
<info name="usage" value="Requires 36k RAM" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="12288">
<rom name="masterchess (19xx)(-).bin" size="12288" crc="c10a6e96" sha1="5dd24aae17c3a293ae91ef5086c1c4f3e59263ed" offset="00000" status="baddump" />
<rom name="masterchess (19xx)(-).bin" size="12288" crc="c10a6e96" sha1="5dd24aae17c3a293ae91ef5086c1c4f3e59263ed" offset="00000"/>
</dataarea>
</part>
</software>
@ -572,7 +572,7 @@ and why some of the dumps below have weird size?
<info name="usage" value="Requires 36k RAM" />
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="6392">
<rom name="reversi (19xx)(games of skill).bin" size="6392" crc="ca2cd257" sha1="a048a1055d175ace09155e50da0387986e150f92" offset="00000" status="baddump" />
<rom name="reversi (19xx)(games of skill).bin" size="6392" crc="ca2cd257" sha1="a048a1055d175ace09155e50da0387986e150f92" offset="00000" />
</dataarea>
</part>
</software>
@ -580,11 +580,10 @@ and why some of the dumps below have weird size?
<!-- these come from TOSEC: they do not work and it's not clear where they
come from... they might be eventually removed -->
<!-- the first contains Czech text strings so it might be a real Czech cart,
but we need more info -->
<!-- Actualy this is wordmaze translated into Czech 1990 by ROS-->
<software name="unk_maze" supported="no">
<description>Unknown CSMAZE</description>
<year>19??</year>
<year>1983</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8448">
@ -606,4 +605,88 @@ but we need more info -->
</part>
</software>
<!-- This is only Sord memory expansion -->
<software name="em-5" supported="no">
<description>EM-5 Expansion memory 32Kb</description>
<year>198?</year>
<publisher>Sord</publisher>
<part name="cart" interface="m5_cart">
<feature name="slot" value="ram"/>
<dataarea name="ram" size="32768">
</dataarea>
</part>
</software>
<!-- Homebrew memory modules -->
<software name="64kbi" supported="no">
<description>EM-64 Expansion memory 64Kb</description>
<year>198?</year>
<publisher>unknown</publisher>
<part name="cart" interface="m5_cart">
<feature name="slot" value="ram"/>
<dataarea name="ram" size="65536">
</dataarea>
</part>
</software>
<software name="64kbf" supported="no">
<description>64Kbf Expansion memory 64Kb</description>
<year>199?</year>
<publisher>unknown</publisher>
<part name="cart" interface="m5_cart">
<feature name="slot" value="ram"/>
<dataarea name="ram" size="65536">
</dataarea>
<dataarea name="rom" size="20480">
<rom name="basic-f (198x)(sord)(jp).bin" size="20480" crc="47be051f" sha1="9942b8f05a441b5dee7ab31ec5b8a643f7e268b8" offset="00000"/>
</dataarea>
</part>
</software>
<software name="64krx" supported="no">
<description>64Krx Expansion board 64Kb</description>
<year>199?</year>
<publisher>unknown</publisher>
<part name="cart" interface="m5_cart">
<feature name="slot" value="ram"/>
<dataarea name="ram" size="65536">
</dataarea>
<dataarea name="rom" size="0x16000">
<rom name="krx_rom2.rom" size="0x2000" crc="5AF18FBD" sha1="cd67d65fb51cdb3a47cc8350a878a77360a353c8" offset="0x0000"/>
<rom name="basic-i (198x)(sord)(jp).bin" size="0x2000" crc="9a98e6ce" sha1="d11f7623919ee593e275e9f00f8a4acf7aed3cf5" offset="0x2000"/>
<rom name="krx_rom4.rom" size="0x4000" crc="27FFB883" sha1="be930946e7cd5f0f3e803792906e087cce122703" offset="0x6000"/>
<rom name="krx_rom5.rom" size="0x4000" crc="107B5DDC" sha1="071fa84c7b10d9d7841c504564825609ebf66140" offset="0xa000"/>
<rom name="krx_rom6.rom" size="0x4000" crc="4D6E9C1A" sha1="d8bf96fc4016e245fd84d713fd988dd503a38d0b" offset="0xe000"/>
<rom name="krx_rom7.rom" size="0x4000" crc="4EF7830A" sha1="9527236af9dd0db25498f4029793703ba8672af5" offset="0x12000"/>
</dataarea>
</part>
</software>
<!-- Brno mod ROMs -->
<software name="brno_boot" supported="no">
<description>Boot for Brno ramdisk</description>
<year>1989</year>
<publisher>&lt;Pavel Brychta a spol.&gt;</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="3456">
<rom name="brno_boot.rom" size="3456" crc="60008729" sha1="FB26E2AE9F74B0AE0D723B417A038A8EF3D72782" offset="00000"/>
</dataarea>
</part>
</software>
<software name="brno_win" supported="no">
<description>Brno windows boot</description>
<year>1989</year>
<publisher>&lt;Ladislav Novak&gt;</publisher>
<part name="cart" interface="m5_cart">
<dataarea name="rom" size="8192">
<rom name="brno_win.rom" size="8192" crc="f4cfb2ee" sha1="23f41d2d9ac915545409dd0163f3dc298f04eea2" offset="00000"/>
</dataarea>
</part>
</software>
</softwarelist>

16
hash/m5_flop.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="m5_flop" description="Sord m5 diskettes">
<software name="bb">
<description>Booting diskette for CP/M.[Brno mod]</description>
<year>1989</year>
<publisher></publisher>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="860416">
<rom name="brno_boot_cpm.dsk" size="860416" crc="dabb3256" sha1="61a5d638f6166e09d3bbbb12b653f6bf3fb2393f" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -0,0 +1,63 @@
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
/***********************************************************************************************************
M5 cart emulation
***********************************************************************************************************/
#include "emu.h"
#include "rom.h"
//-------------------------------------------------
// m5_rom_device - constructor
//-------------------------------------------------
const device_type M5_ROM_STD = &device_creator<m5_rom_device>;
const device_type M5_ROM_RAM = &device_creator<m5_ram_device>;
m5_rom_device::m5_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
: device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_m5_cart_interface( mconfig, *this )
{
}
m5_rom_device::m5_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, M5_ROM_STD, "M5 Standard ROM Carts", tag, owner, clock, "m5_rom", __FILE__),
device_m5_cart_interface( mconfig, *this )
{
}
m5_ram_device::m5_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: m5_rom_device(mconfig, M5_ROM_RAM, "M5 Expansion memory cart", tag, owner, clock, "m5_ram", __FILE__)
{
}
/*-------------------------------------------------
mapper specific handlers
-------------------------------------------------*/
READ8_MEMBER(m5_rom_device::read_rom)
{
if (offset < m_rom_size)
return m_rom[offset];
else
return 0xff;
}
READ8_MEMBER(m5_ram_device::read_ram)
{
return m_ram[offset];
}
WRITE8_MEMBER(m5_ram_device::write_ram)
{
m_ram[offset] = data;
}

50
src/devices/bus/m5/rom.h Normal file
View File

@ -0,0 +1,50 @@
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
#ifndef __M5_ROM_H
#define __M5_ROM_H
#include "slot.h"
// ======================> m5_rom_device
class m5_rom_device : public device_t,
public device_m5_cart_interface
{
public:
// construction/destruction
m5_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
m5_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device-level overrides
virtual void device_start() {}
virtual void device_reset() {}
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
};
// ======================> m5_ram_device
class m5_ram_device : public m5_rom_device
{
public:
// construction/destruction
m5_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// device-level overrides
virtual void device_start() {}
virtual void device_reset() {}
// reading and writing
virtual DECLARE_READ8_MEMBER(read_ram);
virtual DECLARE_WRITE8_MEMBER(write_ram);
};
// device type definition
extern const device_type M5_ROM_STD;
extern const device_type M5_ROM_RAM;
#endif

275
src/devices/bus/m5/slot.cpp Normal file
View File

@ -0,0 +1,275 @@
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
/***********************************************************************************************************
M5 cart emulation
(through slot devices)
***********************************************************************************************************/
#include "emu.h"
#include "slot.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
const device_type M5_CART_SLOT = &device_creator<m5_cart_slot_device>;
//**************************************************************************
// M5 Cartridges Interface
//**************************************************************************
//-------------------------------------------------
// device_m5_cart_interface - constructor
//-------------------------------------------------
device_m5_cart_interface::device_m5_cart_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device),
m_rom(NULL),
m_rom_size(0)
{
}
//-------------------------------------------------
// ~device_m5_cart_interface - destructor
//-------------------------------------------------
device_m5_cart_interface::~device_m5_cart_interface()
{
}
//-------------------------------------------------
// rom_alloc - alloc the space for the cart
//-------------------------------------------------
void device_m5_cart_interface::rom_alloc(UINT32 size, const char *tag)
{
if (m_rom == NULL)
{
m_rom = device().machine().memory().region_alloc(std::string(tag).append(M5SLOT_ROM_REGION_TAG).c_str(), size, 1, ENDIANNESS_LITTLE)->base();
m_rom_size = size;
}
}
//-------------------------------------------------
// ram_alloc - alloc the space for the ram
//-------------------------------------------------
void device_m5_cart_interface::ram_alloc(UINT32 size)
{
m_ram.resize(size);
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// m5_cart_slot_device - constructor
//-------------------------------------------------
m5_cart_slot_device::m5_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, M5_CART_SLOT, "M5 Cartridge Slot", tag, owner, clock, "m5_cart_slot", __FILE__),
device_image_interface(mconfig, *this),
device_slot_interface(mconfig, *this),
m_type(M5_STD), m_cart(nullptr)
{
}
//-------------------------------------------------
// m5_cart_slot_device - destructor
//-------------------------------------------------
m5_cart_slot_device::~m5_cart_slot_device()
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void m5_cart_slot_device::device_start()
{
m_cart = dynamic_cast<device_m5_cart_interface *>(get_card_device());
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void m5_cart_slot_device::device_config_complete()
{
// set brief and instance name
update_names();
}
//-------------------------------------------------
// M5 PCB
//-------------------------------------------------
struct m5_slot
{
int pcb_id;
const char *slot_option;
};
// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it
static const m5_slot slot_list[] =
{
{EM_5,"em-5"},
{MEM64KBI,"64kbi"},
{MEM64KBF,"64kbf"},
{MEM64KRX,"64krx"}
};
static int m5_get_pcb_id(const char *slot)
{
for (int i = 0; i < ARRAY_LENGTH(slot_list); i++)
{
if (!core_stricmp(slot_list[i].slot_option, slot))
return slot_list[i].pcb_id;
}
return 0;
}
static const char *m5_get_slot(int type)
{
for (int i = 0; i < ARRAY_LENGTH(slot_list); i++)
{
if (slot_list[i].pcb_id == type)
return slot_list[i].slot_option;
}
return "std";
}
/*-------------------------------------------------
call load
-------------------------------------------------*/
bool m5_cart_slot_device::call_load()
{
if (m_cart)
{
m_type=M5_STD;
if (software_entry() != NULL)
{
const char *pcb_name = get_feature("slot");
//software_info *name=m_software_info_ptr;
if (pcb_name) //is it ram cart?
m_type = m5_get_pcb_id(m_full_software_name.c_str());
else
m_type=M5_STD; //standard cart(no feature line in xml)
}
if (m_type == M5_STD || m_type>2) //carts with roms
{
UINT32 size = (software_entry() == NULL) ? length() : get_software_region_length("rom");
if (size > 0x5000 && m_type == M5_STD)
{
seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an M5 cart");
return IMAGE_INIT_FAIL;
}
m_cart->rom_alloc(size, tag());
if (software_entry() == NULL)
fread(m_cart->get_rom_base(), size);
else
memcpy(m_cart->get_rom_base(), get_software_region("rom"), size);
}
if (!M5_STD)
if (get_software_region("ram"))
m_cart->ram_alloc(get_software_region_length("ram"));
//printf("Type: %s\n", m5_get_slot(m_type));
}
return IMAGE_INIT_PASS;
}
/*-------------------------------------------------
call softlist load
-------------------------------------------------*/
bool m5_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry)
{
load_software_part_region(*this, swlist, swname, start_entry);
return TRUE;
}
/*-------------------------------------------------
get default card software
-------------------------------------------------*/
void m5_cart_slot_device::get_default_card_software(std::string &result)
{
if (open_image_file(mconfig().options()))
{
const char *slot_string = "std";
UINT32 size = core_fsize(m_file);
int type = M5_STD;
slot_string = m5_get_slot(type);
//printf("type: %s\n", slot_string);
clear();
result.assign(slot_string);
return;
}
software_get_default_slot(result, "std");
}
/*-------------------------------------------------
read
-------------------------------------------------*/
READ8_MEMBER(m5_cart_slot_device::read_rom)
{
if (m_cart)
return m_cart->read_rom(space, offset);
else
return 0xff;
}
/*-------------------------------------------------
read
-------------------------------------------------*/
READ8_MEMBER(m5_cart_slot_device::read_ram)
{
if (m_cart)
return m_cart->read_ram(space, offset);
else
return 0xff;
}
/*-------------------------------------------------
write
-------------------------------------------------*/
WRITE8_MEMBER(m5_cart_slot_device::write_ram)
{
if (m_cart)
m_cart->write_ram(space, offset, data);
}

119
src/devices/bus/m5/slot.h Normal file
View File

@ -0,0 +1,119 @@
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
#ifndef __M5_SLOT_H
#define __M5_SLOT_H
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
/* PCB */
enum
{
EM_5 = 1,
MEM64KBI,
MEM64KBF,
MEM64KRX
};
#define M5_STD 0
// ======================> device_m5_cart_interface
class device_m5_cart_interface : public device_slot_card_interface
{
public:
// construction/destruction
device_m5_cart_interface(const machine_config &mconfig, device_t &device);
virtual ~device_m5_cart_interface();
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write_ram) {}
void rom_alloc(UINT32 size, const char *tag);
void ram_alloc(UINT32 size);
UINT8* get_rom_base() { return m_rom; }
UINT8* get_ram_base() { return &m_ram[0]; }
UINT32 get_rom_size() { return m_rom_size; }
UINT32 get_ram_size() { return m_ram.size(); }
void save_ram() { device().save_item(NAME(m_ram)); }
protected:
// internal state
UINT8 *m_rom;
UINT32 m_rom_size;
dynamic_buffer m_ram;
};
// ======================> m5_cart_slot_device
class m5_cart_slot_device : public device_t,
public device_image_interface,
public device_slot_interface
{
public:
// construction/destruction
m5_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~m5_cart_slot_device();
// device-level overrides
virtual void device_start();
virtual void device_config_complete();
// image-level overrides
virtual bool call_load();
virtual void call_unload() {}
virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry);
int get_type() { return m_type; }
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
virtual bool is_readable() const { return 1; }
virtual bool is_writeable() const { return 0; }
virtual bool is_creatable() const { return 0; }
virtual bool must_be_loaded() const { return 0; }
virtual bool is_reset_on_load() const { return 1; }
virtual const option_guide *create_option_guide() const { return NULL; }
virtual const char *image_interface() const { return "m5_cart"; }
virtual const char *file_extensions() const { return "bin,rom"; }
// slot interface overrides
virtual void get_default_card_software(std::string &result);
// reading and writing
virtual DECLARE_READ8_MEMBER(read_rom);
virtual DECLARE_READ8_MEMBER(read_ram);
virtual DECLARE_WRITE8_MEMBER(write_ram);
virtual DECLARE_SETOFFSET_MEMBER (read_off);
protected:
int m_type;
device_m5_cart_interface* m_cart;
};
// device type definition
extern const device_type M5_CART_SLOT;
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define M5SLOT_ROM_REGION_TAG ":cart:rom"
#define MCFG_M5_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
MCFG_DEVICE_ADD(_tag, M5_CART_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
// copyright-holders:Curt Coder, Ales Dlabac
#ifndef __M5__
#define __M5__
#include "machine/z80ctc.h"
#include "imagedev/snapquik.h"
#define Z80_TAG "ic17"
#define Z80CTC_TAG "ic19"
@ -15,6 +18,10 @@
#define UPD765_TAG "upd765"
#define CENTRONICS_TAG "centronics"
#define SCREEN_TAG "screen"
//brno mod
#define WD2797_TAG "5f"
#define RAMDISK "ramdisk"
class m5_state : public driver_device
{
@ -22,36 +29,40 @@ public:
m5_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, Z80_TAG),
m_fd5cpu(*this, Z80_FD5_TAG),
m_ctc(*this, Z80CTC_TAG),
m_fd5cpu(*this, Z80_FD5_TAG),
m_ppi(*this, I8255A_TAG),
m_fdc(*this, UPD765_TAG),
m_floppy0(*this, UPD765_TAG ":0:525dd"),
m_cassette(*this, "cassette"),
m_cart(*this, "cartslot"),
m_cart1(*this, "cartslot1"),
m_cart2(*this, "cartslot2"),
m_centronics(*this, CENTRONICS_TAG),
m_ram(*this, RAM_TAG),
m_floppy0(*this, UPD765_TAG ":0:525dd"),
m_reset(*this, "RESET")
m_reset(*this, "RESET"),
m_DIPS(*this, "DIPS")
{ }
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_fd5cpu;
required_device<z80ctc_device> m_ctc;
required_device<i8255_device> m_ppi;
required_device<upd765a_device> m_fdc;
//I've changed following devices to optional since we have to remove them in BRNO mod (I don't know better solution)
optional_device<cpu_device> m_fd5cpu;
optional_device<i8255_device> m_ppi;
optional_device<upd765a_device> m_fdc;
optional_device<floppy_image_device> m_floppy0;
required_device<cassette_image_device> m_cassette;
required_device<generic_slot_device> m_cart;
optional_device<m5_cart_slot_device> m_cart1;
optional_device<m5_cart_slot_device> m_cart2;
required_device<centronics_device> m_centronics;
required_device<ram_device> m_ram;
required_device<floppy_image_device> m_floppy0;
required_ioport m_reset;
optional_ioport m_DIPS;
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void machine_start();
virtual void machine_reset();
DECLARE_READ8_MEMBER( sts_r );
DECLARE_WRITE8_MEMBER( com_w );
DECLARE_READ8_MEMBER( ppi_pa_r );
DECLARE_WRITE8_MEMBER( ppi_pa_w );
DECLARE_WRITE8_MEMBER( ppi_pb_w );
@ -65,23 +76,90 @@ public:
DECLARE_WRITE8_MEMBER( fd5_ctrl_w );
DECLARE_WRITE8_MEMBER( fd5_tc_w );
DECLARE_FLOPPY_FORMATS( floppy_formats );
// video state
// const TMS9928a_interface *m_vdp_intf;
int m_centronics_busy;
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
// floppy state
DECLARE_DRIVER_INIT(pal);
DECLARE_DRIVER_INIT(ntsc);
DECLARE_WRITE_LINE_MEMBER(sordm5_video_interrupt_callback);
// memory
DECLARE_READ8_MEMBER( mem64KBI_r );
DECLARE_WRITE8_MEMBER( mem64KBI_w );
DECLARE_WRITE8_MEMBER( mem64KBF_w );
DECLARE_WRITE8_MEMBER( mem64KRX_w );
UINT8 m_ram_mode;
UINT8 m_ram_type;
memory_region *m_cart_rom;
m5_cart_slot_device *m_cart_ram, *m_cart;
// floppy state for fd5
UINT8 m_fd5_data;
UINT8 m_fd5_com;
int m_intra;
int m_ibfa;
int m_obfa;
DECLARE_DRIVER_INIT(pal);
DECLARE_DRIVER_INIT(ntsc);
DECLARE_WRITE_LINE_MEMBER(sordm5_video_interrupt_callback);
};
class brno_state : public m5_state
{
public:
brno_state(const machine_config &mconfig, device_type type, const char *tag)
: m5_state(mconfig, type, tag),
m_fdc(*this, WD2797_TAG),
m_floppy0(*this, WD2797_TAG":0"),
m_floppy1(*this, WD2797_TAG":1")
// m_ramdisk(*this, RAMDISK)
{ }
required_device<wd2797_t> m_fdc;
required_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
floppy_image_device *m_floppy;
DECLARE_READ8_MEMBER( mmu_r );
DECLARE_WRITE8_MEMBER( mmu_w );
DECLARE_READ8_MEMBER( ramsel_r );
DECLARE_WRITE8_MEMBER(ramsel_w );
DECLARE_READ8_MEMBER( romsel_r );
DECLARE_WRITE8_MEMBER(romsel_w );
DECLARE_READ8_MEMBER( fd_r );
DECLARE_WRITE8_MEMBER( fd_w );
DECLARE_FLOPPY_FORMATS( floppy_formats );
// DECLARE_WRITE_LINE_MEMBER( wd2797_intrq_w );
// DECLARE_WRITE_LINE_MEMBER( wd2797_drq_w );
// DECLARE_WRITE_LINE_MEMBER( wd2797_index_callback);
//required_device<ram_device> m_ramdisk;
DECLARE_DRIVER_INIT(brno);
DECLARE_SNAPSHOT_LOAD_MEMBER( brno );
// DECLARE_DEVICE_IMAGE_LOAD_MEMBER(m5_cart);
virtual void machine_start();
virtual void machine_reset();
UINT8 m_rambank; // bank #
UINT8 m_ramcpu; //where Ramdisk bank is mapped
bool m_romen;
bool m_ramen;
UINT8 m_rammap[16]; // memory map
};
#endif

View File

@ -1153,6 +1153,7 @@ jupace // Jupiter Ace
// Sord
m5
m5p
m5p_brno
// APF Electronics Inc.
apfm1000