diff options
-rw-r--r-- | .gitattributes | 8 | ||||
-rw-r--r-- | hash/crvision.xml | 40 | ||||
-rw-r--r-- | hash/vectrex.xml | 45 | ||||
-rw-r--r-- | src/emu/bus/bus.mak | 24 | ||||
-rw-r--r-- | src/emu/bus/crvision/rom.c | 138 | ||||
-rw-r--r-- | src/emu/bus/crvision/rom.h | 114 | ||||
-rw-r--r-- | src/emu/bus/crvision/slot.c | 296 | ||||
-rw-r--r-- | src/emu/bus/crvision/slot.h | 107 | ||||
-rw-r--r-- | src/emu/bus/vectrex/rom.c | 86 | ||||
-rw-r--r-- | src/emu/bus/vectrex/rom.h | 65 | ||||
-rw-r--r-- | src/emu/bus/vectrex/slot.c | 280 | ||||
-rw-r--r-- | src/emu/bus/vectrex/slot.h | 114 | ||||
-rw-r--r-- | src/mame/drivers/vectrex.c | 30 | ||||
-rw-r--r-- | src/mame/includes/vectrex.h | 10 | ||||
-rw-r--r-- | src/mame/machine/vectrex.c | 116 | ||||
-rw-r--r-- | src/mame/mame.mak | 9 | ||||
-rw-r--r-- | src/mame/video/vectrex.c | 6 | ||||
-rw-r--r-- | src/mess/drivers/crvision.c | 148 | ||||
-rw-r--r-- | src/mess/includes/crvision.h | 6 | ||||
-rw-r--r-- | src/mess/mess.mak | 2 |
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 |