summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitattributes8
-rw-r--r--hash/crvision.xml40
-rw-r--r--hash/vectrex.xml45
-rw-r--r--src/emu/bus/bus.mak24
-rw-r--r--src/emu/bus/crvision/rom.c138
-rw-r--r--src/emu/bus/crvision/rom.h114
-rw-r--r--src/emu/bus/crvision/slot.c296
-rw-r--r--src/emu/bus/crvision/slot.h107
-rw-r--r--src/emu/bus/vectrex/rom.c86
-rw-r--r--src/emu/bus/vectrex/rom.h65
-rw-r--r--src/emu/bus/vectrex/slot.c280
-rw-r--r--src/emu/bus/vectrex/slot.h114
-rw-r--r--src/mame/drivers/vectrex.c30
-rw-r--r--src/mame/includes/vectrex.h10
-rw-r--r--src/mame/machine/vectrex.c116
-rw-r--r--src/mame/mame.mak9
-rw-r--r--src/mame/video/vectrex.c6
-rw-r--r--src/mess/drivers/crvision.c148
-rw-r--r--src/mess/includes/crvision.h6
-rw-r--r--src/mess/mess.mak2
20 files changed, 1423 insertions, 221 deletions
diff --git a/.gitattributes b/.gitattributes
index 0dd0c89a4a2..371162cf5b4 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -850,6 +850,10 @@ src/emu/bus/cpc/mface2.c svneol=native#text/plain
src/emu/bus/cpc/mface2.h svneol=native#text/plain
src/emu/bus/cpc/symbfac2.c svneol=native#text/plain
src/emu/bus/cpc/symbfac2.h svneol=native#text/plain
+src/emu/bus/crvision/rom.c svneol=native#text/plain
+src/emu/bus/crvision/rom.h svneol=native#text/plain
+src/emu/bus/crvision/slot.c svneol=native#text/plain
+src/emu/bus/crvision/slot.h svneol=native#text/plain
src/emu/bus/dmv/dmvbus.c svneol=native#text/plain
src/emu/bus/dmv/dmvbus.h svneol=native#text/plain
src/emu/bus/dmv/k220.c svneol=native#text/plain
@@ -1649,6 +1653,10 @@ src/emu/bus/vcs_ctrl/paddles.c svneol=native#text/plain
src/emu/bus/vcs_ctrl/paddles.h svneol=native#text/plain
src/emu/bus/vcs_ctrl/wheel.c svneol=native#text/plain
src/emu/bus/vcs_ctrl/wheel.h svneol=native#text/plain
+src/emu/bus/vectrex/rom.c svneol=native#text/plain
+src/emu/bus/vectrex/rom.h svneol=native#text/plain
+src/emu/bus/vectrex/slot.c svneol=native#text/plain
+src/emu/bus/vectrex/slot.h svneol=native#text/plain
src/emu/bus/vic10/exp.c svneol=native#text/plain
src/emu/bus/vic10/exp.h svneol=native#text/plain
src/emu/bus/vic10/std.c svneol=native#text/plain
diff --git a/hash/crvision.xml b/hash/crvision.xml
index 5da662aa08a..e561a2197cb 100644
--- a/hash/crvision.xml
+++ b/hash/crvision.xml
@@ -37,6 +37,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8008" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom4k" />
<dataarea name="rom" size="4096">
<rom name="airsea.bin" size="4096" crc="81a9257d" sha1="1fbc52f335c0d8bb96578a6ba764f5631c41fd36" offset="000000" />
</dataarea>
@@ -49,6 +50,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8014" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="astropin.bin" size="8192" crc="d03c0603" sha1="e7cb096d4d16fd8193f7e39c2f73bdf0930c9654" offset="000000" />
</dataarea>
@@ -61,6 +63,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8014" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="astropina_01.bin" size="4096" crc="93794d02" sha1="922152e70d614180d7e5614d61c5ced913ecfcd3" offset="0x0000" />
<rom name="astropina_02.bin" size="4096" crc="aacba2e2" sha1="cf2fffe9ca93e1935efba5d264471b1a0b792971" offset="0x1000" />
@@ -77,6 +80,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8014" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="astropinb.bin" size="8192" crc="cf7bdfc2" sha1="38bcc856d604567dc6453205a8f858bdf2000330" offset="000000" />
</dataarea>
@@ -89,6 +93,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8006" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="autochas.bin" size="8192" crc="bd091ee0" sha1="369dc9aa55dd2c09376be840f8ebeca450db8b9c" offset="000000" />
</dataarea>
@@ -101,6 +106,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8006" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="autochas_01.bin" size="4096" crc="fad237b9" sha1="7762d1b5e12bdc5f32157e6ea820da3566b2c3cd" offset="0x0000" />
<rom name="autochas_02.bin" size="4096" crc="bebde090" sha1="b8af1085bdb47bcc8cf9e667313ab3bcf4cc99ea" offset="0x1000" />
@@ -115,6 +121,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom12k" />
<dataarea name="rom" size="12288">
<rom name="basic82a_01.bin" size="4096" crc="9b2aeef8" sha1="73950bf03abc8f6646a8d283e12760de453eddf2" offset="0x0000" />
<rom name="basic82a_02.bin" size="4096" crc="d713b2d1" sha1="e1af1debb8a05f38aaf14dc79cacbc713f02e6fd" offset="0x1000" />
@@ -129,6 +136,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom12k" />
<dataarea name="rom" size="12288">
<rom name="basic82b_01.bin" size="4096" crc="5ee092d0" sha1="c02b0a7e81a2f43a704376381c167b7c6632119c" offset="0x0000" />
<rom name="basic82b_02.bin" size="4096" crc="19a12d7e" sha1="181c27465e7e2da58e7432eaa0ae03e186b6c365" offset="0x1000" />
@@ -143,6 +151,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom12k" />
<dataarea name="rom" size="12288">
<rom name="basic83_01.bin" size="8192" crc="3ce2a7ca" sha1="f2171867767d0b658eea0b072aa1891869073bb9" offset="0x0000" />
<rom name="basic83_02.bin" size="4096" crc="40f388b9" sha1="989a54e92768baae81cd179808adf1f9943212ee" offset="0x2000" />
@@ -156,6 +165,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8011" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom12k" />
<dataarea name="rom" size="12288">
<rom name="basicram_01.bin" size="4096" crc="5ee092d0" sha1="c02b0a7e81a2f43a704376381c167b7c6632119c" offset="0x0000" />
<rom name="basicram_02.bin" size="4096" crc="76e661db" sha1="ad0aff12c7bee9dd4f256942614b7e99586698f5" offset="0x1000" />
@@ -170,6 +180,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8021" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom18k" />
<dataarea name="rom" size="18432">
<rom name="chopper_01.bin" size="8192" crc="23a6bb47" sha1="748e4c98ed419999063edfe98f26f9e86c877962" offset="0x0000" />
<rom name="chopper_02.bin" size="8192" crc="3980d7ed" sha1="abac0f2a0b73ab5c45e1a617f7c862408086eb66" offset="0x2000" />
@@ -184,6 +195,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8001" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom4k" />
<dataarea name="rom" size="4096">
<rom name="crazych.bin" size="4096" crc="b1b5bfe5" sha1="c0eed370267644d142a42de6201f7ac6d275104d" offset="000000" />
</dataarea>
@@ -196,6 +208,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8001" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom4k" />
<dataarea name="rom" size="4096">
<rom name="crazypuc.bin" size="4096" crc="c673be37" sha1="0762ba98e9a08b7e6063e2a54734becd83df6eb3" offset="000000" />
</dataarea>
@@ -208,6 +221,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8013" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom6k" />
<dataarea name="rom" size="6144">
<rom name="deeps6k_01.bin" size="4096" crc="5112b792" sha1="af917b6ab438b87cde5325d27ccf94c4544c4c9e" offset="0x0000" />
<rom name="deeps6k_02.bin" size="2048" crc="2410042a" sha1="e3813c79b8e504f10d6bfc8a6d39ea284fbc26b6" offset="0x1000" />
@@ -221,6 +235,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8013" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="deeps8k.bin" size="8192" crc="2e0ddd86" sha1="d25f82aab473d4c7850ab626ae92d1eac69dbb32" offset="000000" />
</dataarea>
@@ -233,6 +248,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8020" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom10k" />
<dataarea name="rom" size="10240">
<rom name="locom10k_01.bin" size="8192" crc="5d2e1c6e" sha1="f327434889ac91397c61cdacb88d21cd0df256ce" offset="0x0000" />
<rom name="locom10k_02.bin" size="2048" crc="a4e5c224" sha1="ffa0fcb1fa524ee51e63017412007881a50b8971" offset="0x2000" />
@@ -246,6 +262,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8020" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom12k" />
<dataarea name="rom" size="12288">
<rom name="locom12k_01.bin" size="8192" crc="5d2e1c6e" sha1="f327434889ac91397c61cdacb88d21cd0df256ce" offset="0x0000" />
<rom name="locom12k_02.bin" size="4096" crc="62c6b8e0" sha1="2ebf87eaf6a60bc0d79020a20360916a2c1f0f80" offset="0x2000" />
@@ -259,6 +276,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8015" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="mousepuz.bin" size="8192" crc="e954c46b" sha1="c3aa8077756a6101009645711687edd59bf90a98" offset="000000" />
</dataarea>
@@ -271,6 +289,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8015" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="mousepuza_01.bin" size="4096" crc="42fa1f8b" sha1="d8da4361cd2c3eb87abb41c4a05ee5136ac1b8b0" offset="0x0000" />
<rom name="mousepuza_02.bin" size="4096" crc="09f79bd9" sha1="8325d9b017eab11e24c637599961736b6c25e24e" offset="0x1000" />
@@ -284,6 +303,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8016" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom12k" />
<dataarea name="rom" size="12288">
<rom name="musicmak_01.bin" size="8192" crc="47ac1882" sha1="bdf343bff5436a4b91ffad20971c3b1c05711307" offset="0x0000" />
<rom name="musicmak_02.bin" size="4096" crc="e8caa6d2" sha1="9d3d95e18416fbe0ab30b7d5e3e2518b6a520323" offset="0x2000" />
@@ -297,6 +317,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8005" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom6k" />
<dataarea name="rom" size="6144">
<rom name="planetd_01.bin" size="4096" crc="71cffcdd" sha1="cd72a22d44c9a4be2346847b8ef6e32d929533ae" offset="0x0000" />
<rom name="planetd_02.bin" size="2048" crc="734528a9" sha1="39772785538bb7ee061c9bcaa14768328d45674d" offset="0x1000" />
@@ -310,6 +331,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8005" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="planet8k.bin" size="8192" crc="4457c7b3" sha1="0be7935db55ecf3e70b96e071ecbc489bd22dc73" offset="000000" />
</dataarea>
@@ -321,6 +343,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<year>1981</year>
<publisher>Video Technology Ltd.</publisher>
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="planetd2.bin" size="8192" crc="4b463c18" sha1="1fd80a3921f2487d9eee2b6d8bb3955d22857d0e" offset="000000" />
</dataarea>
@@ -333,6 +356,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8009" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="policej.bin" size="8192" crc="db3d50b2" sha1="0fe6d15c973c73b53c33945e213bc2671ff5d7df" offset="000000" />
</dataarea>
@@ -345,6 +369,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8009" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="policej_01.bin" size="4096" crc="c6c4e3f4" sha1="8d4f056f77d79b0a9a76d14772f76a0b81b526c6" offset="0x0000" />
<rom name="policej_02.bin" size="4096" crc="bd48d4dc" sha1="20e11659285172e6579d57d6a1a769818762c856" offset="0x1000" />
@@ -358,6 +383,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8009" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<!-- Apparently, even internally to V-Tech this Donkey Kong clone was acknowledged as such ;-) -->
<rom name="dk a.bin" size="4096" crc="3033cafe" sha1="a626fd7e1e117d4dba8770f7ac3f85886a6d7022" offset="0x0000" />
@@ -372,6 +398,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8017" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom12k" />
<dataarea name="rom" size="12288">
<rom name="soccer_01.bin" size="8192" crc="9247087c" sha1="3fe1364024895f8f0e83235a429f884a8831553e" offset="0x0000" />
<rom name="soccer_02.bin" size="4096" crc="de284150" sha1="a07befd3a2b1689b2d493ab84928d3aa109f88e6" offset="0x2000" />
@@ -385,6 +412,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8003" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom4k" />
<dataarea name="rom" size="4096">
<rom name="sonicinv.bin" size="4096" crc="767a1f38" sha1="d77f49bfa951ce0ba505ad4f05f3d0adb697811f" offset="000000" />
</dataarea>
@@ -396,6 +424,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<year>1984</year>
<publisher>Video Technology Ltd.</publisher>
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="stoneage.bin" size="8192" crc="74365e94" sha1="dafe57b0ea5da7431bd5b0393bae7cf256c9a562" offset="000000" />
</dataarea>
@@ -408,6 +437,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8002" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom6k" />
<dataarea name="rom" size="6144">
<rom name="tankatk_01.bin" size="4096" crc="3bd183ff" sha1="c5b7c59ea282238550acd5055fb197aa83163eea" offset="0x0000" />
<rom name="tankatk_02.bin" size="2048" crc="114a3a00" sha1="54a7ae46ab79109cbda7401204e3cec13a0b6152" offset="0x1000" />
@@ -421,6 +451,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8002" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="tankat8k.bin" size="8192" crc="2621ffca" sha1="f3c69a848f1246faf6f9558c0badddd3db626e5f" offset="000000" />
</dataarea>
@@ -433,6 +464,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom6k" />
<dataarea name="rom" size="6144">
<rom name="tens6k_01.bin" size="4096" crc="42d5be57" sha1="e8ddc68c418f43dacc9170c335bd66bd7802821c" offset="0x0000" />
<rom name="tens6k_02.bin" size="2048" crc="9fac0db1" sha1="ecfb92eb58f916d5b5520bb351c71fc78837a165" offset="0x1000" />
@@ -447,6 +479,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="tens8k.bin" size="8192" crc="8bed8745" sha1="690a4dcb412e517b172ec5b44c86863ef63b1246" offset="000000" />
</dataarea>
@@ -459,6 +492,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="tens8k_01.bin" size="4096" crc="bfa874cd" sha1="91d1f66ac850728b65045c61b403fb52557336be" offset="0x0000" />
<rom name="tens8k_02.bin" size="4096" crc="42d5be57" sha1="e8ddc68c418f43dacc9170c335bd66bd7802821c" offset="0x1000" />
@@ -472,6 +506,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="8004" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="tenscs8k.bin" size="8192" crc="098d1cbb" sha1="7ea0c5aa6072e2c9eab711f278fd939986a92602" offset="000000" />
</dataarea>
@@ -484,6 +519,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="Y-1620" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom6k" />
<dataarea name="rom" size="6144">
<rom name="tensds6k_01.bin" size="4096" crc="97ab341a" sha1="7cf7ea8a2f70bdbd165a9a523fe50f15b36c9a0e" offset="0x0000" />
<rom name="tensds6k_02.bin" size="2048" crc="d669020b" sha1="523bf43e6c237d04e9649bf7beb1da278a346752" offset="0x1000" />
@@ -498,6 +534,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<publisher>Video Technology Ltd.</publisher>
<info name="serial" value="Y-1620" />
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom8k" />
<dataarea name="rom" size="8192">
<rom name="tensds8k.bin" size="8192" crc="c914c092" sha1="7b64efddb590332c192f6c4a6accce85a6d402c3" offset="000000" />
</dataarea>
@@ -512,6 +549,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<year>198?</year>
<publisher>Richard Hayter</publisher>
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom4k" />
<dataarea name="rom" size="4096">
<rom name="hapmon.bin" size="4096" crc="15d07b96" sha1="89359dca952bc90644dfd7f546c184a8165faa14" offset="000000" />
</dataarea>
@@ -524,6 +562,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom18k">
<dataarea name="rom" size="18432">
<rom name="chopper rescue (alt).rom" size="18432" crc="48e7e8b8" sha1="037088f15830fdd43081edddc5d683318d67ee01" offset="000000" />
</dataarea>
@@ -535,6 +574,7 @@ time! Hence, this is not a situation of usage of "Alt PCB" for these carts.
<year>1983</year>
<publisher>Video Technology Ltd.</publisher>
<part name="cart" interface="crvision_cart">
+ <feature name="slot" value="crv_rom18k">
<dataarea name="rom" size="18432">
<rom name="chopper rescue.rom" size="18432" crc="14179570" sha1="fde339c8dbd44b3332e888cd24d3d492cf066b94" offset="000000" />
</dataarea>
diff --git a/hash/vectrex.xml b/hash/vectrex.xml
index 06888909422..40645a9e812 100644
--- a/hash/vectrex.xml
+++ b/hash/vectrex.xml
@@ -18,6 +18,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="3dmnstrm.bin" size="8192" crc="b2313487" sha1="1731e892da8945fe4945b43847d23960c581682a" offset="0" />
</dataarea>
@@ -29,6 +30,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="animactn.bin" size="8192" crc="9f62e167" sha1="71946be47debae89ad191ac382c2015d6a862072" offset="0" />
</dataarea>
@@ -40,6 +42,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="armora.bin" size="4096" crc="b7510971" sha1="eb76f860130f8cc87826fa931350467760511213" offset="0" />
</dataarea>
@@ -51,6 +54,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="artmastr.bin" size="4096" crc="c8e2f247" sha1="8f35bac5e8e0fc4ad7291bbfe5ae6e693272de06" offset="0" />
</dataarea>
@@ -62,6 +66,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="bedlam.bin" size="4096" crc="a2fa649b" sha1="3ff3fa4feda6d562dedff2a10cfa8679d8318044" offset="0" />
</dataarea>
@@ -73,6 +78,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="berzerk.bin" size="4096" crc="eafe2455" sha1="e4badd494ed548721328ef869d33ad70e3e522c9" offset="0" />
</dataarea>
@@ -84,6 +90,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="blitz.bin" size="8192" crc="0f11ce0c" sha1="60893dfada42cf50c94083d45ad5bd14d0c031c8" offset="0" />
</dataarea>
@@ -95,6 +102,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="blitza.bin" size="8192" crc="881b27c5" sha1="aa1aa811c9ce5e19f43b78a6531cdd0e707337bd" offset="0" />
</dataarea>
@@ -106,6 +114,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="cleanswp.bin" size="4096" crc="f1b1de78" sha1="67f8513958c04e936b135740ed4ec6e6fa1763d5" offset="0" />
</dataarea>
@@ -117,6 +126,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="mrboston.bin" size="8192" crc="bd4da4c2" sha1="299841a116e59399af4e74ccae23ddfc078e007b" offset="0" />
</dataarea>
@@ -128,6 +138,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="cchasm.bin" size="4096" crc="6c1afa52" sha1="56a7f277bf09f94461dda542c04c36266d838b86" offset="0" />
</dataarea>
@@ -139,6 +150,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="crzycstr.bin" size="8192" crc="92709b11" sha1="4a833e4869221f832dacb7ef0fb2997c870b7d7f" offset="0" />
</dataarea>
@@ -150,6 +162,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="12288">
<rom name="darktwer.bin" size="12288" crc="9dcfd5b7" sha1="dbb0b378aacc2a18dfb476aa99ab00d6ab395205" offset="0" />
</dataarea>
@@ -161,6 +174,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="enginean.bin" size="4096" crc="fe9a501a" sha1="c226d78301dbe40f2194c165f2124d5afa885be4" offset="0" />
</dataarea>
@@ -172,6 +186,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="fnarzod.bin" size="8192" crc="13a35c8a" sha1="286e061331289b031de33725a4966c379c1df47f" offset="0" />
</dataarea>
@@ -183,6 +198,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="headsup.bin" size="8192" crc="e61a7de3" sha1="0406c13952fb0bd6adc68298ae163ebc6160484c" offset="0" />
</dataarea>
@@ -194,6 +210,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="hyprchse.bin" size="4096" crc="4bb13472" sha1="a246f1d94a5b062b60784787a1d6d499b21c10cd" offset="0" />
</dataarea>
@@ -205,6 +222,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="mail_plane.bin" size="8192" crc="da1ac0db" sha1="05f56e708f752ca801f8013c7da9b0db01508ba5" offset="0" />
</dataarea>
@@ -217,6 +235,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="mailplne.bin" size="8192" crc="05838962" sha1="969d5ec7d7aba9ac25e54069149d9586217ab63d" offset="0" />
</dataarea>
@@ -228,6 +247,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="mldymstr.bin" size="8192" crc="afefa29c" sha1="58aecc7fb1d26a22b09e9a13d845e4ed12e2449d" offset="0" />
</dataarea>
@@ -239,6 +259,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="minestrm.bin" size="4096" crc="6d509566" sha1="5f00ed35f189357b4a16a190520166371ca57906" offset="0" />
</dataarea>
@@ -250,6 +271,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="minestr2.bin" size="4096" crc="f5b3b374" sha1="1fdcc6e54ae5177bc9cdc79ce616ae3401e5c229" offset="0" />
</dataarea>
@@ -261,6 +283,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="nrrwescp.bin" size="8192" crc="050bd949" sha1="9e5d23cb7ef111394e1804e105b6dd277c062df6" offset="0" />
</dataarea>
@@ -272,6 +295,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="ptchduel.bin" size="8192" crc="c25f2e0e" sha1="f6f26beb20bb364761a9466ff4087c7b9713d048" offset="0" />
</dataarea>
@@ -283,6 +307,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="polarres.bin" size="8192" crc="a7471784" sha1="87248dcd3db51c1ebf3f8e07e21ec021eec0b9be" offset="0" />
</dataarea>
@@ -294,6 +319,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="polarrsb.bin" size="8192" crc="ad844645" sha1="b7bd8c8003c60535e1e776758f5c289aa9a77e81" offset="0" />
</dataarea>
@@ -305,6 +331,7 @@ guys
<year>1983</year>
<publisher>GCE / Namco Ltd.</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="polepos.bin" size="8192" crc="a00ed3d6" sha1="8454d472435e7a6a4ca5fe129162480ca6e84b87" offset="0" />
</dataarea>
@@ -316,6 +343,7 @@ guys
<year>1983</year>
<publisher>GCE / Namco Ltd.</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="poleposa.bin" size="8192" crc="c10f37d8" sha1="9f5b0b5e6caf6d887d3637ace70ad6a6258b999d" offset="0" />
</dataarea>
@@ -327,6 +355,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="ripoff.bin" size="4096" crc="34a98132" sha1="22f7a490f6f7aaa31e892b03a85178af211f62e3" offset="0" />
</dataarea>
@@ -338,6 +367,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="3671">
<rom name="rcktsldg.bin" size="3671" crc="863b89e8" sha1="526b347bc02a47c8bda326b1f6da50284127f038" offset="0" />
</dataarea>
@@ -349,6 +379,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="scramble.bin" size="4096" crc="707c8ffe" sha1="38e38b5c60466146d4648f8929b5ce3a08dcbe0d" offset="0" />
</dataarea>
@@ -360,6 +391,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="solarq.bin" size="4096" crc="5c4611c8" sha1="38072dc491d5c729c06f4c50bc310d361e0ff62a" offset="0" />
</dataarea>
@@ -371,6 +403,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="spacewar.bin" size="4096" crc="a3be5aff" sha1="0c229dd12a55044681585f7fdabd37dbc1243b59" offset="0" />
</dataarea>
@@ -382,6 +415,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="spike.bin" size="8192" crc="62a61843" sha1="8bba6705e6f69f55ab6d105eac2fd5b0c0d16d9f" offset="0" />
</dataarea>
@@ -393,6 +427,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="spinball.bin" size="8192" crc="02f41733" sha1="2e8285061530ccadfa2d8d11c374ae244449ebfa" offset="0" />
</dataarea>
@@ -404,6 +439,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="starcas.bin" size="4096" crc="c9039623" sha1="c9b79f1ba30dcbce5a068b606a97775cf863fe0a" offset="0" />
</dataarea>
@@ -415,6 +451,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="starship.bin" size="4096" crc="7967a8cb" sha1="d182eac5a54ffc642fcbe4a495c7c09f87b43585" offset="0" />
</dataarea>
@@ -426,6 +463,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="startrek.bin" size="4096" crc="3768d8c3" sha1="3a2ee61316fb316d9e9efdf5ee405e813475b466" offset="0" />
</dataarea>
@@ -437,6 +475,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="starhawk.bin" size="4096" crc="4de1f06b" sha1="d6b388b3951e34971c1b00c7fdf8dd00ad52df09" offset="0" />
</dataarea>
@@ -448,6 +487,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="testrev4.bin" size="4096" crc="7297e815" sha1="e3418055f1e79a2300572c557e71bf2ce8badbfa" offset="0" />
</dataarea>
@@ -459,6 +499,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="tourdefr.bin" size="8192" crc="bb4791f1" sha1="4f461b0b51c82433e70130eac5494f26239b4453" offset="0" />
</dataarea>
@@ -470,6 +511,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="webwarp.bin" size="8192" crc="521107c3" sha1="9681dc5d38a31cb0d0c6c3bd0fc76bfdde531cce" offset="0" />
</dataarea>
@@ -481,6 +523,7 @@ guys
<year>1983</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="8192">
<rom name="webwars.bin" size="8192" crc="2ee20103" sha1="08e2df9f7769c16a4d730adf8d659f8ea4be7f9d" offset="0" />
</dataarea>
@@ -495,6 +538,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="32768">
<rom name="berzerkd.bin" size="32768" crc="2adc4eaa" sha1="88031823ed2af95e8a7a6239cd83b158f9b7c16a" offset="0" />
</dataarea>
@@ -506,6 +550,7 @@ guys
<year>1982</year>
<publisher>GCE</publisher>
<part name="cart" interface="vectrex_cart">
+ <feature name="slot" value="vec_rom" />
<dataarea name="rom" size="4096">
<rom name="startrekp.bin" size="4096" crc="563f846b" sha1="21707811e544edae66ca076351bf0743842b46e5" offset="0" />
</dataarea>
diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak
index 08a4be6cf19..986adb3a0b8 100644
--- a/src/emu/bus/bus.mak
+++ b/src/emu/bus/bus.mak
@@ -298,6 +298,18 @@ endif
#-------------------------------------------------
#
+#@src/emu/bus/crvision/slot.h,BUSES += CRVISION
+#-------------------------------------------------
+
+ifneq ($(filter CRVISION,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/crvision
+BUSOBJS += $(BUSOBJ)/crvision/slot.o
+BUSOBJS += $(BUSOBJ)/crvision/rom.o
+endif
+
+
+#-------------------------------------------------
+#
#@src/emu/bus/dmv/dmv.h,BUSES += DMV
#-------------------------------------------------
@@ -716,6 +728,18 @@ endif
#-------------------------------------------------
#
+#@src/emu/bus/vectrex/slot.h,BUSES += VECTREX
+#-------------------------------------------------
+
+ifneq ($(filter VECTREX,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/vectrex
+BUSOBJS += $(BUSOBJ)/vectrex/slot.o
+BUSOBJS += $(BUSOBJ)/vectrex/rom.o
+endif
+
+
+#-------------------------------------------------
+#
#@src/emu/bus/vic10/exp.h,BUSES += VIC10
#-------------------------------------------------
diff --git a/src/emu/bus/crvision/rom.c b/src/emu/bus/crvision/rom.c
new file mode 100644
index 00000000000..0030851828c
--- /dev/null
+++ b/src/emu/bus/crvision/rom.c
@@ -0,0 +1,138 @@
+/***********************************************************************************************************
+
+
+ V-Tech CreatiVision cart emulation
+
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "rom.h"
+
+
+//-------------------------------------------------
+// crvision_rom_device - constructor
+//-------------------------------------------------
+
+const device_type CRVISION_ROM_4K = &device_creator<crvision_rom_device>;
+const device_type CRVISION_ROM_6K = &device_creator<crvision_rom6k_device>;
+const device_type CRVISION_ROM_8K = &device_creator<crvision_rom8k_device>;
+const device_type CRVISION_ROM_10K = &device_creator<crvision_rom10k_device>;
+const device_type CRVISION_ROM_12K = &device_creator<crvision_rom12k_device>;
+const device_type CRVISION_ROM_16K = &device_creator<crvision_rom16k_device>;
+const device_type CRVISION_ROM_18K = &device_creator<crvision_rom18k_device>;
+
+
+crvision_rom_device::crvision_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_crvision_cart_interface(mconfig, *this)
+{
+}
+
+crvision_rom_device::crvision_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, CRVISION_ROM_4K, "CreatiVision 4K Carts", tag, owner, clock, "crvision_4k", __FILE__),
+ device_crvision_cart_interface(mconfig, *this)
+{
+}
+
+crvision_rom6k_device::crvision_rom6k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_6K, "CreatiVision 6K Carts", tag, owner, clock, "crvision_6k", __FILE__)
+{
+}
+
+crvision_rom8k_device::crvision_rom8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_8K, "CreatiVision 8K Carts", tag, owner, clock, "crvision_8k", __FILE__)
+{
+}
+
+crvision_rom10k_device::crvision_rom10k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_10K, "CreatiVision 10K Carts", tag, owner, clock, "crvision_10k", __FILE__)
+{
+}
+
+crvision_rom12k_device::crvision_rom12k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_12K, "CreatiVision 12K Carts", tag, owner, clock, "crvision_12k", __FILE__)
+{
+}
+
+crvision_rom16k_device::crvision_rom16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_16K, "CreatiVision 16K Carts", tag, owner, clock, "crvision_16k", __FILE__)
+{
+}
+
+crvision_rom18k_device::crvision_rom18k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : crvision_rom_device(mconfig, CRVISION_ROM_18K, "CreatiVision 18K Carts", tag, owner, clock, "crvision_18k", __FILE__)
+{
+}
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+READ8_MEMBER(crvision_rom_device::read_rom80)
+{
+ offset &= 0x1fff;
+ if (offset < 0x1000)
+ return 0xff;
+
+ return m_rom[offset & 0xfff];
+}
+
+
+READ8_MEMBER(crvision_rom6k_device::read_rom80)
+{
+ offset &= 0x1fff;
+ if (offset < 0x1000)
+ return m_rom[0x1000 + (offset & 0x7ff)];
+
+ return m_rom[offset & 0xfff];
+}
+
+
+READ8_MEMBER(crvision_rom8k_device::read_rom80)
+{
+ return m_rom[offset & 0x1fff];
+}
+
+
+READ8_MEMBER(crvision_rom10k_device::read_rom80)
+{
+ return m_rom[offset & 0x1fff];
+}
+
+READ8_MEMBER(crvision_rom10k_device::read_rom40)
+{
+ return m_rom[0x2000 + (offset & 0x7ff)];
+}
+
+
+READ8_MEMBER(crvision_rom12k_device::read_rom80)
+{
+ return m_rom[offset & 0x1fff];
+}
+
+READ8_MEMBER(crvision_rom12k_device::read_rom40)
+{
+ return m_rom[0x2000 + (offset & 0xfff)];
+}
+
+
+READ8_MEMBER(crvision_rom16k_device::read_rom80)
+{
+ // lower 8K in 0xa000-0xbfff, higher 8K in 0x8000-0x9fff
+ return m_rom[offset ^ 0x2000];
+}
+
+
+READ8_MEMBER(crvision_rom18k_device::read_rom80)
+{
+ // lower 8K in 0xa000-0xbfff, higher 8K in 0x8000-0x9fff
+ return m_rom[offset ^ 0x2000];
+}
+
+READ8_MEMBER(crvision_rom18k_device::read_rom40)
+{
+ return m_rom[0x4000 + (offset & 0x7ff)];
+}
diff --git a/src/emu/bus/crvision/rom.h b/src/emu/bus/crvision/rom.h
new file mode 100644
index 00000000000..e8715d47a2c
--- /dev/null
+++ b/src/emu/bus/crvision/rom.h
@@ -0,0 +1,114 @@
+#ifndef __CRVISION_ROM_H
+#define __CRVISION_ROM_H
+
+#include "slot.h"
+
+
+// ======================> crvision_rom_device
+
+class crvision_rom_device : public device_t,
+ public device_crvision_cart_interface
+{
+public:
+ // construction/destruction
+ crvision_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);
+ crvision_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_rom80);
+};
+
+// ======================> crvision_rom6k_device
+
+class crvision_rom6k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom6k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom8k_device
+
+class crvision_rom8k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom10k_device
+
+class crvision_rom10k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom10k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom12k_device
+
+class crvision_rom12k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom12k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom16k_device
+
+class crvision_rom16k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+// ======================> crvision_rom18k_device
+
+class crvision_rom18k_device : public crvision_rom_device
+{
+public:
+ // construction/destruction
+ crvision_rom18k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+};
+
+
+
+
+
+// device type definition
+extern const device_type CRVISION_ROM_4K;
+extern const device_type CRVISION_ROM_6K;
+extern const device_type CRVISION_ROM_8K;
+extern const device_type CRVISION_ROM_10K;
+extern const device_type CRVISION_ROM_12K;
+extern const device_type CRVISION_ROM_16K;
+extern const device_type CRVISION_ROM_18K;
+
+
+#endif
diff --git a/src/emu/bus/crvision/slot.c b/src/emu/bus/crvision/slot.c
new file mode 100644
index 00000000000..18bcab83019
--- /dev/null
+++ b/src/emu/bus/crvision/slot.c
@@ -0,0 +1,296 @@
+/***********************************************************************************************************
+
+ V-Tech CreatiVision cart emulation
+ (through slot devices)
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type CRVISION_CART_SLOT = &device_creator<crvision_cart_slot_device>;
+
+//**************************************************************************
+// CreatiVision Cartridges Interface
+//**************************************************************************
+
+//-------------------------------------------------
+// device_crvision_cart_interface - constructor
+//-------------------------------------------------
+
+device_crvision_cart_interface::device_crvision_cart_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device),
+ m_rom(NULL),
+ m_rom_size(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_crvision_cart_interface - destructor
+//-------------------------------------------------
+
+device_crvision_cart_interface::~device_crvision_cart_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the cart
+//-------------------------------------------------
+
+void device_crvision_cart_interface::rom_alloc(UINT32 size, const char *tag)
+{
+ if (m_rom == NULL)
+ {
+ astring tempstring(tag);
+ tempstring.cat(CRVSLOT_ROM_REGION_TAG);
+ m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base();
+ m_rom_size = size;
+ }
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// crvision_cart_slot_device - constructor
+//-------------------------------------------------
+crvision_cart_slot_device::crvision_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, CRVISION_CART_SLOT, "APF Cartridge Slot", tag, owner, clock, "crvision_cart_slot", __FILE__),
+ device_image_interface(mconfig, *this),
+ device_slot_interface(mconfig, *this),
+ m_type(CRV_4K)
+{
+}
+
+
+//-------------------------------------------------
+// crvision_cart_slot_device - destructor
+//-------------------------------------------------
+
+crvision_cart_slot_device::~crvision_cart_slot_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void crvision_cart_slot_device::device_start()
+{
+ m_cart = dynamic_cast<device_crvision_cart_interface *>(get_card_device());
+}
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void crvision_cart_slot_device::device_config_complete()
+{
+ // set brief and instance name
+ update_names();
+}
+
+
+//-------------------------------------------------
+// APF PCB
+//-------------------------------------------------
+
+struct crvision_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 crvision_slot slot_list[] =
+{
+ { CRV_4K, "crv_rom4k" },
+ { CRV_6K, "crv_rom6k" },
+ { CRV_8K, "crv_rom8k" },
+ { CRV_10K, "crv_rom10k" },
+ { CRV_12K, "crv_rom12k" },
+ { CRV_16K, "crv_rom16k" },
+ { CRV_18K, "crv_rom18k" }
+};
+
+static int crvision_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 *crvision_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 "crv_rom4k";
+}
+
+
+/*-------------------------------------------------
+ call load
+ -------------------------------------------------*/
+
+bool crvision_cart_slot_device::call_load()
+{
+ if (m_cart)
+ {
+ UINT32 size = (software_entry() == NULL) ? length() : get_software_region_length("rom");
+
+ if (size > 0x4800)
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an APF 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 (software_entry() == NULL)
+ {
+ m_type = CRV_4K;
+
+ switch (size)
+ {
+ case 0x4800:
+ m_type = CRV_18K;
+ break;
+ case 0x4000:
+ m_type = CRV_16K;
+ break;
+ case 0x3000:
+ m_type = CRV_12K;
+ break;
+ case 0x2800:
+ m_type = CRV_10K;
+ break;
+ case 0x2000:
+ m_type = CRV_8K;
+ break;
+ case 0x1800:
+ m_type = CRV_6K;
+ break;
+ case 0x1000:
+ default:
+ break;
+ }
+ }
+ else
+ {
+ const char *pcb_name = get_feature("slot");
+ if (pcb_name)
+ m_type = crvision_get_pcb_id(pcb_name);
+ }
+
+ printf("Type: %s\n", crvision_get_slot(m_type));
+
+ return IMAGE_INIT_PASS;
+ }
+
+ return IMAGE_INIT_PASS;
+}
+
+
+/*-------------------------------------------------
+ call softlist load
+ -------------------------------------------------*/
+
+bool crvision_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 crvision_cart_slot_device::get_default_card_software(astring &result)
+{
+ if (open_image_file(mconfig().options()))
+ {
+ const char *slot_string = "crv_rom4k";
+ UINT32 size = core_fsize(m_file);
+ int type = CRV_4K;
+
+ switch (size)
+ {
+ case 0x4800:
+ type = CRV_18K;
+ break;
+ case 0x4000:
+ type = CRV_16K;
+ break;
+ case 0x3000:
+ type = CRV_12K;
+ break;
+ case 0x2800:
+ type = CRV_10K;
+ break;
+ case 0x2000:
+ type = CRV_8K;
+ break;
+ case 0x1800:
+ type = CRV_6K;
+ break;
+ case 0x1000:
+ default:
+ break;
+ }
+
+ slot_string = crvision_get_slot(type);
+
+ //printf("type: %s\n", slot_string);
+ clear();
+
+ result.cpy(slot_string);
+ return;
+ }
+
+ software_get_default_slot(result, "crv_rom4k");
+}
+
+/*-------------------------------------------------
+ read_rom
+ -------------------------------------------------*/
+
+READ8_MEMBER(crvision_cart_slot_device::read_rom40)
+{
+ if (m_cart)
+ return m_cart->read_rom40(space, offset);
+ else
+ return 0xff;
+}
+
+READ8_MEMBER(crvision_cart_slot_device::read_rom80)
+{
+ if (m_cart)
+ return m_cart->read_rom80(space, offset);
+ else
+ return 0xff;
+}
+
diff --git a/src/emu/bus/crvision/slot.h b/src/emu/bus/crvision/slot.h
new file mode 100644
index 00000000000..8029eba2752
--- /dev/null
+++ b/src/emu/bus/crvision/slot.h
@@ -0,0 +1,107 @@
+#ifndef __CRVISION_SLOT_H
+#define __CRVISION_SLOT_H
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+
+/* PCB */
+enum
+{
+ CRV_4K = 0,
+ CRV_6K,
+ CRV_8K,
+ CRV_10K,
+ CRV_12K,
+ CRV_16K,
+ CRV_18K
+};
+
+
+// ======================> device_crvision_cart_interface
+
+class device_crvision_cart_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_crvision_cart_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_crvision_cart_interface();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40) { return 0xff; }
+ virtual DECLARE_READ8_MEMBER(read_rom80) { return 0xff; }
+
+ void rom_alloc(UINT32 size, const char *tag);
+ UINT8* get_rom_base() { return m_rom; }
+ UINT32 get_rom_size() { return m_rom_size; }
+
+protected:
+ // internal state
+ UINT8 *m_rom;
+ UINT32 m_rom_size;
+};
+
+
+// ======================> crvision_cart_slot_device
+
+class crvision_cart_slot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ crvision_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~crvision_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; }
+
+ 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 "crvision_cart"; }
+ virtual const char *file_extensions() const { return "bin,rom"; }
+
+ // slot interface overrides
+ virtual void get_default_card_software(astring &result);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom40);
+ virtual DECLARE_READ8_MEMBER(read_rom80);
+
+protected:
+
+ int m_type;
+ device_crvision_cart_interface* m_cart;
+};
+
+
+
+// device type definition
+extern const device_type CRVISION_CART_SLOT;
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+ ***************************************************************************/
+
+#define CRVSLOT_ROM_REGION_TAG ":cart:rom"
+
+#define MCFG_CRVISION_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
+ MCFG_DEVICE_ADD(_tag, CRVISION_CART_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
+
+#endif
diff --git a/src/emu/bus/vectrex/rom.c b/src/emu/bus/vectrex/rom.c
new file mode 100644
index 00000000000..ceaa76c24c7
--- /dev/null
+++ b/src/emu/bus/vectrex/rom.c
@@ -0,0 +1,86 @@
+/***********************************************************************************************************
+
+
+ GCE Vectrex cart emulation
+
+ TODO:
+ - better understand how much SRAM is expected to be present by the homebrew using
+ this cart type and use a RAM array instead of the ROM region for writes
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "rom.h"
+
+
+//-------------------------------------------------
+// vectrex_rom_device - constructor
+//-------------------------------------------------
+
+const device_type VECTREX_ROM_STD = &device_creator<vectrex_rom_device>;
+const device_type VECTREX_ROM_64K = &device_creator<vectrex_rom64k_device>;
+const device_type VECTREX_ROM_SRAM = &device_creator<vectrex_sram_device>;
+
+
+vectrex_rom_device::vectrex_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_vectrex_cart_interface(mconfig, *this)
+{
+}
+
+vectrex_rom_device::vectrex_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, VECTREX_ROM_STD, "Vectrex Standard Carts", tag, owner, clock, "vectrex_rom", __FILE__),
+ device_vectrex_cart_interface(mconfig, *this)
+{
+}
+
+vectrex_rom64k_device::vectrex_rom64k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : vectrex_rom_device(mconfig, VECTREX_ROM_64K, "Vectrex Carts w/ Bankswitch", tag, owner, clock, "vectrex_64k", __FILE__)
+{
+}
+
+vectrex_sram_device::vectrex_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : vectrex_rom_device(mconfig, VECTREX_ROM_SRAM, "Vectrex Carts w/ SRAM", tag, owner, clock, "vectrex_sram", __FILE__)
+{
+}
+
+
+void vectrex_rom64k_device::device_start()
+{
+ save_item(NAME(m_bank));
+}
+
+void vectrex_rom64k_device::device_reset()
+{
+ m_bank = 0;
+}
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+READ8_MEMBER(vectrex_rom_device::read_rom)
+{
+ if (offset < m_rom_size)
+ return m_rom[offset];
+ else
+ return 0xff;
+}
+
+
+READ8_MEMBER(vectrex_rom64k_device::read_rom)
+{
+ return m_rom[(offset + m_bank * 0x8000) & (m_rom_size - 1)];
+}
+
+WRITE8_MEMBER(vectrex_rom64k_device::write_bank)
+{
+ m_bank = data >> 6;
+}
+
+WRITE8_MEMBER(vectrex_sram_device::write_ram)
+{
+ m_rom[offset & (m_rom_size - 1)] = data;
+}
diff --git a/src/emu/bus/vectrex/rom.h b/src/emu/bus/vectrex/rom.h
new file mode 100644
index 00000000000..c1cfbe866c8
--- /dev/null
+++ b/src/emu/bus/vectrex/rom.h
@@ -0,0 +1,65 @@
+#ifndef __VECTREX_ROM_H
+#define __VECTREX_ROM_H
+
+#include "slot.h"
+
+
+// ======================> vectrex_rom_device
+
+class vectrex_rom_device : public device_t,
+ public device_vectrex_cart_interface
+{
+public:
+ // construction/destruction
+ vectrex_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);
+ vectrex_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);
+};
+
+// ======================> vectrex_rom64k_device
+
+class vectrex_rom64k_device : public vectrex_rom_device
+{
+public:
+ // construction/destruction
+ vectrex_rom64k_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);
+ virtual DECLARE_WRITE8_MEMBER(write_bank);
+
+private:
+ int m_bank;
+};
+
+// ======================> vectrex_sram_device
+
+class vectrex_sram_device : public vectrex_rom_device
+{
+public:
+ // construction/destruction
+ vectrex_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_WRITE8_MEMBER(write_ram);
+};
+
+
+
+// device type definition
+extern const device_type VECTREX_ROM_STD;
+extern const device_type VECTREX_ROM_64K;
+extern const device_type VECTREX_ROM_SRAM;
+
+
+#endif
diff --git a/src/emu/bus/vectrex/slot.c b/src/emu/bus/vectrex/slot.c
new file mode 100644
index 00000000000..b44da803f74
--- /dev/null
+++ b/src/emu/bus/vectrex/slot.c
@@ -0,0 +1,280 @@
+/***********************************************************************************************************
+
+ GCE Vectrex cart emulation
+ (through slot devices)
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "slot.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type VECTREX_CART_SLOT = &device_creator<vectrex_cart_slot_device>;
+
+//**************************************************************************
+// Vectrex Cartridges Interface
+//**************************************************************************
+
+//-------------------------------------------------
+// device_vectrex_cart_interface - constructor
+//-------------------------------------------------
+
+device_vectrex_cart_interface::device_vectrex_cart_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device),
+ m_rom(NULL),
+ m_rom_size(0)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_vectrex_cart_interface - destructor
+//-------------------------------------------------
+
+device_vectrex_cart_interface::~device_vectrex_cart_interface()
+{
+}
+
+//-------------------------------------------------
+// rom_alloc - alloc the space for the cart
+//-------------------------------------------------
+
+void device_vectrex_cart_interface::rom_alloc(UINT32 size, const char *tag)
+{
+ if (m_rom == NULL)
+ {
+ astring tempstring(tag);
+ tempstring.cat(VECSLOT_ROM_REGION_TAG);
+ m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base();
+ m_rom_size = size;
+ }
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// vectrex_cart_slot_device - constructor
+//-------------------------------------------------
+vectrex_cart_slot_device::vectrex_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, VECTREX_CART_SLOT, "GCE Vectrex Cartridge Slot", tag, owner, clock, "vectrex_cart_slot", __FILE__),
+ device_image_interface(mconfig, *this),
+ device_slot_interface(mconfig, *this),
+ m_type(VECTREX_STD),
+ m_vec3d(VEC3D_NONE)
+{
+}
+
+
+//-------------------------------------------------
+// vectrex_cart_slot_device - destructor
+//-------------------------------------------------
+
+vectrex_cart_slot_device::~vectrex_cart_slot_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void vectrex_cart_slot_device::device_start()
+{
+ m_cart = dynamic_cast<device_vectrex_cart_interface *>(get_card_device());
+}
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void vectrex_cart_slot_device::device_config_complete()
+{
+ // set brief and instance name
+ update_names();
+}
+
+
+//-------------------------------------------------
+// Vectrex PCB
+//-------------------------------------------------
+
+struct vectrex_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 vectrex_slot slot_list[] =
+{
+ { VECTREX_STD, "vec_rom" },
+ { VECTREX_64K, "vec_rom64k" },
+ { VECTREX_SRAM, "vec_sram" }
+};
+
+#if 0
+static int vectrex_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;
+}
+#endif
+
+static const char *vectrex_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 "vec_rom";
+}
+
+/*-------------------------------------------------
+ call load
+ -------------------------------------------------*/
+
+bool vectrex_cart_slot_device::call_load()
+{
+ if (m_cart)
+ {
+ UINT32 size = (software_entry() == NULL) ? length() : get_software_region_length("rom");
+ UINT8 *ROM;
+
+ if (size > 0x10000)
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return IMAGE_INIT_FAIL;
+ }
+
+ m_cart->rom_alloc((size < 0x1000) ? 0x1000 : size, tag());
+ ROM = m_cart->get_rom_base();
+
+ if (software_entry() == NULL)
+ fread(ROM, size);
+ else
+ memcpy(ROM, get_software_region("rom"), size);
+
+ // Verify the file is accepted by the Vectrex bios
+ if (memcmp(ROM, "g GCE", 5))
+ {
+ seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid image");
+ return IMAGE_INIT_FAIL;
+ }
+
+ // determine type
+ m_type = VECTREX_STD;
+ if (!memcmp(ROM + 0x06, "SRAM", 4))
+ m_type = VECTREX_SRAM;
+ if (size > 0x8000)
+ m_type = VECTREX_64K;
+
+ //printf("Type: %s\n", vectrex_get_slot(m_type));
+
+ // determine 3D setup (to help video setup at machine_start)
+ if (!memcmp(ROM + 0x11, "NARROW", 6) && (ROM[0x39] == 0x0c))
+ m_vec3d = VEC3D_NARROW;
+
+ if (!memcmp(ROM + 0x11, "CRAZY COASTER", 13))
+ m_vec3d = VEC3D_CCOAST;
+
+ if (!memcmp(ROM + 0x11, "3D MINE STORM", 13))
+ m_vec3d = VEC3D_MINEST;
+
+ return IMAGE_INIT_PASS;
+ }
+
+ return IMAGE_INIT_PASS;
+}
+
+
+/*-------------------------------------------------
+ call softlist load
+ -------------------------------------------------*/
+
+bool vectrex_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 vectrex_cart_slot_device::get_default_card_software(astring &result)
+{
+ if (open_image_file(mconfig().options()))
+ {
+ const char *slot_string = "vec_rom";
+ UINT32 size = core_fsize(m_file);
+ dynamic_buffer rom(size);
+ int type = VECTREX_STD;
+
+ core_fread(m_file, rom, size);
+
+ if (!memcmp(rom + 0x06, "SRAM", 4))
+ type = VECTREX_SRAM;
+ if (size > 0x8000)
+ type = VECTREX_64K;
+
+ slot_string = vectrex_get_slot(type);
+
+ //printf("type: %s\n", slot_string);
+ clear();
+
+ result.cpy(slot_string);
+ return;
+ }
+
+ software_get_default_slot(result, "vec_rom");
+}
+
+/*-------------------------------------------------
+ read_rom
+ -------------------------------------------------*/
+
+READ8_MEMBER(vectrex_cart_slot_device::read_rom)
+{
+ if (m_cart)
+ return m_cart->read_rom(space, offset);
+ else
+ return 0xff;
+}
+
+/*-------------------------------------------------
+ write_ram
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(vectrex_cart_slot_device::write_ram)
+{
+ if (m_cart)
+ m_cart->write_ram(space, offset, data);
+}
+
+/*-------------------------------------------------
+ write_bank
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(vectrex_cart_slot_device::write_bank)
+{
+ if (m_cart)
+ m_cart->write_bank(space, offset, data);
+}
+
+
diff --git a/src/emu/bus/vectrex/slot.h b/src/emu/bus/vectrex/slot.h
new file mode 100644
index 00000000000..912a2147e54
--- /dev/null
+++ b/src/emu/bus/vectrex/slot.h
@@ -0,0 +1,114 @@
+#ifndef __VECTREX_SLOT_H
+#define __VECTREX_SLOT_H
+
+/***************************************************************************
+ TYPE DEFINITIONS
+ ***************************************************************************/
+
+
+/* PCB */
+enum
+{
+ VECTREX_STD = 0,
+ VECTREX_64K,
+ VECTREX_SRAM
+};
+
+// 3D setup
+enum
+{
+ VEC3D_NONE = 0,
+ VEC3D_MINEST,
+ VEC3D_CCOAST,
+ VEC3D_NARROW
+};
+
+// ======================> device_vectrex_cart_interface
+
+class device_vectrex_cart_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_vectrex_cart_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_vectrex_cart_interface();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write_ram) {}
+ virtual DECLARE_WRITE8_MEMBER(write_bank) {}
+
+ void rom_alloc(UINT32 size, const char *tag);
+ UINT8* get_rom_base() { return m_rom; }
+ UINT32 get_rom_size() { return m_rom_size; }
+
+protected:
+ // internal state
+ UINT8 *m_rom;
+ UINT32 m_rom_size;
+};
+
+
+// ======================> vectrex_cart_slot_device
+
+class vectrex_cart_slot_device : public device_t,
+ public device_image_interface,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ vectrex_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~vectrex_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; }
+ int get_vec3d() { return m_vec3d; }
+
+ 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 "vectrex_cart"; }
+ virtual const char *file_extensions() const { return "bin,gam,vec"; }
+
+ // slot interface overrides
+ virtual void get_default_card_software(astring &result);
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read_rom);
+ virtual DECLARE_WRITE8_MEMBER(write_ram);
+ virtual DECLARE_WRITE8_MEMBER(write_bank);
+
+protected:
+
+ int m_type, m_vec3d;
+ device_vectrex_cart_interface* m_cart;
+};
+
+
+
+// device type definition
+extern const device_type VECTREX_CART_SLOT;
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+ ***************************************************************************/
+
+#define VECSLOT_ROM_REGION_TAG ":cart:rom"
+
+#define MCFG_VECTREX_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
+ MCFG_DEVICE_ADD(_tag, VECTREX_CART_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
+
+#endif
diff --git a/src/mame/drivers/vectrex.c b/src/mame/drivers/vectrex.c
index fa6b9a704f6..647cb9493d4 100644
--- a/src/mame/drivers/vectrex.c
+++ b/src/mame/drivers/vectrex.c
@@ -13,17 +13,16 @@ Bruce Tomlin (hardware info)
#include "video/vector.h"
#include "machine/6522via.h"
#include "includes/vectrex.h"
-#include "imagedev/cartslot.h"
#include "sound/ay8910.h"
#include "sound/dac.h"
#include "machine/nvram.h"
static ADDRESS_MAP_START(vectrex_map, AS_PROGRAM, 8, vectrex_state )
- AM_RANGE(0x0000, 0x7fff) AM_RAMBANK("bank1") AM_REGION("maincpu", 0)
+ AM_RANGE(0x0000, 0x7fff) AM_NOP // cart area, handled at machine_start
AM_RANGE(0xc800, 0xcbff) AM_RAM AM_MIRROR(0x0400) AM_SHARE("gce_vectorram")
AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(vectrex_via_r, vectrex_via_w)
- AM_RANGE(0xe000, 0xffff) AM_ROM
+ AM_RANGE(0xe000, 0xffff) AM_ROM AM_REGION("maincpu", 0)
ADDRESS_MAP_END
static INPUT_PORTS_START(vectrex)
@@ -84,6 +83,12 @@ static INPUT_PORTS_START(vectrex)
INPUT_PORTS_END
+static SLOT_INTERFACE_START(vectrex_cart)
+ SLOT_INTERFACE_INTERNAL("vec_rom", VECTREX_ROM_STD)
+ SLOT_INTERFACE_INTERNAL("vec_rom64k", VECTREX_ROM_64K)
+ SLOT_INTERFACE_INTERNAL("vec_sram", VECTREX_ROM_SRAM)
+SLOT_INTERFACE_END
+
static MACHINE_CONFIG_START( vectrex, vectrex_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6809, XTAL_6MHz / 4)
@@ -97,7 +102,6 @@ static MACHINE_CONFIG_START( vectrex, vectrex_state )
MCFG_SCREEN_VISIBLE_AREA(0, 399, 0, 299)
MCFG_SCREEN_UPDATE_DRIVER(vectrex_state, screen_update_vectrex)
-
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_DAC_ADD("dac")
@@ -118,28 +122,24 @@ static MACHINE_CONFIG_START( vectrex, vectrex_state )
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(vectrex_state, vectrex_via_irq))
/* cartridge */
- MCFG_CARTSLOT_ADD("cart")
- MCFG_CARTSLOT_EXTENSION_LIST("bin,gam,vec")
- MCFG_CARTSLOT_NOT_MANDATORY
- MCFG_CARTSLOT_LOAD(vectrex_state,vectrex_cart)
- MCFG_CARTSLOT_INTERFACE("vectrex_cart")
+ MCFG_VECTREX_CARTRIDGE_ADD("cartslot", vectrex_cart, NULL)
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list","vectrex")
MACHINE_CONFIG_END
ROM_START(vectrex)
- ROM_REGION(0x18000,"maincpu", 0)
+ ROM_REGION(0x2000,"maincpu", 0)
ROM_SYSTEM_BIOS(0, "bios0", "exec rom")
- ROMX_LOAD("exec_rom.bin", 0xe000, 0x2000, CRC(ba13fb57) SHA1(65d07426b520ddd3115d40f255511e0fd2e20ae7), ROM_BIOS(1) )
+ ROMX_LOAD("exec_rom.bin", 0x0000, 0x2000, CRC(ba13fb57) SHA1(65d07426b520ddd3115d40f255511e0fd2e20ae7), ROM_BIOS(1) )
ROM_SYSTEM_BIOS(1, "bios1", "exec rom intl 284001-1")
- ROMX_LOAD("exec_rom_intl_284001-1.bin", 0xe000, 0x2000, CRC(6d2bd167) SHA1(77a220d5d98846b606dff608f7b5d00183ec3bab), ROM_BIOS(2) )
+ ROMX_LOAD("exec_rom_intl_284001-1.bin", 0x0000, 0x2000, CRC(6d2bd167) SHA1(77a220d5d98846b606dff608f7b5d00183ec3bab), ROM_BIOS(2) )
// The following fastboots are listed here for reference and documentation
// ROM_SYSTEM_BIOS(2, "bios2", "us-fastboot hack")
-// ROMX_LOAD("us-fastboot.bin", 0xe000, 0x2000, CRa6e4dac4) SHA1(e0900be6d6858b985fd7f0999d864b2fceaf01a1), ROM_BIOS(3) )
+// ROMX_LOAD("us-fastboot.bin", 0x0000, 0x2000, CRa6e4dac4) SHA1(e0900be6d6858b985fd7f0999d864b2fceaf01a1), ROM_BIOS(3) )
// ROM_SYSTEM_BIOS(3, "bios3", "intl-fastboot hack")
-// ROMX_LOAD("intl-fastboot.bin", 0xe000, 0x2000, CRC(71dcf0f4) SHA1(2a257c5111f5cee841bd14acaa9df6496aaf3d8b), ROM_BIOS(4) )
+// ROMX_LOAD("intl-fastboot.bin", 0x0000, 0x2000, CRC(71dcf0f4) SHA1(2a257c5111f5cee841bd14acaa9df6496aaf3d8b), ROM_BIOS(4) )
ROM_END
@@ -218,7 +218,7 @@ static MACHINE_CONFIG_DERIVED( raaspec, vectrex )
MCFG_DEVICE_MODIFY("via6522_0")
MCFG_VIA6522_READPB_HANDLER(READ8(vectrex_state, vectrex_s1_via_pb_r))
- MCFG_DEVICE_REMOVE("cart")
+ MCFG_DEVICE_REMOVE("cartslot")
MACHINE_CONFIG_END
ROM_START(raaspec)
diff --git a/src/mame/includes/vectrex.h b/src/mame/includes/vectrex.h
index 4fd8e69cbf4..aecf543e476 100644
--- a/src/mame/includes/vectrex.h
+++ b/src/mame/includes/vectrex.h
@@ -12,6 +12,8 @@
#include "sound/ay8910.h"
#include "video/vector.h"
+#include "bus/vectrex/slot.h"
+#include "bus/vectrex/rom.h"
#define NVECT 10000
@@ -44,6 +46,7 @@ public:
m_dac(*this, "dac"),
m_ay8912(*this, "ay8912"),
m_vector(*this, "vector"),
+ m_cart(*this, "cartslot"),
m_io_contr1x(*this, "CONTR1X"),
m_io_contr1y(*this, "CONTR1Y"),
m_io_contr2x(*this, "CONTR2X"),
@@ -54,10 +57,10 @@ public:
m_io_lpenx(*this, "LPENX"),
m_io_lpeny(*this, "LPENY"),
m_io_coin(*this, "COIN"),
- m_screen(*this, "screen") { }
+ m_screen(*this, "screen")
+ { }
required_shared_ptr<UINT8> m_gce_vectorram;
- int m_64k_cart;
int m_imager_status;
UINT32 m_beam_color;
unsigned char m_via_out[2];
@@ -99,6 +102,7 @@ public:
DECLARE_WRITE8_MEMBER(raaspec_led_w);
DECLARE_DRIVER_INIT(vectrex);
virtual void video_start();
+ virtual void machine_start();
DECLARE_VIDEO_START(raaspec);
UINT32 screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(vectrex_imager_change_color);
@@ -126,6 +130,7 @@ protected:
required_device<dac_device> m_dac;
required_device<ay8910_device> m_ay8912;
required_device<vector_device> m_vector;
+ optional_device<vectrex_cart_slot_device> m_cart;
optional_ioport m_io_contr1x;
optional_ioport m_io_contr1y;
optional_ioport m_io_contr2x;
@@ -142,7 +147,6 @@ protected:
void vectrex_multiplexer(int mux);
void vectrex_add_point(int x, int y, rgb_t color, int intensity);
void vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity);
- int vectrex_verify_cart(char *data);
};
#endif /* VECTREX_H_ */
diff --git a/src/mame/machine/vectrex.c b/src/mame/machine/vectrex.c
index 04a198f1a13..4a5bbc5fb08 100644
--- a/src/mame/machine/vectrex.c
+++ b/src/mame/machine/vectrex.c
@@ -42,19 +42,9 @@ static const double minestorm_3d_angles[3] = {0, 0.1692, 0.2086};
static const double narrow_escape_angles[3] = {0, 0.1631, 0.3305};
static const double crazy_coaster_angles[3] = {0, 0.1631, 0.3305};
-
static const double unknown_game_angles[3] = {0,0.16666666, 0.33333333};
-int vectrex_state::vectrex_verify_cart(char *data)
-{
- /* Verify the file is accepted by the Vectrex bios */
- if (!memcmp(data,"g GCE", 5))
- return IMAGE_VERIFY_PASS;
- else
- return IMAGE_VERIFY_FAIL;
-}
-
void vectrex_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
@@ -87,71 +77,6 @@ void vectrex_state::device_timer(emu_timer &timer, device_timer_id id, int param
}
-/*********************************************************************
-
- ROM load and id functions
-
-*********************************************************************/
-
-DEVICE_IMAGE_LOAD_MEMBER(vectrex_state,vectrex_cart)
-{
- UINT8 *mem = memregion("maincpu")->base();
- if (image.software_entry() == NULL)
- {
- image.fread( mem, 0x8000);
- if (image.length() > 0x8000)
- {
- image.fread( mem+0x10000, 0x8000);
- m_64k_cart = 1;
- }
- } else {
- int size = image.get_software_region_length("rom");
- memcpy(mem, image.get_software_region("rom"), size);
- }
-
- /* check image! */
- if (vectrex_verify_cart((char*)mem) == IMAGE_VERIFY_FAIL)
- {
- logerror("Invalid image!\n");
- return IMAGE_INIT_FAIL;
- }
-
- if (memcmp(mem + 0x06,"SRAM",4)) {
- m_maincpu->space(AS_PROGRAM).unmap_write(0x0000, 0x7fff);
- }
-
- /* If VIA T2 starts, reset refresh timer.
- This is the best strategy for most games. */
- m_reset_refresh = 1;
-
- m_imager_angles = narrow_escape_angles;
-
- /* let's do this 3D detection with a strcmp using data inside the cart images */
- /* slightly prettier than having to hardcode CRCs */
-
- /* handle 3D Narrow Escape but skip the 2-d hack of it from Fred Taft */
- if (!memcmp(mem + 0x11,"NARROW",6) && (((char*)mem)[0x39] == 0x0c))
- {
- m_imager_angles = narrow_escape_angles;
- }
-
- if (!memcmp(mem + 0x11,"CRAZY COASTER", 13))
- {
- m_imager_angles = crazy_coaster_angles;
- }
-
- if (!memcmp(mem + 0x11,"3D MINE STORM", 13))
- {
- m_imager_angles = minestorm_3d_angles;
-
- /* Don't reset T2 each time it's written.
- This would cause jerking in mine3. */
- m_reset_refresh = 0;
- }
-
- return IMAGE_INIT_PASS;
-}
-
/*********************************************************************
@@ -377,12 +302,9 @@ WRITE8_MEMBER(vectrex_state::vectrex_psg_port_w)
DRIVER_INIT_MEMBER(vectrex_state,vectrex)
{
- int i;
-
- m_64k_cart = 0;
m_imager_angles = unknown_game_angles;
m_beam_color = rgb_t::white;
- for (i=0; i<ARRAY_LENGTH(m_imager_colors); i++)
+ for (int i = 0; i < ARRAY_LENGTH(m_imager_colors); i++)
m_imager_colors[i] = rgb_t::white;
/*
@@ -394,3 +316,39 @@ DRIVER_INIT_MEMBER(vectrex_state,vectrex)
m_gce_vectorram[0x7e] = machine().rand() | 1;
m_gce_vectorram[0x7f] = machine().rand() | 1;
}
+
+void vectrex_state::machine_start()
+{
+ if (m_cart && m_cart->exists())
+ {
+ // install cart accesses
+ if (m_cart->get_type() == VECTREX_SRAM)
+ m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),(vectrex_cart_slot_device*)m_cart), write8_delegate(FUNC(vectrex_cart_slot_device::write_ram),(vectrex_cart_slot_device*)m_cart));
+ else
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x0000, 0x7fff, read8_delegate(FUNC(vectrex_cart_slot_device::read_rom),(vectrex_cart_slot_device*)m_cart));
+
+ // setup 3d imager and refresh timer
+
+ // If VIA T2 starts, reset refresh timer. This is the best strategy for most games.
+ m_reset_refresh = 1;
+ m_imager_angles = narrow_escape_angles;
+
+ // let's do this 3D detection
+ switch (m_cart->get_vec3d())
+ {
+ case VEC3D_MINEST:
+ m_imager_angles = minestorm_3d_angles;
+ // Don't reset T2 each time it's written. This would cause jerking in mine3.
+ m_reset_refresh = 0;
+ break;
+ case VEC3D_CCOAST:
+ m_imager_angles = crazy_coaster_angles;
+ break;
+ case VEC3D_NARROW:
+ m_imager_angles = narrow_escape_angles;
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/src/mame/mame.mak b/src/mame/mame.mak
index abcf39b5498..a5fe946a32c 100644
--- a/src/mame/mame.mak
+++ b/src/mame/mame.mak
@@ -575,17 +575,21 @@ MACHINES += PCCARD
#BUSES += ABCKB
#BUSES += ADAM
#BUSES += ADAMNET
+#BUSES += APF
+#BUSES += ARCADIA
#BUSES += BML3
#BUSES += BW2
#BUSES += C64
#BUSES += CBM2
#BUSES += CBMIEC
BUSES += CENTRONICS
+#BUSES += CHANNELF
#BUSES += COCO
#BUSES += COLECO
#BUSES += COMPUCOLOR
#BUSES += COMX35
#BUSES += CPC
+#BUSES += CRVISION
#BUSES += DMV
#BUSES += ECBBUS
#BUSES += ECONET
@@ -596,6 +600,7 @@ BUSES += CENTRONICS
BUSES += GENERIC
#BUSES += IEEE488
#BUSES += IMI7000
+#BUSES += INTV
#BUSES += IQ151
BUSES += ISA
#BUSES += ISBX
@@ -607,6 +612,7 @@ BUSES += ISA
BUSES += NEOGEO
#BUSES += NES
#BUSES += NUBUS
+#BUSES += O2
#BUSES += ORICEXT
#BUSES += PCE
#BUSES += PCI
@@ -627,8 +633,10 @@ BUSES += SCSI
#BUSES += TI99PEB
#BUSES += TVC
#BUSES += VBOY
+#BUSES += VC4000
#BUSES += VCS
#BUSES += VCS_CTRL
+BUSES += VECTREX
#BUSES += VIC10
#BUSES += VIC20
#BUSES += VIDBRAIN
@@ -636,6 +644,7 @@ BUSES += SCSI
#BUSES += VTECH_IOEXP
#BUSES += VTECH_MEMEXP
#BUSES += WANGPC
+#BUSES += WSWAN
#BUSES += X68K
#BUSES += Z88
#BUSES += ZORRO
diff --git a/src/mame/video/vectrex.c b/src/mame/video/vectrex.c
index 053a036351f..60091e7a7ae 100644
--- a/src/mame/video/vectrex.c
+++ b/src/mame/video/vectrex.c
@@ -330,10 +330,8 @@ WRITE8_MEMBER(vectrex_state::v_via_pb_w)
}
/* Cartridge bank-switching */
- if (m_64k_cart && ((data ^ m_via_out[PORTB]) & 0x40))
- {
- membank("bank1")->set_base(memregion("maincpu")->base() + ((data & 0x40) ? 0x10000 : 0x0000));
- }
+ if (m_cart && ((data ^ m_via_out[PORTB]) & 0x40))
+ m_cart->write_bank(space, 0, data);
/* Sound */
if (data & 0x10)
diff --git a/src/mess/drivers/crvision.c b/src/mess/drivers/crvision.c
index 1acab4cb555..269d832135f 100644
--- a/src/mess/drivers/crvision.c
+++ b/src/mess/drivers/crvision.c
@@ -699,6 +699,12 @@ void crvision_state::machine_start()
// state saving
save_item(NAME(m_keylatch));
save_item(NAME(m_joylatch));
+
+ if (m_cart->exists())
+ {
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart));
+ }
}
void crvision_pal_state::machine_start()
@@ -706,6 +712,12 @@ void crvision_pal_state::machine_start()
// state saving
save_item(NAME(m_keylatch));
save_item(NAME(m_joylatch));
+
+ if (m_cart->exists())
+ {
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart));
+ }
}
/*-------------------------------------------------
@@ -717,122 +729,29 @@ void laser2001_state::machine_start()
// state saving
save_item(NAME(m_keylatch));
save_item(NAME(m_joylatch));
-}
-
-/***************************************************************************
- CARTRIDGE
-***************************************************************************/
-
-DEVICE_IMAGE_LOAD_MEMBER( crvision_state, crvision_cart )
-{
- UINT32 size;
- dynamic_buffer temp_copy;
- UINT8 *mem = memregion(M6502_TAG)->base();
- address_space &program = m_maincpu->space(AS_PROGRAM);
-
- if (image.software_entry() == NULL)
+
+ if (m_cart->exists())
{
- size = image.length();
- temp_copy.resize(size);
- image.fread( temp_copy, size);
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart));
}
- else
- {
- size= image.get_software_region_length("rom");
- temp_copy.resize(size);
- memcpy(temp_copy, image.get_software_region("rom"), size);
- }
-
- switch (size)
- {
- case 0x1000: // 4K
- memcpy(mem + 0x9000, temp_copy, 0x1000); // load 4KB at 0x9000
- memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror 4KB at 0xb000
- program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1);
- break;
-
- case 0x1800: // 6K
- memcpy(mem + 0x9000, temp_copy, 0x1000); // load lower 4KB at 0x9000
- memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror lower 4KB at 0xb000
- memcpy(mem + 0x8000, temp_copy + 0x1000, 0x0800); // load higher 2KB at 0x8000
- memcpy(mem + 0x8800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0x8800
- memcpy(mem + 0xa000, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa000
- memcpy(mem + 0xa800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa800
- program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1);
- break;
-
- case 0x2000: // 8K
- memcpy(mem + 0x8000, temp_copy, 0x2000); // load 8KB at 0x8000
- memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror 8KB at 0xa000
- program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1);
- break;
-
- case 0x2800: // 10K
- memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000
- memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000
- memcpy(mem + 0x4000, temp_copy + 0x2000, 0x0800); // load higher 2KB at 0x4000
- memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800
- memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000
- memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800
- memcpy(mem + 0x6000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6000
- memcpy(mem + 0x6800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6800
- memcpy(mem + 0x7000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7000
- memcpy(mem + 0x7800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7800
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- case 0x3000: // 12K
- memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000
- memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000
- memcpy(mem + 0x4000, temp_copy + 0x2000, 0x1000); // load higher 4KB at 0x4000
- memcpy(mem + 0x5000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x5000
- memcpy(mem + 0x6000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x6000
- memcpy(mem + 0x7000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x7000
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- case 0x4000: // 16K
- memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000
- memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- case 0x4800: // 18K
- memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000
- memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000
- memcpy(mem + 0x4000, temp_copy + 0x4000, 0x0800); // load higher 2KB at 0x4000
- memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800
- memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000
- memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800
- memcpy(mem + 0x6000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6000
- memcpy(mem + 0x6800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6800
- memcpy(mem + 0x7000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7000
- memcpy(mem + 0x7800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7800
- program.install_read_bank(0x8000, 0xbfff, BANK_ROM1);
- program.install_read_bank(0x4000, 0x7fff, BANK_ROM2);
- break;
-
- default:
- auto_free(machine(), temp_copy);
- return IMAGE_INIT_FAIL;
- }
-
- membank(BANK_ROM1)->configure_entry(0, mem + 0x8000);
- membank(BANK_ROM1)->set_entry(0);
-
- membank(BANK_ROM2)->configure_entry(0, mem + 0x4000);
- membank(BANK_ROM2)->set_entry(0);
-
- return IMAGE_INIT_PASS;
}
+
/***************************************************************************
MACHINE DRIVERS
***************************************************************************/
+static SLOT_INTERFACE_START(crvision_cart)
+ SLOT_INTERFACE_INTERNAL("crv_rom4k", CRVISION_ROM_4K)
+ SLOT_INTERFACE_INTERNAL("crv_rom6k", CRVISION_ROM_6K)
+ SLOT_INTERFACE_INTERNAL("crv_rom8k", CRVISION_ROM_8K)
+ SLOT_INTERFACE_INTERNAL("crv_rom10k", CRVISION_ROM_10K)
+ SLOT_INTERFACE_INTERNAL("crv_rom12k", CRVISION_ROM_12K)
+ SLOT_INTERFACE_INTERNAL("crv_rom16k", CRVISION_ROM_16K)
+ SLOT_INTERFACE_INTERNAL("crv_rom18k", CRVISION_ROM_18K)
+SLOT_INTERFACE_END
+
/*-------------------------------------------------
MACHINE_CONFIG_START( creativision, crvision_state )
-------------------------------------------------*/
@@ -872,11 +791,7 @@ static MACHINE_CONFIG_START( creativision, crvision_state )
MCFG_SOUND_ROUTE(1, "mono", 0.25)
// cartridge
- MCFG_CARTSLOT_ADD("cart")
- MCFG_CARTSLOT_EXTENSION_LIST("bin,rom")
- MCFG_CARTSLOT_MANDATORY
- MCFG_CARTSLOT_INTERFACE("crvision_cart")
- MCFG_CARTSLOT_LOAD(crvision_state, crvision_cart)
+ MCFG_CRVISION_CARTRIDGE_ADD("cartslot", crvision_cart, NULL)
// internal ram
MCFG_RAM_ADD(RAM_TAG)
@@ -884,7 +799,7 @@ static MACHINE_CONFIG_START( creativision, crvision_state )
MCFG_RAM_EXTRA_OPTIONS("15K") // 16K expansion (lower 14K available only, upper 2K shared with BIOS ROM)
// software lists
- MCFG_SOFTWARE_LIST_ADD("cart_list","crvision")
+ MCFG_SOFTWARE_LIST_ADD("cart_list", "crvision")
MACHINE_CONFIG_END
/*-------------------------------------------------
@@ -958,10 +873,7 @@ static MACHINE_CONFIG_START( lasr2001, laser2001_state )
MCFG_SOUND_ROUTE(1, "mono", 0.25)
// cartridge
- MCFG_CARTSLOT_ADD("cart")
- MCFG_CARTSLOT_EXTENSION_LIST("bin,rom")
- MCFG_CARTSLOT_INTERFACE("crvision_cart")
- MCFG_CARTSLOT_LOAD(crvision_state, crvision_cart)
+ MCFG_CRVISION_CARTRIDGE_ADD("cartslot", crvision_cart, NULL)
// internal ram
MCFG_RAM_ADD(RAM_TAG)
diff --git a/src/mess/includes/crvision.h b/src/mess/includes/crvision.h
index 2c1775eb351..89ee61b7f3f 100644
--- a/src/mess/includes/crvision.h
+++ b/src/mess/includes/crvision.h
@@ -6,11 +6,12 @@
#include "emu.h"
#include "cpu/m6502/m6502.h"
-#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "machine/6821pia.h"
#include "machine/buffer.h"
#include "bus/centronics/ctronics.h"
+#include "bus/crvision/slot.h"
+#include "bus/crvision/rom.h"
#include "machine/ram.h"
#include "sound/sn76496.h"
#include "sound/wave.h"
@@ -35,6 +36,7 @@ public:
m_pia(*this, PIA6821_TAG),
m_psg(*this, SN76489_TAG),
m_cassette(*this, "cassette"),
+ m_cart(*this, "cartslot"),
m_cent_data_out(*this, "cent_data_out"),
m_ram(*this, RAM_TAG)
{
@@ -44,6 +46,7 @@ public:
required_device<pia6821_device> m_pia;
required_device<sn76496_base_device> m_psg;
required_device<cassette_image_device> m_cassette;
+ required_device<crvision_cart_slot_device> m_cart;
required_device<output_latch_device> m_cent_data_out;
required_device<ram_device> m_ram;
@@ -53,7 +56,6 @@ public:
DECLARE_READ8_MEMBER( pia_pa_r );
DECLARE_READ8_MEMBER( pia_pb_r );
DECLARE_INPUT_CHANGED_MEMBER( trigger_nmi );
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER( crvision_cart );
UINT8 read_keyboard(int pa);
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index 39e8aa225c5..a355f631bd3 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -582,6 +582,7 @@ BUSES += COLECO
BUSES += COMPUCOLOR
BUSES += COMX35
BUSES += CPC
+BUSES += CRVISION
BUSES += DMV
BUSES += ECBBUS
BUSES += ECONET
@@ -628,6 +629,7 @@ BUSES += VBOY
BUSES += VC4000
BUSES += VCS
BUSES += VCS_CTRL
+BUSES += VECTREX
BUSES += VIC10
BUSES += VIC20
BUSES += VIDBRAIN