summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--hash/32x.xml2
-rw-r--r--hash/apple2_flop_clcracked.xml71
-rw-r--r--hash/apple2_flop_orig.xml522
-rw-r--r--hash/archimedes.xml168
-rw-r--r--hash/bbc_rom.xml278
-rw-r--r--hash/cgenie_cass.xml260
-rw-r--r--hash/fmtowns_cd.xml150
-rw-r--r--hash/ibm5150.xml4
-rw-r--r--hash/ibm5170.xml12
-rw-r--r--hash/interpro.xml12
-rw-r--r--hash/jaguar.xml10
-rw-r--r--hash/jakks_gamekey_sw.xml2
-rw-r--r--hash/pasogo.xml12
-rw-r--r--hash/saturn.xml6
-rw-r--r--hash/vboy.xml74
-rw-r--r--hash/vsmile_cart.xml340
-rw-r--r--scripts/src/bus.lua17
-rw-r--r--scripts/target/mame/mess.lua22
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.cpp8
-rw-r--r--src/devices/bus/bbc/1mhzbus/scsi.cpp201
-rw-r--r--src/devices/bus/bbc/1mhzbus/scsi.h81
-rw-r--r--src/devices/bus/bbc/modem/modem.cpp102
-rw-r--r--src/devices/bus/bbc/modem/modem.h105
-rw-r--r--src/devices/bus/bbc/modem/scsiaiv.cpp142
-rw-r--r--src/devices/bus/bbc/modem/scsiaiv.h71
-rw-r--r--src/devices/cpu/gigatron/gigatron.cpp14
-rw-r--r--src/devices/cpu/gigatron/gigatrondasm.cpp154
-rw-r--r--src/devices/cpu/gigatron/gigatrondasm.h16
-rw-r--r--src/devices/machine/dp83932c.cpp595
-rw-r--r--src/devices/machine/dp83932c.h244
-rw-r--r--src/devices/machine/intelfsh.cpp18
-rw-r--r--src/devices/machine/intelfsh.h8
-rw-r--r--src/devices/sound/upd7759.cpp5
-rw-r--r--src/emu/debug/debugcmd.cpp2
-rw-r--r--src/emu/device.cpp6
-rw-r--r--src/emu/diimage.cpp12
-rw-r--r--src/emu/disound.cpp2
-rw-r--r--src/emu/emumem.cpp12
-rw-r--r--src/emu/emupal.cpp2
-rw-r--r--src/emu/ioport.cpp4
-rw-r--r--src/emu/machine.cpp4
-rw-r--r--src/emu/render.cpp2
-rw-r--r--src/emu/rendfont.cpp2
-rw-r--r--src/emu/rendlay.cpp2
-rw-r--r--src/emu/rendutil.cpp6
-rw-r--r--src/emu/romload.cpp10
-rw-r--r--src/emu/softlist_dev.cpp4
-rw-r--r--src/emu/tilemap.cpp2
-rw-r--r--src/emu/video.cpp14
-rw-r--r--src/frontend/mame/audit.cpp10
-rw-r--r--src/frontend/mame/language.cpp2
-rw-r--r--src/frontend/mame/luaengine.cpp8
-rw-r--r--src/frontend/mame/ui/custui.cpp6
-rw-r--r--src/frontend/mame/ui/dirmenu.cpp18
-rw-r--r--src/frontend/mame/ui/filecreate.cpp2
-rw-r--r--src/frontend/mame/ui/imgcntrl.cpp4
-rw-r--r--src/frontend/mame/ui/miscmenu.cpp14
-rw-r--r--src/frontend/mame/ui/selgame.cpp10
-rw-r--r--src/frontend/mame/ui/selmenu.cpp10
-rw-r--r--src/frontend/mame/ui/selsoft.cpp4
-rw-r--r--src/frontend/mame/ui/sliders.cpp4
-rw-r--r--src/frontend/mame/ui/tapectrl.cpp2
-rw-r--r--src/lib/formats/ap2_dsk.cpp6
-rw-r--r--src/lib/formats/jvc_dsk.cpp8
-rw-r--r--src/lib/util/options.cpp2
-rw-r--r--src/lib/util/zippath.cpp2
-rw-r--r--src/mame/drivers/bbc.cpp61
-rw-r--r--src/mame/drivers/bnstars.cpp1
-rw-r--r--src/mame/drivers/expro02.cpp3
-rw-r--r--src/mame/drivers/ffantasy_ms.cpp2
-rw-r--r--src/mame/drivers/galpanic_ms.cpp3
-rw-r--r--src/mame/drivers/gigatron.cpp55
-rw-r--r--src/mame/drivers/hh_sm510.cpp5
-rw-r--r--src/mame/drivers/jazz.cpp44
-rw-r--r--src/mame/drivers/kaneko16.cpp13
-rw-r--r--src/mame/drivers/konendev.cpp52
-rw-r--r--src/mame/drivers/konmedal.cpp25
-rw-r--r--src/mame/drivers/midxunit.cpp4
-rw-r--r--src/mame/drivers/model1.cpp2
-rw-r--r--src/mame/drivers/namcos10.cpp18
-rw-r--r--src/mame/drivers/spg2xx.cpp837
-rw-r--r--src/mame/drivers/spg2xx_dreamlife.cpp83
-rw-r--r--src/mame/drivers/spg2xx_ican.cpp505
-rw-r--r--src/mame/drivers/spg2xx_jakks.cpp781
-rw-r--r--src/mame/drivers/spg2xx_lexibook.cpp261
-rw-r--r--src/mame/drivers/spg2xx_pdc.cpp91
-rw-r--r--src/mame/drivers/spg2xx_playvision.cpp230
-rw-r--r--src/mame/drivers/spg2xx_senario.cpp285
-rw-r--r--src/mame/drivers/spg2xx_senario_poker.cpp680
-rw-r--r--src/mame/drivers/spg2xx_shredmjr.cpp190
-rw-r--r--src/mame/drivers/spg2xx_telestory.cpp303
-rw-r--r--src/mame/drivers/spg2xx_tvgogo.cpp265
-rw-r--r--src/mame/drivers/spg2xx_vii.cpp189
-rw-r--r--src/mame/drivers/spg2xx_zone.cpp296
-rw-r--r--src/mame/drivers/spg2xx_zone_32bit.cpp476
-rw-r--r--src/mame/drivers/vii.cpp5017
-rw-r--r--src/mame/includes/bbc.h6
-rw-r--r--src/mame/includes/jazz.h4
-rw-r--r--src/mame/includes/spg2xx.h84
-rw-r--r--src/mame/machine/mct_adr.cpp (renamed from src/mame/machine/jazz_mct_adr.cpp)81
-rw-r--r--src/mame/machine/mct_adr.h (renamed from src/mame/machine/jazz_mct_adr.h)23
-rw-r--r--src/mame/mame.lst67
-rw-r--r--src/mame/video/galpani2.cpp6
-rw-r--r--src/mame/video/kaneko16.cpp4
-rw-r--r--src/mame/video/kaneko_spr.cpp89
-rw-r--r--src/mame/video/kaneko_spr.h20
-rw-r--r--src/osd/modules/debugger/debuggdbstub.cpp2
-rw-r--r--src/osd/modules/debugger/debugimgui.cpp8
-rw-r--r--src/osd/modules/debugger/win/consolewininfo.cpp14
-rw-r--r--src/osd/modules/debugger/win/disasmbasewininfo.cpp6
-rw-r--r--src/osd/modules/debugger/win/editwininfo.cpp2
-rw-r--r--src/osd/modules/file/winptty.cpp2
-rw-r--r--src/osd/modules/font/font_dwrite.cpp2
-rw-r--r--src/osd/modules/monitor/monitor_dxgi.cpp2
-rw-r--r--src/osd/modules/monitor/monitor_win32.cpp2
-rw-r--r--src/osd/modules/output/network.cpp2
-rw-r--r--src/osd/modules/render/bgfx/slider.cpp2
-rw-r--r--src/osd/osdsync.cpp6
-rw-r--r--src/osd/windows/video.cpp2
-rw-r--r--src/osd/windows/window.cpp22
-rw-r--r--src/osd/windows/winmain.cpp2
-rw-r--r--src/tools/unidasm.cpp141
122 files changed, 9192 insertions, 6110 deletions
diff --git a/hash/32x.xml b/hash/32x.xml
index dc7941efbcb..dd05b557f44 100644
--- a/hash/32x.xml
+++ b/hash/32x.xml
@@ -79,7 +79,7 @@
</software>
<!-- boot OK -->
- <software name="toughman" supported="yes">
+ <software name="toughman">
<description>Toughman Contest (Euro, USA)</description>
<year>1995</year>
<publisher>Electronic Arts</publisher>
diff --git a/hash/apple2_flop_clcracked.xml b/hash/apple2_flop_clcracked.xml
index 0acd3ce71ac..cba44a2bb1a 100644
--- a/hash/apple2_flop_clcracked.xml
+++ b/hash/apple2_flop_clcracked.xml
@@ -35996,6 +35996,7 @@
<!-- This is version 4.0, originally distributed on a 3.5-inch (800K)
disk for Apple IIgs, //c+, or //e users with a UniDisk 3.5-inch drive.
-->
+
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819264">
<rom name="the quarter mile v4.0 800k (4am crack).2mg" size="819264" crc="0ecf0ca5" sha1="09f1df0b1819296037ed00020cfca537bc510793"/>
@@ -36003,4 +36004,74 @@
</part>
</software>
+ <software name="whtlgcr1">
+ <description>What's My Logic? (Version 1.0) (cleanly cracked)</description>
+ <year>1984</year>
+ <publisher>Midwest Publications</publisher>
+ <info name="release" value="2020-01-21"/>
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="what's my logic? (4am crack).dsk" size="143360" crc="433922c6" sha1="2902ea9aa9ef0f75d51d555d36b82feef4b51f12"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="diaread1">
+ <description>Diascriptive Reading I (cleanly cracked)</description>
+ <year>1984</year>
+ <publisher>Educational Activities</publisher>
+ <info name="release" value="2020-01-21"/>
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Details"/>
+ <dataarea name="flop" size="143360">
+ <rom name="diascriptive reading i (4am crack) disk 1 - details.dsk" size="143360" crc="84cf8618" sha1="aa682b4da097993877d086b86717625b946944db"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Inference"/>
+ <dataarea name="flop" size="143360">
+ <rom name="diascriptive reading i (4am crack) disk 2 - inference.dsk" size="143360" crc="8585d61e" sha1="a0910aed62bddf4d56c59ae9b6057a8338f56b68"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 - Main idea"/>
+ <dataarea name="flop" size="143360">
+ <rom name="diascriptive reading i (4am crack) disk 3 - main idea.dsk" size="143360" crc="e36d1a25" sha1="bd0a63fd197d51c6271747e764eabfc2888c8a19"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 - Sequence"/>
+ <dataarea name="flop" size="143360">
+ <rom name="diascriptive reading i (4am crack) disk 4 - sequence.dsk" size="143360" crc="bc8f308a" sha1="d63a62cef26488b2d76d6ceb26f791e5531b3127"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 - Vocabulary"/>
+ <dataarea name="flop" size="143360">
+ <rom name="diascriptive reading i (4am crack) disk 5 - vocabulary.dsk" size="143360" crc="947000e5" sha1="e44284a73af9e9d15d6b1eacff9400096e10cf31"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 - Diagnostic tests"/>
+ <dataarea name="flop" size="143360">
+ <rom name="diascriptive reading i (4am crack) disk 6 - diagnostic tests.dsk" size="143360" crc="d487f31c" sha1="ffba07158f024a3668b286e308734a637533b222"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="airnavtr">
+ <description>Air Navigation Trainer (cleanly cracked)</description>
+ <year>1982</year>
+ <publisher>Space-Time Associates</publisher>
+ <info name="release" value="2020-01-21"/>
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="143360">
+ <rom name="air navigation trainer (4am crack).dsk" size="143360" crc="dbd68189" sha1="03e9791a1bf6b4c0560935e8bd7e9b6b8566abcf"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/apple2_flop_orig.xml b/hash/apple2_flop_orig.xml
index 284d8039611..3a1ba415cc4 100644
--- a/hash/apple2_flop_orig.xml
+++ b/hash/apple2_flop_orig.xml
@@ -9878,4 +9878,526 @@
</part>
</software>
+ <software name="wzdryr21">
+ <description>Wizardry: Proving Grounds of the Mad Overlord (Version 2.1)</description>
+ <year>1981</year>
+ <publisher>Sir-Tech</publisher>
+ <info name="release" value="2020-01-11"/>
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It runs on any Apple II with 48K. -->
+ <!-- Note: some emulators may have difficulty loading this disk
+ because of its especially timing-sensitive copy protection.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot disk"/>
+ <dataarea name="flop" size="234829">
+ <rom name="wizardry - proving grounds of the mad overlord v2.1 - boot disk.woz" size="234829" crc="29dfa2a6" sha1="6c0416fb7cb91bde8da05df77ecfc5f7b7c645f1"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Scenario master disk"/>
+ <dataarea name="flop" size="234829">
+ <rom name="wizardry - proving grounds of the mad overlord v2.1 - scenario master disk.woz" size="234829" crc="7951ca26" sha1="604a416c50ca6fccb39c11142f8be00d51ce627c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wzrdry2">
+ <description>Wizardry II: The Knight of Diamonds (Version PV3S2V1/10-MAR-82)</description>
+ <year>1982</year>
+ <publisher>Sir-Tech</publisher>
+ <info name="release" value="2020-01-11"/>
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It runs on any Apple II with 48K. -->
+ <!-- This is version PV3S2V1 of 10-MAR-82.
+ Note: some emulators may have difficulty loading this disk because of
+ its especially timing-sensitive copy protection.-->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Boot disk"/>
+ <dataarea name="flop" size="234854">
+ <rom name="wizardry ii - knight of diamonds - boot disk.woz" size="234854" crc="16a794a8" sha1="db098051302810edb8aa5c56c8a3dd7cc9ab0772"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Master scenario disk"/>
+ <dataarea name="flop" size="234865">
+ <rom name="wizardry ii - knight of diamonds - master scenario disk.woz" size="234865" crc="ac3a27d9" sha1="59f7c602c6347c732ddd8222d667622bf8749a29"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wizipr21">
+ <description>Wiziprint (Version 2.1)</description>
+ <year>1982</year>
+ <publisher>Sir-Tech</publisher>
+ <info name="release" value="2020-01-13"/>
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It runs on any Apple II with 48K. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234840">
+ <rom name="wiziprint v2.01.woz" size="234840" crc="593dc847" sha1="d8628dbce3441820cbbd2ef4ac5a94421e514226"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tramazon">
+ <description>Amazon</description>
+ <year>1984</year>
+ <publisher>Trillium</publisher>
+ <info name="release" value="2020-01-14"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1"/>
+ <dataarea name="flop" size="234765">
+ <rom name="amazon side 1.woz" size="234765" crc="3b40f777" sha1="423b5ac50f78b437147fd8dbe9eda9e4d47759b7"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2"/>
+ <dataarea name="flop" size="234765">
+ <rom name="amazon side 2.woz" size="234765" crc="99779f7b" sha1="3fb413d6e6600257d4a28fcf0f3af7c72b3548ad"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3 (Boot)"/>
+ <dataarea name="flop" size="234765">
+ <rom name="amazon side 3 (boot).woz" size="234765" crc="0e5a0504" sha1="2728aa48758297ad385fa49f30353a49e62bd888"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4"/>
+ <dataarea name="flop" size="234765">
+ <rom name="amazon side 4.woz" size="234765" crc="41ed7aa5" sha1="0b3d7c70f1ed66366ea57d20c0846fb92be4fc0d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lrdskrma">
+ <description>Lords of Karma</description>
+ <year>1981</year>
+ <publisher>Avalon Hill</publisher>
+ <info name="release" value="2020-01-14"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234768">
+ <rom name="lords of karma.woz" size="234768" crc="36d0b276" sha1="cda44968d7b4902af648fbb04597ea50b1b7947a"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="xyphus">
+ <description>Xyphus</description>
+ <year>1984</year>
+ <publisher>Penguin Software</publisher>
+ <info name="release" value="2020-01-14"/>
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It runs on any Apple II with 48K. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 - Program disk"/>
+ <dataarea name="flop" size="121619">
+ <rom name="xyphus - program disk.woz" size="121619" crc="9126e743" sha1="04d5ad0a6a547cc672769f0512d374072ad0d950"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 - Scenario disk"/>
+ <dataarea name="flop" size="221460">
+ <rom name="xyphus - scenario disk.woz" size="221460" crc="081fa985" sha1="116c2cdd0240393c2920c665fc0a251e6d5b8bf5"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ochess70">
+ <description>Chess (Odesta) (Version 7.0)</description>
+ <year>1982</year>
+ <publisher>Odesta Software</publisher>
+ <info name="release" value="2020-01-14"/>
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It runs on any Apple II with 48K. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234821">
+ <rom name="chess v7.0 (odesta).woz" size="234821" crc="dea3482d" sha1="40d127ba91d83be331a266e4f7d9727baeb78711"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rambop2">
+ <description>Rambo: First Blood Part II</description>
+ <year>1985</year>
+ <publisher>Mindscape</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an 64K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234786">
+ <rom name="rambo - first blood part ii.woz" size="234786" crc="92ca8258" sha1="e8c90cd2690c0cdf3760184ccc9befdfde4d171c"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newworld">
+ <description>New World</description>
+ <year>1982</year>
+ <publisher>Epyx</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234801">
+ <rom name="new world.woz" size="234801" crc="2e45639d" sha1="2b64556b6c107d07f382b4fdbb4c61db7e3bcadc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qstscltr">
+ <description>Quest for the Scarlet Letter</description>
+ <year>1982</year>
+ <publisher>Superior Software</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234802">
+ <rom name="quest for the scarlet letter.woz" size="234802" crc="8af2dc02" sha1="f5548d1ad829df311e71d4682741569946054cee"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cubnftsy">
+ <description>Cuban Fantasy</description>
+ <year>1982</year>
+ <publisher>Yukon Computer Products</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="235483">
+ <rom name="cuban fantasy.woz" size="235483" crc="952f53c4" sha1="22eb3c69a4ef8a77dbc72cde2fa2d79a951b8f7b"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="neuromnc">
+ <description>Neuromancer</description>
+ <year>1988</year>
+ <publisher>Interplay Productions</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 128K Apple //e or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1"/>
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 1.woz" size="241467" crc="450dc5ec" sha1="540d98c2c7aceb2160d25b4136e84deec63e213c"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2"/>
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 2.woz" size="241467" crc="4a7de9ee" sha1="5cdb323c885869dacd466122ebd6ce698fcb2471"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Side 3"/>
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 3.woz" size="241467" crc="f041598b" sha1="51073328024c3568cda596656395f570044b7e31"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Side 4"/>
+ <dataarea name="flop" size="241467">
+ <rom name="neuromancer - side 4.woz" size="241467" crc="73642b5f" sha1="ac839fd7419df495bf263f05f70784d74d1c1f16"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dhuukrul">
+ <description>The Dark Heart of Uukrul</description>
+ <year>1989</year>
+ <publisher>Broderbund Software</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 128K Apple //e or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Archive Disk"/>
+ <dataarea name="flop" size="234821">
+ <rom name="the dark heart of uukrul - archive disk.woz" size="234821" crc="e3defc5a" sha1="8ac090f8a5ead4aedea6f337d2dcf6322d463838"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Boot Disk"/>
+ <dataarea name="flop" size="234818">
+ <rom name="the dark heart of uukrul - boot disk.woz" size="234818" crc="94ecd9db" sha1="2892c5b5d1000f08a525fdf2d90842b9fb588eae"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Scenario disk A"/>
+ <dataarea name="flop" size="234824">
+ <rom name="the dark heart of uukrul - scenario disk a.woz" size="234824" crc="5cfa9773" sha1="69ec3686d9b562fc4bd318a10bf2ae464fc3cfd0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Scenario disk B"/>
+ <dataarea name="flop" size="234824">
+ <rom name="the dark heart of uukrul - scenario disk b.woz" size="234824" crc="766dc1ee" sha1="ae4084e5af24a8ecfded776371e470d150ade818"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brck1798">
+ <description>The Breckenridge Caper of 1798</description>
+ <year>1982</year>
+ <publisher>Superior Software</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234798">
+ <rom name="the breckenridge caper of 1798.woz" size="234798" crc="d1399d24" sha1="e61b445913b556052f08a5b3abdaa923fc8c6dde"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="amnesia">
+ <description>Amnesia</description>
+ <year>1986</year>
+ <publisher>Electronic Arts</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 64K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="228118">
+ <rom name="amnesia disk 1a.woz" size="228118" crc="2bc5a39f" sha1="927c536daae91d82175efab5e707881673c4d73a"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="234774">
+ <rom name="amnesia disk 1b.woz" size="234774" crc="b1a530f1" sha1="abf89dd7a83002b7b62cd77b9fd73582bc707333"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="234774">
+ <rom name="amnesia disk 2a.woz" size="234774" crc="28042b7f" sha1="5dbce53fc06e1e9dea2ea3ae9c6c4f1d8dc03a82"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="234774">
+ <rom name="amnesia disk 2b.woz" size="234774" crc="edc22834" sha1="7a2570b1a124fc1cea148f9cd899ccab25958b93"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="goldrush">
+ <description>Gold Rush! (Version 1.0M)</description>
+ <year>1989</year>
+ <publisher>Sierra On-Line</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value="A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 128K Apple //e or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 1a.woz" size="234823" crc="353becc5" sha1="4017229d3201a124fd6e3279e5636a22f1db2ed4"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 1b.woz" size="234823" crc="65579b17" sha1="719361e313bdbec9750d905cc9e6df1fcd0b4309"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 2a.woz" size="234823" crc="402a1809" sha1="e7bfc6707a0dc06a3a056e65ff97e98ba5c832f6"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 2b.woz" size="234823" crc="00c89187" sha1="851bd9fba6b918fa53db274f02325d8e3940609b"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 3a.woz" size="234823" crc="b1f9a9cf" sha1="a3c335e3dcdcaa46a0a98f709f64fbdef4cfaf0b"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 3b.woz" size="234823" crc="846d5ff7" sha1="11d4faa4492c0bb7fe6bc444b4ff7426aec449c3"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 4a.woz" size="234823" crc="aa7a4cd6" sha1="c6487a07ca5841aafcaa3674dfe3a7e695b66fc3"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 4b.woz" size="234823" crc="98a27bfc" sha1="bb7bb6bcf6fd0e25007ebd179c2cc9f8b321d4b7"/>
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 5a.woz" size="234823" crc="52f1b57d" sha1="70a2741ef18489ccb8b9e219e9d7a2092a7ab02d"/>
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 5b.woz" size="234823" crc="5c286071" sha1="fbfa17119806934af718514aa6622861c2d7b16c"/>
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 6a.woz" size="234823" crc="3308207f" sha1="41aff7efcf1775f675ada82eccb89fe7fc19e981"/>
+ </dataarea>
+ </part>
+ <part name="flop12" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 6b.woz" size="234823" crc="51bd3df5" sha1="124f7cba9bef89e63674209ff44f30207f405ade"/>
+ </dataarea>
+ </part>
+ <part name="flop13" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 7a.woz" size="234823" crc="ba529141" sha1="eaadffc83064fc9f709f79fbb47a63569b96e8d1"/>
+ </dataarea>
+ </part>
+ <part name="flop14" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 7b.woz" size="234823" crc="a985bb4d" sha1="c10dbcc84e67fccd627a17a0e7a1f86a38463162"/>
+ </dataarea>
+ </part>
+ <part name="flop15" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8 Side A"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 8a.woz" size="234823" crc="0d6cd2e5" sha1="5fd0a83ea530e010a34353f3a663887aa16c3964"/>
+ </dataarea>
+ </part>
+ <part name="flop16" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8 Side B"/>
+ <dataarea name="flop" size="234823">
+ <rom name="gold rush! disk 8b.woz" size="234823" crc="9894e285" sha1="63a441f0bee1b130b7883e2bbfc20882884c40ef"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qphulk">
+ <description>Questprobe featuring The Hulk (Version 2.3/127)</description>
+ <year>1984</year>
+ <publisher>Adventure International</publisher>
+ <info name="release" value="2020-01-20"/>
+ <sharedfeat name="compatibility" value=",A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires an Apple ][+ with 48K. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="flop" size="234828">
+ <rom name="questprobe featuring the hulk side a.woz" size="234828" crc="5878d49d" sha1="84cf1dbe3c38a0b98e8030932217f911a9146643"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side B (Boot)"/>
+ <dataarea name="flop" size="234828">
+ <rom name="questprobe featuring the hulk side b (boot).woz" size="234828" crc="54ddc830" sha1="c8884b9fb356cfb5dc496920e0653ee6b2572c2f"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="horizv">
+ <description>Horizon V</description>
+ <year>1982</year>
+ <publisher>Gebelli Software</publisher>
+ <info name="release" value="2020-01-22"/>
+ <sharedfeat name="compatibility" value="A2,A2P"/>
+ <!-- It requires an Apple ][ or Apple ][+. Due to restrictive copy protection, it will not boot on later models. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="354579">
+ <rom name="horizon v.woz" size="354579" crc="4ba97a3e" sha1="57c0c36f919df498693e235614bd0c1c83183181"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crwnarth">
+ <description>Crown of Arthain</description>
+ <year>1980</year>
+ <publisher>Micro Lab</publisher>
+ <info name="release" value="2020-01-22"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="234789">
+ <rom name="crown of arthain.woz" size="234789" crc="454ac2fa" sha1="068c976a64a2b0563e5f98983a8d7b46976307c2"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="diamine">
+ <description>Diamond Mine</description>
+ <year>1983</year>
+ <publisher>Roklan Corporation</publisher>
+ <info name="release" value="2020-01-22"/>
+ <sharedfeat name="compatibility" value="A2,A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It runs on any Apple II with 48K. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="201487">
+ <rom name="diamond mine.woz" size="201487" crc="d7e143f3" sha1="66d84fd826d0bed64c585c00deedbfbc570854ce"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="abyszone">
+ <description>The Abyssal Zone</description>
+ <year>1984</year>
+ <publisher>Salty Software</publisher>
+ <info name="release" value="2020-01-22"/>
+ <sharedfeat name="compatibility" value="A2P,A2E,A2EE,A2C,A2GS"/>
+ <!-- It requires a 48K Apple ][+ or later. -->
+
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Side 1"/>
+ <dataarea name="flop" size="234815">
+ <rom name="the abyssal zone side 1.woz" size="234815" crc="36ed024c" sha1="1cb3db556bbbc417e16f0021579d636b461107d2"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Side 2 - Boot"/>
+ <dataarea name="flop" size="234813">
+ <rom name="the abyssal zone side 2 (boot).woz" size="234813" crc="4113c4f4" sha1="6cee828e9f6ed6adbe799b2579f35b05f9821f01"/>
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/archimedes.xml b/hash/archimedes.xml
index 76e51fb923d..79d61142208 100644
--- a/hash/archimedes.xml
+++ b/hash/archimedes.xml
@@ -231,7 +231,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="airsuprm" supported="yes">
+ <software name="airsuprm">
<description>Air Supremacy</description>
<year>1991</year>
<publisher>Superior Software/Acornsoft</publisher>
@@ -255,7 +255,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="alerion" supported="yes">
+ <software name="alerion">
<description>Alerion</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -327,7 +327,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="allinbox" supported="yes">
+ <software name="allinbox">
<description>All-In Boxing</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -395,7 +395,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="alps" supported="yes">
+ <software name="alps">
<description>ALPS - Adventure Language Programming System</description>
<year>1994</year>
<publisher>Alpine Software</publisher>
@@ -477,7 +477,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="axis" supported="yes">
+ <software name="axis">
<description>Axis</description>
<year>1993</year>
<publisher>TBA Software</publisher>
@@ -496,7 +496,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="bigbang" supported="yes">
+ <software name="bigbang">
<description>Big Bang</description>
<year>1996</year>
<publisher>Psycore</publisher>
@@ -508,7 +508,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="blitz" supported="yes">
+ <software name="blitz">
<description>Blitz!</description>
<year>1991</year>
<publisher>Arxe Systems</publisher>
@@ -520,7 +520,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="blowpipe" supported="yes">
+ <software name="blowpipe">
<description>Blowpipe</description>
<year>1990</year>
<publisher>Eclipse</publisher>
@@ -551,7 +551,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="break147" supported="yes">
+ <software name="break147">
<description>Break 147</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -649,7 +649,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="cataclys" supported="yes">
+ <software name="cataclys">
<description>Cataclysm</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -669,7 +669,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- Boot OK -->
- <software name="caverns" supported="yes">
+ <software name="caverns">
<description>Caverns</description>
<year>1991</year>
<publisher>Minerva</publisher>
@@ -681,7 +681,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has hacker note in !ChessInfo -->
- <software name="chess3d" supported="yes">
+ <software name="chess3d">
<description>Chess 3D</description>
<year>1991</year>
<publisher>Micro Power</publisher>
@@ -693,7 +693,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has hacker note in !ChessInfo -->
- <software name="chess3da" cloneof="chess3d" supported="yes">
+ <software name="chess3da" cloneof="chess3d">
<description>Chess 3D (Alt)</description>
<year>1991</year>
<publisher>Micro Power</publisher>
@@ -775,7 +775,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="chuckrck" supported="yes">
+ <software name="chuckrck">
<description>Chuck Rock</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -794,7 +794,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="conquer" supported="yes">
+ <software name="conquer">
<description>Conqueror</description>
<year>1988</year>
<publisher>Superior Software/Acornsoft</publisher>
@@ -1053,7 +1053,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="ego" supported="yes">
+ <software name="ego">
<description>EGO: Repton 4</description>
<year>1992</year>
<publisher>Superior Software</publisher>
@@ -1065,7 +1065,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- Hangs at boot screen -->
- <software name="egoc" cloneof="ego" supported="yes">
+ <software name="egoc" cloneof="ego">
<description>EGO: Repton 4 [passwords]</description>
<year>1992</year>
<publisher>ProAction</publisher>
@@ -1113,7 +1113,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, Has trainer and passwords file -->
- <software name="enigma" supported="yes">
+ <software name="enigma">
<description>Enigma</description>
<year>1993</year>
<publisher>Archimedes World</publisher>
@@ -1125,7 +1125,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, Has trainer and passwords file -->
- <software name="enigmaa" cloneof="enigma" supported="yes">
+ <software name="enigmaa" cloneof="enigma">
<description>Enigma (Alt)</description>
<year>1993</year>
<publisher>Archimedes World</publisher>
@@ -1186,7 +1186,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="fireice" supported="yes">
+ <software name="fireice">
<description>Fire &amp; Ice</description>
<year>1995</year>
<publisher>Krisalis</publisher>
@@ -1205,7 +1205,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has unemulated printer -->
- <software name="fish" supported="yes">
+ <software name="fish">
<description>Fish!</description>
<year>1990</year>
<publisher>Magnetic Scrolls</publisher>
@@ -1371,7 +1371,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="galacdan" supported="yes">
+ <software name="galacdan">
<description>Galactic Dan</description>
<year>1992</year>
<publisher>Fourth Dimension</publisher>
@@ -1383,7 +1383,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, title screen logo have few black dots -->
- <software name="gods" supported="yes">
+ <software name="gods">
<description>Gods</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1402,7 +1402,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, title screen logo have few black dots -->
- <software name="godsc" cloneof="gods" supported="yes">
+ <software name="godsc" cloneof="gods">
<description>Gods [cracked]</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1421,7 +1421,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="gorm" supported="yes">
+ <software name="gorm">
<description>Gorm</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -1445,7 +1445,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="gribblys" supported="yes">
+ <software name="gribblys">
<description>Gribbly's Day Out on the Arc</description>
<year>1992</year>
<publisher>Coin-Age</publisher>
@@ -1457,7 +1457,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="guildthvs" supported="yes">
+ <software name="guildthvs">
<description>The Guild of Thieves</description>
<year>1989</year>
<publisher>Magnetic Scrolls</publisher>
@@ -1481,7 +1481,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, only stage 1 (recheck on Arculator) -->
- <software name="hamsters" supported="yes">
+ <software name="hamsters">
<description>Hamsters (Demo)</description>
<year>1994</year>
<publisher>Eclipse</publisher>
@@ -1544,7 +1544,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="hexatoms" supported="yes">
+ <software name="hexatoms">
<description>Hex Atoms</description>
<year>1992</year>
<publisher>BitBox</publisher>
@@ -1594,7 +1594,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has trainer -->
- <software name="ironlord" supported="yes">
+ <software name="ironlord">
<description>Iron Lord</description>
<year>1990</year>
<publisher>Cygnus</publisher>
@@ -1607,7 +1607,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="ironlorda" cloneof="ironlord" supported="yes">
+ <software name="ironlorda" cloneof="ironlord">
<description>Iron Lord (Alt)</description>
<year>1990</year>
<publisher>Ubi Soft</publisher>
@@ -1716,7 +1716,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="lander" supported="yes">
+ <software name="lander">
<description>Lander (Demo)</description>
<year>1987</year>
<publisher>Acorn</publisher>
@@ -1728,7 +1728,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="ldaydoom" supported="yes">
+ <software name="ldaydoom">
<description>The Last Days of Doom (includes Hezarin)</description>
<year>1993</year>
<publisher>Topologika</publisher>
@@ -1740,7 +1740,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="lastninja" supported="yes">
+ <software name="lastninja">
<description>The Last Ninja</description>
<year>1992</year>
<publisher>Superior Software</publisher>
@@ -1753,7 +1753,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="lastninjac" cloneof="lastninja" supported="yes">
+ <software name="lastninjac" cloneof="lastninja">
<description>The Last Ninja [cracked]</description>
<year>1992</year>
<publisher>Superior Software</publisher>
@@ -1873,7 +1873,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="magpockets" supported="yes">
+ <software name="magpockets">
<description>Magic Pockets</description>
<year>1993</year>
<publisher>Renegade</publisher>
@@ -1885,7 +1885,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="magscrolls" supported="yes">
+ <software name="magscrolls">
<description>The Magnetic Scrolls Collection</description>
<year>1991</year>
<publisher>Magnetic Scrolls</publisher>
@@ -1917,7 +1917,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="mariarti" supported="yes">
+ <software name="mariarti">
<description>Mad Professor Mariarti</description>
<year>1990</year>
<publisher>Krisalis</publisher>
@@ -1941,7 +1941,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="mariartib" cloneof="mariarti" supported="yes">
+ <software name="mariartib" cloneof="mariarti">
<description>Mad Professor Mariarti (Alt 2)</description>
<year>1990</year>
<publisher>Krisalis</publisher>
@@ -2008,7 +2008,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="moonquak" supported="yes">
+ <software name="moonquak">
<description>Moon Quake</description>
<year>1992</year>
<publisher>Archimedes World</publisher>
@@ -2021,7 +2021,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, main sprite cuts off when moving -->
- <software name="mrdoo" supported="yes">
+ <software name="mrdoo">
<description>Mr. Doo</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -2033,7 +2033,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, main sprite cuts off when moving -->
- <software name="mrdooa" cloneof="mrdoo" supported="yes">
+ <software name="mrdooa" cloneof="mrdoo">
<description>Mr. Doo (Alt)</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -2141,7 +2141,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="pacmania" supported="yes">
+ <software name="pacmania">
<description>Pac-Mania</description>
<year>1991</year>
<publisher>Domark</publisher>
@@ -2191,7 +2191,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has Vertical Twist joystick utility -->
- <software name="paradr2k" supported="yes">
+ <software name="paradr2k">
<description>Paradroid 2000</description>
<year>1993</year>
<publisher>Coin-Age</publisher>
@@ -2203,7 +2203,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has Vertical Twist joystick utility -->
- <software name="paradr2ka" cloneof="paradr2k" supported="yes">
+ <software name="paradr2ka" cloneof="paradr2k">
<description>Paradroid 2000 (Alt)</description>
<year>1993</year>
<publisher>Coin-Age</publisher>
@@ -2307,7 +2307,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="populous" supported="yes">
+ <software name="populous">
<description>Populous</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -2319,7 +2319,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="populousc" cloneof="populous" supported="yes">
+ <software name="populousc" cloneof="populous">
<description>Populous [cracked]</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -2373,7 +2373,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="repton3" supported="yes">
+ <software name="repton3">
<description>Repton 3</description>
<year>1988</year>
<publisher>Superior Software/Acornsoft</publisher>
@@ -2396,7 +2396,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="revelatn" supported="yes">
+ <software name="revelatn">
<description>Revelation</description>
<year>1993</year>
<publisher>Krisalis</publisher>
@@ -2408,7 +2408,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="revolver" supported="yes">
+ <software name="revolver">
<description>Revolver</description>
<year>1995</year>
<publisher>Psycore</publisher>
@@ -2420,7 +2420,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, using a "c" command prints the floppy contents? -->
- <software name="risecrime" supported="yes">
+ <software name="risecrime">
<description>Rise In Crime</description>
<year>1988</year>
<publisher>Robico</publisher>
@@ -2475,7 +2475,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="serpents" supported="yes">
+ <software name="serpents">
<description>Serpents</description>
<year>1993</year>
<publisher>CIS</publisher>
@@ -2566,7 +2566,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, initial speech pitch sounds very low (btanb) -->
- <software name="small" supported="yes">
+ <software name="small">
<description>Small</description>
<year>1993</year>
<publisher>Virgo Software</publisher>
@@ -2614,7 +2614,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="spheres" supported="yes">
+ <software name="spheres">
<description>Spheres of Chaos (Demo)</description>
<year>1992</year>
<publisher>Matt Black</publisher>
@@ -2626,7 +2626,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="spheresa" cloneof="spheres" supported="yes">
+ <software name="spheresa" cloneof="spheres">
<description>Spheres of Chaos (Demo)(Alt)</description>
<year>1992</year>
<publisher>Matt Black</publisher>
@@ -2638,7 +2638,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="spheresc" supported="yes">
+ <software name="spheresc">
<description>Spheres of Chaos</description>
<year>1993</year>
<publisher>Matt Black</publisher>
@@ -2737,7 +2737,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="suprpool" supported="yes">
+ <software name="suprpool">
<description>Super Pool</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -2785,7 +2785,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, joystick isn't detected -->
- <software name="swiv" supported="yes">
+ <software name="swiv">
<description>SWIV</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -2809,7 +2809,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, mouse gfx on Frozen screen looks bad -->
- <software name="talismana" cloneof="talisman" supported="yes">
+ <software name="talismana" cloneof="talisman">
<description>Talisman (Alt)</description>
<year>1989</year>
<publisher>Minerva</publisher>
@@ -2821,7 +2821,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="terramex" supported="yes">
+ <software name="terramex">
<description>Terramex</description>
<year>1988</year>
<publisher>Krisalis</publisher>
@@ -2834,7 +2834,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<!-- boot OK -->
<!-- Revised version means it can run on RiscOS 3.5+ -->
- <software name="terramexa" cloneof="terramex" supported="yes">
+ <software name="terramexa" cloneof="terramex">
<description>Terramex (Revised Version, v2.05)</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -2846,7 +2846,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="topbanan" supported="yes">
+ <software name="topbanan">
<description>Top Banana</description>
<year>1988</year>
<publisher>Hex</publisher>
@@ -2858,7 +2858,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="topbanana" cloneof="topbanan" supported="yes">
+ <software name="topbanana" cloneof="topbanan">
<description>Top Banana (Alt)</description>
<year>1988</year>
<publisher>Hex</publisher>
@@ -2870,7 +2870,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="towbabel" supported="yes">
+ <software name="towbabel">
<description>Tower of Babel</description>
<year>1991</year>
<publisher>Cygnus</publisher>
@@ -2955,7 +2955,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has ZX Spectrum like raster effect when dying with the fan -->
- <software name="wimpgame" supported="yes">
+ <software name="wimpgame">
<description>The Wimp Game</description>
<year>1990</year>
<publisher>Fourth Dimension</publisher>
@@ -2968,7 +2968,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has ZX Spectrum like raster effect when dying with the fan -->
- <software name="wimpgamec" cloneof="wimpgame" supported="yes">
+ <software name="wimpgamec" cloneof="wimpgame">
<description>The Wimp Game [cracked]</description>
<year>1990</year>
<publisher>Fourth Dimension</publisher>
@@ -2981,7 +2981,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="wolf3d" supported="yes">
+ <software name="wolf3d">
<description>Wolfenstein 3D</description>
<year>1994</year>
<publisher>Powerslave Software</publisher>
@@ -3019,7 +3019,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="worldbox" supported="yes">
+ <software name="worldbox">
<description>World Championship Boxing Manager</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -3082,7 +3082,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="zarch" supported="yes">
+ <software name="zarch">
<description>Zarch</description>
<year>1987</year>
<publisher>Superior Software/Acornsoft</publisher>
@@ -3095,7 +3095,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="zarchc" cloneof="zarch" supported="yes">
+ <software name="zarchc" cloneof="zarch">
<description>Zarch [cracked]</description>
<year>1987</year>
<publisher>Superior Software/Acornsoft</publisher>
@@ -3130,7 +3130,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<!-- Other disks to sort (homebrew?!?) -->
<!-- boot OK -->
- <software name="3dtanks" supported="yes">
+ <software name="3dtanks">
<description>3D Tanks</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3193,7 +3193,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="bloxed" supported="yes">
+ <software name="bloxed">
<description>Bloxed (v1.09, 23 Feb 1995)</description>
<year>1995</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3206,7 +3206,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="blackhrt" supported="yes">
+ <software name="blackhrt">
<description>Castle Black Heart</description>
<year>1991</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3242,7 +3242,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="colourum" supported="yes">
+ <software name="colourum">
<description>Colour UMoria (v5.4.0)</description>
<year>1992</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3256,7 +3256,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<!-- boot OK -->
<!-- TBD: counter check contents of "other" folder with an anti-virus suite -->
- <software name="corewars" supported="yes">
+ <software name="corewars">
<description>Core Wars (v1.17)</description>
<year>1990</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3268,7 +3268,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="creepie" supported="yes">
+ <software name="creepie">
<description>Creepie Crawlie 1 &amp; 2</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3306,7 +3306,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="dinosaw" supported="yes">
+ <software name="dinosaw">
<description>DinoSaw PD (v1.0)</description>
<year>1993</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3331,7 +3331,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="gyrinus2" supported="yes">
+ <software name="gyrinus2">
<description>Gyrinus II - Son of Gyrinus (v3.5)</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3351,7 +3351,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="hacker" supported="yes">
+ <software name="hacker">
<description>The Hacker (v3.05)</description>
<year>1993</year>
<publisher>DoggySoft</publisher>
@@ -3363,7 +3363,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="hackera" cloneof="hacker" supported="yes">
+ <software name="hackera" cloneof="hacker">
<description>The Hacker (Alt, v3.05)</description>
<year>1993</year>
<publisher>DoggySoft</publisher>
@@ -3405,7 +3405,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="lemings" supported="yes">
+ <software name="lemings">
<description>Lemings</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3430,7 +3430,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK, has minor RMW bug on second screen with text scroll -->
- <software name="riscdrm" supported="yes">
+ <software name="riscdrm">
<description>RiscDream</description>
<year>1991</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3483,7 +3483,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="sysintd" supported="yes">
+ <software name="sysintd">
<description>System Interrupt Demos 1-5</description>
<year>1989</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -3509,7 +3509,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
<!-- boot OK -->
- <software name="coconizr" supported="yes">
+ <software name="coconizr">
<description>Coconizer+ (v1.3)</description>
<year>1991</year>
<publisher>Playfield</publisher>
diff --git a/hash/bbc_rom.xml b/hash/bbc_rom.xml
index 035d551b109..8c4953d1775 100644
--- a/hash/bbc_rom.xml
+++ b/hash/bbc_rom.xml
@@ -641,6 +641,7 @@
<publisher>Acorn</publisher>
<info name="release" value="ANB29" />
<info name="usage" value="Requires Acorn 1770 FDC" />
+ <sharedfeat name="compatibility" value="B"/>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
<rom name="Acorn-ADFS-1.30.rom" size="16384" crc="d3855588" sha1="301fd05c475a629c4bec70510d4507256a5b00d8"/>
@@ -648,6 +649,42 @@
</part>
</software>
+ <software name="adfs133">
+ <description>Acorn ADFS 1.33 (IDE)</description>
+ <year>2005</year>
+ <publisher>Acorn / J.G.Harston</publisher>
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Acorn-ADFS-1.33.rom" size="16384" crc="16568e34" sha1="3433c4518b51e333058fedc524b0e31c04e17474"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adfs153">
+ <description>Acorn ADFS 1.53 (IDE)</description>
+ <year>2005</year>
+ <publisher>Acorn / J.G.Harston</publisher>
+ <sharedfeat name="compatibility" value="M"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Acorn-ADFS-1.53.rom" size="16384" crc="d8f17d6f" sha1="2e169ec7b35a407b5d537bacada8b4188ae18bef"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adfs157">
+ <description>Acorn ADFS 1.57 (MMC)</description>
+ <year>2016</year>
+ <publisher>Acorn / J.G.Harston</publisher>
+ <sharedfeat name="compatibility" value="M"/>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="Acorn-ADFS-1.57.rom" size="16384" crc="0c9473ea" sha1="2cfa3d17455627739bfafb0538b3705692ace35d"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="adfsutil">
<description>ADFS Utilities</description>
<year>1988</year>
@@ -681,6 +718,17 @@
</part>
</software>
+ <software name="advros" supported="no">
+ <description>Advanced Ram Operating System 1.00</description>
+ <year>1985</year>
+ <publisher>Permanent Memory Systems</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="AdvancedROS-PMS-1.0.rom" size="16384" crc="aed8aa74" sha1="bc5e5d5d6bcf8114cd41192cdc114a41b16bc357"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="aerodrom">
<description>Aerodrome Training Aid</description>
<year>1986</year>
@@ -3128,6 +3176,17 @@
</part>
</software>
+ <software name="eprom103" cloneof="eprom" supported="no">
+ <description>EPROM 1.03</description>
+ <year>1983</year>
+ <publisher>Watford Electronics</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="EPROM-1.03.rom" size="8192" crc="06b7d662" sha1="dc9593fea03500a1942cb631a1f318f486d22fc6"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="eprom104" cloneof="eprom" supported="no">
<description>EPROM 1.04</description>
<year>1984</year>
@@ -3882,6 +3941,28 @@
</part>
</software>
+ <software name="hadfs600" cloneof="hadfs">
+ <description>Harston ADFS 6.00</description>
+ <year>2012</year>
+ <publisher>J.G.Harston</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="HADFS-6.00.rom" size="16384" crc="1642bfae" sha1="fce389d29ff9188ae700ccf191d49b9567bd96fa"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hadfs">
+ <description>Harston ADFS 6.10</description>
+ <year>2018</year>
+ <publisher>J.G.Harston</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="HADFS-6.10.rom" size="16384" crc="17567a9a" sha1="cb94b8660bd11f75fd07a7c51cb2579ca4ef7689"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="hebrew">
<description>Hebrew</description>
<year>198?</year>
@@ -4139,8 +4220,8 @@
<software name="informnt">
<description>The Informant</description>
- <year>1989</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1990</year>
+ <publisher>Alan Blundell</publisher>
<part name="rom1" interface="bbc_rom">
<dataarea name="rom" size="16384">
<rom name="Informant-1.00.rom" size="16384" crc="094c5f01" sha1="7b78d3f1ab7d4ac0e6960a0a90f6fb7ad0a36ea8"/>
@@ -6101,6 +6182,54 @@
</part>
</software>
+ <software name="ramfs100">
+ <description>RetroClinic RamFS 1.00</description>
+ <year>2009</year>
+ <publisher>RetroClinic</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="RamFS-1.00.rom" size="16384" crc="728c8134" sha1="b39591bddb896745ce1a1cacd01e369ac5971800"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ramfs">
+ <description>RetroClinic RamFS 1.04</description>
+ <year>2016</year>
+ <publisher>RetroClinic</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="RamFS-1.04.rom" size="16384" crc="2e52e331" sha1="d3c501fb29d35c2d144b164fa3ceb5a3b65d2850"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ramagicb" supported="no">
+ <description>RAMagic! 2.0B</description>
+ <year>2008</year>
+ <publisher>Martin Barr</publisher>
+ <sharedfeat name="compatibility" value="B"/>
+ <part name="rom1" interface="bbc_rom">
+ <feature name="slot" value="ramagic" />
+ <dataarea name="rom" size="16384">
+ <rom name="RAMagic-2.0B.rom" size="16384" crc="9653777d" sha1="a8048b0655f2bf8bf962300e1f19335b2f0f8cf7"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ramagicm" supported="no">
+ <description>RAMagic! 2.1M</description>
+ <year>2008</year>
+ <publisher>Martin Barr</publisher>
+ <sharedfeat name="compatibility" value="M"/>
+ <part name="rom1" interface="bbc_rom">
+ <feature name="slot" value="ramagic" />
+ <dataarea name="rom" size="16384">
+ <rom name="RAMagic-2.1M.rom" size="16384" crc="972f1f77" sha1="dbc485df39461036d7edd1f322bd66d70495c84e"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="ravideo240" cloneof="ravideo" supported="no">
<description>Ramamp Video 2.40</description>
<year>1986</year>
@@ -6735,6 +6864,17 @@
</part>
</software>
+ <software name="smartspi" supported="no">
+ <description>Smart SPI</description>
+ <year>2016</year>
+ <publisher>Duikkie</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="SmartSPI-0.10.rom" size="16384" crc="f5782b50" sha1="1058b85bfa3141cc74371a012ed4d6141ba3783a"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="solimon">
<description>Solimon 1.02</description>
<year>1984</year>
@@ -7470,6 +7610,39 @@
</part>
</software>
+ <software name="streamer005" cloneof="streamer" supported="no">
+ <description>Digistore Streamer 0.05</description>
+ <year>1986</year>
+ <publisher>Digital Services</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Streamer-0.05.rom" size="8192" crc="9b6d6039" sha1="8f3bfd1b1201942641236b4fbf282410fdfe9a80"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="streamer007" cloneof="streamer" supported="no">
+ <description>Digistore Streamer 0.07</description>
+ <year>1986</year>
+ <publisher>Digital Services</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Streamer-0.07.rom" size="8192" crc="4d87e756" sha1="72f574edee756dc3ea91221ff6b8a4c97136a360"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="streamer" supported="no">
+ <description>Digistore Streamer 0.09</description>
+ <year>1986</year>
+ <publisher>Digital Services</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="Streamer-0.09.rom" size="8192" crc="e0c28921" sha1="ffdab09962f61ff674157533ee977abce64dbe63"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="style">
<description>Style 1.3</description>
<year>1991</year>
@@ -8069,7 +8242,7 @@
</part>
</software>
- <software name="turbommc" supported="no">
+ <software name="turbommca1" cloneof="turbommc" supported="no">
<description>Turbo MMC 0.A1</description>
<year>2009</year>
<publisher>IFEL</publisher>
@@ -8080,6 +8253,17 @@
</part>
</software>
+ <software name="turbommc" supported="no">
+ <description>Turbo MMC 0.A3</description>
+ <year>2009</year>
+ <publisher>IFEL</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="TurboMMC-0.A3.rom" size="16384" crc="6f46faf0" sha1="d4db96b96c489209477903d08eaeaa00f0bf5fea"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="turbprom">
<description>Turbo-PROM</description>
<year>1984</year>
@@ -8163,6 +8347,94 @@
</part>
</software>
+ <software name="upurs30r" cloneof="upurs" supported="no">
+ <description>UPURS 3.0R</description>
+ <year>2011</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="UPURS-3.0R.rom" size="8192" crc="43784f3f" sha1="951c1098d21e710606ee0a225413ce2bcf86afcc"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="upurs31r" cloneof="upurs" supported="no">
+ <description>UPURS 3.1R</description>
+ <year>2011</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="UPURS-3.1R.rom" size="8192" crc="7c2571b9" sha1="1d2986d2af35c456ced269a4b9eab62671029105"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="upurs32r" cloneof="upurs" supported="no">
+ <description>UPURS 3.2R</description>
+ <year>2011</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="UPURS-3.2R.rom" size="8192" crc="a149bb89" sha1="76cbcac50e078dbcc48182d1b5060aa63bae4194"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="upurs33r" cloneof="upurs" supported="no">
+ <description>UPURS 3.3R</description>
+ <year>2011</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="8192">
+ <rom name="UPURS-3.3R.rom" size="8192" crc="584ac7bc" sha1="80f6394374268fa3e491e09410e5ec7da5c3d540"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="upurs40r" cloneof="upurs" supported="no">
+ <description>UPURS 4.0R</description>
+ <year>2011</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="UPURS-4.0R.rom" size="16384" crc="8fd5d877" sha1="12a9a448b47efb0eebc6622897b08dd4965ebf6d"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="upurs41r" cloneof="upurs" supported="no">
+ <description>UPURS 4.1R</description>
+ <year>2011</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="UPURS-4.1R.rom" size="16384" crc="9a57906b" sha1="85af1466d966ce05725133dda4b4ba20c29c0c90"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="upurs50r" cloneof="upurs" supported="no">
+ <description>UPURS 5.0R</description>
+ <year>2012</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="UPURS-5.0R.rom" size="16384" crc="fce08231" sha1="ad8ccb3cf9a83f6331383139fe7b7c1a2334f944"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="upurs" supported="no">
+ <description>UPURS 5.1R</description>
+ <year>2018</year>
+ <publisher>Martin Barr</publisher>
+ <part name="rom1" interface="bbc_rom">
+ <dataarea name="rom" size="16384">
+ <rom name="UPURS-5.1R.rom" size="16384" crc="27d87f01" sha1="4725b436c8a31ac88efacf170b27666b68e04869"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="urom12" cloneof="urom">
<description>UROM 1.2</description>
<year>1983</year>
diff --git a/hash/cgenie_cass.xml b/hash/cgenie_cass.xml
index 4b1ccfc268e..7a278c0696a 100644
--- a/hash/cgenie_cass.xml
+++ b/hash/cgenie_cass.xml
@@ -42,7 +42,7 @@ Screen-Printer (standalone)
<!-- Applications -->
- <software name="adressd2" supported="yes">
+ <software name="adressd2">
<description>Adressdatei II</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -54,7 +54,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="basicode" supported="yes">
+ <software name="basicode">
<description>Basicode</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -67,7 +67,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="basicp5" supported="yes">
+ <software name="basicp5">
<description>Basic +5</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -79,7 +79,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="baspack" supported="yes">
+ <software name="baspack">
<description>Basic-Packer 2.13</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -92,7 +92,7 @@ Screen-Printer (standalone)
</software>
<!-- This version doesn't have a help message when you start it with just / -->
- <software name="baspacka" cloneof="baspack" supported="yes">
+ <software name="baspacka" cloneof="baspack">
<description>Basic-Packer 2.13 (alternate)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -104,7 +104,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="benchm" supported="yes">
+ <software name="benchm">
<description>Benchmark Test</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -117,7 +117,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="casloader" supported="yes">
+ <software name="casloader">
<description>Genie I II / TRS 80 Cassettenlader</description>
<year>1984</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -130,7 +130,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="charset" supported="yes">
+ <software name="charset">
<description>Charset</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -143,7 +143,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colcom" supported="yes">
+ <software name="colcom">
<description>Colour Basic Compiler 3.05</description>
<year>1982</year>
<publisher>TCS</publisher>
@@ -155,7 +155,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="coldesig" supported="yes">
+ <software name="coldesig">
<description>Colour Design 3.0</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -167,7 +167,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colforth" supported="yes">
+ <software name="colforth">
<description>Colour-Forth 2.0 (with cassette support)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -179,7 +179,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colfortha" cloneof="colforth" supported="yes">
+ <software name="colfortha" cloneof="colforth">
<description>Colour-Forth 2.0</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -191,7 +191,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colmon2" supported="yes">
+ <software name="colmon2">
<description>Colour-Monitor 2.0</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -203,7 +203,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colmon3" supported="yes">
+ <software name="colmon3">
<description>Colour-Monitor 3.0</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -215,7 +215,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colpasc" supported="yes">
+ <software name="colpasc">
<description>Colour-PASCAL 2.0</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -227,7 +227,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colrot" supported="yes">
+ <software name="colrot">
<description>Colour-ROT</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -240,7 +240,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colzap" supported="yes">
+ <software name="colzap">
<description>Colour-Zap Ver 1.0 (TCS)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -252,7 +252,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="dezhex" supported="yes">
+ <software name="dezhex">
<description>Dez-Hex</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -264,7 +264,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="ebasic" supported="yes">
+ <software name="ebasic">
<description>EBASIC (32k version)</description>
<year>1985</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -277,7 +277,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="editdef" supported="yes">
+ <software name="editdef">
<description>Editor fuer definierbare Zeichen</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -294,7 +294,7 @@ Screen-Printer (standalone)
<!-- * Mastercopy (Joerg L) -->
<!-- * Kopiermonitor (1983, Ernst Schoeberl) -->
<!-- * Ultracopy (TTS) -->
- <software name="excopy" supported="yes">
+ <software name="excopy">
<description>Extended Copy</description>
<year>198?</year>
<publisher>TTS</publisher>
@@ -306,7 +306,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="extrabas" supported="yes">
+ <software name="extrabas">
<description>Extra-Basic</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -319,7 +319,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="grafiked" supported="yes">
+ <software name="grafiked">
<description>Grafik-Editor</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -333,7 +333,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="natomors" supported="yes">
+ <software name="natomors">
<description>Nato Morsing Standard Code</description>
<year>1983</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -347,7 +347,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="nodos80" supported="yes">
+ <software name="nodos80">
<description>NODOS 80</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -359,7 +359,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="primzahl" supported="yes">
+ <software name="primzahl">
<description>Primzahlsuche</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -372,7 +372,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="realcomp" supported="yes">
+ <software name="realcomp">
<description>Real-Compiler</description>
<year>198?</year>
<publisher>MM-Software</publisher>
@@ -384,7 +384,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="rs232" supported="yes">
+ <software name="rs232">
<description>RS-232 Treiberprogramm</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -396,7 +396,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="screened" supported="yes">
+ <software name="screened">
<description>Screen Editor (incl. Adventure screen)</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -408,7 +408,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="shifttra" supported="yes">
+ <software name="shifttra">
<description>Shift Transformation</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -421,7 +421,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="softschu" supported="yes">
+ <software name="softschu">
<description>Software-Schutz</description>
<year>1983</year>
<publisher>Harald Bögeholz</publisher>
@@ -433,7 +433,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="spriteed" supported="yes">
+ <software name="spriteed">
<description>Sprite-Editor</description>
<year>1983</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -446,7 +446,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="superbas" supported="yes">
+ <software name="superbas">
<description>Super-Basic</description>
<year>198?</year>
<publisher>Heinz Hübben Software Verlag</publisher>
@@ -458,7 +458,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="supergra" supported="yes">
+ <software name="supergra">
<description>Super-Grafik</description>
<year>1984</year>
<publisher>The Colour Connection</publisher>
@@ -471,7 +471,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="synthi" supported="yes">
+ <software name="synthi">
<description>Synthesizer (TCS)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -484,7 +484,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="syscopy" supported="yes">
+ <software name="syscopy">
<description>System Copy</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -497,7 +497,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="tapedisk" supported="yes">
+ <software name="tapedisk">
<description>Tape-Disk Converter 1.11</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -509,7 +509,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="tapeedit" supported="yes">
+ <software name="tapeedit">
<description>Tape-Edit</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -522,7 +522,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="tracemon" supported="yes">
+ <software name="tracemon">
<description>Tracemon</description>
<year>1983</year>
<publisher>Juergen Buchmueller</publisher>
@@ -535,7 +535,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="transist" supported="yes">
+ <software name="transist">
<description>Die Physik des Transistors</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -559,7 +559,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="utpack2" supported="yes">
+ <software name="utpack2">
<description>Utilities Package Ver. 2.0</description>
<year>1983</year>
<publisher>Algray Software</publisher>
@@ -572,7 +572,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="zeichen2" supported="yes">
+ <software name="zeichen2">
<description>Zeicheneditor + (incl. SCREEN-Editor)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -584,7 +584,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="zeichene" supported="yes">
+ <software name="zeichene">
<description>Zeicheneditor +</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -596,7 +596,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="zeichens" supported="yes">
+ <software name="zeichens">
<description>Zeichensätze (incl. Screen-Printer)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -611,7 +611,7 @@ Screen-Printer (standalone)
<!-- Demos -->
- <software name="coldemo" supported="yes">
+ <software name="coldemo">
<description>Colour Genie Demonstration Kassette</description>
<year>198?</year>
<publisher>Carsten Schmidt</publisher>
@@ -624,7 +624,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="floh" supported="yes">
+ <software name="floh">
<description>Der Flohwalzer</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -636,7 +636,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="musik" supported="yes">
+ <software name="musik">
<description>Musik</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -649,7 +649,7 @@ Screen-Printer (standalone)
</software>
<!-- From the Colour Genie manual -->
- <software name="peng" supported="yes">
+ <software name="peng">
<description>Peng</description>
<year>198?</year>
<publisher>TCS</publisher>
@@ -663,7 +663,7 @@ Screen-Printer (standalone)
<!-- Games -->
- <software name="abenteue" supported="yes">
+ <software name="abenteue">
<description>Abenteuerland</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -675,7 +675,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="africa" supported="yes">
+ <software name="africa">
<description>Africa</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -688,7 +688,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="andromed" supported="yes">
+ <software name="andromed">
<description>Andromeda (32k)</description>
<year>1982</year>
<publisher>TCG</publisher>
@@ -701,7 +701,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="andromed16" cloneof="andromed" supported="yes">
+ <software name="andromed16" cloneof="andromed">
<description>Andromeda (16k)</description>
<year>1982</year>
<publisher>TCG</publisher>
@@ -714,7 +714,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="astrnaut" supported="yes">
+ <software name="astrnaut">
<description>Astronaut</description>
<year>1984</year>
<publisher>N. A. Taylor</publisher>
@@ -726,7 +726,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="ballon" supported="yes">
+ <software name="ballon">
<description>Ballon</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -738,7 +738,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="botschaf" supported="yes">
+ <software name="botschaf">
<description>Botschaft</description>
<year>1985</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -751,7 +751,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="bruecke" supported="yes">
+ <software name="bruecke">
<description>Brücke</description>
<year>1984</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -765,7 +765,7 @@ Screen-Printer (standalone)
</software>
<!-- From the Colour Genie manual -->
- <software name="bumm" supported="yes">
+ <software name="bumm">
<description>Bumm Bumm</description>
<year>198?</year>
<publisher>TCS</publisher>
@@ -780,7 +780,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="caveman" supported="yes">
+ <software name="caveman">
<description>Cave Man</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -793,7 +793,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="chessm" supported="yes">
+ <software name="chessm">
<description>Chess Machine</description>
<year>1984</year>
<publisher>Heinz Hübben Software Verlag</publisher>
@@ -805,7 +805,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="chop83" supported="yes">
+ <software name="chop83">
<description>Chopper (1983)</description>
<year>1983</year>
<publisher>Jürgen Buchmüller</publisher>
@@ -818,7 +818,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="chopper" supported="yes">
+ <software name="chopper">
<description>Chopper (TCS)</description>
<year>198?</year>
<publisher>TCS</publisher>
@@ -831,7 +831,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="ciaagent" supported="yes">
+ <software name="ciaagent">
<description>CIA-Agent</description>
<year>1985</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -844,7 +844,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colkong" supported="yes">
+ <software name="colkong">
<description>Colour Kong (32k)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -857,7 +857,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colkong16" cloneof="colkong" supported="yes">
+ <software name="colkong16" cloneof="colkong">
<description>Colour Kong (16k)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -870,7 +870,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colkong16a" cloneof="colkong" supported="yes">
+ <software name="colkong16a" cloneof="colkong">
<description>Colour Kong (16k, no autostart)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -883,7 +883,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colscha" supported="yes">
+ <software name="colscha">
<description>Colour Schach</description>
<year>1983</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -896,7 +896,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="colsch" supported="yes">
+ <software name="colsch">
<description>Colour Schach (TCS)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -909,7 +909,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="cosmicat" supported="yes">
+ <software name="cosmicat">
<description>Cosmic Attack</description>
<year>198?</year>
<publisher>Kansas Software</publisher>
@@ -922,7 +922,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="crzchase" supported="yes">
+ <software name="crzchase">
<description>Crazy Chaser</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -934,7 +934,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="crzpaint" supported="yes">
+ <software name="crzpaint">
<description>Crazy Paint</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -947,7 +947,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="crzpaintc" supported="yes">
+ <software name="crzpaintc">
<description>Crazy Paint (The Colour Connection)</description>
<year>1984</year>
<publisher>The Colour Connection</publisher>
@@ -960,7 +960,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="crzpaintca" cloneof="crzpaintc" supported="yes">
+ <software name="crzpaintca" cloneof="crzpaintc">
<description>Crazy Paint (The Colour Connection, alternate)</description>
<year>1984</year>
<publisher>The Colour Connection</publisher>
@@ -973,7 +973,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="deathsta" supported="yes">
+ <software name="deathsta">
<description>Deathstar</description>
<year>1983</year>
<publisher>Algray Software</publisher>
@@ -986,7 +986,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="deathtra" supported="yes">
+ <software name="deathtra">
<description>Deathtrap</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -999,7 +999,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="defender" supported="yes">
+ <software name="defender">
<description>Defender</description>
<year>198?</year>
<publisher>Andreas Goldau Softwareproduction</publisher>
@@ -1012,7 +1012,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="digboy" supported="yes">
+ <software name="digboy">
<description>DIG-BOY (TCS)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1025,7 +1025,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="disvilla" supported="yes">
+ <software name="disvilla">
<description>Disastrous Villa</description>
<year>1985</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -1038,7 +1038,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="dracula" supported="yes">
+ <software name="dracula">
<description>Die Juwelen des Grafen Dracula</description>
<year>198?</year>
<publisher>Cooperated Software</publisher>
@@ -1056,7 +1056,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="eagle" supported="yes">
+ <software name="eagle">
<description>Eagle</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1069,7 +1069,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="eatman" supported="yes">
+ <software name="eatman">
<description>Eatman</description>
<year>1983</year>
<publisher>Molimerx Ltd.</publisher>
@@ -1082,7 +1082,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="eis" supported="yes">
+ <software name="eis">
<description>Eis</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1095,7 +1095,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="eliminat" supported="yes">
+ <software name="eliminat">
<description>Eliminator</description>
<year>1984</year>
<publisher>TCC</publisher>
@@ -1108,7 +1108,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="empire" supported="yes">
+ <software name="empire">
<description>Empire</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1120,7 +1120,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="exrevers" supported="yes">
+ <software name="exrevers">
<description>ExReversic</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1133,7 +1133,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="fastfood" supported="yes">
+ <software name="fastfood">
<description>Fast Food</description>
<year>1983</year>
<publisher>cc Computer Studio</publisher>
@@ -1146,7 +1146,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="firebird" supported="yes">
+ <software name="firebird">
<description>Firebird</description>
<year>1983</year>
<publisher>Heinz Hübben Software Verlag</publisher>
@@ -1159,7 +1159,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="flugsim" supported="yes">
+ <software name="flugsim">
<description>Colour Genie Flugsimulator</description>
<year>1984</year>
<publisher>TCS</publisher>
@@ -1171,7 +1171,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="fraggels" supported="yes">
+ <software name="fraggels">
<description>Im Reich der Fraggels</description>
<year>19??</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -1185,7 +1185,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="frog" supported="yes">
+ <software name="frog">
<description>Colour Frog</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1198,7 +1198,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="glueck" supported="yes">
+ <software name="glueck">
<description>Glückspilz</description>
<year>1983</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1212,7 +1212,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="gorilla" supported="yes">
+ <software name="gorilla">
<description>Gorilla</description>
<year>1983</year>
<publisher>Heinz Hübben Software Verlag</publisher>
@@ -1225,7 +1225,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="grauen" supported="yes">
+ <software name="grauen">
<description>Schiff des Grauens</description>
<year>198?</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -1239,7 +1239,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="hdeath" supported="yes">
+ <software name="hdeath">
<description>House of Death</description>
<year>1985</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -1253,7 +1253,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="hektik" supported="yes">
+ <software name="hektik">
<description>Hektik</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1266,7 +1266,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="hektika" cloneof="hektik" supported="yes">
+ <software name="hektika" cloneof="hektik">
<description>Hektik (alternate)</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1279,7 +1279,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="helikopt" supported="yes">
+ <software name="helikopt">
<description>Helikopter</description>
<year>1983</year>
<publisher>Heinz Hübben Software Verlag</publisher>
@@ -1292,7 +1292,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="horror" supported="yes">
+ <software name="horror">
<description>Horror Castle</description>
<year>198?</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -1305,7 +1305,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="invasion" supported="yes">
+ <software name="invasion">
<description>Invasion aus dem Weltraum</description>
<year>1982</year>
<publisher>TCS</publisher>
@@ -1337,7 +1337,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="jpoker" supported="yes">
+ <software name="jpoker">
<description>Joker Poker</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1350,7 +1350,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="kaefer" supported="yes">
+ <software name="kaefer">
<description>Marienkäfer</description>
<year>1984</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1363,7 +1363,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="king" supported="yes">
+ <software name="king">
<description>King</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1376,7 +1376,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="kniffel" supported="yes">
+ <software name="kniffel">
<description>Kniffel</description>
<year>1985</year>
<publisher>TTS</publisher>
@@ -1389,7 +1389,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="labyfear" supported="yes">
+ <software name="labyfear">
<description>Labyrinth of Fear</description>
<year>1983</year>
<publisher>Algray Software</publisher>
@@ -1407,7 +1407,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="laenquiz" supported="yes">
+ <software name="laenquiz">
<description>Länder-Quiz</description>
<year>1984</year>
<publisher>TCS</publisher>
@@ -1420,7 +1420,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="lasverga" supported="yes">
+ <software name="lasverga">
<description>Las Vergas Spiel-Automat</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1433,7 +1433,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="life" supported="yes">
+ <software name="life">
<description>Life</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1446,7 +1446,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="lunarlan" supported="yes">
+ <software name="lunarlan">
<description>Lunar Lander</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1471,7 +1471,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="madtree" supported="yes">
+ <software name="madtree">
<description>Madtree</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1484,7 +1484,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="mampf2" supported="yes">
+ <software name="mampf2">
<description>Mampf Man II</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1497,7 +1497,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="meteor" supported="yes">
+ <software name="meteor">
<description>Meteor</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1522,7 +1522,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="mordzepp" supported="yes">
+ <software name="mordzepp">
<description>Mord im Zeppelin</description>
<year>198?</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -1535,7 +1535,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="motten" supported="yes">
+ <software name="motten">
<description>Motten</description>
<year>1982</year>
<publisher>TCS</publisher>
@@ -1548,7 +1548,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="mysttave" supported="yes">
+ <software name="mysttave">
<description>Mysterious Tavern</description>
<year>198?</year>
<publisher>Scholz Baeumner Schaffarzik (SBS)</publisher>
@@ -1561,7 +1561,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="netzo" supported="yes">
+ <software name="netzo">
<description>Netzo</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1574,7 +1574,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="pacboy" supported="yes">
+ <software name="pacboy">
<description>Pac Boy</description>
<year>1984</year>
<publisher>Heinz Hübben Software Verlag</publisher>
@@ -1587,7 +1587,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="santapar" supported="yes">
+ <software name="santapar">
<description>Santa Paravia und Fuimaccio</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1599,7 +1599,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="saug" supported="yes">
+ <software name="saug">
<description>Saug</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1612,7 +1612,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="schnick" supported="yes">
+ <software name="schnick">
<description>Schnick Schnack Schnuck</description>
<year>1986</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1625,7 +1625,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="scuttle" supported="yes">
+ <software name="scuttle">
<description>Scuttle</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1638,7 +1638,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="skramble" supported="yes">
+ <software name="skramble">
<description>Skramble</description>
<year>1983</year>
<publisher>Algray Software</publisher>
@@ -1652,7 +1652,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="spaceatt" supported="yes">
+ <software name="spaceatt">
<description>Space Attack</description>
<year>1984</year>
<publisher>TCC</publisher>
@@ -1665,7 +1665,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="spaceman" supported="yes">
+ <software name="spaceman">
<description>Spaceman</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1691,7 +1691,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="superhrn" supported="yes">
+ <software name="superhrn">
<description>Superhirn</description>
<year>198?</year>
<publisher>TTS</publisher>
@@ -1704,7 +1704,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="tausend" supported="yes">
+ <software name="tausend">
<description>Tausendfuss</description>
<year>1983</year>
<publisher>TCS</publisher>
@@ -1716,7 +1716,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="toadman" supported="yes">
+ <software name="toadman">
<description>Toad Mania</description>
<year>1983</year>
<publisher>Gumboot Software</publisher>
@@ -1730,7 +1730,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="trashman" supported="yes">
+ <software name="trashman">
<description>Trash-Man</description>
<year>1983</year>
<publisher>Schmidtke Electronic</publisher>
@@ -1743,7 +1743,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="triton" supported="yes">
+ <software name="triton">
<description>Triton Battle</description>
<year>19??</year>
<publisher>Schmidtke Electronic</publisher>
@@ -1757,7 +1757,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="ubootjag" supported="yes">
+ <software name="ubootjag">
<description>U-Boot-Jagd</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1769,7 +1769,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="wurm" supported="yes">
+ <software name="wurm">
<description>Wurm</description>
<year>1982</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -1781,7 +1781,7 @@ Screen-Printer (standalone)
</part>
</software>
- <software name="zalaga" supported="yes">
+ <software name="zalaga">
<description>Zalaga</description>
<year>198?</year>
<publisher>&lt;unknown&gt;</publisher>
diff --git a/hash/fmtowns_cd.xml b/hash/fmtowns_cd.xml
index d43787b94b4..b460ac15e28 100644
--- a/hash/fmtowns_cd.xml
+++ b/hash/fmtowns_cd.xml
@@ -27,6 +27,7 @@ Ablemax Suugaku Able Serve
AD&D Heroes of the Lance Pony Canyon 1990/6 CD
Aesop World Dai-1-shuu (Denshi Ehon) Fujitsu 1993/12 CD
Aesop World Dai-2-shuu (Denshi Ehon) Fujitsu 1993/12 CD
+After Burner (v1.02) CRI 1989/11 CD
Airwave Adventure Toshiba EMI 1989/12 CD
Aishuu to Netsujou no Chouwa Fujitsu 1995/4 CD
Akiko Gold Fairytale (Red Zone) 1995/1 SET(CD+FD)
@@ -203,7 +204,6 @@ FreeColle Marty 1 Fujitsu
* Fujitsu Air Warrior V1.1 Fujitsu 1992/3 SET(CD+FD)
Fujitsu Air Warrior V2.1 Fujitsu 1995/4 SET(CD+FD)
Fujitsu Habitat V1.1 Fujitsu 1990/1 SET(CD+FD)
-* Fujitsu Habitat V2.1 L10 Fujitsu 1994/5 SET(CD+FD)
Fujitsu Habitat V2.1 L11 Fujitsu 1994/? SET(CD+FD)
Fukui Toshio no Otenki Map Inter Limited Logic 1991/2 CD
Functioning in Business Part 1 DynEd Japan 1992/7 SET(CD+FD)
@@ -600,7 +600,6 @@ Shiki wo Irodoru Nihon no Shouka: Fuyu-hen Toshiba EMI
Shiki wo Irodoru Nihon no Shouka: Haru-hen Toshiba EMI 1991/4 CD
Shiki wo Irodoru Nihon no Shouka: Natsu-hen Toshiba EMI 1991/4 CD
Shin Eiwa / Waei Chuujiten Fujitsu 1993/11 CD
-Shooting Towns Amorphous 1990/3 CD
Shoubunsha Area Guide: 74 Zenkoku Pension Guide Com Staff 1989/12 CD
Shougakkou 4-nen Kyouzai Set Uchida Youkou 1993/5 CD
Shougakkou 5-nen Kyouzai Set Uchida Youkou 1993/5 CD
@@ -1604,29 +1603,45 @@ User/save disks that can be created from the game itself are not included.
<!-- Runs too fast -->
<software name="aburner" supported="partial">
<!--
- Origin: Neo Kobe Collection
- <rom name="After Burner.ccd" size="2145" crc="c88c38a9" sha1="88f2a8ff8f7c8f27b43e7b2ac2e92e856e97def2"/>
- <rom name="After Burner.cue" size="386" crc="a1a8850b" sha1="986ad6875e82ba8c8c20684606cd86d6aeebf5f5"/>
- <rom name="After Burner.img" size="230907600" crc="37fa03b7" sha1="1cfa47e4767f4048160149a7c7f3c0bc7ccc60cd"/>
- <rom name="After Burner.sub" size="9424800" crc="7a728a6d" sha1="c12601658d2c4863b7c40e2a5c56abe4b2c1e671"/>
- -->
- <description>After Burner</description>
+ Origin: redump.org
+ <rom name="After Burner (Japan) (Track 1).bin" size="7126560" crc="789fc2c6" sha1="0604f645a7777df34006b93baa1c2f68d3379dad"/>
+ <rom name="After Burner (Japan) (Track 2).bin" size="15709008" crc="e82058e2" sha1="53b1455a8e0db651d5404e3f49aaa6fb6fd00303"/>
+ <rom name="After Burner (Japan) (Track 3).bin" size="36136128" crc="32986b6c" sha1="78d6b64dc121363bef3ac57fbf1e96b0e3a3d510"/>
+ <rom name="After Burner (Japan) (Track 4).bin" size="58696512" crc="8bcb4924" sha1="2f399b78429d8b5d91b48379cc3bf54e208fc1c1"/>
+ <rom name="After Burner (Japan) (Track 5).bin" size="20107248" crc="ef8c6543" sha1="a83c5f182f7bfc41adb8bb94b1965bf7be10298b"/>
+ <rom name="After Burner (Japan) (Track 6).bin" size="52546032" crc="cb19df25" sha1="3890a42757ce4c220177b748465902e7fd53cced"/>
+ <rom name="After Burner (Japan) (Track 7).bin" size="35207088" crc="a7e97277" sha1="a932119e322e21c61d71f42ead2c61e41375cfba"/>
+ <rom name="After Burner (Japan) (Track 8).bin" size="5379024" crc="a9397468" sha1="c7bba81a93d0a5ab5575ad976b5de22a7825e6a7"/>
+ <rom name="After Burner (Japan).cue" size="917" crc="cac464a9" sha1="31cb5ced76d61f0a76ef1c8f455b6483a2ddcfa7"/>
+ -->
+ <description>After Burner (v1.01)</description>
<year>1989</year>
<publisher>CRI</publisher>
<info name="alt_title" value="アフターãƒãƒ¼ãƒŠãƒ¼" />
- <info name="release" value="198911xx" />
+ <info name="release" value="198903xx" />
<part name="cdrom" interface="fmt_cdrom">
<diskarea name="cdrom">
- <disk name="after burner" sha1="e1c6cc2df19b89ca1dab88358337d97ece90dd58" />
+ <disk name="after burner (japan)" sha1="a7889124b3e67f6ef8b129b2ecb5914da14e9ed7" />
</diskarea>
</part>
</software>
<software name="aburner3">
<!--
- Origin: Neo Kobe Collection
- <rom name="After Burner III.bin" size="414645840" crc="d58140b8" sha1="2a7b13067e1e810f173021e8cdd7e8bdaedfe08c"/>
- <rom name="After Burner III.cue" size="554" crc="c686ae32" sha1="fd6f1618b9ea5c15300044a8e1626802fa4bbab9"/>
+ Origin: redump.org
+ <rom name="After Burner III (Japan) (Track 01).bin" size="10231200" crc="0d6bc39a" sha1="9a3eecc6b1dbf4a30e0cc62e4ddb54a1298038d2"/>
+ <rom name="After Burner III (Japan) (Track 02).bin" size="12496176" crc="97def07f" sha1="4e9f21e85d2bb4c2d4108ad1510d8d920a157cd8"/>
+ <rom name="After Burner III (Japan) (Track 03).bin" size="58393104" crc="243ee025" sha1="b1bd4b5aab7a926d02f3ca5818621690b122d708"/>
+ <rom name="After Burner III (Japan) (Track 04).bin" size="61500096" crc="7b3225f8" sha1="ec12fa3b41ea7ee94fa800aa7f6e44ec3c263358"/>
+ <rom name="After Burner III (Japan) (Track 05).bin" size="53030544" crc="6e9be897" sha1="9ddc5c079c066b9cf5e02bef684c39b42584f63d"/>
+ <rom name="After Burner III (Japan) (Track 06).bin" size="54714576" crc="d7e48924" sha1="34853c8d662b5898926adba7b60dca92fdd8a874"/>
+ <rom name="After Burner III (Japan) (Track 07).bin" size="56734944" crc="ea9507e7" sha1="7d8edd52637cc65af0853fd678798fa95e8bb4fd"/>
+ <rom name="After Burner III (Japan) (Track 08).bin" size="60300576" crc="bc0325ae" sha1="6826f501a1d7c5d54441ca60ddf6443398bac077"/>
+ <rom name="After Burner III (Japan) (Track 09).bin" size="12947760" crc="f5b3562b" sha1="e82dc93b13aa4fa1b4f1706f68597ddf3cc49809"/>
+ <rom name="After Burner III (Japan) (Track 10).bin" size="13328784" crc="10bc34e6" sha1="2f72bc2635cd10760e2795d479e72eb1de25d6bd"/>
+ <rom name="After Burner III (Japan) (Track 11).bin" size="6157536" crc="5a8629c2" sha1="9eb2f74518d840fbc73410c34f6647cddee919cf"/>
+ <rom name="After Burner III (Japan) (Track 12).bin" size="15163344" crc="2b7add3d" sha1="9490084e6b4a95494869784e23a634075b6c343b"/>
+ <rom name="After Burner III (Japan).cue" size="1410" crc="a13d9e08" sha1="a2f29ae1c5edb4b11ddf39cc196aea9192c54461"/>
-->
<description>After Burner III</description>
<year>1992</year>
@@ -1635,7 +1650,7 @@ User/save disks that can be created from the game itself are not included.
<info name="release" value="199206xx" />
<part name="cdrom" interface="fmt_cdrom">
<diskarea name="cdrom">
- <disk name="after burner iii" sha1="70b10643e32f4d4a254a0c8f29e3224c2f810c1d" />
+ <disk name="after burner iii (japan)" sha1="fe11d382c3efef8ed4a698f6a9832fb6bcd09167" />
</diskarea>
</part>
</software>
@@ -3937,7 +3952,6 @@ User/save disks that can be created from the game itself are not included.
</part>
</software>
-
<software name="emit2">
<!--
Origin: redump.org
@@ -3969,6 +3983,36 @@ User/save disks that can be created from the game itself are not included.
</part>
</software>
+ <software name="emit3">
+ <!--
+ Origin: redump.org
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 1).bin" size="20815200" crc="d77c413f" sha1="5ddc8bcbd38929a6e74845df23de3a730d79adf1"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 2).bin" size="42547680" crc="c4e86795" sha1="f22e3636eaff62524d189c4bcc771dd63cd226d5"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 3).bin" size="158341344" crc="8f6b1bb1" sha1="268de6a023126d32931b04a3291ed4854f956375"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 4).bin" size="183209040" crc="cf38ec52" sha1="525c83befa09f26c8a5b1ce1a53b3bfb22e21bac"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 5).bin" size="46428480" crc="de12b148" sha1="9d413ac2e691b07a918bcf9699b303dd217309e3"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 6).bin" size="123785760" crc="4796d502" sha1="bdeb2600fa79e451db3468d7bc6880d1473391a6"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 7).bin" size="68991216" crc="19056db5" sha1="bd59802aacf935d0e0807b36c34270061b27cf26"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja) (Track 8).bin" size="3356304" crc="a77f098e" sha1="59f1048a47f199b1b5311e09e6cdcaa777ccc314"/>
+ <rom name="Emit Vol. 3 - Watashi ni Sayonara o (Japan) (En,Ja).cue" size="1142" crc="1c6b0466" sha1="dcaef9c9d047f96aa269271c29a62f200a5a8acb"/>
+ -->
+ <description>Emit Vol. 3 - Watashi ni Sayonara o</description>
+ <year>1994</year>
+ <publisher>光栄 (Koei)</publisher>
+ <info name="release" value="199409xx" />
+ <info name="alt_title" value="エミット Vol. 3 ç§ã«ã•よãªã‚‰ã‚’" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1261568">
+ <rom name="emit3.hdm" size="1261568" crc="4e00e431" sha1="8feb87e951bb4030c085a3a37add7091533c7272" />
+ </dataarea>
+ </part>
+ <part name="cdrom" interface="fmt_cdrom">
+ <diskarea name="cdrom">
+ <disk name="emit vol. 3 - watashi ni sayonara o (japan) (en,ja)" sha1="b19d7321c656c3c8722ece8a17622e441422ec20" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="enkaio">
<!--
Origin: redump.org / r09
@@ -4676,10 +4720,13 @@ User/save disks that can be created from the game itself are not included.
</part>
</software>
- <!-- Missing a floppy disk -->
+ <!--
+ Habitat is an early MMORPG, so it's marked as "not supported" since it requires a modem, and obviously the original online service.
+ There is an open source server replacement called NeoHabitat, but for now it only works with the Commodore 64 version.
+ -->
<software name="habitat" supported="no">
<!--
- Origin: redump.org
+ Origin: redump.org + private floppy dump (StuBlad)
<rom name="Fujitsu Habitat V2.1L10 (Japan) (Track 1).bin" size="101959200" crc="29a91a0f" sha1="ecff62e56a93cc5d357e012fe21f1ae6c9a2cf70"/>
<rom name="Fujitsu Habitat V2.1L10 (Japan) (Track 2).bin" size="47150544" crc="f61961ed" sha1="c89982352db456c812c486b59088656363cde992"/>
<rom name="Fujitsu Habitat V2.1L10 (Japan) (Track 3).bin" size="20551776" crc="7e452f3c" sha1="4a8fc3891643ffeff4ea74e4dbd50ad38cd29823"/>
@@ -4692,6 +4739,11 @@ User/save disks that can be created from the game itself are not included.
<publisher>富士通 (Fujitsu)</publisher>
<info name="alt_title" value="富士通 Habitat V2.1L10" />
<info name="release" value="199405xx" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="1261568">
+ <rom name="habitatv2.1l10.hdm" size="1261568" crc="4dc2691b" sha1="a99ada487e1970240a284eb67f7420b13c45f265" />
+ </dataarea>
+ </part>
<part name="cdrom" interface="fmt_cdrom">
<diskarea name="cdrom">
<disk name="fujitsu habitat v2.1l10 (japan)" sha1="5704f482ca0bb17e0a01f82bfc4ea272a7534bda" />
@@ -6561,11 +6613,16 @@ User/save disks that can be created from the game itself are not included.
<!-- Runs too fast? -->
<software name="lastsurv" supported="partial">
<!--
- Origin: Neo Kobe Collection
- <rom name="Last Survivor.ccd" size="2083" crc="dd87d31e" sha1="8453a35a485de1b0343da937e5a2236e799032fe"/>
- <rom name="Last Survivor.cue" size="350" crc="b39f0cbd" sha1="63a66fd501fdea977ffc97ba88b24d48db4778a3"/>
- <rom name="Last Survivor.img" size="291942000" crc="e221b966" sha1="8d9318700dfddf70bd932ce08b12cbc53b584e94"/>
- <rom name="Last Survivor.sub" size="11916000" crc="3c61313c" sha1="c839a29dfc45bf1bb074cc76c334561fd9949df1"/>
+ Origin: redump.org
+ <rom name="Last Survivor (Japan) (Track 1).bin" size="13759200" crc="8655d470" sha1="e57e9280e729ae54ffda5bbe0b87879b45907d81"/>
+ <rom name="Last Survivor (Japan) (Track 2).bin" size="1587600" crc="9bec6429" sha1="e47f903e9c644bb77e4459c7d854c946660f3945"/>
+ <rom name="Last Survivor (Japan) (Track 3).bin" size="14112000" crc="bda965b3" sha1="40681625e19826dd490d9b7f049e07ad16c94911"/>
+ <rom name="Last Survivor (Japan) (Track 4).bin" size="66502800" crc="f3447abd" sha1="ec4711adfda4718c17f53445117a5e36aa492ae3"/>
+ <rom name="Last Survivor (Japan) (Track 5).bin" size="67914000" crc="1c0ad2eb" sha1="b349258bd0502166b3ae0c6d529e0d26bd9c48b3"/>
+ <rom name="Last Survivor (Japan) (Track 6).bin" size="67032000" crc="c178c066" sha1="6446297de98387d8f7cb07005ef36a3a75bb6a6d"/>
+ <rom name="Last Survivor (Japan) (Track 7).bin" size="57153600" crc="f4a16773" sha1="e2771df7800bee85ac6b40bafb32a3d46c63c43b"/>
+ <rom name="Last Survivor (Japan) (Track 8).bin" size="3880800" crc="f3e8c4c3" sha1="78e4b91400e7fc2b41f9e687ebd1277f0059ca3b"/>
+ <rom name="Last Survivor (Japan).cue" size="925" crc="210d69e8" sha1="59987b4b5018e93426d81a1a5dcfc22f10599926"/>
-->
<description>Last Survivor</description>
<year>1990</year>
@@ -6574,7 +6631,7 @@ User/save disks that can be created from the game itself are not included.
<info name="release" value="199011xx" />
<part name="cdrom" interface="fmt_cdrom">
<diskarea name="cdrom">
- <disk name="last survivor" sha1="d853e7cc1be3d5b10d67f81c9c92ec0b2b360ddd" />
+ <disk name="last survivor (japan)" sha1="2daa0d86cda7f88037065f1a70924261fecc3afd" />
</diskarea>
</part>
</software>
@@ -6670,7 +6727,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="Lemmings 2 - The Tribes.img" size="335865600" crc="b92ab9cc" sha1="1b45b55ccb0cd2df1cce6475221204deb2d17984"/>
<rom name="Lemmings 2 - The Tribes.sub" size="13708800" crc="fe714f95" sha1="1be99f829fdc8926a8a8a879706e66cc0c258b05"/>
-->
- <description>Lemmings 2 - The Tribes (Japanese)</description>
+ <description>Lemmings 2 - The Tribes</description>
<year>1994</year>
<publisher>富士通 (Fujitsu)</publisher>
<info name="alt_title" value="レミングス2 ザ・トライブス" />
@@ -9881,6 +9938,29 @@ User/save disks that can be created from the game itself are not included.
</part>
</software>
+ <software name="shooting">
+ <!--
+ Origin: Private dump (rockleevk)
+ <rom name="SHOOTING (Track 1).bin" size="20462400" crc="f61249cf" sha1="3b758e2510d94d05ec21c36724b82b60bb77768d"/>
+ <rom name="SHOOTING (Track 2).bin" size="32673984" crc="b43eb157" sha1="cf28bb9f37763e0d085b1c8fa9871a4fbb546f08"/>
+ <rom name="SHOOTING (Track 3).bin" size="35750400" crc="1b12759b" sha1="c2d102aeb67c5e3a48a43d01b1e9ff4893bedc34"/>
+ <rom name="SHOOTING (Track 4).bin" size="40061616" crc="55697b43" sha1="45a7dcf45f5698748e1394bb65b1dc42b94eacb3"/>
+ <rom name="SHOOTING (Track 5).bin" size="36437184" crc="27377dcb" sha1="050a78132620b8ce2c4b24a969c784088626fb02"/>
+ <rom name="SHOOTING (Track 6).bin" size="26742240" crc="61d65f10" sha1="ddd14ce28067deaba895e38f9aa7dee3109cf3ec"/>
+ <rom name="SHOOTING.cue" size="617" crc="199debf6" sha1="ddce20c7149404b97a5557a258f102d08014eb46"/>
+ -->
+ <description>Shooting Towns</description>
+ <year>1990</year>
+ <publisher>アモルファス (Amorphous)</publisher>
+ <info name="alt_title" value="シューティングTOWNS" />
+ <info name="release" value="199003xx" />
+ <part name="cdrom" interface="fmt_cdrom">
+ <diskarea name="cdrom">
+ <disk name="shooting" sha1="e2671ef122e5c7d4c5c1893208c621251ae462c1" />
+ </diskarea>
+ </part>
+ </software>
+
<software name="shounenm">
<!--
Origin: Neo Kobe Collection
@@ -10981,7 +11061,7 @@ User/save disks that can be created from the game itself are not included.
<rom name="The New Zealand Story.img" size="3528000" crc="1aa9de77" sha1="41ad193cfa00c6a66b16a11a466025bb6b00f4a2"/>
<rom name="The New Zealand Story.sub" size="144000" crc="ca7fa012" sha1="c9b7ab8bef81071416697e7a7b764f8beac732dc"/>
-->
- <description>The New Zealand Story</description>
+ <description>The New Zealand Story (HMA-213A)</description>
<year>1989</year>
<publisher>ビング (Ving)</publisher>
<info name="alt_title" value="ニュージーランドストーリー" />
@@ -10993,6 +11073,24 @@ User/save disks that can be created from the game itself are not included.
</part>
</software>
+ <software name="tnzso" cloneof="tnzs">
+ <!--
+ Origin: redump.org
+ <rom name="NewZealand Story, The (Japan).bin" size="3528000" crc="f1245680" sha1="e8c9ea40ce35475707f0dc561917dc9b9ec9dfd0"/>
+ <rom name="NewZealand Story, The (Japan).cue" size="118" crc="3fd154f7" sha1="a79b9610ec8a2bad92e21982d887b878e87c4910"/>
+ -->
+ <description>The New Zealand Story (HMA-213)</description>
+ <year>1989</year>
+ <publisher>ビング (Ving)</publisher>
+ <info name="alt_title" value="ニュージーランドストーリー" />
+ <info name="release" value="198908xx" />
+ <part name="cdrom" interface="fmt_cdrom">
+ <diskarea name="cdrom">
+ <disk name="newzealand story, the (japan)" sha1="fffd76294e587755c3753bfbbd71ce3555186701" />
+ </diskarea>
+ </part>
+ </software>
+
<!-- Mouse doesn't work, but can be played with a controller -->
<software name="tokio" supported="partial">
<!--
diff --git a/hash/ibm5150.xml b/hash/ibm5150.xml
index c8abd637010..181694b6007 100644
--- a/hash/ibm5150.xml
+++ b/hash/ibm5150.xml
@@ -6696,7 +6696,7 @@ has been replaced with an all-zero block. -->
</software>
<!-- Listed as clone of 2400ad because not sure if different version -->
- <software name="2400ad1" cloneof="2400ad" supported="yes">
+ <software name="2400ad1" cloneof="2400ad">
<description>2400 A.D. (set 2)</description>
<year>1987</year>
<publisher>Origin</publisher>
@@ -10090,7 +10090,7 @@ has been replaced with an all-zero block. -->
</software>
<!-- matches dump of 3.5" "International Version" -->
- <software name="nova9a" cloneof="nova9" supported="yes">
+ <software name="nova9a" cloneof="nova9">
<description>Nova 9: The Return of Gir Draxon (version 1.0)</description>
<year>1991</year>
<publisher>Sierra</publisher>
diff --git a/hash/ibm5170.xml b/hash/ibm5170.xml
index 4f69e963e95..6370254bb60 100644
--- a/hash/ibm5170.xml
+++ b/hash/ibm5170.xml
@@ -550,7 +550,7 @@
</part>
</software>
- <software name="drafix" supported="yes">
+ <software name="drafix">
<description>Drafix Windows CAD (Demo)</description>
<year>1990</year>
<publisher>Fox Data</publisher>
@@ -6369,7 +6369,7 @@
</part>
</software>
- <software name="5250emu" supported="yes">
+ <software name="5250emu">
<description>Enhanced 5250 Emulation Program</description>
<year>1986</year>
<publisher>IBM</publisher>
@@ -6874,7 +6874,7 @@
</software>
<!-- Bundled with "Mastering Borland C++ 3.1" by Tom Swan. ISBN10: 0-672-30274-8 -->
- <software name="brlndcpp" supported="yes">
+ <software name="brlndcpp">
<description>Mastering Borland C++ 3.1</description>
<year>1992</year>
<publisher>Sams Publishing</publisher>
@@ -7588,7 +7588,7 @@
</software>
<!-- Bundled with "TMS320C5x DSK - Applications Guide" by Texas Instruments. TI ID: BPRA063 -->
- <software name="tms320c5x" supported="yes">
+ <software name="tms320c5x">
<description>TMS320C5x DSK - Applications Guide - Application Software</description>
<year>1997</year>
<publisher>Texas Instruments</publisher>
@@ -11782,7 +11782,7 @@
</part>
</software>
- <software name="nova9_525" supported="yes">
+ <software name="nova9_525">
<description>Nova 9 (International Version, 5.25")</description>
<year>1991</year>
<publisher>Dynamix</publisher>
@@ -12935,7 +12935,7 @@
</part>
</software>
- <software name="veildark" supported="yes">
+ <software name="veildark">
<description>Veil of Darkness</description>
<year>1993</year>
<publisher>Strategic Simulations, Inc.</publisher>
diff --git a/hash/interpro.xml b/hash/interpro.xml
index 59c2ebef159..b069c923f7a 100644
--- a/hash/interpro.xml
+++ b/hash/interpro.xml
@@ -36,7 +36,7 @@
<part name="disc1" interface="cdrom">
<feature name="part_id" value="System Software Disc I" />
<diskarea name="cdrom">
- <disk name="iss_050599_1" sha1="5d556b4df2dccdc681095fedcf836a5b0a7782a0" writeable="no" />
+ <disk name="iss_050599_1" sha1="5d556b4df2dccdc681095fedcf836a5b0a7782a0"/>
</diskarea>
</part>
@@ -44,7 +44,7 @@
<part name="disc2" interface="cdrom">
<feature name="part_id" value="System Software Disc II" />
<diskarea name="cdrom">
- <disk name="iss_050599_2" sha1="3813db83871668eed97b43f2384b7e95a649598a" writeable="no" />
+ <disk name="iss_050599_2" sha1="3813db83871668eed97b43f2384b7e95a649598a"/>
</diskarea>
</part>
@@ -52,7 +52,7 @@
<part name="disc3" interface="cdrom">
<feature name="part_id" value="System Software Disc III" />
<diskarea name="cdrom">
- <disk name="iss_050599_3" sha1="c8b08cd45ef1614b3db1cd0fb8e6539e3bcc5725" writeable="no" />
+ <disk name="iss_050599_3" sha1="c8b08cd45ef1614b3db1cd0fb8e6539e3bcc5725"/>
</diskarea>
</part>
@@ -60,7 +60,7 @@
<part name="disc4" interface="cdrom">
<feature name="part_id" value="System Software Disc IV" />
<diskarea name="cdrom">
- <disk name="iss_050599_4" sha1="2681b4cd8d355b6abfcfebb1b40a6d8a5ef37fe9" writeable="no" />
+ <disk name="iss_050599_4" sha1="2681b4cd8d355b6abfcfebb1b40a6d8a5ef37fe9"/>
</diskarea>
</part>
</software>
@@ -76,7 +76,7 @@
<part name="disc1" interface="cdrom">
<feature name="part_id" value="MDEM Software" />
<diskarea name="cdrom">
- <disk name="mech_081797_1" sha1="a03f9a9b08d6220b49f1be8a50a2032323f69fb8" writeable="no" />
+ <disk name="mech_081797_1" sha1="a03f9a9b08d6220b49f1be8a50a2032323f69fb8"/>
</diskarea>
</part>
@@ -84,7 +84,7 @@
<part name="disc2" interface="cdrom">
<feature name="part_id" value="MDEM Disc II" />
<diskarea name="cdrom">
- <disk name="mech_081797_2" sha1="a269113a742c8dbf081855bcf2135b70c42738ef" writeable="no" />
+ <disk name="mech_081797_2" sha1="a269113a742c8dbf081855bcf2135b70c42738ef"/>
</diskarea>
</part>
</software>
diff --git a/hash/jaguar.xml b/hash/jaguar.xml
index f8dd1277fe3..7e65188a3dd 100644
--- a/hash/jaguar.xml
+++ b/hash/jaguar.xml
@@ -272,7 +272,7 @@ Unreleased (possibly no prototypes exist):
</software>
<!-- boot OK -->
- <software name="bubsy" supported="yes">
+ <software name="bubsy">
<description>Bubsy in Fractured Furry Tales</description>
<year>1994</year>
<publisher>Atari</publisher>
@@ -285,7 +285,7 @@ Unreleased (possibly no prototypes exist):
</software>
<!-- boot OK -->
- <software name="cfodder" supported="yes">
+ <software name="cfodder">
<description>Cannon Fodder</description>
<year>1995</year>
<publisher>Virgin Interactive</publisher>
@@ -760,7 +760,7 @@ Unreleased (possibly no prototypes exist):
</software>
<!-- boot OK -->
- <software name="soccerkd" supported="yes">
+ <software name="soccerkd">
<description>Soccer Kid</description>
<year>1996</year>
<publisher>ReadySoft</publisher>
@@ -790,7 +790,7 @@ Unreleased (possibly no prototypes exist):
</software>
<!-- boot OK -->
- <software name="soccerkd1h" cloneof="soccerkd" supported="yes">
+ <software name="soccerkd1h" cloneof="soccerkd">
<!-- uses universal header, only way to boot this at moment -->
<description>Soccer Kid (Re-release, Hacked)</description>
<year>2000</year>
@@ -1068,7 +1068,7 @@ Unreleased (possibly no prototypes exist):
</software>
<!-- boot OK, sound metrics menu has glitchy bars (pause menu then press 'B') -->
- <software name="zool2" supported="yes">
+ <software name="zool2">
<description>Zool 2</description>
<year>1994</year>
<publisher>Atari</publisher>
diff --git a/hash/jakks_gamekey_sw.xml b/hash/jakks_gamekey_sw.xml
index 9b1fcc06ba2..5db8d6775ca 100644
--- a/hash/jakks_gamekey_sw.xml
+++ b/hash/jakks_gamekey_sw.xml
@@ -7,7 +7,7 @@
<!-- There are 4 pads on the PCB labeled A0 A1 A2 and A3. A1 and A2 are connected to VCC.
The gamekey PCB had the same silkscreened boxes as the Disney Games, with A1 H and A3 H marked. -->
- <software name="tdyoda" supported="yes">
+ <software name="tdyoda">
<description>Turret Defense &amp; Yoda's Escape</description>
<year>2005</year>
<publisher>JAKKS Pacific / Griptonite Games</publisher>
diff --git a/hash/pasogo.xml b/hash/pasogo.xml
index b2544669957..c9a30920f33 100644
--- a/hash/pasogo.xml
+++ b/hash/pasogo.xml
@@ -22,7 +22,7 @@
<info name="serial" value="KS-1001"/>
<info name="alt_title" value="対局ãã‚“ I"/>
<part name="cart" interface="pasogo_cart">
- <dataarea name="rom" width="16" endianness="little" size="1048576">
+ <dataarea name="rom" width="16" size="1048576">
<rom name="ks-1001.ic4" size="1048576" crc="b6a3f97c" sha1="2de63b05ec93a4ba3ea55ba131c0706927a5bf39" offset="00000000" />
</dataarea>
</part>
@@ -36,7 +36,7 @@
<info name="serial" value="KS-1002"/>
<info name="alt_title" value="楽ã—ã„è©°ç¢ãƒ»ç¬¬1å·»"/>
<part name="cart" interface="pasogo_cart">
- <dataarea name="rom" width="16" endianness="little" size="524288">
+ <dataarea name="rom" width="16" size="524288">
<rom name="ks-1002.ic4" size="524288" crc="32f9c38a" sha1="1be82afcdf5e2d1a0e873fda4161e663d7a53a85" offset="00000000" />
</dataarea>
</part>
@@ -50,7 +50,7 @@
<info name="serial" value="KS-1003"/>
<info name="alt_title" value="楽ã—ã„è©°ç¢ãƒ»ç¬¬2å·»"/>
<part name="cart" interface="pasogo_cart">
- <dataarea name="rom" width="16" endianness="little" size="524288">
+ <dataarea name="rom" width="16" size="524288">
<rom name="ks-1003.ic4" size="524288" crc="32f9c38a" sha1="1be82afcdf5e2d1a0e873fda4161e663d7a53a85" offset="00000000" />
</dataarea>
</part>
@@ -64,7 +64,7 @@
<info name="serial" value="KS-1004"/>
<info name="alt_title" value="囲ç¢å局集・第1å·»"/>
<part name="cart" interface="pasogo_cart">
- <dataarea name="rom" width="16" endianness="little" size="524288">
+ <dataarea name="rom" width="16" size="524288">
<rom name="ks-1004.ic4" size="524288" crc="32f9c38a" sha1="1be82afcdf5e2d1a0e873fda4161e663d7a53a85" offset="00000000" />
</dataarea>
</part>
@@ -78,7 +78,7 @@
<info name="serial" value="KS-1009"/>
<info name="alt_title" value="é›»å­ç¢ç›¤"/>
<part name="cart" interface="pasogo_cart">
- <dataarea name="rom" width="16" endianness="little" size="1048576">
+ <dataarea name="rom" width="16" size="1048576">
<rom name="ks-1009.ic4" size="1048576" crc="b6a3f97c" sha1="2de63b05ec93a4ba3ea55ba131c0706927a5bf39" offset="00000000" />
</dataarea>
</part>
@@ -92,7 +92,7 @@
<info name="serial" value="KS-1010"/>
<info name="alt_title" value="å¼·ããªã‚‹æ‰‹ç­‹ãƒ»ç¬¬1å·»"/>
<part name="cart" interface="pasogo_cart">
- <dataarea name="rom" width="16" endianness="little" size="524288">
+ <dataarea name="rom" width="16" size="524288">
<rom name="ks-1010.ic4" size="524288" crc="3e70fca6" sha1="c46cdc9e01f2f5c66b2523e1d30355e51c839f27" offset="00000000" />
</dataarea>
</part>
diff --git a/hash/saturn.xml b/hash/saturn.xml
index efe068137c2..920264076d9 100644
--- a/hash/saturn.xml
+++ b/hash/saturn.xml
@@ -2523,7 +2523,7 @@ Olympic Soccer (Fra) T-7904H-09
</software>
<!-- -->
- <software name="aishogi" supported="yes">
+ <software name="aishogi">
<description>AI Shougi (Jpn)</description>
<year>1995</year>
<publisher>Soft Bank</publisher>
@@ -3069,7 +3069,7 @@ Olympic Soccer (Fra) T-7904H-09
</software>
<!-- Works including mouse support -->
- <software name="catrip" supported="yes">
+ <software name="catrip">
<description>Cat the Ripper - 13-ninme no Tanteishi (Jpn)</description>
<year>1997</year>
<publisher>Tonkin House</publisher>
@@ -3555,7 +3555,7 @@ Olympic Soccer (Fra) T-7904H-09
</software>
<!-- Works including loading from Save Game Manager CDs -->
- <software name="dezaemn2" supported="yes">
+ <software name="dezaemn2">
<description>Dezaemon 2 (Jpn)</description>
<year>1997</year>
<publisher>Athena</publisher>
diff --git a/hash/vboy.xml b/hash/vboy.xml
index 0eb438d1cd5..2d1ef5b522a 100644
--- a/hash/vboy.xml
+++ b/hash/vboy.xml
@@ -26,7 +26,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<feature name="u2" value="U2" />
<feature name="u3" value="U3" />
<feature name="battery" value="BT1" />
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="vue-vpbe-0.u1" size="1048576" crc="bb71b522" sha1="5177015a91442e56bd76af39447bca365e06c272" offset="000000" />
</dataarea>
</part>
@@ -40,7 +40,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<publisher>Nintendo</publisher>
<info name="serial" value="VUE-VBHE-JPN, VUE-VBHE-USA"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="2097152" width="32" endianness="little">
+ <dataarea name="rom" size="2097152" width="32">
<rom name="bound high! (ju).bin" size="2097152" crc="e81a3703" sha1="1196ef8b9a96a0ff2f3634f8eb1c4865c0fb6b01" offset="000000" />
</dataarea>
</part>
@@ -54,7 +54,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VGPJ-JPN, VUE-VGPJ-USA"/>
<info name="release" value="19950701 (JPN), 19950814 (USA)"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="galactic pinball (japan, usa).bin" size="1048576" crc="c9710a36" sha1="93a25abf4f86e71a49c1c3a470140bb40cb693d6" offset="000000" />
</dataarea>
</part>
@@ -68,10 +68,10 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VVGE-USA"/>
<info name="release" value="199511xx"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="2097152" width="32" endianness="little">
+ <dataarea name="rom" size="2097152" width="32">
<rom name="golf (usa).bin" size="2097152" crc="2199af41" sha1="23ce3c174789cdd306497d86cb2c4e76ba8b06e5" offset="000000" />
</dataarea>
- <dataarea name="sram" size="8192" width="8" endianness="little">
+ <dataarea name="sram" size="8192">
</dataarea>
</part>
</software>
@@ -84,7 +84,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VIMJ-JPN"/>
<info name="release" value="19951013"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="innsmouth no yakata (japan).bin" size="1048576" crc="83cb6a00" sha1="37e06e53ce2810e870835c48decdd6c72079bfda" offset="000000" />
</dataarea>
</part>
@@ -100,7 +100,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<part name="cart" interface="vboy_cart">
<feature name="pcb" value="VUE-AA-01(K)" />
<feature name="u1" value="U1 PRG" />
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="vue-vjbe-0.u1" size="1048576" crc="a44de03c" sha1="0e086d7ef2bd8b97315196943fd0b71da07aa8f1" offset="000000" />
</dataarea>
</part>
@@ -114,7 +114,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VJBJ-JPN"/>
<info name="release" value="19950929"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="jack bros. no meiro de hiihoo! (japan).bin" size="1048576" crc="cab61e8b" sha1="a973406590382ee503037271330d68d2834b79db" offset="000000" />
</dataarea>
</part>
@@ -130,7 +130,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<part name="cart" interface="vboy_cart">
<feature name="pcb" value="VUE-AA-01" />
<feature name="u1" value="U1 PRG" />
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="vue-vmcj-0.u1" size="1048576" crc="a47de78c" sha1="7556a778b60490bdb81774bcbaa7413fc84cb985" offset="000000" />
</dataarea>
</part>
@@ -144,7 +144,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VMTJ-JPN, VUE-VMTJ-USA"/>
<info name="release" value="19950721 (JPN), 19950814 (USA)"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="524288" width="32" endianness="little">
+ <dataarea name="rom" size="524288" width="32">
<rom name="mario's tennis (japan, usa).bin" size="524288" crc="7ce7460d" sha1="5162f7fa9e3eae4338c53ccba641ba080c768754" offset="000000" />
</dataarea>
</part>
@@ -160,7 +160,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<part name="cart" interface="vboy_cart">
<feature name="pcb" value="VUE-AA-01" />
<feature name="u1" value="U1 PRG" />
- <dataarea name="rom" size="2097152" width="32" endianness="little">
+ <dataarea name="rom" size="2097152" width="32">
<rom name="vue-vnfe-0.u1" size="2097152" crc="df4d56b4" sha1="f4a4c7928f15102cf14c90c5f044e5f7cc7c32f9" offset="000000" />
</dataarea>
</part>
@@ -172,7 +172,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<publisher>Bullet-Proof Software</publisher>
<info name="alt_title" value="ニコã¡ã‚ƒã‚“ãƒãƒˆãƒ«"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="nikochan battle (j)(prototype).bin" size="1048576" crc="f3cd40dd" sha1="217ca062f65d4e8b2848085918af5ac4b33b12d4" offset="000000" />
</dataarea>
</part>
@@ -188,7 +188,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<part name="cart" interface="vboy_cart">
<feature name="pcb" value="VUE-AA-01" />
<feature name="u1" value="U1 PRG" />
- <dataarea name="rom" size="524288" width="32" endianness="little">
+ <dataarea name="rom" size="524288" width="32">
<rom name="vue-vh2e-0.u1" size="524288" crc="19bb2dfb" sha1="80216b2874cf162f301d571bb8aebc98d80b4f3e" offset="000000" />
</dataarea>
</part>
@@ -202,7 +202,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VREE-USA"/>
<info name="release" value="19950814"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="red alarm (usa).bin" size="1048576" crc="aa10a7b4" sha1="494fa60cb8997880b4e8cd3270b21d6c2768a48a" offset="000000" />
</dataarea>
</part>
@@ -216,7 +216,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VREJ-JPN"/>
<info name="release" value="19950721"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="red alarm (japan).bin" size="1048576" crc="7e85c45d" sha1="f5057fa9bfd9d60b9dcfc004cfdd12aa8eb1cb4a" offset="000000" />
</dataarea>
</part>
@@ -230,7 +230,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VSDJ-JPN"/>
<info name="release" value="19951222"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="sd gundam - dimension war (japan).bin" size="1048576" crc="44788197" sha1="1a67f6bdb45db46e22b8aadea754a68ad379ae29" offset="000000" />
</dataarea>
</part>
@@ -244,7 +244,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VSPJ-JPN"/>
<info name="release" value="19951201"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="524288" width="32" endianness="little">
+ <dataarea name="rom" size="524288" width="32">
<rom name="space invaders - virtual collection (japan).bin" size="524288" crc="fa44402d" sha1="16ad904faafd24642dfd056d10a768e81f0d9bfa" offset="000000" />
</dataarea>
</part>
@@ -255,7 +255,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<year>1995</year>
<publisher>Nintendo</publisher>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="2097152" width="32" endianness="little">
+ <dataarea name="rom" size="2097152" width="32">
<rom name="space pinball prototype (j).bin" size="2097152" crc="44c2b723" sha1="dc182360c7c8d26323db8921f09db76638e81ced" offset="000000" />
</dataarea>
</part>
@@ -269,7 +269,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VSSJ-JPN"/>
<info name="release" value="19950929"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="524288" width="32" endianness="little">
+ <dataarea name="rom" size="524288" width="32">
<rom name="space squash (japan).bin" size="524288" crc="60895693" sha1="3f08cae2b6f9e386529949ff954220860db1af64" offset="000000" />
</dataarea>
</part>
@@ -283,10 +283,10 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VTBJ-JPN, VUE-VTBJ-USA"/>
<info name="release" value="19950721 (JPN), 19950814 (USA)"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="teleroboxer (japan, usa).bin" size="1048576" crc="36103000" sha1="c59e020f9674774c5cbc022317ebba0eb1d744f7" offset="000000" />
</dataarea>
- <dataarea name="sram" size="8192" width="8" endianness="little">
+ <dataarea name="sram" size="8192">
</dataarea>
</part>
</software>
@@ -299,7 +299,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VH2J-JPN"/>
<info name="release" value="19950721"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="524288" width="32" endianness="little">
+ <dataarea name="rom" size="524288" width="32">
<rom name="tobidase! panibon (japan).bin" size="524288" crc="40498f5e" sha1="b8a12a9677afa5cbce6ed43eb0effb5a02875534" offset="000000" />
</dataarea>
</part>
@@ -313,7 +313,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VVBJ-JPN"/>
<info name="release" value="19951222"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="virtual bowling (japan).bin" size="1048576" crc="20688279" sha1="a5be7654037050f0a781e70efea0191f43d26f06" offset="000000" />
</dataarea>
</part>
@@ -332,10 +332,10 @@ According to Planet Virtual Boy, the following undumped protos exist
<feature name="u2" value="U2 [HY6264ALLJ-10]" />
<feature name="u3" value="U3 [??]" />
<feature name="battery" value="BT1" />
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="vue-vvfj-0.u1" size="1048576" crc="526cc969" sha1="583b409b7215159219d08e789db46140062095f2" offset="000000" />
</dataarea>
- <dataarea name="sram" size="8192" width="8" endianness="little">
+ <dataarea name="sram" size="8192">
</dataarea>
</part>
</software>
@@ -348,7 +348,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VH3E-USA"/>
<info name="release" value="19951201"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="vertical force (usa).bin" size="1048576" crc="4c32ba5e" sha1="38f9008f60b09deef1151d46b905b090a0338200" offset="000000" />
</dataarea>
</part>
@@ -362,7 +362,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VH3J-JPN"/>
<info name="release" value="19950812"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="vertical force (japan).bin" size="1048576" crc="9e9b8b92" sha1="c7204ba5cfe7d26394b5e22badc580c8ed8c0b37" offset="000000" />
</dataarea>
</part>
@@ -376,10 +376,10 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VVGJ-JPN"/>
<info name="release" value="19950811"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="2097152" width="32" endianness="little">
+ <dataarea name="rom" size="2097152" width="32">
<rom name="t&amp;e virtual golf (japan).bin" size="2097152" crc="6ba07915" sha1="c595285d42c69f14b2b418c1edfbe4a7f9a624b6" offset="000000" />
</dataarea>
- <dataarea name="sram" size="8192" width="8" endianness="little">
+ <dataarea name="sram" size="8192">
</dataarea>
</part>
</software>
@@ -394,7 +394,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<part name="cart" interface="vboy_cart">
<feature name="pcb" value="VUE-AA-01" />
<feature name="u1" value="U1 PRG" />
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="vue-vjvj-0.u1" size="1048576" crc="8989fe0a" sha1="d96c9f8aac5b4ea012a8fe659bb68fb1159a9c6d" offset="000000" />
</dataarea>
</part>
@@ -408,7 +408,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VVPE-USA"/>
<info name="release" value="19950911"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="virtual league baseball (usa).bin" size="1048576" crc="736b40d6" sha1="266fe615ee3df1160a20b456824699f16810fa28" offset="000000" />
</dataarea>
</part>
@@ -422,7 +422,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VVPJ-JPN"/>
<info name="release" value="19950811"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="1048576" width="32" endianness="little">
+ <dataarea name="rom" size="1048576" width="32">
<rom name="virtual pro yakyuu '95 (japan).bin" size="1048576" crc="9ba8bb5e" sha1="ab8fa82b79512eefefccdccea6768078a374c4aa" offset="000000" />
</dataarea>
</part>
@@ -436,24 +436,24 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VTRJ-JPN"/>
<info name="release" value="19950825"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="524288" width="32" endianness="little">
+ <dataarea name="rom" size="524288" width="32">
<rom name="v-tetris (japan).bin" size="524288" crc="3ccb67ae" sha1="ff7d4dfc467e6e0d3fe8517102132a65a9d17589" offset="000000" />
</dataarea>
</part>
</software>
<!-- Developers: Nintendo R&D1 -->
- <software name="wariolnd" supported="yes">
+ <software name="wariolnd">
<description>Virtual Boy Wario Land (USA) ~ Virtual Boy Wario Land - Awazon no Hihou (Jpn)</description>
<year>1995</year>
<publisher>Nintendo</publisher>
<info name="serial" value="VUE-VWCJ-JPN, VUE-VWCJ-USA"/>
<info name="release" value="19951201 (JPN), 199511xx (USA)"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="2097152" width="32" endianness="little">
+ <dataarea name="rom" size="2097152" width="32">
<rom name="virtual boy wario land (japan, usa).bin" size="2097152" crc="133e9372" sha1="274c328fbd904f20e69172ab826bf8f94ced1bdb" offset="000000" />
</dataarea>
- <dataarea name="sram" size="8192" width="8" endianness="little">
+ <dataarea name="sram" size="8192">
</dataarea>
</part>
</software>
@@ -466,7 +466,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<info name="serial" value="VUE-VWEE-USA"/>
<info name="release" value="19951221"/>
<part name="cart" interface="vboy_cart">
- <dataarea name="rom" size="2097152" width="32" endianness="little">
+ <dataarea name="rom" size="2097152" width="32">
<rom name="waterworld (usa).bin" size="2097152" crc="82a95e51" sha1="dcc46484bd0acab0ac1ea178f425a0f5ccfb8dc2" offset="000000" />
</dataarea>
</part>
diff --git a/hash/vsmile_cart.xml b/hash/vsmile_cart.xml
index 3c39c5b2b31..c012f72eea4 100644
--- a/hash/vsmile_cart.xml
+++ b/hash/vsmile_cart.xml
@@ -574,7 +574,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
<softwarelist name="vsmile_cart" description="VTech V.Smile cartridges">
- <software name="aladdini" supported="yes">
+ <software name="aladdini">
<description>Disney Aladdin - Il magico mondo di Aladdin (Italy)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -588,7 +588,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="aladdinnl" cloneof="aladdini" supported="yes">
+ <software name="aladdinnl" cloneof="aladdini">
<description>Disney's Aladdin - De wonderwereld van Aladdin (Netherlands)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -605,7 +605,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="aladding" cloneof="aladdini" supported="yes">
+ <software name="aladding" cloneof="aladdini">
<description>Disneys Aladdin - Aladdins Welt der Wunder (Germany)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -622,7 +622,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="aladdins" cloneof="aladdini" supported="yes">
+ <software name="aladdins" cloneof="aladdini">
<description>Disney Aladdin - El Maravilloso Mundo de Aladdin (Spain)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -639,7 +639,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="redhoodg" supported="yes">
+ <software name="redhoodg">
<description>Entdecke die Welt von Rotkäppchen (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -656,7 +656,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprkr101" supported="yes">
+ <software name="alphaprkr101">
<description>Alphabet Park Adventure (USA, Rev. 101)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -671,7 +671,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprk" cloneof="alphaprkr101" supported="yes">
+ <software name="alphaprk" cloneof="alphaprkr101">
<description>Alphabet Park Adventure (USA)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -688,7 +688,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprka" cloneof="alphaprkr101" supported="yes">
+ <software name="alphaprka" cloneof="alphaprkr101">
<description>Alphabet Park Adventure (USA, alt)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -705,7 +705,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprknl" cloneof="alphaprkr101" supported="yes">
+ <software name="alphaprknl" cloneof="alphaprkr101">
<description>Alfabet Pretpark (NL)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -722,7 +722,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprkg" cloneof="alphaprkr101" supported="yes">
+ <software name="alphaprkg" cloneof="alphaprkr101">
<description>Abenteuer im ABC Park (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -739,7 +739,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprkgr3" cloneof="alphaprkr101" supported="yes">
+ <software name="alphaprkgr3" cloneof="alphaprkr101">
<description>Abenteuer im ABC Park (Germany, Rev. 3)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -756,7 +756,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprkf" cloneof="alphaprkr101" supported="yes">
+ <software name="alphaprkf" cloneof="alphaprkr101">
<description>ABC Land Aventure (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -773,7 +773,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="alphaprks" cloneof="alphaprkr101" supported="yes">
+ <software name="alphaprks" cloneof="alphaprkr101">
<description>Aventuras en el Parque Alfabeto (Spain)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -790,7 +790,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="arieluk" supported="yes">
+ <software name="arieluk">
<description>Disney's The Little Mermaid - Ariel's Majestic Journey (UK)</description>
<year>2004</year>
<publisher>VTech</publisher>
@@ -804,7 +804,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="arielgr3" cloneof="arieluk" supported="yes">
+ <software name="arielgr3" cloneof="arieluk">
<description>Disneys Arielle die Meerjungfrau - Arielles aufregendes Abenteuer (Germany, Rev. 3?)</description>
<year>2004?</year>
<publisher>VTech</publisher>
@@ -821,7 +821,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="arielg" cloneof="arieluk" supported="yes">
+ <software name="arielg" cloneof="arieluk">
<description>Disneys Arielle Die Meerjungfrau - Arielles aufregendes Abenteuer (Germany)</description>
<year>2004?</year>
<publisher>VTech</publisher>
@@ -838,7 +838,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="arielf" cloneof="arieluk" supported="yes">
+ <software name="arielf" cloneof="arieluk">
<description>Disney La Petite Sirene - Ariel devient une princesse (France)</description>
<year>2004?</year>
<publisher>VTech</publisher>
@@ -855,7 +855,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="ariels" cloneof="arieluk" supported="yes">
+ <software name="ariels" cloneof="arieluk">
<description>Disney La Sirenita - El Viaje Fantástico de Ariel (Spain)</description>
<year>2004</year>
<publisher>VTech</publisher>
@@ -872,7 +872,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="arieldk" cloneof="arieluk" supported="yes">
+ <software name="arieldk" cloneof="arieluk">
<description>Disney Den Lille Havfrue - Ariels majestætiske rejse! (Denmark)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -889,7 +889,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="arielsw" cloneof="arieluk" supported="yes">
+ <software name="arielsw" cloneof="arieluk">
<description>Disneys Den Lilla Sjöjungfrun - Ariels majestätiska resa! (Sweden)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -906,7 +906,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="arieli" cloneof="arieluk" supported="yes">
+ <software name="arieli" cloneof="arieluk">
<description>Disney La sirenetta - Ariel e la crociera magica (Italy)</description>
<year>2005</year>
<publisher>VTech / Giochi Preziosi</publisher>
@@ -918,7 +918,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="backyardigf" supported="yes"> <!-- Will be clone of "backyardig" once found and dumped. -->
+ <software name="backyardigf"> <!-- Will be clone of "backyardig" once found and dumped. -->
<description>Nickelodeon Les Mélodilous - Les explorateurs vikings (France)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -935,7 +935,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="batmanuk" supported="yes">
+ <software name="batmanuk">
<description>The Batman - Gotham City Rescue (UK)</description>
<year>2005</year> <!-- (s05) -->
<publisher>VTech</publisher>
@@ -949,7 +949,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="batmans" cloneof="batmanuk" supported="yes">
+ <software name="batmans" cloneof="batmanuk">
<description>The Batman - Rescate en Gotham City (Spain)</description>
<year>2006</year> <!-- (s06) -->
<publisher>VTech</publisher>
@@ -965,7 +965,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="batmang" supported="yes">
+ <software name="batmang">
<description>The Batman - Rettung von Gotham City (Germany)</description>
<year>2006</year> <!-- (s06) -->
<publisher>VTech</publisher>
@@ -982,7 +982,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="barneyg" supported="yes">
+ <software name="barneyg">
<description>Barney - Erlebnis-Reise (Germany)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -999,7 +999,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="blueclue" supported="yes">
+ <software name="blueclue">
<description>Nick Jr. Blue's Clues - Collection Day (USA)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -1016,7 +1016,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="bobbday" supported="yes">
+ <software name="bobbday">
<description>Bob the Builder - Bob's Busy Day (USA)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1048,7 +1048,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="bobbdayg" cloneof="bobbday" supported="yes">
+ <software name="bobbdayg" cloneof="bobbday">
<description>Bob der Baumeister - Bobs spannender Arbeitstag (Germany)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1065,7 +1065,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="bobbdaygr104" cloneof="bobbday" supported="yes">
+ <software name="bobbdaygr104" cloneof="bobbday">
<description>Bob der Baumeister - Bobs spannender Arbeitstag (Germany, Rev. 104)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -1082,7 +1082,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="bobbdays" cloneof="bobbday" supported="yes">
+ <software name="bobbdays" cloneof="bobbday">
<description>Bob y sus Amigos - Un Día De Trabajo (Spain)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -1099,7 +1099,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="bobbdaydk" cloneof="bobbday" supported="yes">
+ <software name="bobbdaydk" cloneof="bobbday">
<description>Byggemand Bob - Bobs travle dag (Denmark)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1116,7 +1116,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="bobbdaysw" cloneof="bobbday" supported="yes">
+ <software name="bobbdaysw" cloneof="bobbday">
<description>Byggare Bob - Bobs stressiga dag (Sweden)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1133,7 +1133,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="carebears" supported="yes"> <!-- Will be clone of "carebear" once found and dumped. -->
+ <software name="carebears"> <!-- Will be clone of "carebear" once found and dumped. -->
<description>Osos Amorosos - Una Lección de Amor (Spain)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1166,7 +1166,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cars" cloneof="carsr201" supported="yes">
+ <software name="cars" cloneof="carsr201">
<description>Disney/Pixar Cars - Rev It Up in Radiator Springs (USA)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1183,7 +1183,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="carsuk" cloneof="carsr201" supported="yes">
+ <software name="carsuk" cloneof="carsr201">
<description>Disney/Pixar Cars - Rev It Up in Radiator Springs (UK)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1197,7 +1197,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="carsg" cloneof="carsr201" supported="yes">
+ <software name="carsg" cloneof="carsr201">
<description>Disney/Pixar Cars - Vollgas in Radiator Springs (Germany)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1214,7 +1214,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="carsf" cloneof="carsr201" supported="yes">
+ <software name="carsf" cloneof="carsr201">
<description>Disney/Pixar Cars - Quatre Roues (France)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1231,7 +1231,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="carss" cloneof="carsr201" supported="yes">
+ <software name="carss" cloneof="carsr201">
<description>Disney/Pixar Cars - Acelera el Motor en Radiador Springs (Spain)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -1248,7 +1248,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="carsdk" cloneof="carsr201" supported="yes">
+ <software name="carsdk" cloneof="carsr201">
<description>Disney/Pixar Biler - Ræs i Kølerkildekøbing (Denmark)</description>
<year>2007?</year>
<publisher>VTech</publisher>
@@ -1265,7 +1265,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="carssw" cloneof="carsr201" supported="yes">
+ <software name="carssw" cloneof="carsr201">
<description>Disney/Pixar Bilar - Kör ikapp i Kylarköping (Sweden)</description>
<year>2007?</year>
<publisher>VTech</publisher>
@@ -1283,7 +1283,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderla" supported="yes">
+ <software name="cinderla">
<description>Disney Princess Cinderella - Cinderella's Magic Wishes (USA)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1300,7 +1300,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlaa" cloneof="cinderla" supported="yes">
+ <software name="cinderlaa" cloneof="cinderla">
<description>Disney Princess Cinderella - Cinderella's Magic Wishes (USA, alt)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -1313,7 +1313,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlai" cloneof="cinderla" supported="yes">
+ <software name="cinderlai" cloneof="cinderla">
<description>Disney Cenerentola - I desideri magici di Cenerentola (Italy)</description>
<year>2006</year>
<publisher>VTech / Giochi Preziosi</publisher>
@@ -1326,7 +1326,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlanl" cloneof="cinderla" supported="yes">
+ <software name="cinderlanl" cloneof="cinderla">
<description>Walt Disney's Assepoester - De wonderwereld van Assepoester (Netherlands)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -1343,7 +1343,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlauk" cloneof="cinderla" supported="yes">
+ <software name="cinderlauk" cloneof="cinderla">
<description>Disney's Cinderella - Cinderella's Magic Wishes (UK)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -1356,7 +1356,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlaf" cloneof="cinderla" supported="yes">
+ <software name="cinderlaf" cloneof="cinderla">
<description>Disney Princesses Cendrillon - Le rêve enchanté de Cendrillon (France)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1373,7 +1373,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlas" cloneof="cinderla" supported="yes">
+ <software name="cinderlas" cloneof="cinderla">
<description>Walt Disney La Cenicienta - Los sueños mágicos de Cenicienta (Spain)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -1408,7 +1408,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlasr222" cloneof="cinderla" supported="yes">
+ <software name="cinderlasr222" cloneof="cinderla">
<description>Walt Disney La Cenicienta - Los sueños mágicos de Cenicienta (Spain, Rev. 222)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -1425,7 +1425,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderladk" cloneof="cinderla" supported="yes">
+ <software name="cinderladk" cloneof="cinderla">
<description>Disney Princess Cinderella - Askepots magiske ønsker (Denmark)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1442,7 +1442,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlagr204" cloneof="cinderla" supported="yes">
+ <software name="cinderlagr204" cloneof="cinderla">
<description>Disney's Princess Cinderella - Lernen im Märchenland (Germany, Rev. 204)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -1459,7 +1459,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlagr104" cloneof="cinderla" supported="yes">
+ <software name="cinderlagr104" cloneof="cinderla">
<description>Disney's Princess Cinderella - Lernen im Märchenland (Germany, Rev. 104)</description>
<year>2007?</year>
<publisher>VTech</publisher>
@@ -1476,7 +1476,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlag" cloneof="cinderla" supported="yes">
+ <software name="cinderlag" cloneof="cinderla">
<description>Disney's Princess Cinderella - Lernen im Märchenland (Germany)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1493,7 +1493,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="cinderlasw" cloneof="cinderla" supported="yes">
+ <software name="cinderlasw" cloneof="cinderla">
<description>Disney Princess Cinderella - Askungens magiska önskningar (Sweden)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -1527,7 +1527,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</software>
<!-- Same ROM as "80-092283(UK)" -->
- <software name="dora" cloneof="dorar201" supported="yes">
+ <software name="dora" cloneof="dorar201">
<description>Nick Jr Dora the Explorer - Dora's Fix-it Adventure (USA)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -1562,7 +1562,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="doraf" cloneof="dorar201" supported="yes">
+ <software name="doraf" cloneof="dorar201">
<description>Dora L'Exploratrice - Les aventures de Dora Apprentie Mécano (France)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -1597,7 +1597,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="doragr104" cloneof="dorar201" supported="yes">
+ <software name="doragr104" cloneof="dorar201">
<description>Nick Jr Dora - Doras Reparatur-Abenteuer (Germany, Rev. 104)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -1614,7 +1614,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="elmo" supported="yes">
+ <software name="elmo">
<description>Elmos großes Abenteuer (Germany)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1631,7 +1631,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="elmof" cloneof="elmo" supported="yes">
+ <software name="elmof" cloneof="elmo">
<description>Le Monde d'Elmo - Les Grandes Découvertes D'Elmo (France)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1648,7 +1648,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="elmos" cloneof="elmo" supported="yes">
+ <software name="elmos" cloneof="elmo">
<description>El Mundo de Elmo - Grandes descubrimientos de Elmo (Spain)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -1665,7 +1665,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="findnemo" supported="yes">
+ <software name="findnemo">
<description>Disney/Pixar Finding Nemo - Nemo's Ocean Discoveries (USA)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1682,7 +1682,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="findnemog" cloneof="findnemo" supported="yes">
+ <software name="findnemog" cloneof="findnemo">
<description>Disney/Pixar Findet Nemo - Nemos Unterwasserabenteuer (Germany)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -1699,7 +1699,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="findnemop" cloneof="findnemo" supported="yes">
+ <software name="findnemop" cloneof="findnemo">
<description>Disney/Pixar À Procura de Nemo - Nemo À Descoberta do Oceano (Portugal)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -1716,7 +1716,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="findnemonl" cloneof="findnemo" supported="yes">
+ <software name="findnemonl" cloneof="findnemo">
<description>Disney/Pixar Finding Nemo - De wonderwereld van Nemo (Netherlands)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -1733,7 +1733,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="findnemos" cloneof="findnemo" supported="yes">
+ <software name="findnemos" cloneof="findnemo">
<description>Disney/Pixar Buscando a Nemo - Los Descubrimientos de Nemo (Spain)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -1750,7 +1750,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="fred" supported="yes">
+ <software name="fred">
<description>Freds Zahlen Rallye (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -1767,7 +1767,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="fredf" cloneof="fred" supported="yes">
+ <software name="fredf" cloneof="fred">
<description>Apprenti' pilote (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -1854,7 +1854,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="ltleinstngr3" cloneof="ltleinstnr5" supported="yes">
+ <software name="ltleinstngr3" cloneof="ltleinstnr5">
<description>Disney's Kleine Einsteins (Germany, Rev. 3?)</description>
<year>2009</year>
<publisher>VTech</publisher>
@@ -1889,7 +1889,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lionking" supported="yes">
+ <software name="lionking">
<description>Disney's The Lion King - Simba's Big Adventure (USA)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -1906,7 +1906,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</software>
<!-- where did the last 2MB in this come from? the cart is confirmed as having a 4MB blob and a 2MB blob -->
- <software name="lionkinga" cloneof="lionking" supported="yes">
+ <software name="lionkinga" cloneof="lionking">
<description>Disney's The Lion King - Simba's Big Adventure (USA, alt)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -1923,7 +1923,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lionkinggr2" cloneof="lionking" supported="yes">
+ <software name="lionkinggr2" cloneof="lionking">
<description>Der Koenig der Loewen - Simbas großes Abenteuer (Germany, Rev. 2?)</description>
<year>2004</year>
<publisher>VTech</publisher>
@@ -1940,7 +1940,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lionkingf" cloneof="lionking" supported="yes">
+ <software name="lionkingf" cloneof="lionking">
<description>Le Roi Lion - Simba Découvre la Jungle (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -1957,7 +1957,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lionkings" cloneof="lionking" supported="yes">
+ <software name="lionkings" cloneof="lionking">
<description>Disney El Rey León - La Gran Aventura de Simba (Spain)</description>
<year>2004</year>
<publisher>VTech</publisher>
@@ -1974,7 +1974,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lionkingdk" cloneof="lionking" supported="yes">
+ <software name="lionkingdk" cloneof="lionking">
<description>Disney Løvernes Konge - Simbas store eventyr (Denmark)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -1991,7 +1991,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lionkingsw" cloneof="lionking" supported="yes">
+ <software name="lionkingsw" cloneof="lionking">
<description>Disney Lejonkungen - Simbas stora äventyr (Sweden)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2008,7 +2008,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lionkingi" cloneof="lionking" supported="yes">
+ <software name="lionkingi" cloneof="lionking">
<description>Disney Il re leone - La grande avventura di Simba (Italy)</description>
<year>2005</year>
<publisher>VTech / Giochi Preziosi</publisher>
@@ -2021,7 +2021,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="kungfupuk" supported="yes">
+ <software name="kungfupuk">
<description>Kung Fu Panda - Path of the Panda (UK)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -2034,7 +2034,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="kungfupg" cloneof="kungfupuk" supported="yes">
+ <software name="kungfupg" cloneof="kungfupuk">
<description>Kung Fu Panda - Der Weg des Panda (Germany)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -2069,7 +2069,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="lbratzs" supported="yes">
+ <software name="lbratzs">
<description>Lil' Bratz Estrellas De La Moda - Amigos, Moda y Diversión (Spain)</description>
<year>2008</year>
<publisher>VTech</publisher>
@@ -2086,7 +2086,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mannyg" supported="yes">
+ <software name="mannyg">
<description>Meister Manny's Werkzeugkiste (Germany)</description>
<year>2009?</year>
<publisher>VTech</publisher>
@@ -2103,7 +2103,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickymag" supported="yes">
+ <software name="mickymag">
<description>Disney's Mickey Mouse - Mickey's Magical Adventure (USA)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -2116,7 +2116,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickymagi" cloneof="mickymag" supported="yes">
+ <software name="mickymagi" cloneof="mickymag">
<description>Disney Topolino - Le Magiche Avventure di Topolino (Italy)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -2130,7 +2130,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickymagg" cloneof="mickymag" supported="yes">
+ <software name="mickymagg" cloneof="mickymag">
<description>Disneys Micky - Mickys magisches Abenteuer (Germany)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -2147,7 +2147,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickymags" cloneof="mickymag" supported="yes">
+ <software name="mickymags" cloneof="mickymag">
<description>Disney Mickey - La Aventura Mágica de Mickey (Spain)</description>
<year>2004</year>
<publisher>VTech</publisher>
@@ -2164,7 +2164,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickymagsw" cloneof="mickymag" supported="yes">
+ <software name="mickymagsw" cloneof="mickymag">
<description>Disneys Musse Pigg - Musses magiska äventyr (Sweden)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2181,7 +2181,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickeychgr3" supported="yes">
+ <software name="mickeychgr3">
<description>Micky Maus Wunderhaus (Germany, Rev. 3?)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2216,7 +2216,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickeychnl" cloneof="mickeychgr3" supported="yes">
+ <software name="mickeychnl" cloneof="mickeychgr3">
<description>Mickey Mouse Clubhouse (Netherlands)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2233,7 +2233,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mickeychsw" cloneof="mickeychgr3" supported="yes">
+ <software name="mickeychsw" cloneof="mickeychgr3">
<description>Mickey Mouse Clubhouse (Sweden)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2250,7 +2250,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="monstalng" supported="yes">
+ <software name="monstalng">
<description>DreamWorks Monsters vs Aliens (Germany)</description>
<year>2009?</year>
<publisher>VTech</publisher>
@@ -2285,7 +2285,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mypuppyg" supported="yes">
+ <software name="mypuppyg">
<description>Mein erster Hund (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2320,7 +2320,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="mypuppysw" cloneof="mypuppyg" supported="yes">
+ <software name="mypuppysw" cloneof="mypuppyg">
<description>Min hundvalp (Sweden)</description>
<year>2009?</year>
<publisher>VTech</publisher>
@@ -2337,7 +2337,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="noddy" supported="yes">
+ <software name="noddy">
<description>Noddy - Detective for a Day (USA)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2354,7 +2354,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="noddyuk" cloneof="noddy" supported="yes">
+ <software name="noddyuk" cloneof="noddy">
<description>Noddy - Detective for a Day (UK)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2368,7 +2368,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="noddygr104" cloneof="noddy" supported="yes">
+ <software name="noddygr104" cloneof="noddy">
<description>Noddy - Detektiv für einen Tag (Germany, Rev. 104)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2385,7 +2385,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="noddyf" cloneof="noddy" supported="yes">
+ <software name="noddyf" cloneof="noddy">
<description>Oui-Oui - Détective d'un Jour (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2402,7 +2402,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="noddyp" cloneof="noddy" supported="yes">
+ <software name="noddyp" cloneof="noddy">
<description>Noddy - Detective Por um Dia (Portugal)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2436,7 +2436,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</software>
<!-- No inputs, uses keyboard and mouse -->
- <software name="pcpalisg" cloneof="pcpalisr3" supported="yes">
+ <software name="pcpalisg" cloneof="pcpalisr3">
<description>V.Smile Mein erster Mausklick (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2471,7 +2471,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="upgr004" supported="yes">
+ <software name="upgr004">
<description>Disney/Pixar Oben (Germany, Rev. 004)</description>
<year>2009?</year>
<publisher>VTech</publisher>
@@ -2488,7 +2488,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="upukr3" cloneof="upgr004" supported="yes">
+ <software name="upukr3" cloneof="upgr004">
<description>Disney/Pixar Up (UK, Rev. 003)</description>
<year>2009</year>
<publisher>VTech</publisher>
@@ -2519,7 +2519,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="partyprk" supported="yes">
+ <software name="partyprk">
<description>Cranium Partyland Park - A Carnival of Play-and-Learn Fun (USA)</description>
<year>2007?</year>
<publisher>VTech</publisher>
@@ -2572,7 +2572,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="ratati" cloneof="ratatg" supported="yes">
+ <software name="ratati" cloneof="ratatg">
<description>Disney/Pixar Ratatouille - Le nuove ricette di Remy (Italy)</description>
<year>2007</year>
<publisher>VTech</publisher>
@@ -2602,7 +2602,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="ratatg" supported="yes">
+ <software name="ratatg">
<description>Disney/Pixar Ratatouille - Remys neue Rezepte (Germany)</description>
<year>2007?</year>
<publisher>VTech</publisher>
@@ -2653,7 +2653,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydo" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydo" cloneof="scoobydor301">
<description>Scooby-Doo! - Funland Frenzy (USA)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2670,7 +2670,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydoi" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydoi" cloneof="scoobydor301">
<description>Scooby-Doo! - Avventura a Funland (Italy)</description>
<year>200?</year>
<publisher>VTech / Giochi Preziosi</publisher>
@@ -2683,7 +2683,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydonl" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydonl" cloneof="scoobydor301">
<description>Scooby-Doo! - Griezelen in het Pretpark (Netherlands)</description>
<year>2005</year> <!-- (s05) -->
<publisher>VTech</publisher>
@@ -2728,7 +2728,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydog" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydog" cloneof="scoobydor301">
<description>Scooby-Doo! - Im Lernpark (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2745,7 +2745,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydof" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydof" cloneof="scoobydor301">
<description>Scooby-Doo - Panique à Funland (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2780,7 +2780,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydostb" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydostb" cloneof="scoobydor301">
<description>Scooby-Doo - Misterio En El Parque (Spain, translucent blue cartridge)</description>
<year>2004</year> <!-- (s04) -->
<publisher>VTech</publisher>
@@ -2797,7 +2797,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydodk" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydodk" cloneof="scoobydor301">
<description>Scooby-Doo! - Sjov i forlystelsesparken (Denmark)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2814,7 +2814,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="scoobydosw" cloneof="scoobydor301" supported="yes">
+ <software name="scoobydosw" cloneof="scoobydor301">
<description>Scooby-Doo! - Tivoli-tokerier (Sweden)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -2831,7 +2831,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="erniebrt" supported="yes">
+ <software name="erniebrt">
<description>Ernies &amp; Berts Fantastisches Abenteuer (Germany)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -2848,7 +2848,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="erniebrts" cloneof="erniebrt" supported="yes">
+ <software name="erniebrts" cloneof="erniebrt">
<description>Barrio Sésamo - El Mundo Fantástico de Epi y Blas (Spain)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -2865,7 +2865,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="shrek3" supported="yes">
+ <software name="shrek3">
<description>DreamWorks Shrek the Third - Arthur's School Day Adventure (USA)</description>
<year>2007?</year>
<publisher>VTech</publisher>
@@ -2900,7 +2900,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="shrek3g" cloneof="shrek3" supported="yes">
+ <software name="shrek3g" cloneof="shrek3">
<description>DreamWorks Shrek der Dritte - Ein Spannender Schultag (Germany)</description>
<year>2007</year>
<publisher>VTech</publisher>
@@ -2917,7 +2917,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="shrek3nl" cloneof="shrek3" supported="yes">
+ <software name="shrek3nl" cloneof="shrek3">
<description>Shrek De Derde - Arthurs Schooldag Avontuur (Netherlands)</description>
<year>2007?</year>
<publisher>VTech</publisher>
@@ -2949,7 +2949,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="shreknl" supported="yes">
+ <software name="shreknl">
<description>DreamWorks Shrek - Het Verhaal Van Draakje (Netherlands)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -2963,7 +2963,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="shrekg" cloneof="shreknl" supported="yes">
+ <software name="shrekg" cloneof="shreknl">
<description>DreamWorks Shrek - Die Geschichte des Drachen (Germany)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -2980,7 +2980,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="shrekf" cloneof="shreknl" supported="yes">
+ <software name="shrekf" cloneof="shreknl">
<description>DreamWorks Shrek - Le Rhume de Dragonne (France)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -2997,7 +2997,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="shreks" cloneof="shreknl" supported="yes">
+ <software name="shreks" cloneof="shreknl">
<description>DreamWorks Shrek - El Cuento de la Dragona (Spain)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -3014,7 +3014,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="soccerch" supported="yes">
+ <software name="soccerch">
<description>V.Smile Soccer Challenge (USA)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3031,7 +3031,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="soccerchg" cloneof="soccerch" supported="yes">
+ <software name="soccerchg" cloneof="soccerch">
<description>V.Smile Fußball Schule (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3048,7 +3048,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="soccerchs" cloneof="soccerch" supported="yes">
+ <software name="soccerchs" cloneof="soccerch">
<description>Campeonato de Futbol V.Smile (Spain)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3065,7 +3065,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spiderdocg" supported="yes">
+ <software name="spiderdocg">
<description>Spider-Man &amp; Freunde - Wettkampf im Space-Labor (Germany)</description>
<year>2006?</year>
<publisher>VTech</publisher>
@@ -3082,7 +3082,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spiderdocs" cloneof="spiderdocg" supported="yes">
+ <software name="spiderdocs" cloneof="spiderdocg">
<description>Spider-Man y Amigos - La Aventura Del Doctor Octopus (Spain)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -3117,7 +3117,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spidermisi" cloneof="spidermisr101" supported="yes">
+ <software name="spidermisi" cloneof="spidermisr101">
<description>Spider-Man &amp; Friends - Missioni Segrete (Italy)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3131,7 +3131,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spidermisg" cloneof="spidermisr101" supported="yes">
+ <software name="spidermisg" cloneof="spidermisr101">
<description>Spider-Man &amp; Freunde - Geheime Missionen (Germany)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3148,7 +3148,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spidermisf" cloneof="spidermisr101" supported="yes">
+ <software name="spidermisf" cloneof="spidermisr101">
<description>Marvel Spider-Man &amp; ses amis - Missions secrètes (France)</description>
<year>2007</year>
<publisher>VTech</publisher>
@@ -3165,7 +3165,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spidermiss" cloneof="spidermisr101" supported="yes">
+ <software name="spidermiss" cloneof="spidermisr101">
<description>Spider-Man y Amigos - Misiones Secretas (Spain)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3200,7 +3200,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spongeb" supported="yes">
+ <software name="spongeb">
<description>Nickelodeon Spongebob Squarepants - A Day in the Life of a Sponge (USA)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -3217,7 +3217,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spongebgr1" cloneof="spongeb" supported="yes">
+ <software name="spongebgr1" cloneof="spongeb">
<description>Nickelodeon Spongebob Schwammkopf - Der Tag des Schwamms (Germany, Rev. 1)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -3234,7 +3234,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spongebg1" cloneof="spongeb" supported="yes">
+ <software name="spongebg1" cloneof="spongeb">
<description>Nickelodeon Spongebob Schwammkopf - Der Tag des Schwamms (Germany)</description>
<year>2005?</year>
<publisher>VTech</publisher>
@@ -3251,7 +3251,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="spongebs" cloneof="spongeb" supported="yes">
+ <software name="spongebs" cloneof="spongeb">
<description>Nickelodeon Bob Esponja - Un día en la vida de una esponja (Spain)</description>
<year>2006</year>
<publisher>VTech</publisher>
@@ -3268,7 +3268,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="superman" supported="yes">
+ <software name="superman">
<description>Superman - The Greatest Hero (USA)</description>
<year>2006</year> <!-- (s06) -->
<publisher>VTech</publisher>
@@ -3285,7 +3285,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="supermang" cloneof="superman" supported="yes">
+ <software name="supermang" cloneof="superman">
<description>Superman - Der Superheld (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3302,7 +3302,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="supermannl" cloneof="superman" supported="yes">
+ <software name="supermannl" cloneof="superman">
<description>Superman - De Grootste Held (Netherlands)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3319,7 +3319,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="supermanf" cloneof="superman" supported="yes">
+ <software name="supermanf" cloneof="superman">
<description>Superman - À la rescousse ! (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3336,7 +3336,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="supermans" cloneof="superman" supported="yes">
+ <software name="supermans" cloneof="superman">
<description>Superman - El Hombre de Acero (Spain)</description>
<year>2006</year> <!-- (s06) -->
<publisher>VTech</publisher>
@@ -3353,7 +3353,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="thomas" supported="yes">
+ <software name="thomas">
<description>Thomas &amp; Friends - Engines Working Together (USA)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3368,7 +3368,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="thomasuk" cloneof="thomas" supported="yes">
+ <software name="thomasuk" cloneof="thomas">
<description>Thomas &amp; Friends - Engines Working Together (UK)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3397,7 +3397,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="thomasgr104" cloneof="thomas" supported="yes">
+ <software name="thomasgr104" cloneof="thomas">
<description>Thomas &amp; seine Freunde - Freunde Halten Zusammen (Germany, Rev. 104)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3414,7 +3414,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="thomasg" cloneof="thomas" supported="yes">
+ <software name="thomasg" cloneof="thomas">
<description>Thomas &amp; seine Freunde - Freunde Halten Zusammen (Germany)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3431,7 +3431,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="thomasf" cloneof="thomas" supported="yes">
+ <software name="thomasf" cloneof="thomas">
<description>Thomas et ses Amis - Les locomotives s'entraident (France)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3448,7 +3448,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="thomassw" cloneof="thomas" supported="yes">
+ <software name="thomassw" cloneof="thomas">
<description>Thomas &amp; Friends - Tågen hjälps åt (Sweden)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3465,7 +3465,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="tingelng" supported="yes">
+ <software name="tingelng">
<description>Tingeling (Sweden)</description>
<year>2010?</year>
<publisher>VTech</publisher>
@@ -3482,7 +3482,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="toystor2" supported="yes">
+ <software name="toystor2">
<description>Disney/Pixar Toy Story 2 - Operation: Rescue Woody! (USA)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3495,7 +3495,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="toystor2a" cloneof="toystor2" supported="yes">
+ <software name="toystor2a" cloneof="toystor2">
<description>Disney/Pixar Toy Story 2 - Operation: Rescue Woody! (USA, alt)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3511,7 +3511,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="toystor2uk" cloneof="toystor2" supported="yes">
+ <software name="toystor2uk" cloneof="toystor2">
<description>Disney/Pixar Toy Story 2 - Operation-Rescue Woody! (UK)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3525,7 +3525,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="toystor2g" cloneof="toystor2" supported="yes">
+ <software name="toystor2g" cloneof="toystor2">
<description>Disney/Pixar Toy Story 2 - Woodys Spannende Rettung (Germany)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3542,7 +3542,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="toystor2s" cloneof="toystor2" supported="yes">
+ <software name="toystor2s" cloneof="toystor2">
<description>Disney/Pixar Toy Story 2 - El Rescate De Woody (Spain)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3559,7 +3559,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="toystor2sw" cloneof="toystor2" supported="yes">
+ <software name="toystor2sw" cloneof="toystor2">
<description>Disney/Pixar Toy Story 2 - Operation: Rädda Woody! (Sweden)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3576,7 +3576,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="walleg" supported="yes">
+ <software name="walleg">
<description>Disney/Pixar Wall-E (Germany)</description>
<year>2008?</year>
<publisher>VTech</publisher>
@@ -3611,7 +3611,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="wallesw" cloneof="walleg" supported="yes">
+ <software name="wallesw" cloneof="walleg">
<description>Disney/Pixar Wall-E (Sweden)</description>
<year>2008?</year>
<publisher>VTech</publisher>
@@ -3628,7 +3628,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="pooh" supported="yes">
+ <software name="pooh">
<description>Disneys Winnie the Pooh - The Honey Hunt (USA)</description>
<year>2004?</year>
<publisher>VTech</publisher>
@@ -3645,7 +3645,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohi" cloneof="pooh" supported="yes">
+ <software name="poohi" cloneof="pooh">
<description>Winnie the Pooh e la caccia al miele (Italy)</description>
<year>2005</year>
<publisher>VTech</publisher>
@@ -3677,7 +3677,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohg" cloneof="pooh" supported="yes">
+ <software name="poohg" cloneof="pooh">
<description>Disneys Winnie Puuh - Die Honigjagd (Germany)</description>
<year>2004?</year>
<publisher>VTech</publisher>
@@ -3694,7 +3694,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohgr204" cloneof="pooh" supported="yes">
+ <software name="poohgr204" cloneof="pooh">
<description>My Friends Tigger &amp; Pooh - Die Honigjagd (Germany, Rev. 204)</description>
<year>2008?</year>
<publisher>VTech</publisher>
@@ -3711,7 +3711,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohf" cloneof="pooh" supported="yes">
+ <software name="poohf" cloneof="pooh">
<description>Disney Winnie l'Ourson - La Chasse au miel de Winnie (France)</description>
<year>2004?</year>
<publisher>VTech</publisher>
@@ -3728,7 +3728,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohfr2" cloneof="pooh" supported="yes">
+ <software name="poohfr2" cloneof="pooh">
<description>Disney Winnie l'Ourson - La Chasse au miel de Winnie (France, Rev. 2)</description>
<year>2004?</year>
<publisher>VTech</publisher>
@@ -3745,7 +3745,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohs" cloneof="pooh" supported="yes">
+ <software name="poohs" cloneof="pooh">
<description>Disney Winnie the Pooh - En Busca de la Miel (Spain)</description>
<year>2004</year>
<publisher>VTech</publisher>
@@ -3782,7 +3782,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohdk" cloneof="pooh" supported="yes">
+ <software name="poohdk" cloneof="pooh">
<description>Disney Peter Plys - Honningjagten (Denmark)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3799,7 +3799,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="poohsw" cloneof="pooh" supported="yes">
+ <software name="poohsw" cloneof="pooh">
<description>Disney Nalle Puh - Honungsjakten (Sweden)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3875,7 +3875,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="techartsw" cloneof="techart" supported="yes">
+ <software name="techartsw" cloneof="techart">
<description>V.Smile Tecknarstudio (Sweden)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3916,7 +3916,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="wkwheelg" supported="yes"> <!-- Will be clone of "wkwheel" once found and dumped. -->
+ <software name="wkwheelg"> <!-- Will be clone of "wkwheel" once found and dumped. -->
<description>Flitzers Schlaue Städtetour (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3935,7 +3935,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="wkwheels" cloneof="wkwheelg" supported="yes"> <!-- Will be clone of "wkwheel" once found and dumped. -->
+ <software name="wkwheels" cloneof="wkwheelg"> <!-- Will be clone of "wkwheel" once found and dumped. -->
<description>Conducción Divertida (Spain)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3974,7 +3974,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="zayzaear101" supported="yes">
+ <software name="zayzaear101">
<description>Zayzoo: An Earth Adventure (USA, Rev. 101)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -3991,7 +3991,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="zayzaea" cloneof="zayzaear101" supported="yes">
+ <software name="zayzaea" cloneof="zayzaear101">
<description>Zayzoo - My Alien Classmate (USA)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -4004,7 +4004,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="zayzaeag" cloneof="zayzaear101" supported="yes">
+ <software name="zayzaeag" cloneof="zayzaear101">
<description>Zayzoos Lernall (Germany)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -4022,7 +4022,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</software>
<!-- Found also with the same ROM as "80-092360-101(US)" -->
- <software name="zayzaeaukr103" cloneof="zayzaear101" supported="yes">
+ <software name="zayzaeaukr103" cloneof="zayzaear101">
<description>Zayzoo: An Earth Adventure (UK, Rev. 103)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -4035,7 +4035,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="zayzaeaf" cloneof="zayzaear101" supported="yes">
+ <software name="zayzaeaf" cloneof="zayzaear101">
<description>Zézou - Notre Ami Venu d'Ailleurs (France)</description>
<year>200?</year>
<publisher>VTech</publisher>
@@ -4052,7 +4052,7 @@ V.Smile Smartbook Smartidges (need a Smartbook touch tablet connected to a regul
</part>
</software>
- <software name="zayzaeas" cloneof="zayzaear101" supported="yes">
+ <software name="zayzaeas" cloneof="zayzaear101">
<description>Zayzoo - Mi Amiga del Espacio (Spain)</description>
<year>200?</year>
<publisher>VTech</publisher>
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 1a9fb3d0fd8..b443021f745 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -458,6 +458,21 @@ end
---------------------------------------------------
--
+--@src/devices/bus/bbc/modem/modem.h,BUSES["BBC_MODEM"] = true
+---------------------------------------------------
+
+if (BUSES["BBC_MODEM"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/bus/bbc/modem/modem.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/modem/modem.h",
+ MAME_DIR .. "src/devices/bus/bbc/modem/scsiaiv.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/modem/scsiaiv.h",
+ }
+end
+
+
+---------------------------------------------------
+--
--@src/devices/bus/bbc/1mhzbus/1mhzbus.h,BUSES["BBC_1MHZBUS"] = true
---------------------------------------------------
@@ -485,6 +500,8 @@ if (BUSES["BBC_1MHZBUS"]~=null) then
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/pms64k.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/ramdisc.cpp",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/ramdisc.h",
+ MAME_DIR .. "src/devices/bus/bbc/1mhzbus/scsi.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/1mhzbus/scsi.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/sprite.cpp",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/sprite.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp",
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 86220fa754d..be277585ef1 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -768,6 +768,7 @@ BUSES["BBC_CART"] = true
BUSES["BBC_EXP"] = true
BUSES["BBC_INTERNAL"] = true
BUSES["BBC_JOYPORT"] = true
+BUSES["BBC_MODEM"] = true
BUSES["BBC_1MHZBUS"] = true
BUSES["BBC_TUBE"] = true
BUSES["BBC_USERPORT"] = true
@@ -2576,8 +2577,8 @@ createMESSProjects(_target, _subtarget, "jazz")
files {
MAME_DIR .. "src/mame/drivers/jazz.cpp",
MAME_DIR .. "src/mame/includes/jazz.h",
- MAME_DIR .. "src/mame/machine/jazz_mct_adr.cpp",
- MAME_DIR .. "src/mame/machine/jazz_mct_adr.h",
+ MAME_DIR .. "src/mame/machine/mct_adr.cpp",
+ MAME_DIR .. "src/mame/machine/mct_adr.h",
}
createMESSProjects(_target, _subtarget, "kaypro")
@@ -3789,7 +3790,22 @@ files {
MAME_DIR .. "src/mame/drivers/trkfldch.cpp",
MAME_DIR .. "src/mame/drivers/tvgame.cpp",
MAME_DIR .. "src/mame/drivers/spg110.cpp",
- MAME_DIR .. "src/mame/drivers/vii.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_jakks.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_zone.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_zone_32bit.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_senario.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_senario_poker.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_vii.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_ican.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_playvision.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_shredmjr.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_telestory.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_tvgogo.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_pdc.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_dreamlife.cpp",
+ MAME_DIR .. "src/mame/drivers/spg2xx_lexibook.cpp",
+ MAME_DIR .. "src/mame/includes/spg2xx.h",
MAME_DIR .. "src/mame/drivers/sunplus_gcm394.cpp",
MAME_DIR .. "src/mame/drivers/generalplus_gpl32612.cpp",
MAME_DIR .. "src/mame/drivers/xavix.cpp",
diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
index 6eb6c623769..ca3a5e5f0af 100644
--- a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
+++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
@@ -116,7 +116,7 @@ void bbc_1mhzbus_slot_device::jim_w(offs_t offset, uint8_t data)
#include "ieee488.h"
#include "m2000.h"
//#include "m5000.h"
-//#include "scsi.h"
+#include "scsi.h"
//#include "multiform.h"
#include "opus3.h"
#include "pms64k.h"
@@ -134,7 +134,7 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
//device.option_add("teletext", BBC_TELETEXT); /* Acorn ANE01 Teletext Adapter */
device.option_add("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */
//device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
- //device.option_add("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */
+ device.option_add("awhd", BBC_AWHD); /* Acorn Winchester Disc */
device.option_add("autoprom", BBC_AUTOPROM); /* ATPL AutoPrommer */
device.option_add("beebide", BBC_BEEBIDE); /* Sprow BeebIDE 16-bit */
device.option_add("ide8", BBC_IDE8); /* RetroClinic BBC 8-bit IDE */
@@ -143,7 +143,6 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
//device.option_add("videodig", BBC_VIDEODIG); /* Video Digitiser (RH Electronics) */
device.option_add("emrmidi", BBC_EMRMIDI); /* EMR Midi Interface */
//device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */
- //device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */
//device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
device.option_add("opus3", BBC_OPUS3); /* Opus Challenger 3 */
device.option_add("pms64k", BBC_PMS64K); /* PMS 64K Non-Volatile Ram Module */
@@ -160,14 +159,13 @@ void bbcm_1mhzbus_devices(device_slot_interface &device)
//device.option_add("teletext", BBC_TELETEXT); /* Acorn ANE01 Teletext Adapter */
device.option_add("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */
//device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
- //device.option_add("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */
+ device.option_add("awhd", BBC_AWHD); /* Acorn Winchester Disc */
device.option_add("beebide", BBC_BEEBIDE); /* Sprow BeebIDE 16-bit */
device.option_add("ide8", BBC_IDE8); /* RetroClinic BBC 8-bit IDE */
device.option_add("b488", BBC_B488); /* Aries B488 */
//device.option_add("videodig", BBC_VIDEODIG); /* Video Digitiser (RH Electronics) */
device.option_add("emrmidi", BBC_EMRMIDI); /* EMR Midi Interface */
//device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */
- //device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */
device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 Interface */
//device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */
//device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
diff --git a/src/devices/bus/bbc/1mhzbus/scsi.cpp b/src/devices/bus/bbc/1mhzbus/scsi.cpp
new file mode 100644
index 00000000000..26c640467b3
--- /dev/null
+++ b/src/devices/bus/bbc/1mhzbus/scsi.cpp
@@ -0,0 +1,201 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn SCSI Host Adaptor
+
+ Known SCSI controller boards used:
+ Adaptec ACB-4000A
+
+ Known SCSI devices using adaptor:
+ SCSI ID 0 - Acorn Winchester 110: Seagate ST412 + Adaptec ACB-4000A
+ Acorn Winchester 120: NEC D5126 + Adaptec ACB-4000A
+ Acorn Winchester 130: Rodime R0203E + Adaptec ACB-4000A
+ SCSI ID 1 - Digistore Tape Streamer: Archive 2060S
+
+ Compatible 3rd party Winchesters using Akhter Host Adaptor:
+ Technomatic 20MB: Seagate ST225 + Adaptec ACB-4070
+ Technomatic 30MB:
+ Technomatic 40MB:
+
+ Additional notes:
+ The Digistore used a modified Acorn Host Adaptor, it re-mapped
+ the device to &FC44-47, from &FC40-43. This allows both the
+ Digistore and Winchester to co-exist.
+
+ Useful CHD parameters:
+ 10MB -chs 306,4,33 -ss=256
+ 20MB -chs 612,4,33 -ss=256
+ 30MB -chs 640,6,33 -ss=256
+ 512MB -chs 3971,16,33 -ss 256
+
+ TODO:
+ - test formatting, may require specific ACB-4000A commands.
+
+**********************************************************************/
+
+#include "emu.h"
+#include "scsi.h"
+#include "machine/nscsi_bus.h"
+#include "bus/nscsi/devices.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_SCSI, bbc_scsi_device, "bbc_scsi", "Acorn SCSI Host Adaptor");
+DEFINE_DEVICE_TYPE(BBC_AWHD, bbc_awhd_device, "bbc_awhd", "Acorn Winchester Disc");
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_scsi_device::device_add_mconfig(machine_config& config)
+{
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", default_scsi_devices, "scsicb", true)
+ .option_add_internal("scsicb", NSCSI_CB)
+ .machine_config([this](device_t* device) {
+ downcast<nscsi_callback_device&>(*device).bsy_callback().set(*this, FUNC(bbc_scsi_device::bsy_w));
+ downcast<nscsi_callback_device&>(*device).req_callback().set(*this, FUNC(bbc_scsi_device::req_w));
+ });
+}
+
+void bbc_awhd_device::device_add_mconfig(machine_config &config)
+{
+ bbc_scsi_device::device_add_mconfig(config);
+
+ /* Adaptec ACB-4000A */
+ subdevice<nscsi_connector>("scsi:0")->set_default_option("harddisk");
+ subdevice<nscsi_connector>("scsi:0")->set_fixed(true);
+
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, DERIVED_CLOCK(1, 1), bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::irq_w));
+ m_1mhzbus->nmi_handler().set(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::nmi_w));
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_scsi_device - constructor
+//-------------------------------------------------
+
+bbc_scsi_device::bbc_scsi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_bbc_1mhzbus_interface(mconfig, *this)
+ , m_scsi(*this, "scsi:7:scsicb")
+{
+}
+
+bbc_scsi_device::bbc_scsi_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
+ : bbc_scsi_device(mconfig, BBC_SCSI, tag, owner, clock)
+{
+}
+
+bbc_awhd_device::bbc_awhd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : bbc_scsi_device(mconfig, BBC_AWHD, tag, owner, clock)
+ , m_1mhzbus(*this, "1mhzbus")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_scsi_device::device_start()
+{
+ /* register for save states */
+ save_item(NAME(m_irq_enable));
+ save_item(NAME(m_irq_state));
+}
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+uint8_t bbc_scsi_device::fred_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ switch (offset)
+ {
+ case 0x40:
+ data = m_scsi->read();
+ m_scsi->ack_w(1);
+ break;
+ case 0x41:
+ data = (m_scsi->msg_r() << 0)
+ | (m_scsi->bsy_r() << 1)
+ | (m_irq_state << 4)
+ | (m_scsi->req_r() << 5)
+ | (m_scsi->io_r() << 6)
+ | (m_scsi->cd_r() << 7);
+ break;
+ }
+
+ return data;
+}
+
+void bbc_scsi_device::fred_w(offs_t offset, uint8_t data)
+{
+ switch (offset)
+ {
+ case 0x40:
+ m_scsi->write(data);
+ m_scsi->ack_w(1);
+ break;
+ case 0x42:
+ m_scsi->sel_w(1);
+ break;
+ case 0x43:
+ m_irq_enable = BIT(data, 0);
+ break;
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_scsi_device::bsy_w)
+{
+ m_scsi->sel_w(0);
+}
+
+WRITE_LINE_MEMBER(bbc_scsi_device::req_w)
+{
+ m_scsi->ack_w(0);
+
+ m_irq_state = (m_irq_enable && !state) ? 0 : 1;
+ m_slot->irq_w(m_irq_state ? CLEAR_LINE : ASSERT_LINE);
+}
+
+
+uint8_t bbc_awhd_device::fred_r(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ data &= bbc_scsi_device::fred_r(offset);
+ data &= m_1mhzbus->fred_r(offset);
+
+ return data;
+}
+
+void bbc_awhd_device::fred_w(offs_t offset, uint8_t data)
+{
+ bbc_scsi_device::fred_w(offset, data);
+ m_1mhzbus->fred_w(offset, data);
+}
+
+uint8_t bbc_awhd_device::jim_r(offs_t offset)
+{
+ return m_1mhzbus->jim_r(offset);
+}
+
+void bbc_awhd_device::jim_w(offs_t offset, uint8_t data)
+{
+ m_1mhzbus->jim_w(offset, data);
+}
diff --git a/src/devices/bus/bbc/1mhzbus/scsi.h b/src/devices/bus/bbc/1mhzbus/scsi.h
new file mode 100644
index 00000000000..8a4dabbe113
--- /dev/null
+++ b/src/devices/bus/bbc/1mhzbus/scsi.h
@@ -0,0 +1,81 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn SCSI Host Adaptor
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_1MHZBUS_SCSI_H
+#define MAME_BUS_BBC_1MHZBUS_SCSI_H
+
+#include "1mhzbus.h"
+#include "machine/nscsi_cb.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_scsi_device:
+ public device_t,
+ public device_bbc_1mhzbus_interface
+{
+public:
+ // construction/destruction
+ bbc_scsi_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock);
+
+ DECLARE_WRITE_LINE_MEMBER(bsy_w);
+ DECLARE_WRITE_LINE_MEMBER(req_w);
+
+protected:
+ bbc_scsi_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config& config) override;
+
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+
+private:
+ required_device<nscsi_callback_device> m_scsi;
+
+ int m_irq_enable;
+ int m_irq_state;
+};
+
+
+// ======================> bbc_awhd_device
+
+class bbc_awhd_device : public bbc_scsi_device
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::DISK; }
+
+ // construction/destruction
+ bbc_awhd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ virtual uint8_t fred_r(offs_t offset) override;
+ virtual void fred_w(offs_t offset, uint8_t data) override;
+ virtual uint8_t jim_r(offs_t offset) override;
+ virtual void jim_w(offs_t offset, uint8_t data) override;
+
+private:
+ required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_SCSI, bbc_scsi_device);
+DECLARE_DEVICE_TYPE(BBC_AWHD, bbc_awhd_device);
+
+
+#endif /* MAME_BUS_BBC_1MHZBUS_SCSI_H */
diff --git a/src/devices/bus/bbc/modem/modem.cpp b/src/devices/bus/bbc/modem/modem.cpp
new file mode 100644
index 00000000000..1d5eff6e85c
--- /dev/null
+++ b/src/devices/bus/bbc/modem/modem.cpp
@@ -0,0 +1,102 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ BBC Master Internal Modem port
+
+**********************************************************************/
+
+#include "emu.h"
+#include "modem.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_MODEM_SLOT, bbc_modem_slot_device, "bbc_modem_slot", "BBC Master Internal Modem port")
+
+
+
+//**************************************************************************
+// DEVICE BBC_MODEM PORT INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_bbc_modem_interface - constructor
+//-------------------------------------------------
+
+device_bbc_modem_interface::device_bbc_modem_interface(const machine_config &mconfig, device_t &device) :
+ device_interface(device, "bbcmodem")
+{
+ m_slot = dynamic_cast<bbc_modem_slot_device *>(device.owner());
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_modem_slot_device - constructor
+//-------------------------------------------------
+
+bbc_modem_slot_device::bbc_modem_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_MODEM_SLOT, tag, owner, clock)
+ , device_single_card_slot_interface<device_bbc_modem_interface>(mconfig, *this)
+ , m_card(nullptr)
+ , m_irq_handler(*this)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_modem_slot_device::device_start()
+{
+ m_card = get_card_device();
+
+ // resolve callbacks
+ m_irq_handler.resolve_safe();
+}
+
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_modem_slot_device::read(offs_t offset)
+{
+ if (m_card)
+ return m_card->read(offset & 0x0f);
+ else
+ return 0xfe;
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+void bbc_modem_slot_device::write(offs_t offset, uint8_t data)
+{
+ if (m_card)
+ m_card->write(offset & 0x0f, data);
+}
+
+//-------------------------------------------------
+// SLOT_INTERFACE( bbcm_modem_devices )
+//-------------------------------------------------
+
+
+// slot devices
+#include "scsiaiv.h"
+
+
+void bbcm_modem_devices(device_slot_interface &device)
+{
+ //device.option_add("modem", BBC_MODEM); /* Beebug Master Modem */
+ device.option_add("scsiaiv", BBC_SCSIAIV); /* Acorn AIV SCSI Host Adaptor */
+ //device.option_add("vp415", BBC_VP415); /* Philips VP415 */
+}
diff --git a/src/devices/bus/bbc/modem/modem.h b/src/devices/bus/bbc/modem/modem.h
new file mode 100644
index 00000000000..6c1e7840637
--- /dev/null
+++ b/src/devices/bus/bbc/modem/modem.h
@@ -0,0 +1,105 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ BBC Master Internal Modem port
+
+**********************************************************************
+
+ Pinout:
+
+ 1 NIRQ
+ 2 NRST
+ 3 BD0
+ 4 BD1
+ 5 BD2
+ 6 BD3
+ 7 BD4
+ 8 BD5
+ 9 BD6
+ 10 BD7
+ 11 MODEM
+ 12 A0
+ 13 A1
+ 14 A2
+ 15 A3
+ 16 1MHzE
+ 17 R/W
+ 18 +5V
+ 19 -5V
+ 20 0V
+
+**********************************************************************/
+
+#ifndef MAME_BUS_BBC_MODEM_MODEM_H
+#define MAME_BUS_BBC_MODEM_MODEM_H
+
+#pragma once
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_modem_slot_device
+
+class device_bbc_modem_interface;
+
+class bbc_modem_slot_device : public device_t, public device_single_card_slot_interface<device_bbc_modem_interface>
+{
+public:
+ // construction/destruction
+ template <typename T>
+ bbc_modem_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&slot_options, const char *default_option)
+ : bbc_modem_slot_device(mconfig, tag, owner, clock)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_modem_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+ // callbacks
+ auto irq_handler() { return m_irq_handler.bind(); }
+
+ virtual uint8_t read(offs_t offset);
+ virtual void write(offs_t offset, uint8_t data);
+
+ DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ device_bbc_modem_interface *m_card;
+
+private:
+ devcb_write_line m_irq_handler;
+};
+
+
+// ======================> device_bbc_modem_interface
+
+class device_bbc_modem_interface : public device_interface
+{
+public:
+ virtual uint8_t read(offs_t offset) { return 0xff; }
+ virtual void write(offs_t offset, uint8_t data) { }
+
+protected:
+ device_bbc_modem_interface(const machine_config &mconfig, device_t &device);
+
+ bbc_modem_slot_device *m_slot;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_MODEM_SLOT, bbc_modem_slot_device)
+
+void bbcm_modem_devices(device_slot_interface &device);
+
+
+#endif // MAME_BUS_BBC_MODEM_MODEM_H
diff --git a/src/devices/bus/bbc/modem/scsiaiv.cpp b/src/devices/bus/bbc/modem/scsiaiv.cpp
new file mode 100644
index 00000000000..f3e1ed19f27
--- /dev/null
+++ b/src/devices/bus/bbc/modem/scsiaiv.cpp
@@ -0,0 +1,142 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn AIV SCSI Host Adaptor
+
+**********************************************************************/
+
+#include "emu.h"
+#include "scsiaiv.h"
+#include "machine/nscsi_bus.h"
+#include "bus/nscsi/devices.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_SCSIAIV, bbc_scsiaiv_device, "bbc_scsiaiv", "Acorn AIV SCSI Host Adaptor");
+//DEFINE_DEVICE_TYPE(BBC_VP415, bbc_vp415_device, "bbc_vp415", "BBC Philips VP415");
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void bbc_scsiaiv_device::device_add_mconfig(machine_config& config)
+{
+ NSCSI_BUS(config, "scsi");
+ NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr);
+ NSCSI_CONNECTOR(config, "scsi:7", default_scsi_devices, "scsicb", true)
+ .option_add_internal("scsicb", NSCSI_CB)
+ .machine_config([this](device_t* device) {
+ downcast<nscsi_callback_device&>(*device).bsy_callback().set(*this, FUNC(bbc_scsiaiv_device::bsy_w));
+ downcast<nscsi_callback_device&>(*device).req_callback().set(*this, FUNC(bbc_scsiaiv_device::req_w));
+ });
+}
+
+//void bbc_vp415_device::device_add_mconfig(machine_config& config)
+//{
+// bbc_scsiaiv_device::device_add_mconfig(config);
+//
+// /* Philips VP415 */
+// subdevice<nscsi_connector>("scsi:0")->set_default_option("vp415");
+// subdevice<nscsi_connector>("scsi:0")->set_fixed(true);
+//}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_scsiaiv_device - constructor
+//-------------------------------------------------
+
+bbc_scsiaiv_device::bbc_scsiaiv_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_bbc_modem_interface(mconfig, *this)
+ , m_scsi(*this, "scsi:7:scsicb")
+{
+}
+
+bbc_scsiaiv_device::bbc_scsiaiv_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
+ : bbc_scsiaiv_device(mconfig, BBC_SCSIAIV, tag, owner, clock)
+{
+}
+
+//bbc_vp415_device::bbc_vp415_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock)
+// : bbc_scsiaiv_device(mconfig, BBC_VP415, tag, owner, clock)
+//{
+//}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_scsiaiv_device::device_start()
+{
+ /* register for save states */
+ save_item(NAME(m_irq_enable));
+ save_item(NAME(m_irq_state));
+}
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+uint8_t bbc_scsiaiv_device::read(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ switch (offset & 0x07)
+ {
+ case 0x00:
+ data = m_scsi->read();
+ m_scsi->ack_w(1);
+ break;
+ case 0x01:
+ data = (m_scsi->msg_r() << 0)
+ | (m_scsi->bsy_r() << 1)
+ | (m_scsi->rst_r() << 2)
+ | (!m_irq_state << 4)
+ | (m_scsi->req_r() << 5)
+ | (m_scsi->io_r() << 6)
+ | (m_scsi->cd_r() << 7);
+ break;
+ }
+
+ return data;
+}
+
+void bbc_scsiaiv_device::write(offs_t offset, uint8_t data)
+{
+ switch (offset & 0x07)
+ {
+ case 0x00:
+ m_scsi->write(~data);
+ m_scsi->ack_w(1);
+ break;
+ case 0x02:
+ m_scsi->sel_w(1);
+ break;
+ case 0x03:
+ m_irq_enable = BIT(data, 0);
+ break;
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_scsiaiv_device::bsy_w)
+{
+ m_scsi->sel_w(0);
+}
+
+WRITE_LINE_MEMBER(bbc_scsiaiv_device::req_w)
+{
+ m_scsi->ack_w(0);
+
+ m_irq_state = (m_irq_enable && !state) ? 0 : 1;
+ m_slot->irq_w(m_irq_state ? CLEAR_LINE : ASSERT_LINE);
+}
diff --git a/src/devices/bus/bbc/modem/scsiaiv.h b/src/devices/bus/bbc/modem/scsiaiv.h
new file mode 100644
index 00000000000..d8f241acd91
--- /dev/null
+++ b/src/devices/bus/bbc/modem/scsiaiv.h
@@ -0,0 +1,71 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn AIV SCSI Host Adaptor
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_1MHZBUS_SCSIAIV_H
+#define MAME_BUS_BBC_1MHZBUS_SCSIAIV_H
+
+#include "modem.h"
+#include "machine/nscsi_cb.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_scsiaiv_device:
+ public device_t,
+ public device_bbc_modem_interface
+{
+public:
+ // construction/destruction
+ bbc_scsiaiv_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock);
+
+ DECLARE_WRITE_LINE_MEMBER(bsy_w);
+ DECLARE_WRITE_LINE_MEMBER(req_w);
+
+protected:
+ bbc_scsiaiv_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config& config) override;
+
+ virtual uint8_t read(offs_t offset) override;
+ virtual void write(offs_t offset, uint8_t data) override;
+
+private:
+ required_device<nscsi_callback_device> m_scsi;
+
+ int m_irq_enable;
+ int m_irq_state;
+};
+
+
+// ======================> bbc_vp415_device
+
+//class bbc_vp415_device : public bbc_scsiaiv_device
+//{
+//public:
+// // construction/destruction
+// bbc_vp415_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock);
+//
+//protected:
+// // optional information overrides
+// virtual void device_add_mconfig(machine_config& config) override;
+//};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_SCSIAIV, bbc_scsiaiv_device);
+//DECLARE_DEVICE_TYPE(BBC_VP415, bbc_vp415_device);
+
+
+#endif /* MAME_BUS_BBC_1MHZBUS_SCSIAIV_H */
diff --git a/src/devices/cpu/gigatron/gigatron.cpp b/src/devices/cpu/gigatron/gigatron.cpp
index 4a56be8ef41..64a3b265bd6 100644
--- a/src/devices/cpu/gigatron/gigatron.cpp
+++ b/src/devices/cpu/gigatron/gigatron.cpp
@@ -11,7 +11,7 @@
#include "gigatrondasm.h"
-DEFINE_DEVICE_TYPE(GTRON, gigatron_cpu_device, "gigatron", "GTRON")
+DEFINE_DEVICE_TYPE(GTRON, gigatron_cpu_device, "gigatron", "Gigatron CPU Device")
/* FLAGS */
@@ -77,9 +77,13 @@ void gigatron_cpu_device::device_start()
set_icountptr(m_icount);
}
-#if 0
+void gigatron_cpu_device::device_reset()
+{
+}
+
void gigatron_cpu_device::execute_set_input(int irqline, int state)
{
+#if 0
switch(irqline)
{
case GTRON_INT_INTRM: // level-sensitive
@@ -97,13 +101,13 @@ void gigatron_cpu_device::execute_set_input(int irqline, int state)
m_intr_state = (ASSERT_LINE == state);
break;
}
-}
#endif
+}
gigatron_cpu_device::gigatron_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: cpu_device(mconfig, GTRON, tag, owner, clock)
- , m_program_config("program", ENDIANNESS_BIG, 8, 32, -1)
- , m_data_config("data", ENDIANNESS_BIG, 8, 32, 0)
+ , m_program_config("program", ENDIANNESS_BIG, 16, 14, -1)
+ , m_data_config("data", ENDIANNESS_BIG, 8, 15, 0)
{
}
diff --git a/src/devices/cpu/gigatron/gigatrondasm.cpp b/src/devices/cpu/gigatron/gigatrondasm.cpp
index 100f8d7e984..e18ec7b9b59 100644
--- a/src/devices/cpu/gigatron/gigatrondasm.cpp
+++ b/src/devices/cpu/gigatron/gigatrondasm.cpp
@@ -1,17 +1,161 @@
// license:BSD-3-Clause
-// copyright-holders:Sterophonick
+// copyright-holders:AJR
+/***************************************************************************
-// Gigatron Disassembler
+ Gigatron disassembler
+
+***************************************************************************/
#include "emu.h"
#include "gigatrondasm.h"
+gigatron_disassembler::gigatron_disassembler()
+ : util::disasm_interface()
+{
+}
+
+const char *const gigatron_disassembler::s_ops[7] = {
+ "ld",
+ "anda",
+ "ora",
+ "xora",
+ "adda",
+ "suba",
+ "st"
+};
+
+const char *const gigatron_disassembler::s_jumps[8] = {
+ "jmp",
+ "bgt",
+ "blt",
+ "bne",
+ "beq",
+ "bge",
+ "ble",
+ "bra"
+};
+
u32 gigatron_disassembler::opcode_alignment() const
{
- return 0;
+ return 1;
}
-offs_t gigatron_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
+offs_t gigatron_disassembler::disassemble(std::ostream &stream, offs_t pc, const gigatron_disassembler::data_buffer &opcodes, const gigatron_disassembler::data_buffer &params)
{
- return 0;
+ u16 inst = opcodes.r16(pc);
+ u32 flags = 0;
+
+ if (inst >= 0xe000)
+ {
+ // Jump instructions use special format
+ util::stream_format(stream, "%-5s", s_jumps[(inst & 0x1c00) >> 10]);
+ if ((inst & 0x1c00) == 0)
+ stream << "y,";
+
+ switch (inst & 0x0300)
+ {
+ case 0x0000:
+ if ((inst & 0x1c00) == 0)
+ util::stream_format(stream, "$%02x", inst & 0x00ff);
+ else
+ util::stream_format(stream, "$%04x", ((pc + 1) & 0x3f00) | (inst & 0x00ff));
+ break;
+
+ case 0x0100:
+ util::stream_format(stream, "[$%02x]", inst & 0x00ff);
+ break;
+
+ case 0x0200:
+ stream << "ac";
+ break;
+
+ case 0x0300:
+ stream << "in";
+ break;
+ }
+
+ flags = STEP_OVER | step_over_extra(1);
+ }
+ else if ((inst & 0xf300) == 0x0200)
+ stream << "nop";
+ else
+ {
+ if ((inst & 0xe300) == 0xc100)
+ {
+ // This was originally an undefined store mode
+ util::stream_format(stream, "%-5s", "ctrl");
+ }
+ else
+ {
+ util::stream_format(stream, "%-5s", s_ops[(inst & 0xe000) >> 13]);
+
+ // Bus data
+ switch (inst & 0x0300)
+ {
+ case 0x0000:
+ util::stream_format(stream, "$%02x", inst & 0x00ff);
+ if (inst >= 0xc000)
+ stream << ",";
+ break;
+
+ case 0x0100:
+ break;
+
+ case 0x0200:
+ if (inst < 0xc000)
+ stream << "ac"; // implicit for store instruction
+ break;
+
+ case 0x0300:
+ stream << "in";
+ if (inst >= 0xc000)
+ stream << ",";
+ break;
+ }
+ }
+
+ // RAM source or store destination
+ if (inst >= 0xc000 || (inst & 0x0300) == 0x0100)
+ {
+ if ((inst & 0xe300) != 0xc100)
+ stream << "[";
+
+ switch (inst & 0x1c00)
+ {
+ case 0x0000: case 0x1000: case 0x1400: case 0x1800:
+ util::stream_format(stream, "$%02x", inst & 0x00ff);
+ break;
+
+ case 0x0400:
+ stream << "x";
+ break;
+
+ case 0x0800:
+ util::stream_format(stream, "y,$%02x", inst & 0x00ff);
+ break;
+
+ case 0x0c00:
+ stream << "y,x";
+ break;
+
+ case 0x1c00:
+ stream << "y,x++";
+ break;
+ }
+
+ if ((inst & 0xe300) != 0xc100)
+ stream << "]";
+ }
+
+ // Non-accumulator destinations
+ if (BIT(inst, 12))
+ {
+ if (!BIT(inst, 11))
+ util::stream_format(stream, ",%c", "xy"[BIT(inst, 10)]);
+ else if (inst < 0xc000)
+ stream << ",out";
+ }
+ }
+
+ return 1 | flags | SUPPORTED;
}
diff --git a/src/devices/cpu/gigatron/gigatrondasm.h b/src/devices/cpu/gigatron/gigatrondasm.h
index a1e590c0be8..1c8c976b41a 100644
--- a/src/devices/cpu/gigatron/gigatrondasm.h
+++ b/src/devices/cpu/gigatron/gigatrondasm.h
@@ -1,7 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Sterophonick
-
-// Gigatron disassembler
+// copyright-holders:AJR
#ifndef MAME_CPU_GIGATRON_GIGATRONDASM_H
#define MAME_CPU_GIGATRON_GIGATRONDASM_H
@@ -11,14 +9,18 @@
class gigatron_disassembler : public util::disasm_interface
{
public:
- gigatron_disassembler() = default;
- virtual ~gigatron_disassembler() = default;
+ // construction/destruction
+ gigatron_disassembler();
+protected:
+ // disassembler overrides
virtual u32 opcode_alignment() const override;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
private:
+ // tables
+ static const char *const s_ops[7];
+ static const char *const s_jumps[8];
};
-#endif
-
+#endif // MAME_CPU_GIGATRON_GIGATRONDASM_H
diff --git a/src/devices/machine/dp83932c.cpp b/src/devices/machine/dp83932c.cpp
index 82d70f02797..c08a16b655c 100644
--- a/src/devices/machine/dp83932c.cpp
+++ b/src/devices/machine/dp83932c.cpp
@@ -10,118 +10,565 @@
* http://bitsavers.org/components/national/_dataBooks/1995_National_Ethernet_Databook.pdf
*
* TODO
- * - everything (skeleton only)
+ * - bus mode (big endian, interrupts active low)
+ * - byte count mismatch
+ * - data widths
+ * - tally counters
+ * - software reset
+ * - watchdog timers
+ * - loopback modes
+ * - programmable outputs and extended bus mode
*/
#include "emu.h"
#include "dp83932c.h"
#include "hashing.h"
-#define VERBOSE 0
+#define LOG_GENERAL (1U << 0)
+#define LOG_COMMAND (1U << 1)
+#define LOG_FILTER (1U << 2)
+#define LOG_PACKETS (1U << 3)
+
+//#define VERBOSE (LOG_GENERAL|LOG_COMMAND|LOG_FILTER|LOG_PACKETS)
#include "logmacro.h"
+#define EA(hi, lo) ((u32(hi) << 16) | lo)
+
DEFINE_DEVICE_TYPE(DP83932C, dp83932c_device, "dp83932c", "National Semiconductor DP83932C SONIC")
-dp83932c_device::dp83932c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+static constexpr u32 FCS_RESIDUE = 0xdebb20e3;
+
+static char const *const regname[] =
+{
+ "CR", "DCR", "RCR", "TCR", "IMR", "ISR", "UTDA", "CTDA",
+ "TPS", "TFC", "TSA0", "TSA1", "TFS", "URDA", "CRDA", "CRBA0",
+ "CRBA1", "RBWC0", "RBWC1", "EOBC", "URRA", "RSA", "REA", "RRP",
+ "RWP", "TRBA0", "TRBA1", "TBWC0", "TBWC1", "ADDR0", "ADDR1", "LLFA",
+
+ "TTDA", "CEP", "CAP2", "CAP1", "CAP0", "CE", "CDP", "CDC",
+ "SR", "WT0", "WT1", "RSC", "CRCT", "FAET", "MPT", "MDT",
+ "30", "31", "32", "33", "34", "35", "36", "37",
+ "38", "39", "3a", "3b", "3c", "3d", "3e", "DCR2",
+};
+
+static u16 const regmask[] =
+{
+ 0x03bf, 0xbfff, 0xfe00, 0xf000, 0x7fff, 0x7fff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xfffe, 0xfffe, 0xfffe,
+ 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+
+ 0xffff, 0x000f, 0x0000, 0x0000, 0x0000, 0xffff, 0xfffe, 0x001f,
+ 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf017,
+};
+
+dp83932c_device::dp83932c_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
: device_t(mconfig, DP83932C, tag, owner, clock)
, device_network_interface(mconfig, *this, 10.0f)
- , m_ram(*this, finder_base::DUMMY_TAG)
+ , m_bus(*this, finder_base::DUMMY_TAG, 0)
, m_out_int(*this)
+ , m_int_state(false)
{
}
void dp83932c_device::map(address_map &map)
{
- // datasheet uses unshifted register addresses
- int const shift = 1;
-
- // command and status registers
- map(0x00 << shift, (0x00 << shift) | 0x01).rw(FUNC(dp83932c_device::cr_r), FUNC(dp83932c_device::cr_w));
- //map(0x01 << shift, (0x01 << shift) | 0x01).rw(FUNC(dp83932c_device::dcr_r), FUNC(dp83932c_device::dcr_w));
- //map(0x02 << shift, (0x02 << shift) | 0x01).rw(FUNC(dp83932c_device::rcr_r), FUNC(dp83932c_device::rcr_w));
- map(0x03 << shift, (0x03 << shift) | 0x01).rw(FUNC(dp83932c_device::tcr_r), FUNC(dp83932c_device::tcr_w));
- //map(0x04 << shift, (0x04 << shift) | 0x01).rw(FUNC(dp83932c_device::imr_r), FUNC(dp83932c_device::imr_w));
- map(0x05 << shift, (0x05 << shift) | 0x01).rw(FUNC(dp83932c_device::isr_r), FUNC(dp83932c_device::isr_w));
-
- // transmit registers
- map(0x06 << shift, (0x06 << shift) | 0x01).rw(FUNC(dp83932c_device::utda_r), FUNC(dp83932c_device::utda_w));
- //map(0x07 << shift, (0x07 << shift) | 0x01).rw(FUNC(dp83932c_device::ctda_r), FUNC(dp83932c_device::ctda_w));
-
- // tps
- // tfc
- // tsa0
- // tsa1
- // tfs
-
- // receive registers
- //map(0x0d << shift, (0x0d << shift) | 0x01).rw(FUNC(dp83932c_device::urda_r), FUNC(dp83932c_device::urda_w));
- map(0x0e << shift, (0x0e << shift) | 0x01).rw(FUNC(dp83932c_device::crda_r), FUNC(dp83932c_device::crda_w));
-
- // crba0
- // crba1
- // rbwc0
- // rbwc1
- // eobc
- // urra
- // rsa
- // rea
- map(0x17 << shift, (0x17 << shift) | 0x01).rw(FUNC(dp83932c_device::rrp_r), FUNC(dp83932c_device::rrp_w));
- map(0x18 << shift, (0x18 << shift) | 0x01).rw(FUNC(dp83932c_device::rwp_r), FUNC(dp83932c_device::rwp_w));
- // trba0
- // trba1
- // tbwc0
- // tbwc1
- // addr0
- // addr1
- // llfa
- // ttda
- // cep
- // cap2
- // cap1
- // cap0
- map(0x25 << shift, (0x25 << shift) | 0x01).rw(FUNC(dp83932c_device::ce_r), FUNC(dp83932c_device::ce_w));
- // cdp
- // cdc
- // sr
- map(0x29 << shift, (0x29 << shift) | 0x01).rw(FUNC(dp83932c_device::wt0_r), FUNC(dp83932c_device::wt0_w));
- map(0x2a << shift, (0x2a << shift) | 0x01).rw(FUNC(dp83932c_device::wt1_r), FUNC(dp83932c_device::wt1_w));
- map(0x2b << shift, (0x2b << shift) | 0x01).rw(FUNC(dp83932c_device::rsc_r), FUNC(dp83932c_device::rsc_w));
- // crct
- map(0x2d << shift, (0x2d << shift) | 0x01).rw(FUNC(dp83932c_device::faet_r), FUNC(dp83932c_device::faet_w));
- // mpt
- // mdt
-
- // 30-3e internal use registers
- // dcr2
+ map(0x00, 0x7f).rw(FUNC(dp83932c_device::reg_r), FUNC(dp83932c_device::reg_w));
}
void dp83932c_device::device_start()
{
m_out_int.resolve();
+
+ m_command = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(dp83932c_device::command), this));
+
+ save_item(NAME(m_int_state));
+ save_item(NAME(m_reg));
+ save_item(NAME(m_cam));
+
+ for (u16 &reg : m_reg)
+ reg = 0;
+
+ m_reg[SR] = 6; // silicon revision for DP83932CVF
}
void dp83932c_device::device_reset()
{
- m_cr = RST | STP | RXDIS;
- m_tcr = NCRS | PTX;
- m_isr = 0;
- m_ce = 0;
- m_rsc = 0;
+ m_reg[CR] = CR_RST | CR_STP | CR_RXDIS;
+ m_reg[DCR] &= ~(DCR_EXBUS | DCR_LBR); // TODO: sample USR1,0
+ m_reg[RCR] &= ~(RCR_RNT | RCR_BRD | RCR_LB);
+ m_reg[TCR] |= TCR_NCRS | TCR_PTX;
+ m_reg[TCR] &= ~(TCR_TPC | TCR_BCM);
+ m_reg[IMR] = 0;
+ m_reg[ISR] = 0;
+ m_reg[EOBC] = 0x02f8;
+ m_reg[CE] = 0;
+ m_reg[RSC] = 0;
+ m_reg[DCR2] = 0;
+
+ update_interrupts();
}
-void dp83932c_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+int dp83932c_device::recv_start_cb(u8 *buf, int length)
{
+ unsigned const width = (m_reg[DCR] & DCR_DW) ? 4 : 2;
+
+ if (!(m_reg[CR] & CR_RXEN))
+ return -1;
+
+ m_reg[RCR] &= ~(RCR_MC | RCR_BC | RCR_LPKT | RCR_CRCR | RCR_FAER | RCR_LBK | RCR_PRX);
+
+ // address filter
+ if (!address_filter(buf))
+ return -1;
+
+ if ((length < 64) && !(m_reg[RCR] & RCR_RNT))
+ return -1;
+
+ u32 const fcs = util::crc32_creator::simple(buf, length);
+ if (~fcs != FCS_RESIDUE)
+ {
+ if (m_reg[RCR] & RCR_ERR)
+ m_reg[RCR] |= RCR_CRCR;
+ else
+ return -1;
+ }
+ else
+ m_reg[RCR] |= RCR_PRX;
+
+ LOG("recv_start_cb %d\n", length);
+
+ // loopback
+ if (m_reg[RCR] & RCR_LB)
+ m_reg[RCR] |= RCR_LBK;
+
+ dump_bytes(buf, length);
+
+ if (m_reg[CRDA] & 1)
+ {
+ // re-read the previous descriptor link field
+ m_reg[CRDA] = m_bus->read_word(EA(m_reg[URDA], m_reg[LLFA]));
+ if (m_reg[CRDA] & 1)
+ {
+ logerror("no receive descriptor available\n");
+ return -2;
+ }
+ }
+
+ // save rba pointer registers
+ m_reg[TRBA0] = m_reg[CRBA0];
+ m_reg[TRBA1] = m_reg[CRBA1];
+ m_reg[TBWC0] = m_reg[RBWC0];
+ m_reg[TBWC1] = m_reg[RBWC1];
+
+ // store data to rba
+ // TODO: word/dword transfers (allow unaligned)
+ // TODO: pad to word/dword size with 0xff
+ // TODO: check for buffer overflow
+ offs_t const rba = EA(m_reg[CRBA1], m_reg[CRBA0]);
+ for (unsigned i = 0; i < length; i++)
+ m_bus->write_byte(rba + i, buf[i]);
+
+ // update remaining buffer word count
+ u32 const rbwc = ((u32(m_reg[RBWC1]) << 16) | m_reg[RBWC0]) - (length + 1) / 2;
+ m_reg[RBWC1] = rbwc >> 16;
+ m_reg[RBWC0] = u16(rbwc);
+
+ if (rbwc < m_reg[EOBC])
+ m_reg[RCR] |= RCR_LPKT;
+
+ // write status to rda
+ // TODO: don't write the rda if rba limit exceeded (buffer overflow)
+ offs_t const rda = EA(m_reg[URDA], m_reg[CRDA]);
+ m_bus->write_word(rda + 0 * width, m_reg[RCR]);
+ m_bus->write_word(rda + 1 * width, length);
+ m_bus->write_word(rda + 2 * width, m_reg[CRBA0]);
+ m_bus->write_word(rda + 3 * width, m_reg[CRBA1]);
+ m_bus->write_word(rda + 4 * width, m_reg[RSC]);
+ m_reg[LLFA] = m_reg[CRDA] + 5 * width;
+ m_reg[CRDA] = m_bus->read_word(rda + 5 * width);
+
+ // check for end of list
+ if (m_reg[CRDA] & 1)
+ m_reg[ISR] |= ISR_RDE;
+ else
+ m_bus->write_word(rda + 6 * width, 0);
+
+ // handle buffer exhaustion
+ if (rbwc < m_reg[EOBC])
+ read_rra();
+ else
+ m_reg[RSC] = (m_reg[RSC] & 0xff00) | u8(m_reg[RSC] + 1);
+
+ return length;
+}
+
+void dp83932c_device::recv_complete_cb(int result)
+{
+ if (result > 0)
+ {
+ m_reg[ISR] |= ISR_PKTRX;
+ update_interrupts();
+ }
+}
+
+void dp83932c_device::reg_w(offs_t offset, u16 data)
+{
+ LOG("reg_w register %s data 0x%04x (%s)\n", regname[offset], data, machine().describe_context());
+
+ // TODO: can only write during reset: DCR, DCR2
+
+ switch (offset)
+ {
+ case CR:
+ if (m_reg[CR] & CR_RST)
+ {
+ if (!(data & CR_RST))
+ {
+ LOGMASKED(LOG_COMMAND, "exit software reset\n");
+
+ m_reg[CR] &= ~CR_RST;
+ }
+
+ return;
+ }
+
+ if (data & CR_RST)
+ {
+ LOGMASKED(LOG_COMMAND, "enter software reset\n");
+
+ m_command->adjust(attotime::never);
+
+ m_reg[CR] &= ~(CR_LCAM | CR_RRRA | CR_TXP | CR_HTX);
+ m_reg[CR] |= (CR_RST | CR_RXDIS);
+
+ return;
+ }
+
+ m_reg[offset] |= data & regmask[offset];
+ m_command->adjust(attotime::zero, data & regmask[offset]);
+ break;
+
+ case RCR:
+ m_reg[offset] = (m_reg[offset] & ~regmask[offset]) | (data & regmask[offset]);
+ set_loopback(bool(m_reg[offset] & RCR_LB));
+ break;
+
+ case IMR:
+ m_reg[offset] = (m_reg[offset] & ~regmask[offset]) | (data & regmask[offset]);
+ update_interrupts();
+ break;
+
+ case ISR:
+ m_reg[offset] &= ~(data & regmask[offset]);
+ // TODO: reload rra after RBE cleared
+ update_interrupts();
+ break;
+
+ case CRCT:
+ case FAET:
+ case MPT:
+ // inverted
+ m_reg[offset] = ~data;
+ break;
+
+ default:
+ if (regmask[offset])
+ m_reg[offset] = (m_reg[offset] & ~regmask[offset]) | (data & regmask[offset]);
+ else
+ logerror("write to read-only register %s data 0x%04x (%s)\n",
+ regname[offset], data, machine().describe_context());
+ break;
+ }
+}
+
+void dp83932c_device::command(void *ptr, s32 param)
+{
+ if (param & CR_HTX)
+ {
+ LOGMASKED(LOG_COMMAND, "halt transmission\n");
+ m_reg[CR] &= ~CR_TXP;
+ }
+
+ if (param & CR_TXP)
+ {
+ LOGMASKED(LOG_COMMAND, "transmit\n");
+ m_reg[CR] &= ~CR_HTX;
+
+ transmit();
+ }
+
+ if (param & CR_RXDIS)
+ {
+ LOGMASKED(LOG_COMMAND, "receiver disable\n");
+ m_reg[CR] &= ~CR_RXEN;
+ }
+
+ if (param & CR_RXEN)
+ {
+ LOGMASKED(LOG_COMMAND, "receiver enable\n");
+ m_reg[CR] &= ~CR_RXDIS;
+ }
+
+ if (param & CR_STP)
+ {
+ LOGMASKED(LOG_COMMAND, "stop timer\n");
+ m_reg[CR] &= ~CR_ST;
+ }
+
+ if (param & CR_ST)
+ {
+ LOGMASKED(LOG_COMMAND, "start timer\n");
+ m_reg[CR] &= ~CR_STP;
+ }
+
+ if (param & CR_RRRA)
+ {
+ LOGMASKED(LOG_COMMAND, "read rra\n");
+ read_rra(true);
+ }
+
+ if (param & CR_LCAM)
+ {
+ LOGMASKED(LOG_COMMAND, "load cam\n");
+ load_cam();
+ }
+
+ update_interrupts();
+}
+
+void dp83932c_device::transmit()
+{
+ unsigned const width = (m_reg[DCR] & DCR_DW) ? 4 : 2;
+
+ m_reg[TTDA] = m_reg[CTDA];
+ offs_t const tda = EA(m_reg[UTDA], m_reg[CTDA]);
+ unsigned word = 1;
+
+ // read control information from tda and load registers
+ u16 const tcr = m_reg[TCR];
+ m_reg[TCR] = m_bus->read_word(tda + word++ * width) & TCR_TPC;
+ m_reg[TPS] = m_bus->read_word(tda + word++ * width);
+ m_reg[TFC] = m_bus->read_word(tda + word++ * width);
+
+ // check for programmable interrupt
+ if ((m_reg[TCR] & TCR_PINT) && !(tcr & TCR_PINT))
+ m_reg[ISR] |= ISR_PINT;
+
+ // FIXME: abort if tps > buffer size
+ u8 buf[1520];
+ unsigned length = 0;
+
+ // read fragments into buffer
+ for (unsigned fragment = 0; fragment < m_reg[TFC]; fragment++)
+ {
+ // read fragment address and size
+ m_reg[TSA0] = m_bus->read_word(tda + word++ * width);
+ m_reg[TSA1] = m_bus->read_word(tda + word++ * width);
+ m_reg[TFS] = m_bus->read_word(tda + word++ * width);
+
+ offs_t const tsa = EA(m_reg[TSA1], m_reg[TSA0]);
+
+ // FIXME: word/dword transfers (allow unaligned)
+ for (unsigned byte = 0; byte < m_reg[TFS]; byte++)
+ buf[length++] = m_bus->read_byte(tsa + byte);
+ }
+
+ // append fcs if not inhibited
+ if (!(m_reg[TCR] & TCR_CRCI))
+ {
+ u32 const crc = util::crc32_creator::simple(buf, length);
+
+ // insert the fcs
+ buf[length++] = crc >> 0;
+ buf[length++] = crc >> 8;
+ buf[length++] = crc >> 16;
+ buf[length++] = crc >> 24;
+ }
+
+ // advance ctda to the link field
+ m_reg[CTDA] += word * width;
+
+ // transmit data
+ dump_bytes(buf, length);
+ send(buf, length);
}
void dp83932c_device::send_complete_cb(int result)
{
+ // TODO: errors
+ if (result > 0)
+ {
+ // TODO: number of collisions
+
+ m_reg[TCR] |= TCR_PTX;
+ }
+
+ // write descriptor status
+ m_bus->write_word(EA(m_reg[UTDA], m_reg[TTDA]), m_reg[TCR] & TCR_TPS);
+
+ // check for halt
+ if (!(m_reg[CR] & CR_HTX))
+ {
+ // load next descriptor address
+ m_reg[CTDA] = m_bus->read_word(EA(m_reg[UTDA], m_reg[CTDA]));
+
+ // check for end of list
+ if (m_reg[CTDA] & 1)
+ {
+ m_reg[ISR] |= ISR_TXDN;
+ m_reg[CR] &= ~CR_TXP;
+
+ update_interrupts();
+ }
+ else
+ // transmit next packet
+ if (m_command->enabled())
+ m_command->set_param(m_command->param() | CR_TXP);
+ else
+ m_command->adjust(attotime::zero, CR_TXP);
+ }
+ else
+ m_reg[CR] &= ~CR_TXP;
}
-int dp83932c_device::recv_start_cb(u8 *buf, int length)
+void dp83932c_device::read_rra(bool command)
+{
+ unsigned const width = (m_reg[DCR] & DCR_DW) ? 4 : 2;
+
+ offs_t const rrp = EA(m_reg[URRA], m_reg[RRP]);
+
+ m_reg[CRBA0] = m_bus->read_word(rrp + 0 * width);
+ m_reg[CRBA1] = m_bus->read_word(rrp + 1 * width);
+ m_reg[RBWC0] = m_bus->read_word(rrp + 2 * width);
+ m_reg[RBWC1] = m_bus->read_word(rrp + 3 * width);
+
+ LOG("read_rra crba 0x%08x rbwc 0x%08x\n",
+ EA(m_reg[CRBA1], m_reg[CRBA0]), EA(m_reg[RBWC1], m_reg[RBWC0]));
+
+ // advance rrp
+ m_reg[RRP] += 4 * width;
+
+ // check for wrapping and resource exhaustion
+ if (m_reg[RRP] == m_reg[REA])
+ m_reg[RRP] = m_reg[RSA];
+
+ if (m_reg[RRP] == m_reg[RWP])
+ m_reg[ISR] |= ISR_RBE;
+
+ if (command)
+ m_reg[CR] &= ~CR_RRRA;
+ else
+ m_reg[RSC] = (m_reg[RSC] & 0xff00) + 0x100;
+}
+
+void dp83932c_device::load_cam()
{
- return 0;
+ unsigned const width = (m_reg[DCR] & DCR_DW) ? 4 : 2;
+
+ while (m_reg[CDC])
+ {
+ offs_t const cdp = EA(m_reg[URRA], m_reg[CDP]);
+
+ u16 const cep = m_bus->read_word(cdp + 0 * width) & 0xf;
+ u16 const cap0 = m_bus->read_word(cdp + 1 * width);
+ u16 const cap1 = m_bus->read_word(cdp + 2 * width);
+ u16 const cap2 = m_bus->read_word(cdp + 3 * width);
+
+ // FIXME: documented byte/word order doesn't match emulation
+
+ LOG("load_cam entry %2d %02x:%02x:%02x:%02x:%02x:%02x\n",
+ cep, u8(cap0), cap0 >> 8, u8(cap1), cap1 >> 8, u8(cap2), cap2 >> 8);
+
+ m_cam[cep] =
+ (u64(u8(cap0 >> 0)) << 40) | (u64(u8(cap0 >> 8)) << 32) | (u64(u8(cap1 >> 0)) << 24) |
+ (u64(u8(cap1 >> 8)) << 16) | (u64(u8(cap2 >> 0)) << 8) | (u64(u8(cap2 >> 8)) << 0);
+
+ m_reg[CDP] += 4 * width;
+ m_reg[CDC]--;
+ }
+
+ // read cam enable
+ m_reg[CE] = m_bus->read_word(EA(m_reg[URRA], m_reg[CDP]));
+ LOG("load_cam enable 0x%04x\n", m_reg[CE]);
+
+ m_reg[CR] &= ~CR_LCAM;
+ m_reg[ISR] |= ISR_LCD;
}
-void dp83932c_device::recv_complete_cb(int result)
+void dp83932c_device::update_interrupts()
+{
+ bool const int_state = bool(m_reg[ISR] & m_reg[IMR]);
+
+ if (int_state != m_int_state)
+ {
+ m_int_state = int_state;
+ m_out_int(m_int_state);
+ }
+}
+
+bool dp83932c_device::address_filter(u8 *buf)
{
+ if (m_reg[RCR] & RCR_PRO)
+ {
+ LOGMASKED(LOG_FILTER, "address_filter accepted (promiscuous)\n");
+
+ return true;
+ }
+
+ u64 const address =
+ (u64(buf[0]) << 40) | (u64(buf[1]) << 32) | (u64(buf[2]) << 24) |
+ (u64(buf[3]) << 16) | (u64(buf[4]) << 8) | (u64(buf[5]) << 0);
+
+ // broadcast
+ if ((address == 0xffff'ffffffffULL) && (m_reg[RCR] & (RCR_AMC | RCR_BRD)))
+ {
+ LOGMASKED(LOG_FILTER, "address_filter accepted (broadcast) %02x-%02x-%02x-%02x-%02x-%02x\n",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
+
+ m_reg[RCR] |= RCR_BC;
+ return true;
+ }
+
+ // multicast
+ if ((address & 0x0100'00000000ULL) && (m_reg[RCR] & RCR_AMC))
+ {
+ LOGMASKED(LOG_FILTER, "address_filter accepted (multicast) %02x-%02x-%02x-%02x-%02x-%02x\n",
+ buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
+
+ m_reg[RCR] |= RCR_MC;
+ return true;
+ }
+
+ // content addressable memory
+ for (unsigned i = 0; i < 16; i++)
+ {
+ if ((address == m_cam[i]) && BIT(m_reg[CE], i))
+ {
+ LOGMASKED(LOG_FILTER, "address_filter accepted (cam entry %d match) %02x-%02x-%02x-%02x-%02x-%02x\n",
+ i, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
+
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void dp83932c_device::dump_bytes(u8 *buf, int length)
+{
+ if (VERBOSE & LOG_PACKETS)
+ {
+ // pad with zeros to 8-byte boundary
+ for (int i = 0; i < 8 - (length % 8); i++)
+ buf[length + i] = 0;
+
+ // dump length / 8 (rounded up) groups of 8 bytes
+ for (int i = 0; i < (length + 7) / 8; i++)
+ LOGMASKED(LOG_PACKETS, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
+ buf[i * 8 + 0], buf[i * 8 + 1], buf[i * 8 + 2], buf[i * 8 + 3],
+ buf[i * 8 + 4], buf[i * 8 + 5], buf[i * 8 + 6], buf[i * 8 + 7]);
+ }
}
diff --git a/src/devices/machine/dp83932c.h b/src/devices/machine/dp83932c.h
index e608f7508a6..054bb9e28cd 100644
--- a/src/devices/machine/dp83932c.h
+++ b/src/devices/machine/dp83932c.h
@@ -6,111 +6,207 @@
#pragma once
-#include "machine/ram.h"
-
class dp83932c_device
: public device_t
, public device_network_interface
{
public:
- dp83932c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- static constexpr feature_type imperfect_features() { return feature::LAN; }
+ dp83932c_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
// configuration
- template <typename T> void set_ram(T &&tag) { m_ram.set_tag(std::forward<T>(tag)); }
+ template <typename T> void set_bus(T &&tag, int spacenum) { m_bus.set_tag(std::forward<T>(tag), spacenum); }
auto out_int_cb() { return m_out_int.bind(); }
+ // external interface
void map(address_map &map);
+ u16 reg_r(offs_t offset) { return m_reg[offset]; }
+ void reg_w(offs_t offset, u16 data);
protected:
// device_t overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_network_interface overrides
virtual void send_complete_cb(int result) override;
virtual int recv_start_cb(u8 *buf, int length) override;
virtual void recv_complete_cb(int result) override;
- enum cr_mask : u16
+ // command helpers
+ void command(void *ptr, s32 param);
+ void transmit();
+ void read_rra(bool command = false);
+ void load_cam();
+ void update_interrupts();
+ bool address_filter(u8 *buf);
+
+ // diagnostic helper
+ void dump_bytes(u8 *buf, int length);
+
+ enum registers : unsigned
{
- HTX = 0x0001, // halt transmission
- TXP = 0x0002, // transmit packets
- RXDIS = 0x0004, // receiver disable
- RXEN = 0x0008, // receiver enable
- STP = 0x0010, // stop timer
- ST = 0x0020, // start timer
- RST = 0x0080, // software reset
- RRRA = 0x0100, // read rra
- LCAM = 0x0200, // load cam
-
- CR_WMASK = 0x03bf
+ CR = 0x00, // command
+ DCR = 0x01, // data configuration
+ RCR = 0x02, // receive control
+ TCR = 0x03, // transmit control
+ IMR = 0x04, // interrupt mask
+ ISR = 0x05, // interrupt status
+ UTDA = 0x06, // upper transmit descriptor address
+ CTDA = 0x07, // current transmit descriptor address
+ TPS = 0x08, // transmit packet size
+ TFC = 0x09, // transmit fragment count
+ TSA0 = 0x0a, // transmit start address 0
+ TSA1 = 0x0b, // transmit start address 1
+ TFS = 0x0c, // transmit fragment size
+ URDA = 0x0d, // upper receive descriptor address
+ CRDA = 0x0e, // current receive descriptor address
+ CRBA0 = 0x0f, // current receive buffer address 0
+ CRBA1 = 0x10, // current receive buffer address 1
+ RBWC0 = 0x11, // remaining buffer word count 0
+ RBWC1 = 0x12, // remaining buffer word count 1
+ EOBC = 0x13, // end of buffer word count
+ URRA = 0x14, // upper receive resource address
+ RSA = 0x15, // resource start address
+ REA = 0x16, // resource end address
+ RRP = 0x17, // resource read pointer
+ RWP = 0x18, // resource write pointer
+ TRBA0 = 0x19, // temporary receive buffer address 0
+ TRBA1 = 0x1a, // temporary receive buffer address 1
+ TBWC0 = 0x1b, // temporary buffer word count 0
+ TBWC1 = 0x1c, // temporary buffer word count 1
+ ADDR0 = 0x1d, // address generator 0
+ ADDR1 = 0x1e, // address generator 1
+ LLFA = 0x1f, // last link field address
+ TTDA = 0x20, // temporary transmit descriptor address
+ CEP = 0x21, // cam entry pointer
+ CAP2 = 0x22, // cam address port 2
+ CAP1 = 0x23, // cam address port 1
+ CAP0 = 0x24, // cam address port 0
+ CE = 0x25, // cam enable
+ CDP = 0x26, // cam descriptor pointer
+ CDC = 0x27, // cam descriptor count
+ SR = 0x28, // silicon revision
+ WT0 = 0x29, // watchdog timer 0
+ WT1 = 0x2a, // watchdog timer 1
+ RSC = 0x2b, // receive sequence counter
+ CRCT = 0x2c, // crc error tally
+ FAET = 0x2d, // fae tally
+ MPT = 0x2e, // missed packet tally
+ MDT = 0x2f, // maximum deferral timer
+ // factory use only
+ DCR2 = 0x3f, // data configuration 2
};
- enum tcr_mask : u16
+ enum cr_mask : u16
+ {
+ CR_HTX = 0x0001, // halt transmission
+ CR_TXP = 0x0002, // transmit packets
+ CR_RXDIS = 0x0004, // receiver disable
+ CR_RXEN = 0x0008, // receiver enable
+ CR_STP = 0x0010, // stop timer
+ CR_ST = 0x0020, // start timer
+ CR_RST = 0x0080, // software reset
+ CR_RRRA = 0x0100, // read rra
+ CR_LCAM = 0x0200, // load cam
+ };
+ enum dcr_mask : u16
+ {
+ DCR_TFT = 0x0003, // transmit fifo threshold
+ DCR_RFT = 0x000c, // receive fifo threshold
+ DCR_BMS = 0x0010, // block mode select for dma
+ DCR_DW = 0x0020, // data width select
+ DCR_WC = 0x00c0, // wait state control
+ DCR_USR = 0x0300, // user definable pins
+ DCR_SBUS = 0x0400, // synchronous bus mode
+ DCR_PO = 0x1800, // programmable outputs
+ DCR_LBR = 0x2000, // latched bus retry
+ DCR_EXBUS = 0x8000, // extended bus mode
+ };
+ enum rcr_mask : u16
{
- PTX = 0x0001, // packet transmitted ok
- BCM = 0x0002, // byte count mismatch
- FU = 0x0004, // fifo underrun
- PMB = 0x0008, // packet monitored bad
- OWC = 0x0020, // out of window collision
- EXC = 0x0040, // excessive collisions
- CRSL = 0x0080, // crs lost
- NCRS = 0x0100, // no crs
- DEF = 0x0200, // deferred transmission
- EXD = 0x0400, // excessive deferral
- EXDIS = 0x1000, // disable excessive deferral timer
- CRCI = 0x2000, // crc inhibit
- POWC = 0x4000, // programmed out of window collision timer
- PINT = 0x8000, // programmable interrupt
-
- TCR_WMASK = 0xf000
+ RCR_PRX = 0x0001, // packet received ok
+ RCR_LBK = 0x0002, // loopback packet received
+ RCR_FAER = 0x0004, // frame alignment error
+ RCR_CRCR = 0x0008, // crc error
+ RCR_COL = 0x0010, // collision activity
+ RCR_CRS = 0x0020, // carrier sense activity
+ RCR_LPKT = 0x0040, // last packet in rba
+ RCR_BC = 0x0080, // broadcast packet received
+ RCR_MC = 0x0100, // multicast packet received
+ RCR_LB = 0x0600, // loopback control
+ RCR_AMC = 0x0800, // accept all multicast packets
+ RCR_PRO = 0x1000, // physical promiscuous mode
+ RCR_BRD = 0x2000, // accept broadcast packets
+ RCR_RNT = 0x4000, // accept runt packets
+ RCR_ERR = 0x8000, // accept packet with crc errors or collisions
};
+ enum tcr_mask : u16
+ {
+ TCR_PTX = 0x0001, // packet transmitted ok
+ TCR_BCM = 0x0002, // byte count mismatch
+ TCR_FU = 0x0004, // fifo underrun
+ TCR_PMB = 0x0008, // packet monitored bad
+ TCR_OWC = 0x0020, // out of window collision
+ TCR_EXC = 0x0040, // excessive collisions
+ TCR_CRSL = 0x0080, // crs lost
+ TCR_NCRS = 0x0100, // no crs
+ TCR_DEF = 0x0200, // deferred transmission
+ TCR_EXD = 0x0400, // excessive deferral
+ TCR_EXDIS = 0x1000, // disable excessive deferral timer
+ TCR_CRCI = 0x2000, // crc inhibit
+ TCR_POWC = 0x4000, // programmed out of window collision timer
+ TCR_PINT = 0x8000, // programmable interrupt
+
+ TCR_TPC = 0xf000, // tx packet descriptor config
+ TCR_TPS = 0x07ff, // tx packet descriptor status
- u16 cr_r() { return m_cr; }
- u16 tcr_r() { return m_tcr; }
- u16 utda_r() { return m_utda; }
- u16 crda_r() { return m_crda; }
- u16 rrp_r() { return m_rrp; }
- u16 rwp_r() { return m_rwp; }
- u16 isr_r() { return m_isr; }
- u16 ce_r() { return m_ce; }
- u16 wt0_r() { return m_wt0; }
- u16 wt1_r() { return m_wt1; }
- u16 rsc_r() { return m_rsc; }
- u16 faet_r() { return m_faet; }
-
- void cr_w(u16 data) { m_cr = (data & CR_WMASK) | (m_cr & ~CR_WMASK); }
- void tcr_w(u16 data) { m_tcr = (data & TCR_WMASK) | (m_tcr & ~TCR_WMASK); }
- void utda_w(u16 data) { m_utda = data; }
- void crda_w(u16 data) { m_crda = data; }
- void rrp_w(u16 data) { m_rrp = data; }
- void rwp_w(u16 data) { m_rwp = data; }
- void isr_w(u16 data) { m_isr = data; }
- void ce_w(u16 data) { m_ce = data; }
- void wt0_w(u16 data) { m_wt0 = data; }
- void wt1_w(u16 data) { m_wt1 = data; }
- void rsc_w(u16 data) { m_rsc = data; }
- void faet_w(u16 data) { m_faet = ~data; }
+ };
+ enum imr_mask : u16
+ {
+ IMR_RFOEN = 0x0001, // receive fifo overrun
+ IMR_MPEN = 0x0002, // missed packet tally counter warning
+ IMR_FAEEN = 0x0004, // frame alignment error tally counter warning
+ IMR_CRCEN = 0x0008, // crc tally counter warning
+ IMR_RBAEEN = 0x0010, // receive buffer area exceeded
+ IMR_RBEEN = 0x0020, // receive buffers exhausted
+ IMR_RDEEN = 0x0040, // receive descriptors exhausted
+ IMR_TCEN = 0x0080, // general purpose timer complete
+ IMR_TXEREN = 0x0100, // transmit error
+ IMR_PTXEN = 0x0200, // packet transmitted ok
+ IMR_PRXEN = 0x0400, // packet received
+ IMR_PINTEN = 0x0800, // programmable interrupt
+ IMR_LCDEN = 0x1000, // load cam done
+ IMR_HBLEN = 0x2000, // heartbeat lost
+ IMR_BREN = 0x4000, // bus retry occurred
+ };
+ enum isr_mask : u16
+ {
+ ISR_RFO = 0x0001, // receive fifo overrun
+ ISR_MP = 0x0002, // missed packet counter rollover
+ ISR_FAE = 0x0004, // frame alignment error tally counter rollover
+ ISR_CRC = 0x0008, // crc tally counter rollover
+ ISR_RBAE = 0x0010, // receive buffer area exceeded
+ ISR_RBE = 0x0020, // receive buffer exhausted
+ ISR_RDE = 0x0040, // receive descriptors exhausted
+ ISR_TC = 0x0080, // general purpose timer complete
+ ISR_TXER = 0x0100, // transmit error
+ ISR_TXDN = 0x0200, // transmission done
+ ISR_PKTRX = 0x0400, // packet received
+ ISR_PINT = 0x0800, // programmed interrupt
+ ISR_LCD = 0x1000, // load cam done
+ ISR_HBL = 0x2000, // cd heartbeat lost
+ ISR_BR = 0x4000, // bus retry occurred
+ };
private:
- required_device<ram_device> m_ram;
-
+ required_address_space m_bus;
devcb_write_line m_out_int;
- u16 m_cr;
- u16 m_tcr;
- u16 m_utda;
- u16 m_crda;
- u16 m_rrp;
- u16 m_rwp;
- u16 m_isr;
- u16 m_ce;
- u16 m_wt0;
- u16 m_wt1;
- u16 m_rsc;
- u16 m_faet;
+ emu_timer *m_command;
+
+ bool m_int_state;
+ u16 m_reg[64];
+ u64 m_cam[16];
};
DECLARE_DEVICE_TYPE(DP83932C, dp83932c_device)
diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp
index 73ff954a02a..0ce7ed8dc53 100644
--- a/src/devices/machine/intelfsh.cpp
+++ b/src/devices/machine/intelfsh.cpp
@@ -111,6 +111,7 @@ DEFINE_DEVICE_TYPE(SHARP_LH28F160S3, sharp_lh28f160s3_device, "sharp_l
DEFINE_DEVICE_TYPE(INTEL_TE28F320, intel_te28f320_device, "intel_te28f320", "Intel TE28F320 Flash")
DEFINE_DEVICE_TYPE(SHARP_LH28F320BF, sharp_lh28f320bf_device, "sharp_lh28f320bf", "Sharp LH28F320BFHE-PBTL Flash")
DEFINE_DEVICE_TYPE(INTEL_28F320J3D, intel_28f320j3d_device, "intel_28f320j3d", "Intel 28F320J3D Flash")
+DEFINE_DEVICE_TYPE(SPANSION_S29GL064S, spansion_s29gl064s_device, "spansion_s29gl064s", "Spansion / Cypress S29GL064S Flash" )
DEFINE_DEVICE_TYPE(INTEL_28F320J5, intel_28f320j5_device, "intel_28f320j5", "Intel 28F320J5 Flash")
DEFINE_DEVICE_TYPE(SST_39VF400A, sst_39vf400a_device, "sst_39vf400a", "SST 39VF400A Flash")
@@ -118,6 +119,7 @@ DEFINE_DEVICE_TYPE(SST_39VF400A, sst_39vf400a_device, "sst_39v
DEFINE_DEVICE_TYPE(ATMEL_49F4096, atmel_49f4096_device, "atmel_49f4096", "Atmel AT49F4096 Flash")
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -228,6 +230,13 @@ intelfsh_device::intelfsh_device(const machine_config &mconfig, device_type type
m_device_id = 0x16;
m_sector_is_4k = true;
break;
+ case FLASH_SPANSION_S29GL064S: // senbbs
+ m_bits = 16;
+ m_size = 0x800000;
+ m_maker_id = MFG_SPANSION;
+ m_device_id = 0x227e;
+ m_sector_is_4k = false;
+ break;
case FLASH_INTEL_28F320J5: // funkball
m_bits = 16;
m_size = 0x400000;
@@ -457,6 +466,9 @@ sharp_lh28f160s3_device::sharp_lh28f160s3_device(const machine_config &mconfig,
intel_te28f320_device::intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: intelfsh16_device(mconfig, INTEL_TE28F320, tag, owner, clock, FLASH_INTEL_TE28F320) { }
+spansion_s29gl064s_device::spansion_s29gl064s_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : intelfsh16_device(mconfig, SPANSION_S29GL064S, tag, owner, clock, FLASH_SPANSION_S29GL064S) { }
+
intel_e28f400b_device::intel_e28f400b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: intelfsh16_device(mconfig, INTEL_E28F400B, tag, owner, clock, FLASH_INTEL_E28F400B) { }
@@ -1000,8 +1012,12 @@ void intelfsh_device::write_full(uint32_t address, uint32_t data)
else
m_data[address] = data;
break;
+ case 16: // senbbs test mode requires this, note, flash type is guessed there based on manufacturer + device ident as markings were erased
+ m_data[address*2] = data >> 8;
+ m_data[address*2+1] = data;
+ break;
default:
- logerror( "FM_BYTEPROGRAM not supported when m_bits == %d\n", m_bits );
+ logerror( "FM_BYTEPROGRAM not supported when m_bits == %d (address %08x data %04x)\n", m_bits, address, data );
break;
}
m_flash_mode = FM_NORMAL;
diff --git a/src/devices/machine/intelfsh.h b/src/devices/machine/intelfsh.h
index cd52dc7ada5..dbab11362ae 100644
--- a/src/devices/machine/intelfsh.h
+++ b/src/devices/machine/intelfsh.h
@@ -49,6 +49,7 @@ public:
FLASH_INTEL_TE28F320,
FLASH_SHARP_LH28F320BF,
FLASH_INTEL_28F320J3D,
+ FLASH_SPANSION_S29GL064S,
FLASH_INTEL_28F320J5,
FLASH_SST_39VF400A,
FLASH_ATMEL_49F4096
@@ -307,6 +308,12 @@ public:
intel_te28f320_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
};
+class spansion_s29gl064s_device : public intelfsh16_device
+{
+public:
+ spansion_s29gl064s_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+};
+
class intel_e28f400b_device : public intelfsh16_device
{
public:
@@ -376,6 +383,7 @@ DECLARE_DEVICE_TYPE(INTEL_E28F008SA, intel_e28f008sa_device)
DECLARE_DEVICE_TYPE(INTEL_TE28F160, intel_te28f160_device)
DECLARE_DEVICE_TYPE(SHARP_LH28F160S3, sharp_lh28f160s3_device)
DECLARE_DEVICE_TYPE(INTEL_TE28F320, intel_te28f320_device)
+DECLARE_DEVICE_TYPE(SPANSION_S29GL064S, spansion_s29gl064s_device)
DECLARE_DEVICE_TYPE(SHARP_LH28F320BF, sharp_lh28f320bf_device)
DECLARE_DEVICE_TYPE(INTEL_28F320J3D, intel_28f320j3d_device)
DECLARE_DEVICE_TYPE(INTEL_28F320J5, intel_28f320j5_device)
diff --git a/src/devices/sound/upd7759.cpp b/src/devices/sound/upd7759.cpp
index b800f6a7b0e..f8ca2c2336d 100644
--- a/src/devices/sound/upd7759.cpp
+++ b/src/devices/sound/upd7759.cpp
@@ -287,7 +287,7 @@ void upd7756_device::device_start()
void upd775x_device::device_reset()
{
m_pos = 0;
- m_fifo_in = 0;
+ //m_fifo_in = 0; // this seems keeping state when /RESET line asserted (test case: konmedal.cpp games)
m_state = STATE_IDLE;
m_clocks_left = 0;
m_nibbles_left = 0;
@@ -699,6 +699,9 @@ void upd775x_device::port_w(u8 data)
READ_LINE_MEMBER( upd775x_device::busy_r )
{
+ /* update the stream first */
+ m_channel->update();
+
/* return /BUSY */
return (m_state == STATE_IDLE);
}
diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp
index 2679845996b..41ae0b698a1 100644
--- a/src/emu/debug/debugcmd.cpp
+++ b/src/emu/debug/debugcmd.cpp
@@ -3119,7 +3119,7 @@ void debugger_commands::execute_snap(int ref, const std::vector<std::string> &pa
if (fname.find(".png") == -1)
fname.append(".png");
emu_file file(m_machine.options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = file.open(fname.c_str());
+ osd_file::error filerr = file.open(fname);
if (filerr != osd_file::error::NONE)
{
diff --git a/src/emu/device.cpp b/src/emu/device.cpp
index c534969dcd5..39897887628 100644
--- a/src/emu/device.cpp
+++ b/src/emu/device.cpp
@@ -130,7 +130,7 @@ device_t::~device_t()
memory_region *device_t::memregion(std::string _tag) const
{
// build a fully-qualified name and look it up
- auto search = machine().memory().regions().find(subtag(_tag).c_str());
+ auto search = machine().memory().regions().find(subtag(_tag));
if (search != machine().memory().regions().end())
return search->second.get();
else
@@ -146,7 +146,7 @@ memory_region *device_t::memregion(std::string _tag) const
memory_share *device_t::memshare(std::string _tag) const
{
// build a fully-qualified name and look it up
- auto search = machine().memory().shares().find(subtag(_tag).c_str());
+ auto search = machine().memory().shares().find(subtag(_tag));
if (search != machine().memory().shares().end())
return search->second.get();
else
@@ -161,7 +161,7 @@ memory_share *device_t::memshare(std::string _tag) const
memory_bank *device_t::membank(std::string _tag) const
{
- auto search = machine().memory().banks().find(subtag(_tag).c_str());
+ auto search = machine().memory().banks().find(subtag(_tag));
if (search != machine().memory().banks().end())
return search->second.get();
else
diff --git a/src/emu/diimage.cpp b/src/emu/diimage.cpp
index 5595ca809be..fe3d6d9e292 100644
--- a/src/emu/diimage.cpp
+++ b/src/emu/diimage.cpp
@@ -448,7 +448,7 @@ u8 *device_image_interface::get_software_region(const char *tag)
return nullptr;
std::string full_tag = util::string_format("%s:%s", device().tag(), tag);
- memory_region *region = device().machine().root_device().memregion(full_tag.c_str());
+ memory_region *region = device().machine().root_device().memregion(full_tag);
return region != nullptr ? region->base() : nullptr;
}
@@ -460,7 +460,7 @@ u8 *device_image_interface::get_software_region(const char *tag)
u32 device_image_interface::get_software_region_length(const char *tag)
{
std::string full_tag = util::string_format("%s:%s", device().tag(), tag);
- memory_region *region = device().machine().root_device().memregion(full_tag.c_str());
+ memory_region *region = device().machine().root_device().memregion(full_tag);
return region != nullptr ? region->bytes() : 0;
}
@@ -632,7 +632,7 @@ void device_image_interface::battery_load(void *buffer, int length, int fill)
osd_file::error filerr;
int bytes_read = 0;
- std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext.c_str()).append(".nv");
+ std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext).append(".nv");
/* try to open the battery file and read it in, if possible */
emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_READ);
@@ -651,7 +651,7 @@ void device_image_interface::battery_load(void *buffer, int length, const void *
osd_file::error filerr;
int bytes_read = 0;
- std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext.c_str()).append(".nv");
+ std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext).append(".nv");
// try to open the battery file and read it in, if possible
emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_READ);
@@ -680,7 +680,7 @@ void device_image_interface::battery_save(const void *buffer, int length)
if (!device().machine().options().nvram_save())
return;
- std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext.c_str()).append(".nv");
+ std::string fname = std::string(device().machine().system().name).append(PATH_SEPARATOR).append(m_basename_noext).append(".nv");
// try to open the battery file and write it out, if possible
emu_file file(device().machine().options().nvram_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
@@ -930,7 +930,7 @@ bool device_image_interface::load_software(software_list_device &swlist, const c
while (swinfo != nullptr)
{
locationtag.append(swinfo->shortname()).append(breakstr);
- swinfo = !swinfo->parentname().empty() ? swlist.find(swinfo->parentname().c_str()) : nullptr;
+ swinfo = !swinfo->parentname().empty() ? swlist.find(swinfo->parentname()) : nullptr;
}
// strip the final '%'
locationtag.erase(locationtag.length() - 1, 1);
diff --git a/src/emu/disound.cpp b/src/emu/disound.cpp
index 6135b4a2f64..a48ad44c40b 100644
--- a/src/emu/disound.cpp
+++ b/src/emu/disound.cpp
@@ -260,7 +260,7 @@ void device_sound_interface::interface_validity_check(validity_checker &valid) c
// find a device with the requested tag
device_t const *const target = route.m_base.get().subdevice(route.m_target.c_str());
if (!target)
- osd_printf_error("Attempting to route sound to non-existent device '%s'\n", route.m_base.get().subtag(route.m_target.c_str()));
+ osd_printf_error("Attempting to route sound to non-existent device '%s'\n", route.m_base.get().subtag(route.m_target));
// if it's not a speaker or a sound device, error
device_sound_interface const *sound;
diff --git a/src/emu/emumem.cpp b/src/emu/emumem.cpp
index 691917bc4a5..3514045e32d 100644
--- a/src/emu/emumem.cpp
+++ b/src/emu/emumem.cpp
@@ -1422,7 +1422,7 @@ void address_space::prepare_map()
{
// if we can't find it, add it to our map
std::string fulltag = entry.m_devbase.subtag(entry.m_share);
- if (m_manager.m_sharelist.find(fulltag.c_str()) == m_manager.m_sharelist.end())
+ if (m_manager.m_sharelist.find(fulltag) == m_manager.m_sharelist.end())
{
VPRINTF(("Creating share '%s' of length 0x%X\n", fulltag.c_str(), entry.m_addrend + 1 - entry.m_addrstart));
m_manager.m_sharelist.emplace(fulltag.c_str(), std::make_unique<memory_share>(m_config.data_width(), address_to_byte(entry.m_addrend + 1 - entry.m_addrstart), endianness()));
@@ -1447,7 +1447,7 @@ void address_space::prepare_map()
std::string fulltag = entry.m_devbase.subtag(entry.m_region);
// find the region
- memory_region *region = m_manager.machine().root_device().memregion(fulltag.c_str());
+ memory_region *region = m_manager.machine().root_device().memregion(fulltag);
if (region == nullptr)
fatalerror("device '%s' %s space memory map entry %X-%X references nonexistent region \"%s\"\n", m_device.tag(), m_name, entry.m_addrstart, entry.m_addrend, entry.m_region);
@@ -1463,7 +1463,7 @@ void address_space::prepare_map()
std::string fulltag = entry.m_devbase.subtag(entry.m_region);
// set the memory address
- entry.m_memory = m_manager.machine().root_device().memregion(fulltag.c_str())->base() + entry.m_rgnoffs;
+ entry.m_memory = m_manager.machine().root_device().memregion(fulltag)->base() + entry.m_rgnoffs;
}
}
}
@@ -1774,7 +1774,7 @@ address_map_entry *address_space::block_assign_intersecting(offs_t addrstart, of
if (entry.m_memory == nullptr && entry.m_share != nullptr)
{
std::string fulltag = entry.m_devbase.subtag(entry.m_share);
- auto share = m_manager.shares().find(fulltag.c_str());
+ auto share = m_manager.shares().find(fulltag);
if (share != m_manager.shares().end() && share->second->ptr() != nullptr)
{
entry.m_memory = share->second->ptr();
@@ -1797,7 +1797,7 @@ address_map_entry *address_space::block_assign_intersecting(offs_t addrstart, of
if (entry.m_memory != nullptr && entry.m_share != nullptr)
{
std::string fulltag = entry.m_devbase.subtag(entry.m_share);
- auto share = m_manager.shares().find(fulltag.c_str());
+ auto share = m_manager.shares().find(fulltag);
if (share != m_manager.shares().end() && share->second->ptr() == nullptr)
{
share->second->set_ptr(entry.m_memory);
@@ -2299,7 +2299,7 @@ bool address_space::needs_backing_store(const address_map_entry &entry)
if (entry.m_share != nullptr)
{
std::string fulltag = entry.m_devbase.subtag(entry.m_share);
- auto share = m_manager.shares().find(fulltag.c_str());
+ auto share = m_manager.shares().find(fulltag);
if (share != m_manager.shares().end() && share->second->ptr() == nullptr)
return true;
}
diff --git a/src/emu/emupal.cpp b/src/emu/emupal.cpp
index 536eff6577d..6c027ffe611 100644
--- a/src/emu/emupal.cpp
+++ b/src/emu/emupal.cpp
@@ -502,7 +502,7 @@ void palette_device::device_start()
{
// find the extended (split) memory, if present
std::string tag_ext = std::string(tag()).append("_ext");
- const memory_share *share_ext = memshare(tag_ext.c_str());
+ const memory_share *share_ext = memshare(tag_ext);
// make sure we have specified a format
if (m_raw_to_rgb.bytes_per_entry() <= 0)
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index 8e5a57dd9e3..7efe86226ca 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -2754,7 +2754,7 @@ void ioport_manager::timecode_init()
filename.append(record_filename).append(".timecode");
osd_printf_info("Record input timecode file: %s\n", record_filename);
- osd_file::error filerr = m_timecode_file.open(filename.c_str());
+ osd_file::error filerr = m_timecode_file.open(filename);
if (filerr != osd_file::error::NONE)
throw emu_fatalerror("ioport_manager::timecode_init: Failed to open file for input timecode recording");
@@ -3028,7 +3028,7 @@ ioport_configurer& ioport_configurer::port_modify(const char *tag)
std::string fulltag = m_owner.subtag(tag);
// find the existing port
- m_curport = m_portlist.find(fulltag.c_str())->second.get();
+ m_curport = m_portlist.find(fulltag)->second.get();
if (m_curport == nullptr)
throw emu_fatalerror("Requested to modify nonexistent port '%s'", fulltag.c_str());
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index 9480ee38803..b3c0fd0d8e5 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -513,7 +513,7 @@ std::string running_machine::get_statename(const char *option) const
if (pos != -1)
{
// if more %d are found, revert to default and ignore them all
- if (statename_str.find(statename_dev.c_str(), pos + 3) != -1)
+ if (statename_str.find(statename_dev, pos + 3) != -1)
statename_str.assign("%g");
// else if there is a single %d, try to create the correct snapname
else
@@ -557,7 +557,7 @@ std::string running_machine::get_statename(const char *option) const
std::string filename(image.basename_noext());
// setup snapname and remove the %d_
- strreplace(statename_str, devname_str.c_str(), filename.c_str());
+ strreplace(statename_str, devname_str, filename);
statename_str.erase(pos, 3);
//printf("check image: %s\n", filename.c_str());
diff --git a/src/emu/render.cpp b/src/emu/render.cpp
index b25e18fa968..6e7067ea30e 100644
--- a/src/emu/render.cpp
+++ b/src/emu/render.cpp
@@ -2041,7 +2041,7 @@ bool render_target::load_layout_file(const char *dirname, const char *filename)
// attempt to open the file; bail if we can't
emu_file layoutfile(m_manager.machine().options().art_path(), OPEN_FLAG_READ);
- osd_file::error const filerr(layoutfile.open(fname.c_str()));
+ osd_file::error const filerr(layoutfile.open(fname));
if (filerr != osd_file::error::NONE)
return false;
diff --git a/src/emu/rendfont.cpp b/src/emu/rendfont.cpp
index c5debb5f055..788f84a60ca 100644
--- a/src/emu/rendfont.cpp
+++ b/src/emu/rendfont.cpp
@@ -958,7 +958,7 @@ bool render_font::load_cached_bdf(const char *filename)
// attempt to open the cached version of the font
{
emu_file cachefile(m_manager.machine().options().font_path(), OPEN_FLAG_READ);
- filerr = cachefile.open(cachedname.c_str());
+ filerr = cachefile.open(cachedname);
if (filerr == osd_file::error::NONE)
{
// if we have a cached version, load it
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp
index ff16d8a22fa..c4b458ed80c 100644
--- a/src/emu/rendlay.cpp
+++ b/src/emu/rendlay.cpp
@@ -3414,7 +3414,7 @@ void layout_view::item::resolve_tags()
if (!m_input_tag.empty())
{
- m_input_port = m_element->machine().root_device().ioport(m_input_tag.c_str());
+ m_input_port = m_element->machine().root_device().ioport(m_input_tag);
if (m_input_port)
{
for (ioport_field &field : m_input_port->fields())
diff --git a/src/emu/rendutil.cpp b/src/emu/rendutil.cpp
index ab5770b86e1..7a1aa9193bb 100644
--- a/src/emu/rendutil.cpp
+++ b/src/emu/rendutil.cpp
@@ -559,7 +559,7 @@ void render_load_jpeg(bitmap_argb32 &bitmap, emu_file &file, const char *dirname
else
fname.assign(dirname).append(PATH_SEPARATOR).append(filename);
- if (file.open(fname.c_str()) != osd_file::error::NONE)
+ if (file.open(fname) != osd_file::error::NONE)
return;
// define standard JPEG structures
@@ -637,7 +637,7 @@ bool render_load_png(bitmap_argb32 &bitmap, emu_file &file, const char *dirname,
fname.assign(dirname).append(PATH_SEPARATOR).append(filename);
else
fname.assign(filename);
- osd_file::error const filerr = file.open(fname.c_str());
+ osd_file::error const filerr = file.open(fname);
if (filerr != osd_file::error::NONE)
return false;
@@ -810,7 +810,7 @@ ru_imgformat render_detect_image(emu_file &file, const char *dirname, const char
fname.assign(dirname).append(PATH_SEPARATOR).append(filename);
else
fname.assign(filename);
- osd_file::error const filerr = file.open(fname.c_str());
+ osd_file::error const filerr = file.open(fname);
if (filerr != osd_file::error::NONE)
return RENDUTIL_IMGFORMAT_ERROR;
diff --git a/src/emu/romload.cpp b/src/emu/romload.cpp
index 57f04d8de74..67ef6cfb6aa 100644
--- a/src/emu/romload.cpp
+++ b/src/emu/romload.cpp
@@ -1093,7 +1093,7 @@ chd_error rom_load_manager::open_disk_diff(emu_options &options, const rom_entry
/* try to open the diff */
LOG("Opening differencing image file: %s\n", fname.c_str());
emu_file diff_file(options.diff_directory(), OPEN_FLAG_READ | OPEN_FLAG_WRITE);
- osd_file::error filerr = diff_file.open(fname.c_str());
+ osd_file::error filerr = diff_file.open(fname);
if (filerr == osd_file::error::NONE)
{
std::string fullpath(diff_file.fullpath());
@@ -1106,7 +1106,7 @@ chd_error rom_load_manager::open_disk_diff(emu_options &options, const rom_entry
/* didn't work; try creating it instead */
LOG("Creating differencing image: %s\n", fname.c_str());
diff_file.set_openflags(OPEN_FLAG_READ | OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- filerr = diff_file.open(fname.c_str());
+ filerr = diff_file.open(fname);
if (filerr == osd_file::error::NONE)
{
std::string fullpath(diff_file.fullpath());
@@ -1282,7 +1282,7 @@ void rom_load_manager::load_software_part_region(device_t &device, software_list
while (swinfo != nullptr)
{
locationtag.append(swinfo->shortname()).append(breakstr);
- swinfo = !swinfo->parentname().empty() ? swlist.find(swinfo->parentname().c_str()) : nullptr;
+ swinfo = !swinfo->parentname().empty() ? swlist.find(swinfo->parentname()) : nullptr;
}
// strip the final '%'
locationtag.erase(locationtag.length() - 1, 1);
@@ -1303,7 +1303,7 @@ void rom_load_manager::load_software_part_region(device_t &device, software_list
/* if this is a device region, override with the device width and endianness */
endianness_t endianness = ROMREGION_ISBIGENDIAN(region) ? ENDIANNESS_BIG : ENDIANNESS_LITTLE;
u8 width = ROMREGION_GETWIDTH(region) / 8;
- memory_region *memregion = machine().root_device().memregion(regiontag.c_str());
+ memory_region *memregion = machine().root_device().memregion(regiontag);
if (memregion != nullptr)
{
normalize_flags_for_device(regiontag.c_str(), width, endianness);
@@ -1413,7 +1413,7 @@ void rom_load_manager::process_region_list()
for (device_t &device : deviter)
for (const rom_entry *param = rom_first_parameter(device); param != nullptr; param = rom_next_parameter(param))
{
- std::string regiontag = device.subtag(param->name().c_str());
+ std::string regiontag = device.subtag(param->name());
machine().parameters().add(regiontag, param->hashdata());
}
}
diff --git a/src/emu/softlist_dev.cpp b/src/emu/softlist_dev.cpp
index 08075e4ff1a..08befcd4e9e 100644
--- a/src/emu/softlist_dev.cpp
+++ b/src/emu/softlist_dev.cpp
@@ -282,7 +282,7 @@ void software_list_device::parse()
m_errors.clear();
// attempt to open the file
- osd_file::error filerr = m_file.open(m_list_name.c_str(), ".xml");
+ osd_file::error filerr = m_file.open(m_list_name, ".xml");
if (filerr == osd_file::error::NONE)
{
// parse if no error
@@ -489,7 +489,7 @@ void software_list_device::internal_validity_check(validity_checker &valid)
}
// make sure the parent exists
- const software_info *swinfo2 = find(swinfo.parentname().c_str());
+ const software_info *swinfo2 = find(swinfo.parentname());
if (swinfo2 == nullptr)
osd_printf_error("%s: parent '%s' software for '%s' not found\n", filename(), swinfo.parentname(), shortname);
diff --git a/src/emu/tilemap.cpp b/src/emu/tilemap.cpp
index 0957d25c4f0..fab04e8f162 100644
--- a/src/emu/tilemap.cpp
+++ b/src/emu/tilemap.cpp
@@ -1784,7 +1784,7 @@ void tilemap_device::device_start()
// look for an extension entry
std::string tag_ext = std::string(tag()).append("_ext");
- share = memshare(tag_ext.c_str());
+ share = memshare(tag_ext);
if (share != nullptr)
m_extmem.set(*share, m_bytes_per_entry);
}
diff --git a/src/emu/video.cpp b/src/emu/video.cpp
index 71bc97d6cef..727af74ea01 100644
--- a/src/emu/video.cpp
+++ b/src/emu/video.cpp
@@ -441,7 +441,7 @@ void video_manager::begin_recording_mng(const char *name, uint32_t index, screen
full_name = name_buf;
}
- filerr = info.m_mng_file->open(full_name.c_str());
+ filerr = info.m_mng_file->open(full_name);
}
else
{
@@ -518,7 +518,7 @@ void video_manager::begin_recording_avi(const char *name, uint32_t index, screen
full_name = name_buf;
}
- filerr = tempfile.open(full_name.c_str());
+ filerr = tempfile.open(full_name);
}
else
{
@@ -1350,7 +1350,7 @@ osd_file::error video_manager::open_next(emu_file &file, const char *extension,
if (pos != -1)
{
// if more %d are found, revert to default and ignore them all
- if (snapstr.find(snapdev.c_str(), pos + 3) != -1)
+ if (snapstr.find(snapdev, pos + 3) != -1)
snapstr.assign("%g/%i");
// else if there is a single %d, try to create the correct snapname
else
@@ -1397,7 +1397,7 @@ osd_file::error video_manager::open_next(emu_file &file, const char *extension,
filename = filename.substr(0, filename.find_last_of('.'));
// setup snapname and remove the %d_
- strreplace(snapstr, snapdevname.c_str(), filename.c_str());
+ strreplace(snapstr, snapdevname, filename);
snapstr.erase(pos, 3);
//printf("check image: %s\n", filename.c_str());
@@ -1433,10 +1433,10 @@ osd_file::error video_manager::open_next(emu_file &file, const char *extension,
{
// build up the filename
fname.assign(snapstr);
- strreplace(fname, "%i", string_format("%04d", seq).c_str());
+ strreplace(fname, "%i", string_format("%04d", seq));
// try to open the file; stop when we fail
- osd_file::error filerr = file.open(fname.c_str());
+ osd_file::error filerr = file.open(fname);
if (filerr == osd_file::error::NOT_FOUND)
{
break;
@@ -1446,7 +1446,7 @@ osd_file::error video_manager::open_next(emu_file &file, const char *extension,
// create the final file
file.set_openflags(origflags);
- return file.open(fname.c_str());
+ return file.open(fname);
}
diff --git a/src/frontend/mame/audit.cpp b/src/frontend/mame/audit.cpp
index a33dd4bb52a..dbba78e20ec 100644
--- a/src/frontend/mame/audit.cpp
+++ b/src/frontend/mame/audit.cpp
@@ -220,14 +220,14 @@ media_auditor::summary media_auditor::audit_samples()
// look for the files
emu_file file(m_enumerator.options().sample_path(), OPEN_FLAG_READ | OPEN_FLAG_NO_PRELOAD);
- path_iterator path(searchpath.c_str());
+ path_iterator path(searchpath);
std::string curpath;
while (path.next(curpath, samplename))
{
// attempt to access the file (.flac) or (.wav)
- osd_file::error filerr = file.open(curpath.c_str(), ".flac");
+ osd_file::error filerr = file.open(curpath, ".flac");
if (filerr != osd_file::error::NONE)
- filerr = file.open(curpath.c_str(), ".wav");
+ filerr = file.open(curpath, ".wav");
if (filerr == osd_file::error::NONE)
{
@@ -397,9 +397,9 @@ media_auditor::audit_record &media_auditor::audit_one_rom(const rom_entry *rom)
// open the file if we can
osd_file::error filerr;
if (has_crc)
- filerr = file.open(curpath.c_str(), crc);
+ filerr = file.open(curpath, crc);
else
- filerr = file.open(curpath.c_str());
+ filerr = file.open(curpath);
// if it worked, get the actual length and hashes, then stop
if (filerr == osd_file::error::NONE)
diff --git a/src/frontend/mame/language.cpp b/src/frontend/mame/language.cpp
index a5f2e9ce3a9..2740aed973f 100644
--- a/src/frontend/mame/language.cpp
+++ b/src/frontend/mame/language.cpp
@@ -68,7 +68,7 @@ void load_translation(emu_options &m_options)
strreplace(name, "(", "");
strreplace(name, ")", "");
emu_file file(m_options.language_path(), OPEN_FLAG_READ);
- if (file.open(name.c_str(), PATH_SEPARATOR "strings.mo") != osd_file::error::NONE)
+ if (file.open(name, PATH_SEPARATOR "strings.mo") != osd_file::error::NONE)
{
osd_printf_error("Error opening translation file %s\n", name);
return;
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index cc9c597b037..411004676a9 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -1227,13 +1227,13 @@ void lua_engine::initialize()
if(e.type() != OPTION_FLOAT)
luaL_error(m_lua_state, "Cannot set option to wrong type");
else
- e.set_value(string_format("%f", val).c_str(), OPTION_PRIORITY_CMDLINE);
+ e.set_value(string_format("%f", val), OPTION_PRIORITY_CMDLINE);
},
[this](core_options::entry &e, int val) {
if(e.type() != OPTION_INTEGER)
luaL_error(m_lua_state, "Cannot set option to wrong type");
else
- e.set_value(string_format("%d", val).c_str(), OPTION_PRIORITY_CMDLINE);
+ e.set_value(string_format("%d", val), OPTION_PRIORITY_CMDLINE);
},
[this](core_options::entry &e, const char *val) {
if(e.type() != OPTION_STRING)
@@ -1647,9 +1647,9 @@ void lua_engine::initialize()
if(!item)
break;
name = &(strchr(item, '/')[1]);
- if(name.substr(0, name.find("/")) == tag)
+ if(name.substr(0, name.find('/')) == tag)
{
- name = name.substr(name.find("/") + 1, std::string::npos);
+ name = name.substr(name.find('/') + 1, std::string::npos);
table[name] = i;
}
}
diff --git a/src/frontend/mame/ui/custui.cpp b/src/frontend/mame/ui/custui.cpp
index 48fd67a2a67..dfd206706b8 100644
--- a/src/frontend/mame/ui/custui.cpp
+++ b/src/frontend/mame/ui/custui.cpp
@@ -76,7 +76,7 @@ menu_custom_ui::~menu_custom_ui()
ui().options().set_value(OPTION_HIDE_PANELS, ui_globals::panels_status, OPTION_PRIORITY_CMDLINE);
if (!m_lang.empty())
{
- machine().options().set_value(OPTION_LANGUAGE, m_lang[m_currlang].c_str(), OPTION_PRIORITY_CMDLINE);
+ machine().options().set_value(OPTION_LANGUAGE, m_lang[m_currlang], OPTION_PRIORITY_CMDLINE);
load_translation(machine().options());
}
ui_globals::reset = true;
@@ -172,7 +172,7 @@ void menu_custom_ui::populate(float &customtop, float &custombottom)
if (!m_lang.empty())
{
arrow_flags = get_arrow_flags<std::uint16_t>(0, m_lang.size() - 1, m_currlang);
- item_append(_("Language"), m_lang[m_currlang].c_str(), arrow_flags, (void *)(uintptr_t)LANGUAGE_MENU);
+ item_append(_("Language"), m_lang[m_currlang], arrow_flags, (void *)(uintptr_t)LANGUAGE_MENU);
}
arrow_flags = get_arrow_flags<uint16_t>(0, HIDE_BOTH, ui_globals::panels_status);
@@ -445,7 +445,7 @@ menu_colors_ui::~menu_colors_ui()
for (int index = 1; index < MUI_RESTORE; index++)
{
dec_color = string_format("%x", (uint32_t)m_color_table[index].color);
- ui().options().set_value(m_color_table[index].option, dec_color.c_str(), OPTION_PRIORITY_CMDLINE);
+ ui().options().set_value(m_color_table[index].option, dec_color, OPTION_PRIORITY_CMDLINE);
}
// refresh our cached colors
diff --git a/src/frontend/mame/ui/dirmenu.cpp b/src/frontend/mame/ui/dirmenu.cpp
index 1d8166718f0..50afe928561 100644
--- a/src/frontend/mame/ui/dirmenu.cpp
+++ b/src/frontend/mame/ui/dirmenu.cpp
@@ -170,7 +170,7 @@ void menu_display_actual::populate(float &customtop, float &custombottom)
else
m_searchpath.assign(machine().options().value(s_folders[m_ref].option));
- path_iterator path(m_searchpath.c_str());
+ path_iterator path(m_searchpath);
std::string curpath;
m_folders.clear();
while (path.next(curpath, nullptr))
@@ -226,7 +226,7 @@ menu_add_change_folder::menu_add_change_folder(mame_ui_manager &mui, render_cont
else
searchpath = mui.machine().options().value(s_folders[m_ref].option);
- path_iterator path(searchpath.c_str());
+ path_iterator path(searchpath);
std::string curpath;
while (path.next(curpath, nullptr))
m_folders.push_back(curpath);
@@ -289,10 +289,10 @@ void menu_add_change_folder::handle()
if (m_change)
{
if (ui().options().exists(s_folders[m_ref].option))
- ui().options().set_value(s_folders[m_ref].option, m_current_path.c_str(), OPTION_PRIORITY_CMDLINE);
+ ui().options().set_value(s_folders[m_ref].option, m_current_path, OPTION_PRIORITY_CMDLINE);
else if (strcmp(machine().options().value(s_folders[m_ref].option), m_current_path.c_str()) != 0)
{
- machine().options().set_value(s_folders[m_ref].option, m_current_path.c_str(), OPTION_PRIORITY_CMDLINE);
+ machine().options().set_value(s_folders[m_ref].option, m_current_path, OPTION_PRIORITY_CMDLINE);
}
}
else
@@ -307,10 +307,10 @@ void menu_add_change_folder::handle()
}
if (ui().options().exists(s_folders[m_ref].option))
- ui().options().set_value(s_folders[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE);
+ ui().options().set_value(s_folders[m_ref].option, tmppath, OPTION_PRIORITY_CMDLINE);
else if (strcmp(machine().options().value(s_folders[m_ref].option), tmppath.c_str()) != 0)
{
- machine().options().set_value(s_folders[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE);
+ machine().options().set_value(s_folders[m_ref].option, tmppath, OPTION_PRIORITY_CMDLINE);
}
}
@@ -449,7 +449,7 @@ menu_remove_folder::menu_remove_folder(mame_ui_manager &mui, render_container &c
else
m_searchpath.assign(mui.machine().options().value(s_folders[m_ref].option));
- path_iterator path(m_searchpath.c_str());
+ path_iterator path(m_searchpath);
std::string curpath;
while (path.next(curpath, nullptr))
m_folders.push_back(curpath);
@@ -479,10 +479,10 @@ void menu_remove_folder::handle()
}
if (ui().options().exists(s_folders[m_ref].option))
- ui().options().set_value(s_folders[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE);
+ ui().options().set_value(s_folders[m_ref].option, tmppath, OPTION_PRIORITY_CMDLINE);
else if (strcmp(machine().options().value(s_folders[m_ref].option),tmppath.c_str())!=0)
{
- machine().options().set_value(s_folders[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE);
+ machine().options().set_value(s_folders[m_ref].option, tmppath, OPTION_PRIORITY_CMDLINE);
}
reset_parent(reset_options::REMEMBER_REF);
diff --git a/src/frontend/mame/ui/filecreate.cpp b/src/frontend/mame/ui/filecreate.cpp
index 9928829ecf5..157b19bec9a 100644
--- a/src/frontend/mame/ui/filecreate.cpp
+++ b/src/frontend/mame/ui/filecreate.cpp
@@ -205,7 +205,7 @@ void menu_file_create::handle()
if ((event->itemref == ITEMREF_CREATE) || (event->itemref == ITEMREF_NEW_IMAGE_NAME))
{
std::string tmp_file(m_filename);
- if (tmp_file.find(".") != -1 && tmp_file.find(".") < tmp_file.length() - 1)
+ if (tmp_file.find('.') != -1 && tmp_file.find('.') < tmp_file.length() - 1)
{
m_current_file = m_filename;
stack_pop();
diff --git a/src/frontend/mame/ui/imgcntrl.cpp b/src/frontend/mame/ui/imgcntrl.cpp
index 3312e5d54e7..8d3ef0974c1 100644
--- a/src/frontend/mame/ui/imgcntrl.cpp
+++ b/src/frontend/mame/ui/imgcntrl.cpp
@@ -95,7 +95,7 @@ void menu_control_device_image::test_create(bool &can_create, bool &need_confirm
auto path = util::zippath_combine(m_current_directory, m_current_file);
// does a file or a directory exist at the path
- auto entry = osd_stat(path.c_str());
+ auto entry = osd_stat(path);
auto file_type = (entry != nullptr) ? entry->type : osd::directory::entry::entry_type::NONE;
switch(file_type)
@@ -211,7 +211,7 @@ void menu_control_device_image::handle()
break;
case SELECT_PARTLIST:
- m_swi = m_sld->find(m_software_info_name.c_str());
+ m_swi = m_sld->find(m_software_info_name);
if (!m_swi)
m_state = START_SOFTLIST;
else if (m_swi->has_multiple_parts(m_image.image_interface()))
diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp
index 4278e0efad9..55147b020ec 100644
--- a/src/frontend/mame/ui/miscmenu.cpp
+++ b/src/frontend/mame/ui/miscmenu.cpp
@@ -609,11 +609,11 @@ void menu_export::handle()
{
std::string filename("exported");
emu_file infile(ui().options().ui_path(), OPEN_FLAG_READ);
- if (infile.open(filename.c_str(), ".xml") == osd_file::error::NONE)
+ if (infile.open(filename, ".xml") == osd_file::error::NONE)
for (int seq = 0; ; ++seq)
{
std::string seqtext = string_format("%s_%04d", filename, seq);
- if (infile.open(seqtext.c_str(), ".xml") != osd_file::error::NONE)
+ if (infile.open(seqtext, ".xml") != osd_file::error::NONE)
{
filename = seqtext;
break;
@@ -622,7 +622,7 @@ void menu_export::handle()
// attempt to open the output file
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(filename.c_str(), ".xml") == osd_file::error::NONE)
+ if (file.open(filename, ".xml") == osd_file::error::NONE)
{
std::string fullpath(file.fullpath());
file.close();
@@ -654,11 +654,11 @@ void menu_export::handle()
{
std::string filename("exported");
emu_file infile(ui().options().ui_path(), OPEN_FLAG_READ);
- if (infile.open(filename.c_str(), ".txt") == osd_file::error::NONE)
+ if (infile.open(filename, ".txt") == osd_file::error::NONE)
for (int seq = 0; ; ++seq)
{
std::string seqtext = string_format("%s_%04d", filename, seq);
- if (infile.open(seqtext.c_str(), ".txt") != osd_file::error::NONE)
+ if (infile.open(seqtext, ".txt") != osd_file::error::NONE)
{
filename = seqtext;
break;
@@ -667,7 +667,7 @@ void menu_export::handle()
// attempt to open the output file
emu_file file(ui().options().ui_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- if (file.open(filename.c_str(), ".txt") == osd_file::error::NONE)
+ if (file.open(filename, ".txt") == osd_file::error::NONE)
{
// print the header
std::ostringstream buffer;
@@ -764,7 +764,7 @@ void menu_machine_configure::handle()
{
std::string filename(m_drv.name);
emu_file file(machine().options().ini_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE);
- osd_file::error filerr = file.open(filename.c_str(), ".ini");
+ osd_file::error filerr = file.open(filename, ".ini");
if (filerr == osd_file::error::NONE)
{
std::string inistring = m_opts.output_ini();
diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp
index b7e621997ad..00113d8aeda 100644
--- a/src/frontend/mame/ui/selgame.cpp
+++ b/src/frontend/mame/ui/selgame.cpp
@@ -251,7 +251,7 @@ menu_select_game::menu_select_game(mame_ui_manager &mui, render_container &conta
ui_globals::rpanel = std::min<int>(std::max<int>(moptions.last_right_panel(), RP_FIRST), RP_LAST);
std::string tmp(moptions.last_used_filter());
- std::size_t const found = tmp.find_first_of(",");
+ std::size_t const found = tmp.find_first_of(',');
std::string fake_ini;
if (found == std::string::npos)
{
@@ -306,8 +306,8 @@ menu_select_game::~menu_select_game()
ui_options &mopt = ui().options();
mopt.set_value(OPTION_LAST_RIGHT_PANEL, ui_globals::rpanel, OPTION_PRIORITY_CMDLINE);
- mopt.set_value(OPTION_LAST_USED_FILTER, filter.c_str(), OPTION_PRIORITY_CMDLINE);
- mopt.set_value(OPTION_LAST_USED_MACHINE, last_driver.c_str(), OPTION_PRIORITY_CMDLINE);
+ mopt.set_value(OPTION_LAST_USED_FILTER, filter, OPTION_PRIORITY_CMDLINE);
+ mopt.set_value(OPTION_LAST_USED_MACHINE, last_driver, OPTION_PRIORITY_CMDLINE);
mopt.set_value(OPTION_HIDE_PANELS, ui_globals::panels_status, OPTION_PRIORITY_CMDLINE);
ui().save_ui_options();
}
@@ -894,8 +894,8 @@ void menu_select_game::inkey_select_favorite(const event *menu_event)
driver_enumerator drv(machine().options(), *ui_swinfo->driver);
media_auditor auditor(drv);
drv.next();
- software_list_device *swlist = software_list_device::find_by_name(*drv.config(), ui_swinfo->listname.c_str());
- const software_info *swinfo = swlist->find(ui_swinfo->shortname.c_str());
+ software_list_device *swlist = software_list_device::find_by_name(*drv.config(), ui_swinfo->listname);
+ const software_info *swinfo = swlist->find(ui_swinfo->shortname);
media_auditor::summary const summary = auditor.audit_software(swlist->list_name(), swinfo, AUDIT_VALIDATE_FAST);
diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp
index bb3e5dc8c00..4fd71e2798e 100644
--- a/src/frontend/mame/ui/selmenu.cpp
+++ b/src/frontend/mame/ui/selmenu.cpp
@@ -346,8 +346,8 @@ void menu_select_launch::bios_selection::handle()
machine().options().set_value(OPTION_BIOS, elem.second, OPTION_PRIORITY_CMDLINE); // oh dear, relying on this persisting through the part selection menu
driver_enumerator drivlist(machine().options(), *ui_swinfo->driver);
drivlist.next();
- software_list_device *swlist = software_list_device::find_by_name(*drivlist.config(), ui_swinfo->listname.c_str());
- const software_info *swinfo = swlist->find(ui_swinfo->shortname.c_str());
+ software_list_device *swlist = software_list_device::find_by_name(*drivlist.config(), ui_swinfo->listname);
+ const software_info *swinfo = swlist->find(ui_swinfo->shortname);
if (!select_part(ui(), container(), *swinfo, *ui_swinfo))
{
reselect_last::reselect(true);
@@ -693,7 +693,7 @@ void menu_select_launch::custom_render(void *selectedref, float top, float botto
else
{
std::string copyright(emulator_info::get_copyright());
- size_t found = copyright.find("\n");
+ size_t found = copyright.find('\n');
tempbuf[0].clear();
tempbuf[1] = string_format(_("%1$s %2$s"), emulator_info::get_appname(), build_version);
@@ -1305,8 +1305,8 @@ void menu_select_launch::get_title_search(std::string &snaptext, std::string &se
}
std::string tmp(searchstr);
- path_iterator path(tmp.c_str());
- path_iterator path_iter(addpath.c_str());
+ path_iterator path(tmp);
+ path_iterator path_iter(addpath);
std::string c_path, curpath;
// iterate over path and add path for zipped formats
diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp
index 4133f238e08..3c689d19239 100644
--- a/src/frontend/mame/ui/selsoft.cpp
+++ b/src/frontend/mame/ui/selsoft.cpp
@@ -483,8 +483,8 @@ void menu_select_software::inkey_select(const event *menu_event)
driver_enumerator drivlist(machine().options(), *ui_swinfo->driver);
media_auditor auditor(drivlist);
drivlist.next();
- software_list_device *swlist = software_list_device::find_by_name(*drivlist.config(), ui_swinfo->listname.c_str());
- const software_info *swinfo = swlist->find(ui_swinfo->shortname.c_str());
+ software_list_device *swlist = software_list_device::find_by_name(*drivlist.config(), ui_swinfo->listname);
+ const software_info *swinfo = swlist->find(ui_swinfo->shortname);
media_auditor::summary const summary = auditor.audit_software(swlist->list_name(), swinfo, AUDIT_VALIDATE_FAST);
diff --git a/src/frontend/mame/ui/sliders.cpp b/src/frontend/mame/ui/sliders.cpp
index 77df1a003cf..aa3ebac7976 100644
--- a/src/frontend/mame/ui/sliders.cpp
+++ b/src/frontend/mame/ui/sliders.cpp
@@ -151,7 +151,7 @@ void menu_sliders::populate(float &customtop, float &custombottom)
// add UI sliders
std::vector<menu_item> ui_sliders = ui().get_slider_list();
- for (menu_item item : ui_sliders)
+ for (const menu_item &item : ui_sliders)
{
if (item.type == menu_item_type::SLIDER)
{
@@ -180,7 +180,7 @@ void menu_sliders::populate(float &customtop, float &custombottom)
// add OSD options
std::vector<menu_item> osd_sliders = machine().osd().get_slider_list();
- for (menu_item item : osd_sliders)
+ for (const menu_item &item : osd_sliders)
{
if (item.type == menu_item_type::SLIDER)
{
diff --git a/src/frontend/mame/ui/tapectrl.cpp b/src/frontend/mame/ui/tapectrl.cpp
index 0784ed72d26..1517554efd9 100644
--- a/src/frontend/mame/ui/tapectrl.cpp
+++ b/src/frontend/mame/ui/tapectrl.cpp
@@ -87,7 +87,7 @@ void menu_tape_control::populate(float &customtop, float &custombottom)
? ((state & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_ENABLED ? _("playing") : _("(playing)"))
: ((state & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_ENABLED ? _("recording") : _("(recording)"))
),
- timepos.c_str(),
+ timepos,
tapeflags,
TAPECMD_SLIDER);
diff --git a/src/lib/formats/ap2_dsk.cpp b/src/lib/formats/ap2_dsk.cpp
index f7687c0cc66..9e71303ece5 100644
--- a/src/lib/formats/ap2_dsk.cpp
+++ b/src/lib/formats/ap2_dsk.cpp
@@ -496,19 +496,19 @@ static uint32_t apple2_get_track_size(floppy_image_legacy *floppy, int head, int
LEGACY_FLOPPY_OPTIONS_START( apple2 )
LEGACY_FLOPPY_OPTION( apple2_do, "do,dsk,bin", "Apple ][ DOS order disk image", apple2_dsk_identify, apple2_do_construct, nullptr,
HEADS([1])
- TRACKS([APPLE2_TRACK_COUNT])
+ TRACKS([40]) // APPLE2_TRACK_COUNT
SECTORS([16])
SECTOR_LENGTH([256])
FIRST_SECTOR_ID([0]))
LEGACY_FLOPPY_OPTION( apple2_po, "po,dsk,bin", "Apple ][ ProDOS order disk image", apple2_dsk_identify, apple2_po_construct, nullptr,
HEADS([1])
- TRACKS([APPLE2_TRACK_COUNT])
+ TRACKS([40]) // APPLE2_TRACK_COUNT
SECTORS([16])
SECTOR_LENGTH([256])
FIRST_SECTOR_ID([0]))
LEGACY_FLOPPY_OPTION( apple2_nib, "dsk,nib", "Apple ][ Nibble order disk image", apple2_nib_identify, apple2_nib_construct, nullptr,
HEADS([1])
- TRACKS([APPLE2_TRACK_COUNT])
+ TRACKS([40]) // APPLE2_TRACK_COUNT
SECTORS([16])
SECTOR_LENGTH([256])
FIRST_SECTOR_ID([0]))
diff --git a/src/lib/formats/jvc_dsk.cpp b/src/lib/formats/jvc_dsk.cpp
index 5035e989f22..f5de872c672 100644
--- a/src/lib/formats/jvc_dsk.cpp
+++ b/src/lib/formats/jvc_dsk.cpp
@@ -150,8 +150,8 @@ bool jvc_format::parse_header(io_generic *io, int &header_size, int &tracks, int
switch (header_size)
{
- case 5: emu_fatalerror("jvc_format: sector attribute flag unsupported\n");
- break;
+ case 5:
+ throw emu_fatalerror("jvc_format: sector attribute flag unsupported\n");
case 4: base_sector_id = header[3];
// no break
case 3: sector_size = 128 << header[2];
@@ -184,7 +184,7 @@ bool jvc_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
// safety check
if (sector_count * sector_size > 10000)
- emu_fatalerror("jvc_format: incorrect track layout\n");
+ throw emu_fatalerror("jvc_format: incorrect track layout\n");
int file_offset = header_size;
@@ -253,7 +253,7 @@ bool jvc_format::save(io_generic *io, floppy_image *image)
for (int i = 0; i < 18; i++)
{
if (sectors[1 + i].size != 256)
- emu_fatalerror("jvc_format: invalid sector size: %d\n", sectors[1 + i].size);
+ throw emu_fatalerror("jvc_format: invalid sector size: %d\n", sectors[1 + i].size);
io_generic_write(io, sectors[1 + i].data, file_offset, sectors[1 + i].size);
file_offset += sectors[1 + i].size;
diff --git a/src/lib/util/options.cpp b/src/lib/util/options.cpp
index 5def23aa5ff..bc7b72f896d 100644
--- a/src/lib/util/options.cpp
+++ b/src/lib/util/options.cpp
@@ -520,7 +520,7 @@ void core_options::add_entry(const options_entry &opt, bool override_existing)
{
for (const std::string &name : names)
{
- existing_entry = get_entry(name.c_str());
+ existing_entry = get_entry(name);
if (existing_entry)
break;
}
diff --git a/src/lib/util/zippath.cpp b/src/lib/util/zippath.cpp
index 2d44cfc4b4b..760c64fd066 100644
--- a/src/lib/util/zippath.cpp
+++ b/src/lib/util/zippath.cpp
@@ -264,7 +264,7 @@ osd_file::error zippath_resolve(const char *path, osd::directory::entry::entry_t
apath = zippath_parent(apath);
}
}
- while ((current_entry_type == osd::directory::entry::entry_type::NONE) && !is_root(apath.c_str()));
+ while ((current_entry_type == osd::directory::entry::entry_type::NONE) && !is_root(apath));
// if we did not find anything, then error out
if (current_entry_type == osd::directory::entry::entry_type::NONE)
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 3aff97d4909..1e96311ddda 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -250,7 +250,7 @@ void bbcm_state::bbcm_bankdev(address_map &map)
map(0x023c, 0x023f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe3c-fe3f INTON
map(0x0240, 0x025f).mirror(0x400).m(m_via6522_0, FUNC(via6522_device::map)); // fe40-fe5f 6522 VIA SYSTEM VIA
map(0x0260, 0x027f).mirror(0x400).m(m_via6522_1, FUNC(via6522_device::map)); // fe60-fe7f 6522 VIA USER VIA
- map(0x0280, 0x029f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe80-fe9f Int. Modem Int. Modem
+ map(0x0280, 0x029f).mirror(0x400).rw(m_modem, FUNC(bbc_modem_slot_device::read), FUNC(bbc_modem_slot_device::write)); // fe80-fe9f Int. Modem Int. Modem
map(0x02a0, 0x02bf).mirror(0x400).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); // fea0-febf 68B54 ADLC ECONET controller
map(0x02e0, 0x02ff).mirror(0x400).rw(FUNC(bbc_state::bbcm_tube_r), FUNC(bbc_state::bbcm_tube_w)); // fee0-feff Tube ULA Tube system interface
/* ACCCON TST bit - hardware test */
@@ -1095,29 +1095,21 @@ void torch_state::torchf(machine_config &config)
FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies, "525qd", bbc_state::floppy_formats, true).enable_sound(true);
FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies, "525qd", bbc_state::floppy_formats).enable_sound(true);
- /* Add Torch Z80 Communicator co-processor */
+ /* Torch Z80 Communicator co-processor */
m_tube->set_default_option("zep100");
m_tube->set_fixed(true);
}
-void torch_state::torchh10(machine_config &config)
-{
- torchf(config);
- /* fdc */
- m_i8271->subdevice<floppy_connector>("1")->set_default_option(nullptr);
-
- /* 10MB HDD */
-}
-
-
-void torch_state::torchh21(machine_config &config)
+void torch_state::torchh(machine_config &config)
{
torchf(config);
/* fdc */
m_i8271->subdevice<floppy_connector>("1")->set_default_option(nullptr);
- /* 21MB HDD */
+ /* 10MB or 21MB HDD */
+ //m_1mhzbus->set_default_option("sasi");
+ //m_1mhzbus->set_fixed(true);
}
@@ -1201,9 +1193,9 @@ void bbcbp_state::abc110(machine_config &config)
m_tube->set_default_option("z80");
m_tube->set_fixed(true);
- /* Adaptec ACB-4000 Winchester Disc Controller */
-
- /* 10MB ST-412 Winchester */
+ /* Acorn Winchester Disc 10MB */
+ m_1mhzbus->set_default_option("awhd");
+ m_1mhzbus->set_fixed(true);
/* software lists */
config.device_remove("cass_ls_a");
@@ -1223,13 +1215,9 @@ void bbcbp_state::acw443(machine_config &config)
//m_tube->set_default_option("32016");
//m_tube->set_fixed(true);
- /* Adaptec ACB-4000 Winchester Disc Controller */
- //m_1mhzbus->set_default_option("awdd");
- //m_1mhzbus->set_fixed(true);
-
- /* 10MB ST-412 Winchester ABC210 */
-
- /* 20MB ST-412 Winchester Cambridge */
+ /* Acorn Winchester Disc 20MB */
+ m_1mhzbus->set_default_option("awhd");
+ m_1mhzbus->set_fixed(true);
/* software lists */
SOFTWARE_LIST(config, "flop_ls_32016").set_original("bbc_flop_32016");
@@ -1250,9 +1238,9 @@ void bbcbp_state::abc310(machine_config &config)
m_tube->set_default_option("80286");
m_tube->set_fixed(true);
- /* Adaptec ACB-4000 Winchester Disc Controller */
-
- /* 10MB ST-412 Winchester */
+ /* Acorn Winchester Disc 10MB */
+ m_1mhzbus->set_default_option("awhd");
+ m_1mhzbus->set_fixed(true);
/* software lists */
config.device_remove("cass_ls_a");
@@ -1510,6 +1498,10 @@ void bbcm_state::bbcm(machine_config &config)
m_internal->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<8>));
m_internal->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
+ /* internal modem port */
+ BBC_MODEM_SLOT(config, m_modem, 16_MHz_XTAL / 16, bbcm_modem_devices, nullptr);
+ m_modem->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<9>));
+
/* software lists */
SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass");
SOFTWARE_LIST(config, "flop_ls_m").set_original("bbcm_flop");
@@ -1538,7 +1530,9 @@ void bbcm_state::bbcmaiv(machine_config &config)
m_intube->set_default_option("65c102");
m_intube->set_fixed(true);
- /* Add Philips VP415 Laserdisc player */
+ /* Philips VP415 Laserdisc player */
+ m_modem->set_default_option("scsiaiv");
+ m_modem->set_fixed(true);
/* Acorn Tracker Ball */
m_userport->set_default_option("tracker");
@@ -1587,6 +1581,7 @@ void bbcm_state::bbcmet(machine_config &config)
config.device_remove("extube");
config.device_remove("1mhzbus");
config.device_remove("userport");
+ config.device_remove("modem");
}
@@ -1608,6 +1603,9 @@ void bbcm_state::bbcmarm(machine_config &config)
/* Acorn ARM co-processor */
m_extube->set_default_option("arm");
m_extube->set_fixed(true);
+
+ /* Acorn Winchester Disc */
+ m_1mhzbus->set_default_option("awhd");
}
@@ -1765,6 +1763,7 @@ void bbcm_state::bbcmc(machine_config &config)
config.device_remove("extube");
config.device_remove("userport");
config.device_remove("internal");
+ config.device_remove("modem");
}
@@ -1918,8 +1917,7 @@ ROM_START(torchf)
ROM_END
-#define rom_torchh10 rom_torchf
-#define rom_torchh21 rom_torchf
+#define rom_torchh rom_torchf
ROM_START(bbcbp)
@@ -2507,8 +2505,7 @@ ROM_END
COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model B", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1982, torchf, bbcb, 0, torchf, torch, torch_state, init_bbc, "Torch Computers", "Torch CF240", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/10", MACHINE_NOT_WORKING)
-COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240/21", MACHINE_NOT_WORKING)
+COMP ( 1982, torchh, bbcb, 0, torchh, torch, torch_state, init_bbc, "Torch Computers", "Torch CH240", MACHINE_NOT_WORKING)
COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, init_bbc, "Acorn Computers", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbcbp_state, init_bbc, "Acorn Computers", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS)
diff --git a/src/mame/drivers/bnstars.cpp b/src/mame/drivers/bnstars.cpp
index 99a690d1256..35e67a5e9ed 100644
--- a/src/mame/drivers/bnstars.cpp
+++ b/src/mame/drivers/bnstars.cpp
@@ -441,6 +441,7 @@ void bnstars_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co
flipy = !flipy;
}
+ pri >>= 4;
/* TODO: priority handling is completely wrong, but better than nothing */
if (pri == 0x0)
pri_mask = 0x00;
diff --git a/src/mame/drivers/expro02.cpp b/src/mame/drivers/expro02.cpp
index 875febac064..494d384efa3 100644
--- a/src/mame/drivers/expro02.cpp
+++ b/src/mame/drivers/expro02.cpp
@@ -390,7 +390,8 @@ uint32_t expro02_state::screen_update_backgrounds(screen_device &screen, bitmap_
uint32_t expro02_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen_update_backgrounds(screen, bitmap, cliprect);
- m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram, m_spriteram.bytes());
+ m_kaneko_spr->render_sprites(cliprect, m_spriteram, m_spriteram.bytes());
+ m_kaneko_spr->copybitmap(bitmap, cliprect, screen.priority());
return 0;
}
diff --git a/src/mame/drivers/ffantasy_ms.cpp b/src/mame/drivers/ffantasy_ms.cpp
index 2ff31f205a7..8bed6ad31ac 100644
--- a/src/mame/drivers/ffantasy_ms.cpp
+++ b/src/mame/drivers/ffantasy_ms.cpp
@@ -167,4 +167,4 @@ ROM_START( ffantasym )
ROM_LOAD( "ff_5-1_5235_gal16v8.ic8", 0x000, 0x117, NO_DUMP )
ROM_END
-GAME( 199?, ffantasym, ffantasy, ffantasym, ffantasym, ffantasy_ms_state, empty_init, ROT0, "bootleg (Gaelco / Ervisa)", "Fighting Fantasy (Modular System)", MACHINE_IS_SKELETON )
+GAME( 199?, ffantasym, hippodrm, ffantasym, ffantasym, ffantasy_ms_state, empty_init, ROT0, "bootleg (Gaelco / Ervisa)", "Fighting Fantasy (Modular System)", MACHINE_IS_SKELETON )
diff --git a/src/mame/drivers/galpanic_ms.cpp b/src/mame/drivers/galpanic_ms.cpp
index 01d62d747b1..d74847c5b40 100644
--- a/src/mame/drivers/galpanic_ms.cpp
+++ b/src/mame/drivers/galpanic_ms.cpp
@@ -154,7 +154,8 @@ uint32_t galspanic_ms_state::screen_update_backgrounds(screen_device &screen, bi
uint32_t galspanic_ms_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen_update_backgrounds(screen, bitmap, cliprect);
-// m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram, m_spriteram.bytes());
+// m_kaneko_spr->render_sprites(cliprect, m_spriteram, m_spriteram.bytes());
+// m_kaneko_spr->copybitmap(bitmap, cliprect, screen.priority());
return 0;
}
diff --git a/src/mame/drivers/gigatron.cpp b/src/mame/drivers/gigatron.cpp
index c14df7cbafd..9b5953de55f 100644
--- a/src/mame/drivers/gigatron.cpp
+++ b/src/mame/drivers/gigatron.cpp
@@ -7,10 +7,13 @@
***************************************************************************/
+//There is a pre-existing emulator here https://github.com/PhilThomas/gigatron
+//It's just a matter of translating it to MAME.
+
#include "emu.h"
-#include "cpu/m6502/m6502.h"
-//#include "cpu/gigatron/gigatron.h"
+#include "cpu/gigatron/gigatron.h"
#include "machine/nvram.h"
+#include "screen.h"
#include "speaker.h"
#define MAIN_CLOCK 6250000
@@ -26,25 +29,65 @@ public:
void gigatron(machine_config &config);
+
private:
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void prog_map(address_map &map);
+ void data_map(address_map &map);
+
required_device<cpu_device> m_maincpu;
};
+uint32_t gigatron_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+void gigatron_state::prog_map(address_map &map)
+{
+ map(0x0000, 0x3fff).rom().region("maincpu", 0);
+}
+
+void gigatron_state::data_map(address_map &map)
+{
+}
+
+void gigatron_state::machine_start()
+{
+}
+
+void gigatron_state::machine_reset()
+{
+}
+
static INPUT_PORTS_START(gigatron)
INPUT_PORTS_END
void gigatron_state::gigatron(machine_config &config)
{
- M6502(config, m_maincpu, MAIN_CLOCK); // actually its own custom cpu but i cant get it to work
- //GTRON(config, m_maincpu, MAIN_CLOCK);
+ GTRON(config, m_maincpu, MAIN_CLOCK);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gigatron_state::prog_map);
+ m_maincpu->set_addrmap(AS_DATA, &gigatron_state::data_map);
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 640-1, 0, 480-1);
+ screen.set_screen_update(FUNC(gigatron_state::screen_update));
+
SPEAKER(config, "mono").front_center();
}
ROM_START( gigatron )
- ROM_REGION( 0x00000, "maincpu", 0 )
+ ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "gigatron.rom", 0x0000, 0x20000, CRC(78995109) SHA1(2395fc48e64099836111f5aeca39ddbf4650ea4e) )
ROM_END
-GAME(199?, gigatron, 0, gigatron, gigatron, gigatron_state, empty_init, ROT0, "Marcel van Kervinck", "Gigatron TTL Microcomputer", MACHINE_IS_SKELETON_MECHANICAL) \ No newline at end of file
+COMP(2018, gigatron, 0, 0, gigatron, gigatron, gigatron_state, empty_init, "Marcel van Kervinck", "Gigatron TTL Microcomputer", MACHINE_IS_SKELETON)
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index a9d7178c35b..d4d218091f9 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -23,7 +23,8 @@ TODO:
- confirm gnw_bfight rom (assumed to be the same as gnw_bfightn)
- confirm gnw_climber rom (assumed to be the same as gnw_climbern)
- confirm gnw_smb rom (assumed to be the same as gnw_smbn)
-- dump/add purple version of gnw_judge
+- dump/add purple version of gnw_judge, different MCU label?
+- dump/add 2nd version of gnw_mariocmt, different MCU label?
- dump/add CN-07 version of gnw_helmet
- Currently there is no accurate way to dump the SM511/SM512 melody ROM
electronically. For the ones that weren't decapped, they were read by
@@ -2792,6 +2793,8 @@ ROM_END
This is the tabletop version. There's also a new wide screen version which is
a different game. Unlike the other tabletop games, there is no panorama version.
+ There are two known versions, distinguished by the startup jingle. The first
+ version sounds like Queen's "Another One Bites the Dust".
***************************************************************************/
diff --git a/src/mame/drivers/jazz.cpp b/src/mame/drivers/jazz.cpp
index a663a38a78b..8f18f685cc6 100644
--- a/src/mame/drivers/jazz.cpp
+++ b/src/mame/drivers/jazz.cpp
@@ -135,7 +135,7 @@ void jazz_state::jazz_common_map(address_map &map)
map(0x60080000, 0x60081fff).m(m_cvc, FUNC(g364_device::map));
map(0x60180000, 0x60180007).lw32([this] (u32 data) { m_cvc->reset(); }, "g364_reset");
- map(0x80000000, 0x80000fff).m(m_mct_adr, FUNC(jazz_mct_adr_device::map));
+ map(0x80000000, 0x80000fff).m(m_mct_adr, FUNC(mct_adr_device::map));
map(0x80001000, 0x800010ff).m(m_net, FUNC(dp83932c_device::map)).umask32(0x0000ffff);
map(0x80002000, 0x8000200f).m(m_scsi, FUNC(ncr53c94_device::map));
@@ -185,8 +185,8 @@ void jazz_state::jazz_common_map(address_map &map)
//map(0x92000000, 0x92ffffff).m(); // EISA I/O ports?
//map(0x93000000, 0x93ffffff).m(); // EISA memory
- map(0xf0000000, 0xf0000007).r(m_mct_adr, FUNC(jazz_mct_adr_device::isr_r)).umask64(0xffff);
- map(0xf0000000, 0xf0000007).rw(m_mct_adr, FUNC(jazz_mct_adr_device::imr_r), FUNC(jazz_mct_adr_device::imr_w)).umask64(0xffff0000);
+ map(0xf0000000, 0xf0000007).r(m_mct_adr, FUNC(mct_adr_device::isr_r)).umask64(0xffff);
+ map(0xf0000000, 0xf0000007).rw(m_mct_adr, FUNC(mct_adr_device::imr_r), FUNC(mct_adr_device::imr_w)).umask64(0xffff0000);
map(0xfff00000, 0xfff3ffff).r(m_flash, FUNC(amd_28f020_device::read)); // mirror?
}
@@ -217,7 +217,7 @@ void jazz_state::jazz(machine_config &config)
m_vram->set_default_value(0);
// local bus dma, timer and interrupt controller
- JAZZ_MCT_ADR(config, m_mct_adr, 0);
+ MCT_ADR(config, m_mct_adr, 0);
m_mct_adr->set_bus(m_cpu, 0);
m_mct_adr->out_int_dma_cb().set_inputline(m_cpu, INPUT_LINE_IRQ0);
m_mct_adr->out_int_device_cb().set_inputline(m_cpu, INPUT_LINE_IRQ1);
@@ -240,17 +240,17 @@ void jazz_state::jazz(machine_config &config)
{
ncr53c94_device &adapter = downcast<ncr53c94_device &>(*device);
- adapter.irq_handler_cb().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<5>));;
- adapter.drq_handler_cb().set(m_mct_adr, FUNC(jazz_mct_adr_device::drq<0>));
+ adapter.irq_handler_cb().set(m_mct_adr, FUNC(mct_adr_device::irq<5>));;
+ adapter.drq_handler_cb().set(m_mct_adr, FUNC(mct_adr_device::drq<0>));
- subdevice<jazz_mct_adr_device>(":mct_adr")->dma_r_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_r));
- subdevice<jazz_mct_adr_device>(":mct_adr")->dma_w_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_w));
+ subdevice<mct_adr_device>(":mct_adr")->dma_r_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_r));
+ subdevice<mct_adr_device>(":mct_adr")->dma_w_cb<0>().set(adapter, FUNC(ncr53c94_device::dma_w));
});
// floppy controller and drive
N82077AA(config, m_fdc, 24_MHz_XTAL);
- m_fdc->intrq_wr_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<1>));
- m_fdc->drq_wr_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::drq<1>));
+ m_fdc->intrq_wr_callback().set(m_mct_adr, FUNC(mct_adr_device::irq<1>));
+ m_fdc->drq_wr_callback().set(m_mct_adr, FUNC(mct_adr_device::drq<1>));
FLOPPY_CONNECTOR(config, "fdc:0", "35hd", FLOPPY_35_HD, true, jazz_state::floppy_formats).enable_sound(false);
m_mct_adr->dma_r_cb<1>().set(m_fdc, FUNC(n82077aa_device::dma_r));
m_mct_adr->dma_w_cb<1>().set(m_fdc, FUNC(n82077aa_device::dma_w));
@@ -283,18 +283,18 @@ void jazz_state::jazz(machine_config &config)
// keyboard controller
PS2_KEYBOARD_CONTROLLER(config, m_kbdc, 12_MHz_XTAL);
// FIXME: reset is probably routed through the MCT-ADR
- m_kbdc->hot_res().set([this](int state) { logerror("reset %d\n", state); });
+ m_kbdc->hot_res().set([this](int state) { machine().schedule_soft_reset(); });
m_kbdc->kbd_clk().set(kbd_con, FUNC(pc_kbdc_device::clock_write_from_mb));
m_kbdc->kbd_data().set(kbd_con, FUNC(pc_kbdc_device::data_write_from_mb));
- m_kbdc->kbd_irq().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<6>));
+ m_kbdc->kbd_irq().set(m_mct_adr, FUNC(mct_adr_device::irq<6>));
m_kbdc->aux_clk().set(aux_con, FUNC(pc_kbdc_device::clock_write_from_mb));
m_kbdc->aux_data().set(aux_con, FUNC(pc_kbdc_device::data_write_from_mb));
- m_kbdc->aux_irq().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<7>));
+ m_kbdc->aux_irq().set(m_mct_adr, FUNC(mct_adr_device::irq<7>));
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(78643200, 1280, 0, 1280, 1024, 0, 1024);
m_screen->set_screen_update(m_cvc, FUNC(g364_device::screen_update));
- m_screen->screen_vblank().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<3>)); // maybe?
+ m_screen->screen_vblank().set(m_mct_adr, FUNC(mct_adr_device::irq<3>)); // maybe?
G364(config, m_cvc, 5_MHz_XTAL); // FIXME: guessed clock
m_cvc->set_screen(m_screen);
@@ -307,7 +307,7 @@ void jazz_state::jazz(machine_config &config)
m_ace[0]->out_dtr_callback().set(serial0, FUNC(rs232_port_device::write_dtr));
m_ace[0]->out_rts_callback().set(serial0, FUNC(rs232_port_device::write_rts));
m_ace[0]->out_tx_callback().set(serial0, FUNC(rs232_port_device::write_txd));
- m_ace[0]->out_int_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<8>));
+ m_ace[0]->out_int_callback().set(m_mct_adr, FUNC(mct_adr_device::irq<8>));
serial0.cts_handler().set(m_ace[0], FUNC(ns16550_device::cts_w));
serial0.dcd_handler().set(m_ace[0], FUNC(ns16550_device::dcd_w));
@@ -321,7 +321,7 @@ void jazz_state::jazz(machine_config &config)
m_ace[1]->out_dtr_callback().set(serial1, FUNC(rs232_port_device::write_dtr));
m_ace[1]->out_rts_callback().set(serial1, FUNC(rs232_port_device::write_rts));
m_ace[1]->out_tx_callback().set(serial1, FUNC(rs232_port_device::write_txd));
- m_ace[1]->out_int_callback().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<9>));
+ m_ace[1]->out_int_callback().set(m_mct_adr, FUNC(mct_adr_device::irq<9>));
serial1.cts_handler().set(m_ace[1], FUNC(ns16550_device::cts_w));
serial1.dcd_handler().set(m_ace[1], FUNC(ns16550_device::dcd_w));
@@ -330,7 +330,7 @@ void jazz_state::jazz(machine_config &config)
serial1.rxd_handler().set(m_ace[1], FUNC(ns16550_device::rx_w));
PC_LPT(config, m_lpt, 0);
- m_lpt->irq_handler().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<0>));
+ m_lpt->irq_handler().set(m_mct_adr, FUNC(mct_adr_device::irq<0>));
// TODO: sound, interrupt 2, drq 2(l) & 3(r)
@@ -340,8 +340,8 @@ void jazz_state::jazz(machine_config &config)
m_buzzer->add_route(ALL_OUTPUTS, "mono", 0.50);
DP83932C(config, m_net, 20_MHz_XTAL);
- m_net->out_int_cb().set(m_mct_adr, FUNC(jazz_mct_adr_device::irq<4>));
- m_net->set_ram(m_ram);
+ m_net->out_int_cb().set(m_mct_adr, FUNC(mct_adr_device::irq<4>));
+ m_net->set_bus(m_mct_adr, 0);
I82357(config, m_isp, 14.318181_MHz_XTAL);
m_isp->out_rtc_cb().set(m_rtc, FUNC(mc146818_device::write));
@@ -378,6 +378,6 @@ ROM_START(mmr4000le)
ROMX_LOAD("ntprom.bin", 0x00000, 0x40000, CRC(d91018d7) SHA1(316de17820192c89b8ee6d9936ab8364a739ca53), ROM_BIOS(0))
ROM_END
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1992, mmr4000be, 0, 0, mmr4000be, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (big)", MACHINE_NOT_WORKING)
-COMP( 1992, mmr4000le, 0, 0, mmr4000le, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (little)", MACHINE_NO_SOUND | MACHINE_NODEVICE_LAN)
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP(1992, mmr4000be, 0, 0, mmr4000be, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (be)", MACHINE_NOT_WORKING)
+COMP(1992, mmr4000le, 0, 0, mmr4000le, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (le)", MACHINE_NO_SOUND)
diff --git a/src/mame/drivers/kaneko16.cpp b/src/mame/drivers/kaneko16.cpp
index b2be12a98b0..3c420532105 100644
--- a/src/mame/drivers/kaneko16.cpp
+++ b/src/mame/drivers/kaneko16.cpp
@@ -86,7 +86,6 @@ Dip locations verified from manual for:
[general]
- interrupt timing/behaviour
-- replace sample bank copying with new ADDRESS MAP system for OKI and do banking like CPUs
Non-Bugs (happen on real PCB)
@@ -308,9 +307,7 @@ void kaneko16_state::bakubrkr_map(address_map &map)
{
map(0x000000, 0x07ffff).rom(); // ROM
map(0x100000, 0x10ffff).ram(); // Work RAM
- map(0x400000, 0x40001f).r(FUNC(kaneko16_state::ym2149_r<0>)); // Sound
- map(0x400000, 0x40001d).w(FUNC(kaneko16_state::ym2149_w<0>));
- map(0x40001f, 0x40001f).w(FUNC(kaneko16_state::oki_bank0_w<7>)); // OKI bank Switch
+ map(0x400000, 0x40001f).rw(FUNC(kaneko16_state::ym2149_r<0>), FUNC(kaneko16_state::ym2149_w<0>)); // Sound
map(0x400200, 0x40021f).rw(FUNC(kaneko16_state::ym2149_r<1>), FUNC(kaneko16_state::ym2149_w<1>)); // Sound
map(0x400401, 0x400401).rw(m_oki[0], FUNC(okim6295_device::read), FUNC(okim6295_device::write)); //
map(0x500000, 0x503fff).m(m_view2[0], FUNC(kaneko_view2_tilemap_device::vram_map));
@@ -1659,6 +1656,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(kaneko16_state::interrupt)
// main vblank interrupt
if (scanline == 224)
{
+ // 2 frame delayed normaly; differs per PCB?
+ m_kaneko_spr->render_sprites(m_screen->visible_area(), m_spriteram->buffer(), m_spriteram->bytes());
m_spriteram->copy();
m_maincpu->set_input_line(5, HOLD_LINE);
}
@@ -1789,6 +1788,7 @@ void kaneko16_state::bakubrkr(machine_config &config)
YM2149(config, m_ym2149[0], XTAL(12'000'000)/6); /* verified on pcb */
m_ym2149[0]->add_route(ALL_OUTPUTS, "mono", 1.0);
+ m_ym2149[0]->port_b_write_callback().set(FUNC(kaneko16_state::oki_bank0_w<7>)); /* outputs B: OKI bank Switch */
YM2149(config, m_ym2149[1], XTAL(12'000'000)/6); /* verified on pcb */
m_ym2149[1]->add_route(ALL_OUTPUTS, "mono", 1.0);
@@ -2139,8 +2139,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(kaneko16_shogwarr_state::shogwarr_interrupt)
if (scanline == 224)
{
- m_spriteram->copy(); // TODO : shogwarr sprites are 1 frame delayed? reference : https://youtu.be/aj4ayOc4MuI
- // the code for this interrupt is provided by the MCU..
+ m_kaneko_spr->render_sprites(m_screen->visible_area(), m_spriteram->buffer(), m_spriteram->bytes());
+ m_spriteram->copy();
m_maincpu->set_input_line(4, HOLD_LINE);
}
@@ -2924,7 +2924,6 @@ ROM_START( bloodwar )
ROM_REGION( 0x020000, "mcudata", 0 ) /* MCU Code */
ROM_LOAD16_WORD_SWAP( "ofd0x3.124", 0x000000, 0x020000, CRC(399f2005) SHA1(ff0370724770c35963953fd9596d9f808ba87d8f) )
-
ROM_REGION( 0x1e00000, "kan_spr", 0 ) /* Sprites */
ROM_LOAD ( "of-200-0201.8", 0x0000000, 0x200000, CRC(bba63025) SHA1(daec5285469ee953f6f838fe3cb3903524e9ac39) )
ROM_LOAD ( "of-201-0202.9", 0x0200000, 0x200000, CRC(4ffd9ddc) SHA1(62bc8c0ed2efab407fc2956c514c3e732bcc47ee) )
diff --git a/src/mame/drivers/konendev.cpp b/src/mame/drivers/konendev.cpp
index d61bef2d23a..34be211fbec 100644
--- a/src/mame/drivers/konendev.cpp
+++ b/src/mame/drivers/konendev.cpp
@@ -38,6 +38,7 @@
#include "cpu/powerpc/ppc.h"
#include "machine/eepromser.h"
#include "machine/nvram.h"
+#include "machine/msm6242.h"
#include "sound/ymz280b.h"
#include "video/k057714.h"
#include "emupal.h"
@@ -52,6 +53,7 @@ public:
, m_maincpu(*this, "maincpu")
, m_gcu(*this, "gcu")
, m_eeprom(*this, "eeprom")
+ , m_rtc(*this, "rtc")
{ }
void init_konendev();
@@ -65,8 +67,6 @@ private:
DECLARE_READ32_MEMBER(ctrl0_r);
DECLARE_READ32_MEMBER(ctrl1_r);
DECLARE_READ32_MEMBER(ctrl2_r);
- DECLARE_READ32_MEMBER(rtc_r);
- DECLARE_WRITE32_MEMBER(rtc_w);
DECLARE_WRITE32_MEMBER(eeprom_w);
DECLARE_READ32_MEMBER(sound_data_r);
DECLARE_WRITE32_MEMBER(sound_data_w);
@@ -84,6 +84,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device<k057714_device> m_gcu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
+ required_device<rtc62423_device> m_rtc;
};
uint32_t konendev_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@@ -134,49 +135,6 @@ READ32_MEMBER(konendev_state::ifu2_r)
return r;
}
-// This seems to be Epson RTC-72423
-uint8_t konendev_state::rtc_dev_r(uint32_t reg)
-{
- switch (reg)
- {
- case 0x0: return 9;
- case 0x1: return 5;
- case 0x2: return 3;
- case 0x3: return 2;
- case 0x4: return 1;
- case 0x5: return 0;
- case 0x6: return 7;
- case 0x7: return 2;
- case 0x8: return 2;
- case 0x9: return 1;
- case 0xa: return 5;
- case 0xb: return 1;
- case 0xc: return 3;
- }
-
- return 0;
-}
-
-READ32_MEMBER(konendev_state::rtc_r)
-{
- uint32_t r = 0;
-
- if (ACCESSING_BITS_24_31)
- r |= (uint32_t)(rtc_dev_r(offset * 4)) << 24;
- if (ACCESSING_BITS_16_23)
- r |= (uint32_t)(rtc_dev_r((offset * 4)+1)) << 16;
- if (ACCESSING_BITS_8_15)
- r |= (uint32_t)(rtc_dev_r((offset * 4)+2)) << 8;
- if (ACCESSING_BITS_0_7)
- r |= (uint32_t)(rtc_dev_r((offset * 4)+3));
-
- return r;
-}
-
-WRITE32_MEMBER(konendev_state::rtc_w)
-{
-}
-
READ32_MEMBER(konendev_state::ctrl0_r)
{
return ((uint32_t)(ioport("IN1")->read() & 0xffff) << 16) | 0xffff;
@@ -218,7 +176,7 @@ void konendev_state::konendev_map(address_map &map)
{
map(0x00000000, 0x00ffffff).ram();
map(0x78000000, 0x78000003).r(FUNC(konendev_state::mcu2_r));
- map(0x78080000, 0x7808000f).rw(FUNC(konendev_state::rtc_r), FUNC(konendev_state::rtc_w));
+ map(0x78080000, 0x7808000f).rw(m_rtc, FUNC(rtc62423_device::read), FUNC(rtc62423_device::write));
map(0x780c0000, 0x780c0003).rw(FUNC(konendev_state::sound_data_r), FUNC(konendev_state::sound_data_w));
map(0x78100000, 0x78100003).w(FUNC(konendev_state::eeprom_w));
map(0x78800000, 0x78800003).r(FUNC(konendev_state::ifu2_r));
@@ -325,6 +283,8 @@ void konendev_state::konendev(machine_config &config)
K057714(config, m_gcu, 0);
m_gcu->irq_callback().set(FUNC(konendev_state::gcu_interrupt));
+ RTC62423(config, m_rtc, XTAL(32'768));
+
NVRAM(config, "nvram0", nvram_device::DEFAULT_ALL_0);
NVRAM(config, "nvram1", nvram_device::DEFAULT_ALL_0);
diff --git a/src/mame/drivers/konmedal.cpp b/src/mame/drivers/konmedal.cpp
index d80b9c6f5f9..bbc9ada2d11 100644
--- a/src/mame/drivers/konmedal.cpp
+++ b/src/mame/drivers/konmedal.cpp
@@ -62,7 +62,7 @@ public:
m_palette(*this, "palette"),
m_ymz(*this, "ymz"),
m_oki(*this, "oki"),
- m_upd7759(*this, "upd7759"),
+ m_upd7759(*this, "upd"),
m_nvram(*this, "nvram"),
m_outport(*this, "OUT")
{ }
@@ -136,6 +136,10 @@ WRITE8_MEMBER(konmedal_state::control2_w)
{
//printf("%02x to control2\n", data);
m_control2 = data;
+
+ // note: this is needed because games clear reset line and assert start line at the same time, but MAME's outport can't handle right order
+ if (m_upd7759)
+ m_upd7759->reset_w((data & 2) ? 1 : 0);
m_outport->write(data);
}
@@ -452,6 +456,17 @@ static INPUT_PORTS_START( konmedal )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("hopper", hopper_device, motor_w)
INPUT_PORTS_END
+static INPUT_PORTS_START( shuriboy )
+ PORT_INCLUDE( konmedal )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("upd", upd7759_device, busy_r)
+
+ PORT_MODIFY("OUT")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("upd", upd7759_device, reset_w) // this should be called 1st, but it's not
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OUTPUT ) PORT_WRITE_LINE_DEVICE_MEMBER("upd", upd7759_device, start_w)
+INPUT_PORTS_END
+
void konmedal_state::machine_start()
{
membank("bank1")->configure_entries(0, 0x10, memregion("maincpu")->base(), 0x2000);
@@ -660,7 +675,7 @@ void konmedal_state::shuriboy(machine_config &config)
K051649(config, "k051649", XTAL(24'000'000) / 12).add_route(ALL_OUTPUTS, "mono", 0.45); // divisor unknown
- UPD7759(config, m_upd7759);
+ UPD7759(config, m_upd7759, XTAL(640'000)).add_route(ALL_OUTPUTS, "mono", 0.60);
}
void konmedal_state::fuusenpn(machine_config &config)
@@ -892,9 +907,9 @@ ROM_START( mariorou )
ROM_END
// K052109 (TMNT tilemaps) board
-GAME( 1991, mariorou, 0, mariorou, konmedal, konmedal_state, shuri_init, ROT0, "Konami", "Mario Roulette", MACHINE_NOT_WORKING)
-GAME( 1993, shuriboy, 0, shuriboy, konmedal, konmedal_state, shuri_init, ROT0, "Konami", "Shuriken Boy", MACHINE_NOT_WORKING)
-GAME( 1993, fuusenpn, 0, fuusenpn, konmedal, konmedal_state, shuri_init, ROT0, "Konami", "Fuusen Pentai", MACHINE_NOT_WORKING)
+GAME( 1991, mariorou, 0, mariorou, shuriboy, konmedal_state, shuri_init, ROT0, "Konami", "Mario Roulette", MACHINE_NOT_WORKING)
+GAME( 1993, shuriboy, 0, shuriboy, shuriboy, konmedal_state, shuri_init, ROT0, "Konami", "Shuriken Boy", MACHINE_NOT_WORKING)
+GAME( 1993, fuusenpn, 0, fuusenpn, shuriboy, konmedal_state, shuri_init, ROT0, "Konami", "Fuusen Pentai", MACHINE_NOT_WORKING)
// K054156/K054157 (GX tilemaps) board
GAME( 1994, buttobi, 0, ddboy, konmedal, konmedal_state, medal_init, ROT0, "Konami", "Buttobi Striker", MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/midxunit.cpp b/src/mame/drivers/midxunit.cpp
index deb0bed4c25..445c5a6da2b 100644
--- a/src/mame/drivers/midxunit.cpp
+++ b/src/mame/drivers/midxunit.cpp
@@ -381,9 +381,10 @@ ROM_START( revx )
ROM_LOAD32_BYTE( "revx.53", 0x0e00002, 0x80000, CRC(a045b265) SHA1(b294d3a56e41f5ec4ab9bbcc0088833b1cab1879) )
ROM_LOAD32_BYTE( "revx.54", 0x0e00003, 0x80000, CRC(24471269) SHA1(262345bd147402100785459af422dafd1c562787) )
- ROM_REGION( 0x400, "plds", 0 )
+ ROM_REGION( 0x600, "plds", 0 )
ROM_LOAD( "a-17722.u1", 0x000, 0x117, CRC(054de7a3) SHA1(bb7abaec50ed704c03b44d5d54296898f7c80d38) )
ROM_LOAD( "a-17721.u955", 0x200, 0x117, CRC(033fe902) SHA1(6efb4e519ed3c9d49fff046a679762b506b3a75b) )
+ ROM_LOAD( "snd-gal16v8a.u17", 0x400, 0x117, NO_DUMP ) // Protected
ROM_END
ROM_START( revxp5 )
@@ -454,7 +455,6 @@ ROM_START( revxp5 )
ROM_END
-
/*************************************
*
* Game drivers
diff --git a/src/mame/drivers/model1.cpp b/src/mame/drivers/model1.cpp
index c9a793e1034..0531768cf22 100644
--- a/src/mame/drivers/model1.cpp
+++ b/src/mame/drivers/model1.cpp
@@ -10,7 +10,7 @@ Known functional issues:
- Virtua Fighter
* Gameplay mecahnics - specifically, collision detection - are significantly broken due to
imperfect TGP RAM port emulation or hookup. This is observable in both attract mode and
- in-game.
+ in-game. It seems to break when both characters attack at the same time.
Sega Model 1 Hardware Overview
------------------------------
diff --git a/src/mame/drivers/namcos10.cpp b/src/mame/drivers/namcos10.cpp
index 818ba39c29e..a56294f1ff2 100644
--- a/src/mame/drivers/namcos10.cpp
+++ b/src/mame/drivers/namcos10.cpp
@@ -28,6 +28,7 @@ Golgo 13 Juusei no Chinkonka (GLT1 Ver.A) (C) Namco/8ing/Raizing, 2001
Gunbalina (GNN1 Ver. A) (C) Namco, 2000
*Hard Puncher Hajime no Ippo 2 Ouja e no Chousen (C) Namco/Taito, 2002
*Honne Hakkenki (C) Namco, 2001
+**Knock Down 2001 (C) Namco, 2001
Kotoba no Puzzle Mojipittan (KPM1 Ver.A) (C) Namco, 2001
*Kurukuru Food (C) Namco, 2002
Mr Driller 2 (DR21 Ver.A) (C) Namco, 2000
@@ -53,6 +54,7 @@ Uchuu Daisakusen Chocovader Contactee (CVC1 Ver.A) (C) Namco, 2002
Unknown medal (?) game (MTL1 SPR0B) (C) ?, 200?
* - denotes not dumped yet.
+** - denotes incomplete dump.
The Namco System 10 system comprises 2 or 3 PCB's....
MAIN PCB - This is the mother board PCB. It holds the main CPU/GPU & SPU and all sound circuitry, program & video RAM,
@@ -266,6 +268,7 @@ Game Sticker KEYCUS ROMs Populated
Gamshara 10021 Ver.A KC020A 8E, 8D N/A
Gekitoride-Jong Space 10011 Ver.A KC003A 8E, 8D, 7E, 7D N/A
Gunbalina GNN1 Ver.A KC002A 8E, 8D N/A see note 3
+Knock Down 2001 KD11 Ver.B KC011A 8E, 8D N/A also has a Namco P-DRIVE PCB 1908961101 (1908971101) with an H8/3002
Kono Tako 10021 Ver.A KC034A 8E, 8D N/A
Kotoba no Puzzle Mojipittan KPM1 Ver.A KC012A 8E, 8D, 7E N/A
Mr Driller G DRG1 Ver.A KC007A 8E, 8D, 7E N/A
@@ -390,7 +393,7 @@ Notes:
This PCB is required by Point Blank 3 since it controls the gun opto signal. Only the CPLD and J8 and some minor
logic and other small support parts are populated.
-This PCB has been found almost fully populated (minus J6) on some Taiko no Tatsujin games (TK51/TK61) but not
+This PCB has been found almost fully populated (minus J6) on some Taiko no Tatsujin games (TK51/TK61) (and on Knock Down 2001) but not
earlier TK games, so it appears to be optional or is only used by the later TK51 and TK61 games.
*/
@@ -1264,6 +1267,18 @@ ROM_START( unks10md )
ROM_LOAD( "k9f2808u0c.8d", 0x1080000, 0x1080000, CRC(49a2a732) SHA1(1a473177827a6d0e58c289d9af064665b941519b) )
ROM_END
+ROM_START( kd2001 )
+ ROM_REGION32_LE( 0x400000, "maincpu:rom", 0 ) /* bios */
+ ROM_FILL( 0x0000000, 0x400000, 0x55 )
+
+ ROM_REGION16_LE( 0x2100000, "user2", 0 ) /* main prg */
+ ROM_LOAD( "0.8e", 0x0000000, 0x1080000, NO_DUMP ) // broken flash ROM, couldn't be dumped
+ ROM_LOAD( "1.8d", 0x1080000, 0x1080000, CRC(2b0d0e8c) SHA1(d679e7044e1f93bb7bd449e6d8fcb7737d154025) )
+
+ ROM_REGION( 0x20000, "pdrivecpu", 0 )
+ ROM_LOAD( "kd11-dr0-ic10.bin", 0x00000, 0x20000, CRC(59649293) SHA1(71c3a0e73d077398e7f3d95acedc47814e99fbc6) )
+ROM_END
+
GAME( 2000, mrdrilr2, 0, ns10_mrdrilr2, namcos10, namcos10_state, init_mrdrilr2, ROT0, "Namco", "Mr. Driller 2 (Japan, DR21 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // PORT_4WAY joysticks
GAME( 2000, mrdrlr2a, mrdrilr2, ns10_mrdrilr2, namcos10, namcos10_state, init_mrdrilr2, ROT0, "Namco", "Mr. Driller 2 (World, DR22 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // PORT_4WAY joysticks
@@ -1274,6 +1289,7 @@ GAME( 2001, g13jnc, 0, namcos10_memn, namcos10, namcos10_state, empty_
GAME( 2001, mrdrilrg, 0, namcos10_memn, namcos10, namcos10_state, init_mrdrilrg, ROT0, "Namco", "Mr. Driller G (Japan, DRG1 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // PORT_4WAY joysticks
GAME( 2001, mrdrilrga, mrdrilrg, namcos10_memn, namcos10, namcos10_state, init_mrdrilrg, ROT0, "Namco", "Mr. Driller G ALT (Japan, DRG1 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // PORT_4WAY joysticks
GAME( 2001, knpuzzle, 0, ns10_knpuzzle, namcos10, namcos10_state, init_knpuzzle, ROT0, "Namco", "Kotoba no Puzzle Mojipittan (Japan, KPM1 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+GAME( 2001, kd2001, 0, namcos10_memn, namcos10, namcos10_state, empty_init, ROT0, "Namco", "Knock Down 2001 (Japan, KD11 Ver. B)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME( 2002, chocovdr, 0, ns10_chocovdr, namcos10, namcos10_state, init_chocovdr, ROT0, "Namco", "Uchuu Daisakusen: Chocovader Contactee (Japan, CVC1 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
GAME( 2002, startrgn, 0, ns10_startrgn, namcos10, namcos10_state, init_startrgn, ROT0, "Namco", "Star Trigon (Japan, STT1 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
GAME( 2002, panikuru, 0, namcos10_memn, namcos10, namcos10_state, init_panikuru, ROT0, "Namco", "Panicuru Panekuru (Japan, PPA1 Ver.A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
diff --git a/src/mame/drivers/spg2xx.cpp b/src/mame/drivers/spg2xx.cpp
new file mode 100644
index 00000000000..4ae41b6ea2b
--- /dev/null
+++ b/src/mame/drivers/spg2xx.cpp
@@ -0,0 +1,837 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+/******************************************************************************
+
+ Short Description:
+
+ Systems which run on the SPG243 SoC
+
+ die markings show
+ "SunPlus QL8041" ( also known as Sunplus SPG240 & PAC300 )
+
+ All GameKeyReady units
+ Disney Princess (GKR)
+ Wheel of Fortune (GKR)
+ JAKKS WWE (GKR)
+ Fantastic 4 (GKR)
+ Justice League (GKR)
+ Dora the Explorer Nursery Rhyme (GKR)
+ Dora the Explorer Play Park (GKR)
+ Spiderman 5-in-1 (GKR)
+ etc.
+
+ (other non GKR JAKKS games)
+ X-Men (Wolverine pad)
+ Avatar: The Last Airbender
+ Superman in Super Villain Showdown
+
+ (other games)
+ Mattel Classic Sports
+
+ "SunPlus QL8041C" ( known as Sunplus SPG2??, seems to be compatible with above, so probably just a chip revision )
+
+ Clickstart ( see clickstart.cpp instead)
+ Wheel of Fortune 2nd Edition
+ Spider-man - Villain Roundup
+
+ "SunPlus QU7074-P69A"
+
+ The Batman
+ Star Wars (non-gamekey, which model? falcon? - check)
+ Dream Life
+
+ "SunPlus QL8167b" (is the scrambling built into the CPU, or external?)
+
+ Lexibook Zeus IG900 20-in-1
+
+ "SunPlus QL8139C"
+
+ Radica Cricket
+ V Smile Baby (Sweden) - see vsmileb.cpp
+
+ ---
+
+ Very likely the same
+
+ "Sunplus QL8167" (these might have ROM scrambling if that is a 8167 feature)
+
+ Disney Princess Magical Adventure
+ Go Diego Go
+ Shrek - Over the Hedge (this unit shows a 'GameKey Unlock More Games' on startup, but has no port, not even on the internal PCB)
+ Marvel Heroes (Spider-man)
+ Spiderman 3 (Movie - black)
+
+
+ ---
+
+ It is unknown if the following are close to this architecture or not (no dumps yet)
+
+ "SunPlus QU7073-P69A"
+
+ Mortal Kombat
+
+ "Sunplus PU7799-P680?" (difficult to read)
+
+ Mission Paintball
+
+ ---
+
+ These are definitely different but still unSP based
+
+ "SunPlus PA7801" ( known as Sunplus SPG110? )
+ - see spg110.cpp instead
+
+ "GCM394" (this is clearly newer, has extra opcodes, different internal map etc. also scaling and higher resolutions based on Spongebob)
+ - see sunplus_gcm394.cpp instead
+
+ Status:
+
+ Mostly working
+
+ To-Do:
+
+ Proper driver_device inheritance to untangle the mess of members
+
+ Detailed list of bugs:
+
+ All systems:
+ Various inaccuracies in samples/envelopes.
+
+ jak_wall, jak_sdoo:
+ Game seems unhappy with NVRAM, clears contents on each boot.
+ jak_pooh:
+ In the 'Light Tag' minigame (select the rock) the game usually softlocks when you find a friend (with or without DRC)
+ jak_care:
+ All but one mini-game waits on RAM address 0x0165 changing from 0x00f9 to 0x00f8
+ The bottom left game "Wish Bear's Wishing Tree" appears to fail for more complex reasons.
+ jak_disf:
+ Shows corrupt logo on first boot with no valid nvram (possibly hardware does too - verify if possible to invalidate EEPROM on device)
+ lexizeus:
+ Some corrupt sound effects and a few corrupt ground tiles a few minutes in. (checksum is good, and a video recorded
+ from one of these doesn't exhibit these problems, so either emulation issue or alt revision?)
+ pvmil:
+ Question order depends on SoC RNG, only reads when it wants a new value, so unless RNG runs on a timer question order ends up the same
+
+ vii:
+ When loading a cart from file manager, sometimes MAME will crash.
+ The "MOTOR" option in the diagnostic menu does nothing when selected.
+ The "SPEECH IC" option in the diagnostic menu does nothing when selected.
+ On 'vii_vc1' & 'vii_vc2' cart, the left-right keys are transposed with the up-down keys.
+ - This is not a bug per se, as the games are played with the controller physically rotated 90 degrees.
+
+ Note:
+ Cricket, Skateboarder, Skannerz and Football 2 list a 32-bit checksum at the start of ROM.
+ This is the byte sum of the file, excluding the first 16 byte (where the checksum is stored)
+
+ Test Modes:
+ Justice League : press UP, DOWN, LEFT, BT3 on the JAKKS logo in that order, quickly, to get test menu
+ WWE : press UP, BT1, BT2 together during startup logos
+
+ Disney Friends, MS Pacman, WallE, Batman (and some other HotGen GameKeys) for test mode, hold UP,
+ press A, press DOWN during startup
+
+ Capcom test (same access as other Hotgen games) mode looks like this (tested on PAL unit, same ROM as dumped one)
+
+ RAM OK 2800
+ 111111
+ 5432109876543210
+ IOA ............111. (values go from . to 1 when inputs are moved, never 0 as in MAME!, core bug?)
+ GAMEKEY E0
+ IOB0
+ IOC XXX.........X...
+ SPRITES
+
+ Care Bears : Hold analog stck up, rotate stick 360 degress back to up, press 'A' while still holding up
+
+ TODO:
+ Work out how to access the hidden TEST menus for all games (most JAKKS games should have one at least)
+
+*******************************************************************************/
+
+#include "includes/spg2xx.h"
+
+/*************************
+* Machine Hardware *
+*************************/
+
+void spg2xx_game_state::switch_bank(uint32_t bank)
+{
+ if (m_bank)
+ {
+ if (bank != m_current_bank)
+ {
+ m_current_bank = bank;
+ m_bank->set_entry(bank);
+ m_maincpu->invalidate_cache();
+ }
+ }
+}
+
+WRITE16_MEMBER(spg2xx_game_state::porta_w)
+{
+ logerror("%s: porta_w %04x\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(spg2xx_game_state::portb_w)
+{
+ logerror("%s: portb_w %04x\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(spg2xx_game_state::portc_w)
+{
+ logerror("%s: portc_w %04x\n", machine().describe_context(), data);
+}
+
+WRITE8_MEMBER(spg2xx_game_state::i2c_w)
+{
+ logerror("%s: i2c_w %05x %04x\n", machine().describe_context(), offset, data);
+}
+
+READ8_MEMBER(spg2xx_game_state::i2c_r)
+{
+ logerror("%s: i2c_r %04x\n", machine().describe_context(), offset);
+ return 0x0000;
+}
+
+READ16_MEMBER(spg2xx_game_state::rad_porta_r)
+{
+ uint16_t data = m_io_p1->read();
+ logerror("Port A Read: %04x\n", data);
+ return data;
+}
+
+READ16_MEMBER(spg2xx_game_state::rad_portb_r)
+{
+ uint16_t data = m_io_p2->read();
+ logerror("Port B Read: %04x\n", data);
+ return data;
+}
+
+READ16_MEMBER(spg2xx_game_state::rad_portc_r)
+{
+ uint16_t data = m_io_p3->read();
+ logerror("Port C Read: %04x\n", data);
+ return data;
+}
+
+void spg2xx_game_state::mem_map_4m(address_map &map)
+{
+ map(0x000000, 0x3fffff).bankr("cartbank");
+}
+
+void spg2xx_game_state::mem_map_2m(address_map &map)
+{
+ map(0x000000, 0x1fffff).mirror(0x200000).bankr("cartbank");
+}
+
+void spg2xx_game_state::mem_map_1m(address_map &map)
+{
+ map(0x000000, 0x0fffff).mirror(0x300000).bankr("cartbank");
+}
+
+static INPUT_PORTS_START( rad_skat )
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Full Left")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Full Right")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Slight Left") // you have to use this for the menus (eg trick lists)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Slight Right")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Front")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Back")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED )
+ // there only seem to be 3 buttons on the pad part, so presumably all the above are the skateboard, and below are the pad?
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("M Button")
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("X Button")
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("O Button")
+ PORT_BIT( 0xf800, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) // read but unused?
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rad_skatp )
+ PORT_INCLUDE(rad_skat)
+
+ PORT_MODIFY("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rad_sktv )
+ /* how does the Scanner connect? probably some serial port with comms protocol, not IO ports?
+ internal test mode shows 'uart' ports (which currently fail)
+
+ To access internal test hold DOWN and BUTTON1 together on startup until a coloured screen appears.
+ To cycle through the tests again hold DOWN and press BUTTON1 */
+
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( wiwi18 )
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, "Possible Input" )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "IN1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( mattelcs ) // there is a 'secret test mode' that previously got activated before inputs were mapped, might need unused inputs to active?
+ PORT_START("P1")
+ PORT_BIT( 0x0007, IP_ACTIVE_LOW, IPT_UNUSED ) // must be IP_ACTIVE_LOW or you can't switch to Football properly?
+ PORT_DIPNAME( 0x0018, 0x0000, "Game Select Slider" ) // technically not a dipswitch, a 3 position slider, but how best map it?
+ PORT_DIPSETTING( 0x0008, "Baseball (Left)" )
+ PORT_DIPSETTING( 0x0010, "Basketball (Middle)" )
+ PORT_DIPSETTING( 0x0000, "Football (Right)" )
+ // no 4th position possible
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
+ PORT_BIT( 0xffa0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Sound") // toggles between sound+music, sound only, and no sound
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Hike / Pitch")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shoot / Run")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Kick / Hit")
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+/* hold 'Console Down' while powering up to get the test menu, including input tests
+ the ball (Wired) and bat (IR) are read some other way as they don't seem to appear in the ports. */
+static INPUT_PORTS_START( rad_crik )
+ PORT_START("P1")
+ PORT_BIT( 0x003f, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Console Enter") // these are the controls on the base unit
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Console Down")
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Console Left")
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Console Right")
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Console Up")
+ PORT_BIT( 0xf800, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( rad_fb2 ) // controls must be multiplexed somehow, as there's no room for P2 controls otherwise (unless P2 controls were never finished and it was only sold in a single mat version, Radica left useless P2 menu options in the mini Genesis consoles)
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) // 'left'
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // 'up'
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) // 'right'
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // acts a 'motion ball' in menu (this is an analog input from the ball tho? at least in rad_fb in xavix.cpp so this might just be a debug input here)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // 'p2 right'
+ // none of the remaining inputs seem to do anything
+ PORT_BIT( 0xffe0, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( abltenni )
+ PORT_START("P1") // Down and both buttons on startup for Diagnostics Menu
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ // all remaining bits in this port will stop the demo mode, also having them high/low determines if you get 2P demos or Vs. CPU demos, not sure what the real state would be
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, "Used" )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_DIPNAME( 0x0001, 0x0001, "P3" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void spg2xx_game_state::machine_start()
+{
+ if (m_bank)
+ {
+ m_bank->configure_entries(0, (memregion("maincpu")->bytes() + 0x7fffff) / 0x800000, memregion("maincpu")->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+
+ save_item(NAME(m_current_bank));
+}
+
+void spg2xx_game_state::machine_reset()
+{
+ m_current_bank = -1;
+ switch_bank(0);
+ m_maincpu->reset();
+}
+
+void spg2xx_game_state::spg2xx_base(machine_config &config)
+{
+ m_maincpu->porta_out().set(FUNC(spg2xx_game_state::porta_w));
+ m_maincpu->portb_out().set(FUNC(spg2xx_game_state::portb_w));
+ m_maincpu->portc_out().set(FUNC(spg2xx_game_state::portc_w));
+
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_refresh_hz(60);
+ m_screen->set_size(320, 262);
+ m_screen->set_visarea(0, 320-1, 0, 240-1);
+ m_screen->set_screen_update("maincpu", FUNC(spg2xx_device::screen_update));
+ m_screen->screen_vblank().set(m_maincpu, FUNC(spg2xx_device::vblank));
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+ m_maincpu->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
+ m_maincpu->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
+}
+
+void spg2xx_game_state::non_spg_base(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
+
+ spg2xx_base(config);
+}
+
+void spg2xx_game_state::rad_skat(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+ m_maincpu->i2c_w().set(FUNC(spg2xx_game_state::i2c_w));
+ m_maincpu->i2c_r().set(FUNC(spg2xx_game_state::i2c_r));
+}
+
+void spg2xx_game_state::abltenni(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+
+ m_maincpu->set_rowscroll_offset(8);
+}
+
+void spg2xx_game_state::rad_skatp(machine_config &config)
+{
+ rad_skat(config);
+ m_maincpu->set_pal(true);
+ m_screen->set_refresh_hz(50);
+// m_screen->set_size(320, 312);
+}
+
+void spg2xx_game_state::rad_sktv(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(spg2xx_game_state::rad_porta_r));
+ m_maincpu->portb_in().set(FUNC(spg2xx_game_state::rad_portb_r));
+ m_maincpu->portc_in().set(FUNC(spg2xx_game_state::rad_portc_r));
+ m_maincpu->i2c_w().set(FUNC(spg2xx_game_state::i2c_w));
+ m_maincpu->i2c_r().set(FUNC(spg2xx_game_state::i2c_r));
+}
+
+void spg2xx_game_state::rad_crik(machine_config &config)
+{
+ SPG28X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+ m_maincpu->i2c_w().set(FUNC(spg2xx_game_state::i2c_w));
+ m_maincpu->i2c_r().set(FUNC(spg2xx_game_state::i2c_r));
+}
+
+ROM_START( rad_skat )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "skateboarder.bin", 0x000000, 0x400000, CRC(08b9ab91) SHA1(6665edc4740804956136c68065890925a144626b) )
+ROM_END
+
+ROM_START( rad_skatp ) // rom was dumped from the NTSC version, but region comes from an io port, so ROM is probably the same
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "skateboarder.bin", 0x000000, 0x400000, CRC(08b9ab91) SHA1(6665edc4740804956136c68065890925a144626b) )
+ROM_END
+
+ROM_START( rad_sktv )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "skannerztv.bin", 0x000000, 0x200000, CRC(e92278e3) SHA1(eb6bee5e661128d83784960dfff50379c36bfaeb) )
+
+ /* The external scanner MCU is a Winbond from 2000: SA5641
+ the scanner plays sound effects when scanning, without being connected to the main unit, so a way to dump / emulate
+ this MCU is also needed for complete emulation
+
+ TODO: find details on MCU so that we know capacity etc. */
+ROM_END
+
+ROM_START( rad_fb2 )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "football2.bin", 0x000000, 0x400000, CRC(96b4f0d2) SHA1(e91f2ac679fb0c026ffe216eb4ab58802f361a17) )
+ROM_END
+
+ROM_START( rad_crik ) // only released in EU?
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "cricket.bin", 0x000000, 0x200000, CRC(6fa0aaa9) SHA1(210d2d4f542181f59127ce2f516d0408dc6de7a8) )
+ROM_END
+
+ROM_START( mattelcs )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "mattelclassicsports.bin", 0x000000, 0x100000, CRC(e633e7ad) SHA1(bf3e325a930cf645a7e32195939f3c79c6d35dac) )
+ROM_END
+
+ROM_START( abltenni )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "ablpnpwirelesstennis.bin", 0x000000, 0x400000, CRC(66bd8ef1) SHA1(a83640d5d9e84e10d29a065a61e0d7bbec16c6e4) )
+ROM_END
+
+ROM_START( wiwi18 )
+ ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "26gl128.bin", 0x000000, 0x1000000, CRC(0b103ac9) SHA1(14434908f429942096fb8db5b5630603fd54fb2c) )
+ROM_END
+
+void spg2xx_game_state::init_crc()
+{
+ // several games have a byte sum checksum listed at the start of ROM, this little helper function logs what it should match.
+ const int length = memregion("maincpu")->bytes();
+ const uint8_t* rom = memregion("maincpu")->base();
+
+ uint32_t checksum = 0x00000000;
+ // the first 0x10 bytes are where the "chksum:xxxxxxxx " string is listed, so skip over them
+ for (int i = 0x10; i < length; i++)
+ {
+ checksum += rom[i];
+ }
+
+ logerror("Calculated Byte Sum of bytes from 0x10 to 0x%08x is %08x)\n", length - 1, checksum);
+}
+
+void spg2xx_game_state::init_wiwi18()
+{
+ uint16_t* rom = (uint16_t*)memregion("maincpu")->base();
+ rom[0x1ca259] = 0xf165;
+}
+
+// year, name, parent, compat, machine, input, class, init, company, fullname, flags
+
+// Radica TV games
+CONS( 2006, rad_skat, 0, 0, rad_skat, rad_skat, spg2xx_game_state, init_crc, "Radica", "Play TV Skateboarder (NTSC)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2006, rad_skatp, rad_skat, 0, rad_skatp,rad_skatp, spg2xx_game_state, init_crc, "Radica", "Connectv Skateboarder (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2006, rad_crik, 0, 0, rad_crik, rad_crik, spg2xx_game_state, init_crc, "Radica", "Connectv Cricket (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // Version 3.00 20/03/06 is listed in INTERNAL TEST
+CONS( 2007, rad_sktv, 0, 0, rad_sktv, rad_sktv, spg2xx_game_state, init_crc, "Radica", "Skannerz TV", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
+CONS( 2007, rad_fb2, 0, 0, rad_skat, rad_fb2, spg2xx_game_state, init_crc, "Radica", "Play TV Football 2", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // offers a 2 player option in menus, but seems to have only been programmed for, and released as, a single player unit, P2 controls appear unfinished.
+
+// ABL TV Games
+CONS( 2006, abltenni, 0, 0, abltenni, abltenni, spg2xx_game_state, empty_init, "Advance Bright Ltd", "Wireless Tennis (WT2000, ABL TV Game)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+// Mattel games
+CONS( 2005, mattelcs, 0, 0, rad_skat, mattelcs, spg2xx_game_state, empty_init, "Mattel", "Mattel Classic Sports", MACHINE_IMPERFECT_SOUND )
+
+// box marked 'Wireless game console' 'Drahtlose Spielekonsole' 87 Sports games included : 18 hyper sports games, 69 arcade games.
+// Unit marked 'Hamy System' 'WiWi'
+// actually a cartridge, but all hardware is in the cart, overriding any internal hardware entirely. see nes_vt.cp 'mc_sp69' for the '69 arcade game' part
+CONS( 200?, wiwi18, 0, 0, rad_skat, wiwi18, spg2xx_game_state, init_wiwi18, "Hamy System", "WiWi 18-in-1 Sports Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/spg2xx_dreamlife.cpp b/src/mame/drivers/spg2xx_dreamlife.cpp
new file mode 100644
index 00000000000..53fb40bd29e
--- /dev/null
+++ b/src/mame/drivers/spg2xx_dreamlife.cpp
@@ -0,0 +1,83 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+#include "includes/spg2xx.h"
+#include "machine/eepromser.h"
+
+class dreamlif_state : public spg2xx_game_state
+{
+public:
+ dreamlif_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_eeprom(*this, "eeprom")
+ { }
+
+ void dreamlif(machine_config &config);
+
+private:
+ DECLARE_READ16_MEMBER(portb_r);
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
+};
+
+
+READ16_MEMBER(dreamlif_state::portb_r)
+{
+ uint16_t ret = 0x0000;
+ logerror("%s: portb_r\n", machine().describe_context());
+ ret |= m_eeprom->do_read() << 3;
+ return ret;
+}
+
+WRITE16_MEMBER(dreamlif_state::portb_w)
+{
+ logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
+ m_eeprom->di_write(BIT(data, 2));
+ m_eeprom->cs_write(BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
+ m_eeprom->clk_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE);
+}
+
+
+
+static INPUT_PORTS_START( dreamlif )
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("A")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("B")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("C")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Yes")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("No")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // must be low or the Tiger logo gets skipped, also must be low for service mode (hold pause while booting) to work
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Pause")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+void dreamlif_state::dreamlif(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &dreamlif_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ EEPROM_93C66_16BIT(config, m_eeprom); // HT93LC66A
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set(FUNC(dreamlif_state::portb_r));
+ m_maincpu->portb_out().set(FUNC(dreamlif_state::portb_w));
+
+}
+
+ROM_START( dreamlif )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "dreamlife.bin", 0x000000, 0x800000, CRC(632e0237) SHA1(a8586e8a626d75cf7782f13cfd9f1b938af23d56) )
+ROM_END
+
+
+// Hasbro games
+CONS( 2005, dreamlif, 0, 0, dreamlif, dreamlif, dreamlif_state, empty_init, "Hasbro", "Dream Life (Version 1.0, Feb 07 2005)", MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/spg2xx_ican.cpp b/src/mame/drivers/spg2xx_ican.cpp
new file mode 100644
index 00000000000..01e2f570fa9
--- /dev/null
+++ b/src/mame/drivers/spg2xx_ican.cpp
@@ -0,0 +1,505 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+/* Fisher Price / Mattel "I Can..." systems */
+
+#include "includes/spg2xx.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+class icanguit_state : public spg2xx_game_state
+{
+public:
+ icanguit_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_cart(*this, "cartslot"),
+ m_cart_region(nullptr),
+ m_porta_in(*this, "P1_%u", 0U),
+ m_portc_in(*this, "P3_%u", 0U)
+ { }
+
+ void icanguit(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_icanguit);
+
+ DECLARE_READ16_MEMBER(porta_r);
+ virtual DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_READ16_MEMBER(portc_r);
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portc_w) override;
+
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+
+ uint16_t m_inlatch_a;
+ uint16_t m_inlatch_c;
+ optional_ioport_array<6> m_porta_in;
+ optional_ioport_array<6> m_portc_in;
+
+};
+
+class icanpian_state : public icanguit_state
+{
+public:
+ icanpian_state(const machine_config &mconfig, device_type type, const char *tag) :
+ icanguit_state(mconfig, type, tag)
+ // m_eeprom(*this, "eeprom")
+ { }
+
+ void icanpian(machine_config &config);
+
+protected:
+ virtual DECLARE_READ16_MEMBER(portb_r) override;
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+
+ //optional_device<eeprom_serial_93cxx_device> m_eeprom;
+};
+
+
+// there is a speaker volume for the 'guitar' mode, but it's presumably an analog feature, not read by the game.
+static INPUT_PORTS_START( icanguit )
+ PORT_START("P1")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P1_0")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Fret 1, Row 1")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("Fret 2, Row 1")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_NAME("Fret 3, Row 1")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("Fret 4, Row 1")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("Fret 5, Row 1")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("Fret 6, Row 1") // Frets 6-12 only have 2 rows (1 and 6)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Fret 9, Row 1")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Fret 10, Row 1")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Fret 11, Row 1")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Fret 12, Row 1")
+ PORT_BIT( 0xfc00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("Fret 1, Row 2")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("Fret 2, Row 2")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Fret 3, Row 2")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("Fret 4, Row 2")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("Fret 5, Row 2")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("Fret 7, Row 1")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("Fret 1, Row 3")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("Fret 2, Row 3")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("Fret 3, Row 3")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("Fret 4, Row 3")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("Fret 5, Row 3")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Fret 8, Row 1")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("Fret 1, Row 4")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fret 2, Row 4")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fret 3, Row 4")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("Fret 4, Row 4")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Fret 5, Row 4")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Fret 8, Row 6")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_4")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("Fret 1, Row 5")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("Fret 2, Row 5")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("Fret 3, Row 5")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Fret 4, Row 5")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Fret 5, Row 5")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Fret 7, Row 6")
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_5")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Fret 1, Row 6")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("Fret 2, Row 6")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("Fret 3, Row 6")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Fret 4, Row 6")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("Fret 5, Row 6")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Fret 6, Row 6") // Frets 6-12 only have 2 rows (1 and 6)
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Fret 9, Row 6")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Fret 10, Row 6")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Fret 11, Row 6")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Fret 12, Row 6")
+ PORT_BIT( 0xfc00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // might be some kind of seeprom in here?
+
+ PORT_START("P3")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P3_0")
+ PORT_BIT( 0x0007, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("String 1") // these seem to respond on release, but are definitely active high based on visual indicators
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("String 2")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("String 3")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("String 4")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("String 5")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("String 6")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_DIPNAME( 0x0400, 0x0000, "TV or Guitar Mode" )
+ PORT_DIPSETTING( 0x0000, "TV Mode" )
+ PORT_DIPSETTING( 0x0400, "Guitar Mode" )
+ PORT_BIT( 0xf800, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Home")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Enter")
+ PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pause")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_4")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // doesn't highlight during menus, but changes sound in 'Guitar Mode' and switches between levels after selecting song
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // doesn't highlight during menus, but changes sound in 'Guitar Mode' and switches between levels after selecting song
+ PORT_BIT( 0xfff8, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3_5")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Whammy Up")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Whammy Down")
+ PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+// this has an entire piano keyboard + extras
+// there is a volume dial for the internal speakers when used in non-TV mode, but presumably it is not CPU visible
+// there should be a metronome key, but nothing seems to have that effect, maybe due to incomplete sound emulation?
+static INPUT_PORTS_START( icanpian )
+ PORT_START("P1")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P1_0")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)PORT_NAME("Octave 0 F (Green)")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("Octave 0 F# (Purple)")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Octave 0 G (Yellow)")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("Octave 0 G# (Dark Blue)")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("Octave 0 A (Flesh)")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("Octave 0 A# (Dark Green)")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("Octave 0 B (Pink)")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("Octave 0 C (White)")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("Octave 0 C# (Black)")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("Octave 0 D (Blue)")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("Octave 0 D# (Red)")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("Octave 0 E (Orange)")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("Octave 1 F (Green)")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("Octave 1 F# (Purple)")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Octave 1 G (Yellow)")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("Octave 1 G# (Dark Blue)")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Octave 1 A (Flesh)")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Octave 1 A# (Dark Green)")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Octave 1 B (Pink)")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("Octave 1 C (White)")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Octave 1 C# (Black)")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("Octave 1 D (Blue)")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Octave 1 D# (Red)")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("Octave 1 E (Orange)")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1_2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("Octave 2 F (Green)")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Octave 2 F# (Purple)")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Octave 2 G (Yellow)")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Octave 2 G# (Dark Blue)")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("Octave 2 A (Flesh)")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Octave 2 A# (Dark Green)")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("Octave 2 B (Pink)")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("Octave 2 C (White)")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Octave 2 C# (Black)")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("Octave 2 D (Blue)")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Octave 2 D# (Red)")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Octave 2 E (Orange)")
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // might be some kind of seeprom in here? (or not? only I Can Play Guitar seems to offer a 'resume', something does get accessed on startup tho? and the machine tells you 'high scores')
+
+ PORT_START("P3")
+ // uses multiplexed ports instead, see below
+
+ PORT_START("P3_0")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Change Instrument")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Cycle Hands")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Display Mode 1")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Display Mode 2")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Display Mode 3")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Display Mode 4")
+ PORT_BIT( 0x07c0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unused?
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // presumably power / low battery, kils the game
+ PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Tempo Up")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("Tempo Default")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Tempo Down")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Pause")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Metronome")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) // will skip intro scenes etc. like other buttons but no more physical buttons on KB to map here
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3_2") // the system ALWAYS requires a cartridge, but has 2 modes of operation depending on a switch. The only way to use it as a normal keyboard is by flipping this switch.
+ PORT_DIPNAME( 0x0001, 0x0000, "System Mode" ) // or implement this as a toggle key? (it's a slider switch)
+ PORT_DIPSETTING( 0x0001, "Keyboard Mode (no TV output)" )
+ PORT_DIPSETTING( 0x0000, "TV Mode" )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Scroll Up")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Scroll Down")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Enter")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Home")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) // will skip intro scenes etc. like other buttons but no more physical buttons on KB to map here
+ PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+
+
+READ16_MEMBER(icanguit_state::porta_r)
+{
+ logerror("%s: porta_r\n", machine().describe_context());
+ return m_inlatch_a;
+}
+
+
+READ16_MEMBER(icanguit_state::portc_r)
+{
+ logerror("%s: portc_r\n", machine().describe_context());
+ return m_inlatch_c;
+}
+
+
+WRITE16_MEMBER(icanguit_state::portc_w)
+{
+ logerror("%s: portc_w (%04x)\n", machine().describe_context(), data);
+}
+
+
+READ16_MEMBER(icanguit_state::portb_r)
+{
+ logerror("%s: portb_r\n", machine().describe_context());
+ return m_io_p2->read();
+}
+
+WRITE16_MEMBER(icanguit_state::portb_w)
+{
+ logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(icanguit_state::porta_w)
+{
+ //logerror("%s: porta_w (%04x)\n", machine().describe_context(), data);
+
+ if (data == 0x0000)
+ {
+ m_inlatch_a = m_inlatch_c = 0x0000;
+ }
+ else if (data == 0x0400)
+ {
+ m_inlatch_a = m_porta_in[5]->read();
+ m_inlatch_c = m_portc_in[5]->read();
+ }
+ else if (data == 0x0800)
+ {
+ m_inlatch_a = m_porta_in[4]->read();
+ m_inlatch_c = m_portc_in[4]->read();
+ }
+ else if (data == 0x1000)
+ {
+ m_inlatch_a = m_porta_in[3]->read();
+ m_inlatch_c = m_portc_in[3]->read();
+ }
+ else if (data == 0x2000)
+ {
+ m_inlatch_a = m_porta_in[2]->read();
+ m_inlatch_c = m_portc_in[2]->read();
+ }
+ else if (data == 0x4000)
+ {
+ m_inlatch_a = m_porta_in[1]->read();
+ m_inlatch_c = m_portc_in[1]->read();
+ }
+ else if (data == 0x8000)
+ {
+ m_inlatch_a = m_porta_in[0]->read();
+ m_inlatch_c = m_portc_in[0]->read();
+ }
+ else
+ {
+ logerror("%s: unknown porta_w (%04x)\n", machine().describe_context(), data);
+ }
+}
+
+// icanpian differences
+
+WRITE16_MEMBER(icanpian_state::porta_w)
+{
+ if (data == 0x0000)
+ {
+ m_inlatch_a = m_inlatch_c = 0x0000;
+ }
+ else if (data == 0x1000)
+ {
+ m_inlatch_a = m_porta_in[2]->read();
+ m_inlatch_c = m_portc_in[2]->read();
+ }
+ else if (data == 0x2000)
+ {
+ m_inlatch_a = m_porta_in[1]->read();
+ m_inlatch_c = m_portc_in[1]->read();
+ }
+ else if (data == 0x4000)
+ {
+ m_inlatch_a = m_porta_in[0]->read();
+ m_inlatch_c = m_portc_in[0]->read();
+ }
+ else
+ {
+ logerror("%s: unknown porta_w (%04x)\n", machine().describe_context(), data);
+ }
+}
+
+// accesses are made for what appears to be a serial eeprom on port B, very similar to dreamlif, but beyond blanking it at the start it doesn't
+// seem to ever be used, maybe it was never added to hardware, or just never used?
+READ16_MEMBER(icanpian_state::portb_r)
+{
+/*
+ uint16_t ret = 0x0000;
+ logerror("%s: portbxx_r\n", machine().describe_context());
+ ret |= m_eeprom->do_read() ? 0xffff : 0x0000;
+ return ret;
+*/
+ return 0x0000;
+}
+
+WRITE16_MEMBER(icanpian_state::portb_w)
+{
+/*
+ logerror("%s: portbxx_w (%04x)\n", machine().describe_context(), data);
+ m_eeprom->di_write(BIT(data, 2));
+ m_eeprom->cs_write(BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
+ m_eeprom->clk_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE);
+*/
+}
+
+void icanguit_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+}
+
+void icanguit_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+ m_inlatch_a = 0x0000;
+ m_inlatch_c = 0x0000;
+}
+
+
+DEVICE_IMAGE_LOAD_MEMBER(icanguit_state::cart_load_icanguit)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ if (size < 0x800000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+
+
+void icanguit_state::icanguit(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &icanguit_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(icanguit_state::porta_r));
+ m_maincpu->porta_out().set(FUNC(icanguit_state::porta_w));
+ m_maincpu->portb_in().set(FUNC(icanguit_state::portb_r));
+ m_maincpu->portb_out().set(FUNC(icanguit_state::portb_w));
+ m_maincpu->portc_in().set(FUNC(icanguit_state::portc_r));
+ m_maincpu->portc_out().set(FUNC(icanguit_state::portc_w));
+
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "icanguit_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(icanguit_state::cart_load_icanguit));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "icanguit_cart").set_original("icanguit");
+}
+
+void icanpian_state::icanpian(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &icanpian_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(icanpian_state::porta_r));
+ m_maincpu->porta_out().set(FUNC(icanpian_state::porta_w));
+ m_maincpu->portb_in().set(FUNC(icanpian_state::portb_r));
+ m_maincpu->portb_out().set(FUNC(icanpian_state::portb_w));
+ m_maincpu->portc_in().set(FUNC(icanpian_state::portc_r));
+ m_maincpu->portc_out().set(FUNC(icanpian_state::portc_w));
+
+// EEPROM_93C66_16BIT(config, m_eeprom); // unknown part
+// m_eeprom->erase_time(attotime::from_usec(1));
+// m_eeprom->write_time(attotime::from_usec(1));
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "icanpian_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(icanpian_state::cart_load_icanguit));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "icanpian_cart").set_original("icanpian");
+}
+
+ROM_START( icanguit )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ // no internal ROM, requires a cartridge
+ROM_END
+
+ROM_START( icanpian )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ // no internal ROM, requires a cartridge
+ROM_END
+
+
+// Fisher-Price games
+CONS( 2007, icanguit, 0, 0, icanguit, icanguit, icanguit_state, empty_init, "Fisher-Price", "I Can Play Guitar", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // how is data saved?
+CONS( 2006, icanpian, 0, 0, icanpian, icanpian, icanpian_state, empty_init, "Fisher-Price", "I Can Play Piano", MACHINE_IMPERFECT_SOUND ) // 2006 date from Manual
+
diff --git a/src/mame/drivers/spg2xx_jakks.cpp b/src/mame/drivers/spg2xx_jakks.cpp
new file mode 100644
index 00000000000..18590249053
--- /dev/null
+++ b/src/mame/drivers/spg2xx_jakks.cpp
@@ -0,0 +1,781 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+// Note: even after the GameKey port was physically removed and the PCBs redesigned, many of the test modes still show the value read from the port (and many games still show the Game Key Ready splash screen on startup)
+
+#include "includes/spg2xx.h"
+#include "bus/jakks_gamekey/slot.h"
+
+class jakks_gkr_state : public spg2xx_game_state
+{
+public:
+ jakks_gkr_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_porta_key_mode(false),
+ m_cart(*this, "cartslot"),
+ m_cart_region(nullptr)
+ { }
+
+ void jakks(machine_config &config);
+ void jakks_i2c(machine_config &config);
+ void walle(machine_config &config);
+
+ void jakks_gkr(machine_config &config);
+ void jakks_gkr_i2c(machine_config &config);
+ void jakks_gkr_1m_i2c(machine_config &config);
+ void jakks_gkr_2m_i2c(machine_config &config);
+ void jakks_gkr_nk(machine_config &config);
+ void jakks_gkr_nk_i2c(machine_config &config);
+ void jakks_gkr_dy(machine_config &config);
+ void jakks_gkr_dy_i2c(machine_config &config);
+ void jakks_gkr_dp_i2c(machine_config &config);
+ void jakks_gkr_sw_i2c(machine_config &config);
+ void jakks_gkr_nm_i2c(machine_config &config);
+ void jakks_gkr_cc_i2c(machine_config &config);
+ void jakks_gkr_wf_i2c(machine_config &config);
+ void jakks_gkr_mv_i2c(machine_config &config);
+ void jakks_gkr_wp(machine_config &config);
+ void jakks_gkr_cb(machine_config &config);
+
+ DECLARE_READ_LINE_MEMBER(i2c_gkr_r);
+
+protected:
+ DECLARE_READ16_MEMBER(jakks_porta_r);
+ DECLARE_READ16_MEMBER(walle_portc_r);
+
+ DECLARE_WRITE16_MEMBER(jakks_porta_w);
+ DECLARE_WRITE16_MEMBER(jakks_portb_w);
+ DECLARE_WRITE16_MEMBER(walle_portc_w);
+
+ uint16_t m_walle_portc_data;
+
+private:
+ virtual void machine_start() override;
+
+ DECLARE_READ16_MEMBER(jakks_porta_key_io_r);
+
+ DECLARE_WRITE16_MEMBER(gkr_portc_w);
+ DECLARE_WRITE16_MEMBER(jakks_porta_key_io_w);
+ bool m_porta_key_mode;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_gamekey);
+
+ optional_device<jakks_gamekey_slot_device> m_cart;
+ memory_region *m_cart_region;
+};
+
+READ_LINE_MEMBER(jakks_gkr_state::i2c_gkr_r)
+{
+ if (m_cart && m_cart->exists())
+ {
+ return m_cart->read_cart_seeprom();
+ }
+ else
+ {
+ return m_i2cmem->read_sda();
+ }
+}
+
+WRITE16_MEMBER(jakks_gkr_state::walle_portc_w)
+{
+ m_walle_portc_data = data & mem_mask;
+ if (BIT(mem_mask, 1))
+ m_i2cmem->write_scl(BIT(data, 1));
+ if (BIT(mem_mask, 0))
+ m_i2cmem->write_sda(BIT(data, 0));
+}
+
+WRITE16_MEMBER(jakks_gkr_state::gkr_portc_w)
+{
+ m_walle_portc_data = data & mem_mask;
+
+ if (m_cart && m_cart->exists())
+ {
+ m_cart->write_cart_seeprom(space,offset,data,mem_mask);
+ }
+ else
+ {
+ if (m_i2cmem)
+ {
+ if (BIT(mem_mask, 1))
+ m_i2cmem->write_scl(BIT(data, 1));
+ if (BIT(mem_mask, 0))
+ m_i2cmem->write_sda(BIT(data, 0));
+ }
+ }
+}
+
+READ16_MEMBER(jakks_gkr_state::jakks_porta_r)
+{
+ //logerror("%s: jakks_porta_r\n", machine().describe_context());
+ return m_io_p1->read();
+}
+
+WRITE16_MEMBER(jakks_gkr_state::jakks_porta_w)
+{
+ //logerror("%s: jakks_porta_w %04x\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(jakks_gkr_state::jakks_portb_w)
+{
+ //logerror("%s: jakks_portb_w %04x\n", machine().describe_context(), data);
+}
+
+READ16_MEMBER(jakks_gkr_state::jakks_porta_key_io_r)
+{
+ //logerror("%s: jakks_porta_key_io_r\n", machine().describe_context());
+ if (m_porta_key_mode == false)
+ {
+ return m_io_p1->read();
+ }
+ else
+ {
+ /* masks with 0xf, inverts, and combines it with a previous read (when data written to jakks_porta_key_io_w was 0x0000) and expects result to be 0x0000
+ could just expect data written to be returned, but that would be a strange check.
+ all systems seem to respond to the same result, so how is the per-system lock implemented? */
+ return (m_io_p1->read() & 0xfff0) | 0x000f;
+ }
+}
+
+WRITE16_MEMBER(jakks_gkr_state::jakks_porta_key_io_w)
+{
+ logerror("%s: jakks_porta_key_io_w %04x\n", machine().describe_context(), data);
+ // only seen 0xffff and 0x0000 written here.. writes 0xffff before the 2nd part of the port a gamekey check read.
+ if (data == 0xffff)
+ {
+ m_porta_key_mode = true;
+ }
+ else
+ {
+ m_porta_key_mode = false;
+ }
+}
+
+
+static INPUT_PORTS_START( batman )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Menu")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("B Button")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("X Button")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( walle )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button")
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", i2cmem_device, read_sda)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_sith_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0xf3df, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("JOYX")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+
+ PORT_START("JOYY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_pooh )
+ PORT_START("P1")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0xf7df, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+
+ PORT_START("JOYX")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+
+ PORT_START("JOYY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_care )
+ PORT_START("P1")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0xf7df, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+
+ PORT_START("JOYX")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+
+ PORT_START("JOYY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_nm_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
+ PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+
+ PORT_START("DIALX") // for Pole Position, joystick can be twisted like a dial/wheel (limited?) (check range)
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_cc_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("C")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("D")
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
+ PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_wf_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x01c0, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
+
+ /* on real unit you can spin the wheel (and must make sure it completes a full circle, or you lose your turn) instead of pressing 'B' for a random spin but where does it map? (it can be tested in secret test mode)
+ PORT_START("DIALX")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+
+ PORT_START("DIALY")
+ PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
+ */
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_gkr )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (not verified for all games, state can be seen in secret test menu of many tho)
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) // this causes WWE to think the unit is a '2nd Controller' and tells you to plug the 1st one in.
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_sdoo_i2c ) // GameKeyReady units had 2 main buttons, later releases reduced that to 1 button (as the internal games don't require 2 and no GameKeys were released)
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) // debug input, skips levels!
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED ) // must be low or other inputs don't work?
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu / Pause")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r) // is this correct? doesn't seem to work
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( jak_gkr_i2c )
+ PORT_INCLUDE(jak_gkr)
+
+ PORT_MODIFY("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jak_dpr_i2c )
+ PORT_START("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Start / Menu / Pause")
+ PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
+ PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+
+
+void jakks_gkr_state::jakks(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(jakks_gkr_state::jakks_porta_r));
+ m_maincpu->porta_out().set(FUNC(jakks_gkr_state::jakks_porta_w));
+ m_maincpu->portb_out().set(FUNC(jakks_gkr_state::jakks_portb_w));
+}
+
+void jakks_gkr_state::jakks_i2c(machine_config &config)
+{
+ jakks(config);
+ I2CMEM(config, m_i2cmem, 0).set_data_size(0x200);
+}
+
+void jakks_gkr_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(JAKKSSLOT_ROM_REGION_TAG).c_str());
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+
+ save_item(NAME(m_walle_portc_data));
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(jakks_gkr_state::cart_load_gamekey)
+{
+ return m_cart->call_load();
+}
+
+void jakks_gkr_state::jakks_gkr(machine_config &config)
+{
+ jakks(config);
+
+ m_maincpu->porta_in().set(FUNC(jakks_gkr_state::jakks_porta_key_io_r));
+ m_maincpu->porta_out().set(FUNC(jakks_gkr_state::jakks_porta_key_io_w));
+ m_maincpu->portc_in().set_ioport("P3");
+ m_maincpu->portc_out().set(FUNC(jakks_gkr_state::gkr_portc_w));
+
+ m_maincpu->set_rowscroll_offset(0);
+
+ JAKKS_GAMEKEY_SLOT(config, m_cart, 0, jakks_gamekey, nullptr);
+}
+
+void jakks_gkr_state::jakks_gkr_i2c(machine_config &config)
+{
+ jakks_gkr(config);
+ I2CMEM(config, m_i2cmem, 0).set_data_size(0x200);
+}
+
+
+void jakks_gkr_state::jakks_gkr_1m_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+}
+
+void jakks_gkr_state::jakks_gkr_2m_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_2m);
+}
+
+void jakks_gkr_state::jakks_gkr_nk(machine_config &config)
+{
+ jakks_gkr(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_nk").set_original("jakks_gamekey_nk");
+}
+
+void jakks_gkr_state::jakks_gkr_nk_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_nk").set_original("jakks_gamekey_nk");
+}
+
+void jakks_gkr_state::jakks_gkr_dy(machine_config &config)
+{
+ jakks_gkr(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_dy").set_original("jakks_gamekey_dy");
+}
+
+void jakks_gkr_state::jakks_gkr_dy_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_dy").set_original("jakks_gamekey_dy");
+}
+
+void jakks_gkr_state::jakks_gkr_mv_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_mv").set_original("jakks_gamekey_mv");
+}
+
+
+void jakks_gkr_state::jakks_gkr_dp_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ SOFTWARE_LIST(config, "jakks_gamekey_dp").set_original("jakks_gamekey_dp");
+}
+
+void jakks_gkr_state::jakks_gkr_sw_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ m_maincpu->adc_in<0>().set_ioport("JOYX");
+ m_maincpu->adc_in<1>().set_ioport("JOYY");
+ SOFTWARE_LIST(config, "jakks_gamekey_sw").set_original("jakks_gamekey_sw");
+}
+
+void jakks_gkr_state::jakks_gkr_wp(machine_config &config)
+{
+ jakks_gkr(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ m_maincpu->adc_in<0>().set_ioport("JOYX");
+ m_maincpu->adc_in<1>().set_ioport("JOYY");
+ //SOFTWARE_LIST(config, "jakks_gamekey_wp").set_original("jakks_gamekey_wp"); // NO KEYS RELEASED
+}
+
+void jakks_gkr_state::jakks_gkr_cb(machine_config &config)
+{
+ jakks_gkr(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ m_maincpu->adc_in<0>().set_ioport("JOYX");
+ m_maincpu->adc_in<1>().set_ioport("JOYY");
+ //SOFTWARE_LIST(config, "jakks_gamekey_cb").set_original("jakks_gamekey_cb"); // NO KEYS RELEASED
+}
+
+void jakks_gkr_state::jakks_gkr_nm_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ m_maincpu->adc_in<0>().set_ioport("DIALX");
+ SOFTWARE_LIST(config, "jakks_gamekey_nm").set_original("jakks_gamekey_nm");
+}
+
+void jakks_gkr_state::jakks_gkr_cc_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ // shows 'E0' in gamekey test menu on real HW (maybe related to value key needs to return if one existed)
+ //SOFTWARE_LIST(config, "jakks_gamekey_cc").set_original("jakks_gamekey_cc"); // no game keys were released
+}
+
+void jakks_gkr_state::jakks_gkr_wf_i2c(machine_config &config)
+{
+ jakks_gkr_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
+ //m_maincpu->adc_in<0>().set_ioport("DIALX"); // wheel does not seem to map here
+ //m_maincpu->adc_in<1>().set_ioport("DIALY");
+ //SOFTWARE_LIST(config, "jakks_gamekey_wf").set_original("jakks_gamekey_wf"); // no game keys were released
+}
+
+
+
+void jakks_gkr_state::walle(machine_config &config)
+{
+ jakks_i2c(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_2m);
+ m_maincpu->portc_in().set_ioport("P3");
+ m_maincpu->portc_out().set(FUNC(jakks_gkr_state::walle_portc_w));
+}
+
+
+ROM_START( jak_batm )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "batman.bin", 0x000000, 0x400000, CRC(46f848e5) SHA1(5875d57bb3fe0cac5d20e626e4f82a0e5f9bb94c) )
+ROM_END
+
+ROM_START( jak_wall )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(bd554cba) SHA1(6cd06a036ab12e7b0e1fd8003db873b0bb783868) )
+ // both of these dumps are bad, but in slightly different ways, note the random green pixels around the text (bad data is reported in secret test mode)
+ //ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(6bc90b16) SHA1(184d72de059057aae7800da510fcf05ed1da9ec9))
+ROM_END
+
+ROM_START( jak_wwe )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakkswwegkr.bin", 0x000000, 0x200000, CRC(b078a812) SHA1(7d97c0e2171b3fd91b280480c9ffd5651828195a) )
+ROM_END
+
+ROM_START( jak_fan4 )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksffgkr.bin", 0x000000, 0x200000, CRC(8755a1f7) SHA1(7214da15fe61881da27b81575fbdb54cc0f1d6aa) )
+ROM_END
+
+ROM_START( jak_just )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksjlagkr.bin", 0x000000, 0x200000, CRC(182989f0) SHA1(799229c537d6fe629ba9e1e4051d1bb9ca445d44) )
+ROM_END
+
+ROM_START( jak_dora )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdoragkr.bin", 0x000000, 0x200000, CRC(bcaa132d) SHA1(3894b980fbc4144731b2a7a94acebb29e30de67c) )
+ROM_END
+
+ROM_START( jak_nick )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksnicktoonsgkr.bin", 0x000000, 0x200000, CRC(4dec1656) SHA1(b3002ab15e75068102f4955a3f0c52fb6d5cda56) )
+ROM_END
+
+ROM_START( jak_sbfc )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksspongebobgkr.bin", 0x000000, 0x200000, CRC(9871303c) SHA1(78bc2687e1514094db8bb875e1117df3fcb3d201) )
+ROM_END
+
+ROM_START( jak_dorr )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdora2gkr.bin", 0x000000, 0x200000, CRC(6c09bcd9) SHA1(4bcad79658832f319d16b4f63257e127f6862d79) )
+ROM_END
+
+
+ROM_START( jak_spdm )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksspidermangkr.bin", 0x000000, 0x200000, CRC(1b2ee700) SHA1(30ea69c489e1238b004f473f972b682e35573138) )
+ROM_END
+
+ROM_START( jak_pooh )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakkspoohgkr.bin", 0x000000, 0x200000, CRC(0d97df55) SHA1(f108621a83c7b2263dd1531d82311627c3a02002) )
+ROM_END
+
+ROM_START( jak_care )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "carebeargkr.bin", 0x000000, 0x200000, CRC(e6096eb7) SHA1(92ee1a6df374f8b355ba2280dc43d764f6f69dfe) )
+ROM_END
+
+ROM_START( jak_wof )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakkswheeloffortunegkr.bin", 0x000000, 0x200000, CRC(6a879620) SHA1(95478764a61741569041c2299528f6464651d593) )
+ROM_END
+
+ROM_START( jak_disn )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "disneygkr.bin", 0x000000, 0x100000, CRC(7a5ebcd7) SHA1(9add8c2a6e3f0409c8957a2ba2d054fd2c4c39c1) )
+ROM_END
+
+ROM_START( jak_disf )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "disneyfriendsgkr.bin", 0x000000, 0x200000, CRC(77bca50b) SHA1(6e0f4fd229ee11eac721b5dbe79cf9002d3dbd64) )
+ROM_END
+
+ROM_START( jak_dpr )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdisneyprincessgkr.bin", 0x000000, 0x200000, CRC(e26003ce) SHA1(ee15243281df6f09b96185c34582d7091604c954) )
+ROM_END
+
+ROM_START( jak_dprs )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "disneyprincess2gkr.bin", 0x000000, 0x200000, CRC(b670bdde) SHA1(c33ce7ada72a0c44bc881b5792cd33a9f2f0fb08) )
+ROM_END
+
+ROM_START( jak_mpac )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksmspacmangkr.bin", 0x000000, 0x100000, CRC(cab40f77) SHA1(30731acc461150d96aafa7a0451cfb1a25264678) )
+ROM_END
+
+ROM_START( jak_sdoo )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksscoobydoogkr.bin", 0x000000, 0x400000, CRC(61062ce5) SHA1(9d21767fd855385ef83e4209c429ecd4bf7e5384) )
+ROM_END
+
+ROM_START( jak_dbz )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksdragonballzgkr.bin", 0x000000, 0x200000, CRC(d52c3b20) SHA1(fd5ce41c143cad9bca3372054f4ff98b52c33874) )
+ROM_END
+
+ROM_START( jak_sith )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "jakksstarwarsgkr.bin", 0x000000, 0x200000, CRC(932cde19) SHA1(b88b748c235e9eeeda574e4d5b4077ae9da6fbd0) )
+ROM_END
+
+ROM_START( jak_capc )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "capcomgkr.bin", 0x000000, 0x200000, CRC(6d47cce4) SHA1(263926a991d55459aa3cee90049d2202c1e3a70e) )
+ROM_END
+
+
+
+// JAKKS Pacific Inc TV games
+CONS( 2004, jak_batm, 0, 0, jakks, batman, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "The Batman (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2008, jak_wall, 0, 0, walle, walle, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wall-E (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+// 'Game-Key Ready' JAKKS games (these can also take per-game specific expansion cartridges, although not all games had them released)
+// Some of these were available in versions without Game-Key ports, it is unconfirmed if code was the same unless otherwise stated
+// For units released AFTER the GameKey promotion was cancelled it appears the code is the same as the PCB inside is the same, just the external port closed off, earlier units might be different hardware in some cases.
+// units released BEFORE the GameKey support were sometimes different hardware, eg. the Spider-Man and Disney units were SPG110 based
+CONS( 2005, jak_wwe, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "WWE (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // WW (no game-keys released)
+CONS( 2005, jak_fan4, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Fantastic Four (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // F4 (no game-keys released)
+CONS( 2005, jak_just, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Taniko", "Justice League (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // DC (no game-keys released)
+CONS( 2005, jak_dora, 0, 0, jakks_gkr_nk, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dora the Explorer - Nursery Rhyme Adventure (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys (same as Nicktoons & Spongebob) (3 released) - The upper part of this one is pink/purple.
+CONS( 2005, jak_dorr, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dora the Explorer - Race to Play Park (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys (same as Nicktoons & Spongebob) (3 released) - The upper part of this one is blue
+CONS( 2004, jak_nick, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Nicktoons (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys
+CONS( 2005, jak_sbfc, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "SpongeBob SquarePants - The Fry Cook Games (JAKKS Pacific TV Game, Game-Key Ready) (AUG 18 2005 21:31:56)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys
+CONS( 2005, jak_sdoo, 0, 0, jakks_gkr_2m_i2c, jak_sdoo_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Jolliford Management", "Scooby-Doo! and the Mystery of the Castle (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // SD (no game-keys released) (was dumped from a later unit with GameKey port missing, but internal PCB still supported it, code likely the same)
+CONS( 2005, jak_disn, 0, 0, jakks_gkr_dy, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Disney (JAKKS Pacific TV Game, Game-Key Ready) (08 FEB 2005 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
+CONS( 2005, jak_disf, 0, 0, jakks_gkr_dy_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Disney Friends (JAKKS Pacific TV Game, Game-Key Ready) (17 MAY 2005 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
+CONS( 2005, jak_dpr, 0, 0, jakks_gkr_dp_i2c, jak_dpr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / 5000ft, Inc", "Disney Princess (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DP keys (1 key released)
+CONS( 2005, jak_dprs, 0, 0, jakks_gkr_dp_i2c, jak_dpr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / 5000ft, Inc", "Disney Princesses (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DP keys (1 key released) (unit looks identical to above, including just having 'Disney Princess' logo, but this one has the 'board game' as a frontend and a slightly different on-screen title)
+CONS( 2005, jak_sith, 0, 0, jakks_gkr_sw_i2c, jak_sith_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Griptonite Games", "Star Wars - Revenge of the Sith (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses SW keys (1 released)
+CONS( 2005, jak_dbz, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dragon Ball Z (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // DB (no game-keys released, 1 in development but cancelled)
+CONS( 2005, jak_mpac, 0, 0, jakks_gkr_nm_i2c, jak_nm_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Namco / HotGen Ltd", "Ms. Pac-Man 5-in-1 (Ms. Pac-Man, Pole Position, Galaga, Xevious, Mappy) (JAKKS Pacific TV Game, Game-Key Ready) (07 FEB 2005 A SKU F)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NM (3 keys available [Dig Dug, New Rally-X], [Rally-X, Pac-Man, Bosconian], [Pac-Man, Bosconian])
+CONS( 2005, jak_capc, 0, 0, jakks_gkr_cc_i2c, jak_cc_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Capcom / HotGen Ltd", "Capcom 3-in-1 (1942, Commando, Ghosts'n Goblins) (JAKKS Pacific TV Game, Game-Key Ready) (29 MAR 2005 B)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses CC keys (no game-keys released)
+CONS( 2005, jak_wof, 0, 0, jakks_gkr_wf_i2c, jak_wf_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wheel of Fortune (JAKKS Pacific TV Game, Game-Key Ready) (Jul 11 2005 ORIG)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses WF keys (no game-keys released) analog wheel not emulated
+// There is a 'Second Edition' version of Wheel of Fortune with a Gold case, GameKey port removed, and a '2' over the usual Game Key Ready logo, internals are different too, not Game-Key Ready
+CONS( 2004, jak_spdm, 0, 0, jakks_gkr_mv_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Spider-Man (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // MV (1 key available)
+CONS( 2005, jak_pooh, 0, 0, jakks_gkr_wp, jak_pooh, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Backbone Entertainment", "Winnie the Pooh - Piglet's Special Day (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // WP (no game-keys released)
+CONS( 2005, jak_care, 0, 0, jakks_gkr_cb, jak_care, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Backbone Entertainment", "Care Bears TV Games (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // CB (no game-keys released)
+
+// Some versions of the Shrek - Over the Hedge unit show the GameKey logo on startup (others don't) there is no evidence to suggest it was ever released with a GameKey port tho, and the internal PCB has no place for one on the versions we've seen (which show the logo)
diff --git a/src/mame/drivers/spg2xx_lexibook.cpp b/src/mame/drivers/spg2xx_lexibook.cpp
new file mode 100644
index 00000000000..e3875c39d1c
--- /dev/null
+++ b/src/mame/drivers/spg2xx_lexibook.cpp
@@ -0,0 +1,261 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+#include "includes/spg2xx.h"
+
+class spg2xx_lexiseal_game_state : public spg2xx_game_state
+{
+public:
+ spg2xx_lexiseal_game_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag)
+ { }
+
+ void lexiseal(machine_config& config);
+ void lexizeus(machine_config &config);
+
+ void init_zeus();
+
+protected:
+ //virtual void machine_start() override;
+ //virtual void machine_reset() override;
+
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+};
+
+
+static INPUT_PORTS_START( lexizeus ) // how many buttons does this have? I accidentally entered a secret test mode before that seemed to indicate 6, but can't get there again
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "P1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Button 1") // shoot in Tiger Rescue & Deep
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Pause")
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Button 1 Rapid") // same function as button 1 but with rapid toggle on/off
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Button 2 Rapid") // same function as button 2 but with rapid toggle on/off
+ PORT_DIPNAME( 0x0004, 0x0004, "P3" )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Button 2") // toggles ball / number view in pool
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+
+static INPUT_PORTS_START( lexiseal )
+ PORT_START("P1")
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNUSED ) // doesn't respond as 'select'
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON3 ) // pause / start
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON5 )
+ PORT_BIT( 0xfffc, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+
+WRITE16_MEMBER(spg2xx_lexiseal_game_state::portb_w)
+{
+ //logerror("%s: portb_w %04x\n", machine().describe_context(), data);
+
+ // only 2 banks
+ if (data == 0x5f)
+ switch_bank(0);
+ else if (data == 0xdf)
+ switch_bank(1);
+}
+
+
+void spg2xx_lexiseal_game_state::lexiseal(machine_config &config)
+{
+ non_spg_base(config);
+ m_maincpu->portb_out().set(FUNC(spg2xx_lexiseal_game_state::portb_w));
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+}
+
+void spg2xx_lexiseal_game_state::lexizeus(machine_config &config)
+{
+ non_spg_base(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_lexiseal_game_state::mem_map_4m);
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+}
+
+void spg2xx_lexiseal_game_state::init_zeus()
+{
+ uint16_t *ROM = (uint16_t*)memregion("maincpu")->base();
+ int size = memregion("maincpu")->bytes();
+
+ for (int i = 0x8000 / 2; i < size / 2; i++)
+ {
+ // global 16-bit xor
+ ROM[i] = ROM[i] ^ 0x8a1d;
+
+ // 4 single bit conditional xors
+ if (ROM[i] & 0x0020)
+ ROM[i] ^= 0x0100;
+
+ if (ROM[i] & 0x0040)
+ ROM[i] ^= 0x1000;
+
+ if (ROM[i] & 0x4000)
+ ROM[i] ^= 0x0001;
+
+ if (ROM[i] & 0x0080)
+ ROM[i] ^= 0x0004;
+
+ // global 16-bit bitswap
+ ROM[i] = bitswap<16>(ROM[i], 7, 12, 9, 14, 4, 6, 0, 10, 15, 1, 3, 2, 5, 13, 8, 11);
+ }
+}
+
+
+
+ROM_START( lexizeus )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "lexibook1g900us.bin", 0x0000, 0x800000, CRC(c2370806) SHA1(cbb599c29c09b62b6a9951c724cd9fc496309cf9))
+ROM_END
+
+ROM_START( lexiseal )
+ ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "lexibook_seal.bin", 0x0000, 0x1000000, CRC(3529f154) SHA1(f5f142600c6b2d037b97e007364ea2fa228e0163) )
+ROM_END
+
+
+
+
+// Similar, SPG260?, scrambled
+CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_lexiseal_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad sound and some corrupt bg tilemap entries in Tiger Rescue, verify ROM data (same game runs in Zone 60 without issue)
+CONS( 200?, lexiseal, 0, 0, lexiseal, lexiseal, spg2xx_lexiseal_game_state, init_zeus, "Lexibook / Sit Up Limited", "Seal 50-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // also has bad sound in Tiger Rescue, but no corrupt tilemap
+
diff --git a/src/mame/drivers/spg2xx_pdc.cpp b/src/mame/drivers/spg2xx_pdc.cpp
new file mode 100644
index 00000000000..f82995fa80b
--- /dev/null
+++ b/src/mame/drivers/spg2xx_pdc.cpp
@@ -0,0 +1,91 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+#include "includes/spg2xx.h"
+
+class spg2xx_pdc100_game_state : public spg2xx_game_state
+{
+public:
+ spg2xx_pdc100_game_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag)
+ { }
+
+ void pdc100(machine_config& config);
+
+protected:
+ //virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+};
+
+
+static INPUT_PORTS_START( pdc100 )
+ PORT_START("P1")
+ PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Left Trigger")
+ PORT_BIT( 0x0e00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Right Trigger")
+ PORT_BIT( 0xe000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Pause")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+void spg2xx_pdc100_game_state::machine_reset()
+{
+ m_current_bank = -1;
+ switch_bank(7); // must boot from upper bank
+ m_maincpu->reset();
+}
+
+WRITE16_MEMBER(spg2xx_pdc100_game_state::porta_w)
+{
+ //logerror("%s: porta_w %04x\n", machine().describe_context(), data);
+
+ // simply writes 0000 at times during bootup while initializing stuff, which causes an invalid bankswitch mid-code execution
+ if (data & 0xff00)
+ switch_bank(data & 0x0007);
+}
+
+
+void spg2xx_pdc100_game_state::pdc100(machine_config &config)
+{
+ non_spg_base(config);
+ m_maincpu->porta_out().set(FUNC(spg2xx_pdc100_game_state::porta_w));
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3"); // not used?
+}
+
+ROM_START( pdc100 )
+ ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
+ // only 1st half of this is used "Jumper resistor (0 ohm) that short A25 to ground"
+ // 2nd half just contains what seems to be random garbage
+ ROM_LOAD16_WORD_SWAP( "pdc100.bin", 0x000000, 0x8000000, CRC(57285b49) SHA1(cfb4be7877ec263d24063a004c56985db5c0f4e2) )
+ROM_END
+
+
+// there were older models eg. PDC30 with fewer games, and some differences (eg "Jo Ma" instead of "Jo Ma 2")
+// "Jo Ma 2" shows "Licensed by Mitchell Corporation" (Mitchell made the original Puzzloop on which this style of game is based) Videos of the original Jo Ma show it lacking this text.
+
+// Other known units
+// PDC Teenage Mutant Ninja Turtles
+// PDC Dora the Explorer
+// PDC 30
+// PDC 40
+// PDC 200
+
+// This was dumped from an Anncia branded unit, although there's no ingame branding, so ROM is probably the same for all PDC100 units
+CONS( 2008, pdc100, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny", "PDC100 - Pocket Dream Console", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/spg2xx_playvision.cpp b/src/mame/drivers/spg2xx_playvision.cpp
new file mode 100644
index 00000000000..037bf736ec5
--- /dev/null
+++ b/src/mame/drivers/spg2xx_playvision.cpp
@@ -0,0 +1,230 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+#include "includes/spg2xx.h"
+#include "pvmil.lh"
+
+
+class pvmil_state : public spg2xx_game_state
+{
+public:
+ pvmil_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_portcdata(0x0000),
+ m_latchcount(0),
+ m_latchbit(0),
+ m_outdat(0),
+ m_p4inputs(*this, "EXTRA"),
+ m_leds(*this, "led%u", 0U)
+ { }
+
+ void pvmil(machine_config &config);
+
+ DECLARE_READ_LINE_MEMBER(pvmil_p4buttons_r);
+
+protected:
+ virtual void machine_start() override;
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portc_w) override;
+
+private:
+ uint16_t m_portcdata;
+ int m_latchcount;
+ int m_latchbit;
+ uint16_t m_outdat;
+ optional_ioport m_p4inputs;
+ output_finder<4> m_leds;
+};
+
+
+void pvmil_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ m_leds.resolve();
+ save_item(NAME(m_portcdata));
+ save_item(NAME(m_latchcount));
+ save_item(NAME(m_latchbit));
+ save_item(NAME(m_outdat));
+}
+
+
+WRITE16_MEMBER(pvmil_state::porta_w)
+{
+ logerror("%s: pvmil_porta_w %04x\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(pvmil_state::portb_w)
+{
+ logerror("%s: pvmil_portb_w %04x\n", machine().describe_context(), data);
+}
+
+
+READ_LINE_MEMBER(pvmil_state::pvmil_p4buttons_r)
+{
+ return m_latchbit;
+}
+
+
+WRITE16_MEMBER(pvmil_state::portc_w)
+{
+ // ---- -432 1--- r-?c
+ // 4,3,2,1 = player controller LEDs
+ // r = reset input multiplexer
+ // ? = unknown
+ // m = input multiplexer clock
+
+ // p4 input reading
+ // the code to read them is interesting tho, it even includes loops that poll port a 16 times before/after, why?
+ logerror("%s: pvmil_portc_w %04x\n", machine().describe_context(), data);
+
+ uint16_t bit;
+
+ // for logging bits changed on the port
+ if (0)
+ {
+ for (int i = 0; i < 16; i++)
+ {
+ bit = 1 << i;
+ if ((m_portcdata & bit) != (data & bit))
+ {
+ if (data & bit)
+ {
+ logerror("port c %04x low to high\n", bit);
+ }
+ else
+ {
+ logerror("port c %04x high to low\n", bit);
+ }
+ }
+
+ if ((m_portcdata & 0x0400) != (data & 0x0400))
+ {
+ logerror("-------------------------------------------------\n");
+ }
+ }
+ }
+
+ // happens on startup, before it starts reading inputs for the first time, assume 'reset counter'
+ bit = 0x0008;
+ if ((m_portcdata & bit) != (data & bit))
+ {
+ if (data & bit)
+ {
+ logerror("reset read counter\n");
+ m_latchcount = 0;
+ }
+ }
+
+ bit = 0x0001;
+ if ((m_portcdata & bit) != (data & bit))
+ {
+ if (!(data & bit))
+ {
+ //logerror("latch with count of %d (outbit is %d)\n", m_latchcount, (m_portcdata & 0x0002)>>1 );
+ // what is bit 0x0002? it gets flipped in the same code as the inputs are read.
+ // it doesn't follow any obvious pattern
+ m_outdat &= ~(1 << m_latchcount);
+ m_outdat |= ((data & 0x0002) >> 1) << m_latchcount;
+ if (0)
+ popmessage("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
+ (m_outdat & 0x8000) ? 1 : 0, (m_outdat & 0x4000) ? 1 : 0, (m_outdat & 0x2000) ? 1 : 0, (m_outdat & 0x1000) ? 1 : 0,
+ (m_outdat & 0x0800) ? 1 : 0, (m_outdat & 0x0400) ? 1 : 0, (m_outdat & 0x0200) ? 1 : 0, (m_outdat & 0x0100) ? 1 : 0,
+ (m_outdat & 0x0080) ? 1 : 0, (m_outdat & 0x0040) ? 1 : 0, (m_outdat & 0x0020) ? 1 : 0, (m_outdat & 0x0010) ? 1 : 0,
+ (m_outdat & 0x0008) ? 1 : 0, (m_outdat & 0x0004) ? 1 : 0, (m_outdat & 0x0002) ? 1 : 0, (m_outdat & 0x0001) ? 1 : 0);
+
+
+ m_latchbit = (((m_p4inputs->read()) << m_latchcount) & 0x8000) ? 1 : 0;
+
+ m_latchcount++;
+ if (m_latchcount == 16)
+ m_latchcount = 0;
+ }
+ }
+
+ m_portcdata = data;
+
+ if (0)
+ popmessage("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
+ (m_portcdata & 0x8000) ? 1 : 0, (m_portcdata & 0x4000) ? 1 : 0, (m_portcdata & 0x2000) ? 1 : 0, (m_portcdata & 0x1000) ? 1 : 0,
+ (m_portcdata & 0x0800) ? 1 : 0, (m_portcdata & 0x0400) ? 1 : 0, (m_portcdata & 0x0200) ? 1 : 0, (m_portcdata & 0x0100) ? 1 : 0,
+ (m_portcdata & 0x0080) ? 1 : 0, (m_portcdata & 0x0040) ? 1 : 0, (m_portcdata & 0x0020) ? 1 : 0, (m_portcdata & 0x0010) ? 1 : 0,
+ (m_portcdata & 0x0008) ? 1 : 0, (m_portcdata & 0x0004) ? 1 : 0, (m_portcdata & 0x0002) ? 1 : 0, (m_portcdata & 0x0001) ? 1 : 0);
+
+ m_leds[0] = (m_portcdata & 0x0080) ? 0 : 1;
+ m_leds[1] = (m_portcdata & 0x0100) ? 0 : 1;
+ m_leds[2] = (m_portcdata & 0x0200) ? 0 : 1;
+ m_leds[3] = (m_portcdata & 0x0400) ? 0 : 1;
+}
+
+
+static INPUT_PORTS_START( pvmil ) // hold "console start" + "console select" on boot for test mode
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Player 1 A")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Player 1 B")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Player 1 C")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Player 1 D")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Player 2 A")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Player 2 B")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Player 2 C")
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("Player 2 D")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_NAME("Player 3 A")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_NAME("Player 3 B")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) PORT_NAME("Player 3 C")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(3) PORT_NAME("Player 3 D")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("Player 1 Lifeline")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START ) PORT_CODE(KEYCODE_1) PORT_NAME("Console Start")
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CODE(KEYCODE_5) PORT_NAME("Console Select")
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(pvmil_state, pvmil_p4buttons_r) // Player 4 buttons read through here
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("Player 2 Lifeline")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(3) PORT_NAME("Player 3 Lifeline")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(4) PORT_NAME("Player 4 Lifeline")
+ PORT_BIT( 0xff80, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("EXTRA")
+ PORT_BIT( 0x0fff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_NAME("Player 4 A")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_NAME("Player 4 B")
+ PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) PORT_NAME("Player 4 C")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(4) PORT_NAME("Player 4 D")
+INPUT_PORTS_END
+
+
+void pvmil_state::pvmil(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &pvmil_state::mem_map_4m);
+ m_maincpu->set_pal(true);
+
+ spg2xx_base(config);
+
+ m_screen->set_refresh_hz(50);
+ //m_screen->set_size(320, 312);
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+ m_maincpu->porta_out().set(FUNC(pvmil_state::porta_w));
+ m_maincpu->portb_out().set(FUNC(pvmil_state::portb_w));
+ m_maincpu->portc_out().set(FUNC(pvmil_state::portc_w));
+
+ config.set_default_layout(layout_pvmil);
+}
+
+ROM_START( pvmil )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) // Fujistu 29Z0002TN, read as ST M29W320FB
+ ROM_LOAD16_WORD_SWAP( "millionare4.bin", 0x000000, 0x400000, CRC(9c43d0f2) SHA1(fb4ba0115000b10b7c0e0d44b9fa3234c900e694) )
+ROM_END
+
+// there are other regions of this, including a Finnish version "Haluatko miljonääriksi?" (see https://millionaire.fandom.com/wiki/Haluatko_miljon%C3%A4%C3%A4riksi%3F_(Play_Vision_game) )
+CONS( 2006, pvmil, 0, 0, pvmil, pvmil, pvmil_state, empty_init, "Play Vision", "Who Wants to Be a Millionaire? (Play Vision, Plug and Play, UK)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/spg2xx_senario.cpp b/src/mame/drivers/spg2xx_senario.cpp
new file mode 100644
index 00000000000..6c1e72936b8
--- /dev/null
+++ b/src/mame/drivers/spg2xx_senario.cpp
@@ -0,0 +1,285 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+/*
+ General Senario games on SunPlus hardware
+
+ these check for flash ROM and actually save user data at 0x700000 in the flash ROM
+
+ TODO:
+ senmil - Are the LEDs on the controllers meant to go out as players select answers like with pvmil, or are they just to show that the controller is connected?
+ sencosmo - fix Flash hookup
+*/
+
+#include "includes/spg2xx.h"
+#include "machine/intelfsh.h"
+
+class spg2xx_senario_state : public spg2xx_game_state
+{
+public:
+ spg2xx_senario_state(const machine_config& mconfig, device_type type, const char* tag) :
+ spg2xx_game_state(mconfig, type, tag)
+ { }
+
+protected:
+ //virtual void machine_start() override;
+ //virtual void machine_reset() override;
+
+private:
+};
+
+class spg2xx_senario_bbs_state : public spg2xx_senario_state
+{
+public:
+ spg2xx_senario_bbs_state(const machine_config& mconfig, device_type type, const char* tag) :
+ spg2xx_senario_state(mconfig, type, tag)
+ { }
+
+ void senbbs(machine_config& config);
+ void mem_map_flash(address_map &map);
+
+protected:
+ //virtual void machine_start() override;
+ //virtual void machine_reset() override;
+
+private:
+};
+
+class spg2xx_senario_cosmo_state : public spg2xx_senario_bbs_state
+{
+public:
+ spg2xx_senario_cosmo_state(const machine_config& mconfig, device_type type, const char* tag) :
+ spg2xx_senario_bbs_state(mconfig, type, tag),
+ m_romregion(*this, "flash")
+ { }
+
+ void sencosmo(machine_config& config);
+ void mem_map_flash_bypass(address_map& map);
+
+protected:
+ //virtual void machine_start() override;
+ //virtual void machine_reset() override;
+
+ DECLARE_READ16_MEMBER(read_bypass) { return m_romregion[offset]; }
+ DECLARE_WRITE16_MEMBER(write_bypass) { logerror("Write to ROM area %08x %04x\n", offset, data); }
+
+private:
+ required_region_ptr<uint16_t> m_romregion;
+};
+
+
+class spg2xx_senario_mil_state : public spg2xx_senario_bbs_state
+{
+public:
+ spg2xx_senario_mil_state(const machine_config& mconfig, device_type type, const char* tag) :
+ spg2xx_senario_bbs_state(mconfig, type, tag),
+ m_portc_data(0)
+ { }
+
+ void senmil(machine_config& config);
+
+protected:
+ //virtual void machine_start() override;
+ //virtual void machine_reset() override;
+
+ DECLARE_READ16_MEMBER(portc_r);
+
+ virtual DECLARE_WRITE16_MEMBER(portc_w) override;
+
+private:
+ uint16_t m_portc_data;
+};
+
+static INPUT_PORTS_START( senmil ) // reset with Console Start and Console Select held down for test mode
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Player 1 A")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Player 1 B")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Player 1 C")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Player 1 D")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Player 2 A")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Player 2 B")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Player 2 C")
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("Player 2 D")
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_NAME("Player 3 A")
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_NAME("Player 3 B")
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3) PORT_NAME("Player 3 C")
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(3) PORT_NAME("Player 3 D")
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_NAME("Player 4 A")
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_NAME("Player 4 B")
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4) PORT_NAME("Player 4 C")
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(4) PORT_NAME("Player 4 D")
+
+ PORT_START("P2")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("Player 1 Select")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("Player 1 OK")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("Player 2 Select")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("Player 2 OK")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(3) PORT_NAME("Player 3 Select")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(3) PORT_NAME("Player 3 OK")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(4) PORT_NAME("Player 4 Select")
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(4) PORT_NAME("Player 4 OK")
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Pad Connection Status (see spg2xx_senario_mil_state::portc_r)
+ PORT_BIT( 0x0300, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Low Battery sensor
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_CODE(KEYCODE_1) PORT_NAME("Console Start")
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_SELECT ) PORT_CODE(KEYCODE_5) PORT_NAME("Console Select")
+ PORT_BIT( 0xe000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( senbbs ) // reset with Select and Spin held down for test mode
+ PORT_START("P1")
+ // To use Gambling controls or not? This is a Plug and Play themed controller, not an actual gambling unit
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Spin")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Lever")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Select")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("OK")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Bet")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Cash Out")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Bet Max")
+ PORT_BIT( 0x7f80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Low Battery sensor
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( senappren )
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Red Team Select")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Red Team Ok")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Blue Team Select")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Blue Team Ok")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_1) PORT_NAME("Console Ok")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_5) PORT_NAME("Console Select")
+ PORT_BIT( 0x7f80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Low Battery sensor
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( sencosmo ) // hold Pause during power on for Test Menu
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Player 1 A")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Player 1 B")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Player 1 C")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Player 1 D")
+ PORT_BIT( 0x0030, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_1) PORT_NAME("Console Pause")
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Player 2 A")
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Player 2 B")
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Player 2 C")
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("Player 2 D")
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_CODE(KEYCODE_5) PORT_NAME("Console Power")
+ PORT_BIT( 0x6000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Low Battery sensor
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+void spg2xx_senario_bbs_state::mem_map_flash(address_map &map)
+{
+ map(0x000000, 0x3fffff).rw("flash", FUNC(spansion_s29gl064s_device::read), FUNC(spansion_s29gl064s_device::write));
+}
+
+// this is meant to be flash, but it crashes with invalid flash command when answering questions?
+void spg2xx_senario_cosmo_state::mem_map_flash_bypass(address_map &map)
+{
+ map(0x000000, 0x1fffff).rw(FUNC(spg2xx_senario_cosmo_state::read_bypass), FUNC(spg2xx_senario_cosmo_state::write_bypass));
+}
+
+
+WRITE16_MEMBER(spg2xx_senario_mil_state::portc_w)
+{
+ // -4-3 -2-1
+ // change when a button for that player is pressed, none of these seem to be for the LEDs on the controllers (or are they 'always on')
+
+ logerror("%s: spg2xx_senario_mil_state::portc_w %04x ---- %04x %04x \n", machine().describe_context(), data, data & 0x55, data & 0xaa);
+ m_portc_data = data;
+}
+
+READ16_MEMBER(spg2xx_senario_mil_state::portc_r)
+{
+ uint16_t ret = m_io_p3->read() & 0xffaa; // 0xaa must be set to register all controllers as turned on
+ ret |= m_portc_data & 0x0055;
+ return ret;
+}
+
+void spg2xx_senario_bbs_state::senbbs(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_senario_bbs_state::mem_map_flash);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+
+ SPANSION_S29GL064S(config, "flash");
+}
+
+void spg2xx_senario_cosmo_state::sencosmo(machine_config& config)
+{
+ senbbs(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_senario_cosmo_state::mem_map_flash_bypass);
+}
+
+
+void spg2xx_senario_mil_state::senmil(machine_config& config)
+{
+ senbbs(config);
+
+ m_maincpu->portc_in().set(FUNC(spg2xx_senario_mil_state::portc_r));
+ m_maincpu->portc_out().set(FUNC(spg2xx_senario_mil_state::portc_w));
+}
+
+// is ROM_REGION16_BE correct here, allows us to use ROM_LOAD16_WORD_SWAP as when loading SunPlus stuff in other cases
+
+ROM_START( senapren )
+ ROM_REGION16_BE( 0x800000, "flash", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "apprentice.bin", 0x000000, 0x200000, BAD_DUMP CRC(1c919e72) SHA1(20efcb992bd3ff8ab78470bd484f4f0b226e6c15) ) // needs further verification
+ // That one has a SOP44 COB instead of a TSOP48 chip. Pin 1 is N/C, 32 is grounded, and 33 is tied high. That means a max of A0-A20 = 21 16-bit address lines, for 4MB
+ // Data repeated dumped as 4MB, so 2MB? (but game attempts to write to 0x700000 for flash user data which would erase game data in a 2MB ROM)
+ROM_END
+
+ROM_START( sencosmo )
+ ROM_REGION16_BE( 0x400000, "flash", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "cosmo.bin", 0x000000, 0x400000, BAD_DUMP CRC(1ec50795) SHA1(621c4e03b5713f3678d2935f8938f15c5d4a5fdf) ) // needs further verification
+ // attempts to write to 0x380000 for flash user data? different Flash type?
+ROM_END
+
+ROM_START( senmil )
+ ROM_REGION16_BE( 0x800000, "flash", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "wwtbam_nouserdata.bin", 0x000000, 0x800000, CRC(b2626df6) SHA1(f06943d63dbb1c9d211cb35b40dcb18cb8b39ecd) )
+ROM_END
+
+ROM_START( senbbs )
+ ROM_REGION16_BE( 0x800000, "flash", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "bigbonusslots.bin", 0x000000, 0x800000, CRC(071effc3) SHA1(892c05a8b64a388b331ad0d361bf4c523c6c14c9) )
+ROM_END
+
+
+
+CONS( 2005, senbbs, 0, 0, senbbs, senbbs, spg2xx_senario_bbs_state, empty_init, "Senario", "Big Bonus Slots (Senario, Plug and Play)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, senapren, 0, 0, senbbs, senappren, spg2xx_senario_bbs_state, empty_init, "Senario", "The Apprentice (Senario, Plug and Play)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2005, sencosmo, 0, 0, sencosmo, sencosmo, spg2xx_senario_cosmo_state, empty_init, "Senario", "Cosmo Girl (Senario, Plug and Play)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2006, senmil, 0, 0, senmil, senmil, spg2xx_senario_mil_state, empty_init, "Senario", "Who Wants to Be a Millionaire? (Senario, Plug and Play, US)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/spg2xx_senario_poker.cpp b/src/mame/drivers/spg2xx_senario_poker.cpp
new file mode 100644
index 00000000000..a4c0d88532f
--- /dev/null
+++ b/src/mame/drivers/spg2xx_senario_poker.cpp
@@ -0,0 +1,680 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+/* 'Zone' systems */
+
+#include "includes/spg2xx.h"
+#include "sentx6p.lh"
+
+
+class sentx6p_state : public spg2xx_game_state
+{
+public:
+ sentx6p_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_porta_data(0x0000),
+ m_suite1(*this, "SUITE_LEFT_BZ%u", 0U),
+ m_suite2(*this, "SUITE_RIGHT_BZ%u", 0U),
+ m_number1(*this, "NUMBER_LEFT_BZ%u", 0U),
+ m_number2(*this, "NUMBER_RIGHT_BZ%u", 0U),
+ m_select_fold(*this, "SELECT_FOLD_BZ%u", 0U),
+ m_select_check(*this, "SELECT_CHECK_BZ%u", 0U),
+ m_select_bet(*this, "SELECT_BET_BZ%u", 0U),
+ m_select_call(*this, "SELECT_CALL_BZ%u", 0U),
+ m_select_raise(*this, "SELECT_RAISE_BZ%u", 0U),
+ m_select_allin(*this, "SELECT_ALLIN_BZ%u", 0U),
+ m_option_fold(*this, "OPTION_FOLD_BZ%u", 0U),
+ m_option_check(*this, "OPTION_CHECK_BZ%u", 0U),
+ m_option_bet(*this, "OPTION_BET_BZ%u", 0U),
+ m_option_call(*this, "OPTION_CALL_BZ%u", 0U),
+ m_option_raise(*this, "OPTION_RAISE_BZ%u", 0U),
+ m_option_allin(*this, "OPTION_ALLIN_BZ%u", 0U),
+
+ m_led(*this, "LED_BZ%u", 0U)
+ { }
+
+ void sentx6p(machine_config &config);
+
+ void mem_map_2m_texas(address_map &map);
+
+ DECLARE_INPUT_CHANGED_MEMBER(ok_latch)
+ {
+ if (newval == 1)
+ {
+ m_inputlatches[param] |= 0x02;
+ logerror("latching OK button for Player %d\n", param+1);
+ }
+ }
+
+ DECLARE_INPUT_CHANGED_MEMBER(select_latch)
+ {
+ if (newval == 1)
+ {
+ m_inputlatches[param] |= 0x01;
+ logerror("latching Select button for Player %d\n", param+1);
+ }
+ }
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ READ16_MEMBER(sentx_porta_r);
+ READ16_MEMBER(sentx_portb_r);
+ READ16_MEMBER(sentx_portc_r);
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portc_w) override;
+
+ DECLARE_WRITE8_MEMBER(sentx_tx_w);
+
+ uint8_t m_lcd_card1[6];
+ uint8_t m_lcd_card2[6];
+ uint8_t m_lcd_options[6];
+ uint8_t m_lcd_options_select[6];
+ uint8_t m_lcd_led[6];
+
+ void set_card1(uint8_t value, int select_bits);
+ void set_card2(uint8_t value, int select_bits);
+ void set_options(uint8_t value, int select_bits);
+ void set_options_select(uint8_t value, int select_bits);
+ void set_controller_led(uint8_t value, int select_bits);
+
+ void controller_send_data(int which);
+
+ uint8_t m_inputlatches[6];
+
+ uint16_t m_porta_data;
+
+ output_finder<6> m_suite1;
+ output_finder<6> m_suite2;
+ output_finder<6> m_number1;
+ output_finder<6> m_number2;
+
+ output_finder<6> m_select_fold;
+ output_finder<6> m_select_check;
+ output_finder<6> m_select_bet;
+ output_finder<6> m_select_call;
+ output_finder<6> m_select_raise;
+ output_finder<6> m_select_allin;
+
+ output_finder<6> m_option_fold;
+ output_finder<6> m_option_check;
+ output_finder<6> m_option_bet;
+ output_finder<6> m_option_call;
+ output_finder<6> m_option_raise;
+ output_finder<6> m_option_allin;
+
+ output_finder<6> m_led;
+};
+
+
+void sentx6p_state::mem_map_2m_texas(address_map &map)
+{
+ map(0x000000, 0x1fffff).bankr("cartbank");
+ map(0x3f0000, 0x3f7fff).ram();
+}
+
+static INPUT_PORTS_START( sentx6p )
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "Port 1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ // is this really just the battery sensor, or does it have some other meaning, like data ready?
+ PORT_DIPNAME( 0x8000, 0x0000, "Low Battery" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
+
+ PORT_START("P2")
+ // these must be sense lines
+ PORT_DIPNAME( 0x0001, 0x0001, "Player 1 Connected" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0002, 0x0002, "Player 2 Connected" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0004, 0x0004, "Player 3 Connected" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0008, 0x0008, "Player 4 Connected" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0010, 0x0010, "Player 5 Connected" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x0020, 0x0020, "Player 6 Connected" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Yes ) )
+
+ PORT_DIPNAME( 0x0040, 0x0040, "Port 2" )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_DIPNAME( 0x0001, 0x0001, "Port 3" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_5) PORT_NAME("Console Select") // the Console buttons also work for Player 1
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_1) PORT_NAME("Console Ok")
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ // these are presuambly read through the UART as the LCD screens are driven by it, currently not hooked up
+ // using PORT_CHANGED_MEMBER because we assume the controller latches them for sending as inputs are only read every few frames
+ PORT_START("CTRL1")
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 0)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 0)
+
+ PORT_START("CTRL2")
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 1)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 1)
+
+ PORT_START("CTRL3")
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 2)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 2)
+
+ PORT_START("CTRL4")
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 3)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 3)
+
+ PORT_START("CTRL5")
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(5) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 4)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(5) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 4)
+
+ PORT_START("CTRL6")
+ PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(6) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 5)
+ PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(6) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 5)
+
+INPUT_PORTS_END
+
+
+void sentx6p_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ m_suite1.resolve();
+ m_suite2.resolve();
+ m_number1.resolve();
+ m_number2.resolve();
+
+ m_select_fold.resolve();
+ m_select_check.resolve();
+ m_select_bet.resolve();
+ m_select_call.resolve();
+ m_select_raise.resolve();
+ m_select_allin.resolve();
+
+ m_option_fold.resolve();
+ m_option_check.resolve();
+ m_option_bet.resolve();
+ m_option_call.resolve();
+ m_option_raise.resolve();
+ m_option_allin.resolve();
+
+ m_led.resolve();
+}
+
+void sentx6p_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+
+ for (int i = 0; i < 6; i++)
+ {
+ m_lcd_card1[i] = 0x00;
+ m_lcd_card2[i] = 0x00;
+ m_lcd_options[i] = 0x00;
+ m_lcd_options_select[i] = 0x00;
+ m_lcd_led[i] = 0x00;
+
+ m_inputlatches[i] = 0x00;
+ }
+
+ /* HACK: this address needs to contain '1' so that it thinks the first controller
+ is present, otherwise it hangs on boot. How does this get set?
+ following addresses are for the other controllers, and get set based on Port B
+ status flags */
+ address_space &mem = m_maincpu->space(AS_PROGRAM);
+ mem.write_word(0x1e08,0x0001);
+}
+
+void sentx6p_state::controller_send_data(int which)
+{
+ // 0x78 have to be set, this is probably because there is an unused space in the commands
+ // going the other way at 0x78 - 0x7f
+ // bit 3 (0x04) can also be set, doesn't care
+
+ uint8_t send = m_inputlatches[which] | 0x78;
+
+ m_maincpu->uart_rx( send );
+
+ if (m_inputlatches[which] & 0x03)
+ {
+ m_inputlatches[which] = 0x00;
+ logerror("clearing input latches for player %d\n", which + 1);
+ }
+}
+
+READ16_MEMBER(sentx6p_state::sentx_porta_r)
+{
+ int select_bits = (m_porta_data >> 8) & 0x3f;
+ logerror("%s: sentx_porta_r (with controller select bits %02x)\n", machine().describe_context(), select_bits);
+
+ /* 0000 = no controller? (system buttons only?)
+ 0100 = controller 1?
+ 0200 = controller 2?
+ 0400 = controller 3?
+ 0800 = controller 4?
+ 1000 = controller 5?
+ 2000 = controller 6?
+
+ this is an assumption based on startup, where the port is polled after writing those values
+ */
+
+ // the code around 029811 uses a ram value shifted left 8 times as the select bits (select_bits) on write
+ // then does a mask with them on the reads from this port, without shifting, comparing with 0
+
+ // the 'select bits' must also be active when the controller wants to send data, the UART read function
+ // won't proceed if they're zero, but the port is written with 0 before that
+
+ //logerror("%08x\n", m_maincpu->pc());
+
+ // regular logic for writing to the LCDs
+ uint16_t ret = (m_io_p1->read() & 0xffc0) | select_bits;
+
+ // hacks needed for reading from the UART to work
+
+ // the select bit must be high here to read from the controller?
+ if (m_maincpu->pc() == 0x2981e)
+ {
+ ret ^= 0x3f;
+ }
+
+ // but must be low again here after writing the select bits in order to not
+ // get stuck in a timeout loop
+ if (m_maincpu->pc() == 0x29834)
+ {
+ ret &= ~0x3f;
+
+ // presumably the inputs can only be sent once the controller is actually selected, otherwise
+ // there would be competing UART sources?
+ for (int i = 0; i < 6; i++)
+ {
+ if (select_bits & (1 << i))
+ {
+ controller_send_data(i);
+ }
+ }
+ }
+
+ return ret;
+}
+
+READ16_MEMBER(sentx6p_state::sentx_portb_r)
+{
+ return m_io_p2->read();
+}
+
+READ16_MEMBER(sentx6p_state::sentx_portc_r)
+{
+ return m_io_p3->read();
+}
+
+WRITE16_MEMBER(sentx6p_state::porta_w)
+{
+ logerror("%s: sentx_porta_w %04x\n", machine().describe_context(), data);
+
+ COMBINE_DATA(&m_porta_data);
+}
+
+WRITE16_MEMBER(sentx6p_state::portb_w)
+{
+ logerror("%s: sentx_portb_w %04x\n", machine().describe_context(), data);
+}
+
+WRITE16_MEMBER(sentx6p_state::portc_w)
+{
+ logerror("%s: sentx_portc_w %04x\n", machine().describe_context(), data);
+}
+
+/*
+ Card Table
+ (the controller must contain an MCU under the glob to receive thes commands
+ and convert them to actual LCD segments)
+
+ off 00
+ | A diamonds 01 | A hearts 0e | A spades 1b | A clubs 28 |
+ | 2 diamonds 02 | 2 hearts 0f | 2 spades 1c | 2 clubs 29 |
+ | 3 diamonds 03 | 3 hearts 10 | 3 spades 1d | 3 clubs 2a |
+ | 4 diamonds 04 | 4 hearts 11 | 4 spades 1e | 4 clubs 2b |
+ | 5 diamonds 05 | 5 hearts 12 | 5 spades 1f | 5 clubs 2c |
+ | 6 diamonds 06 | 6 hearts 13 | 6 spades 20 | 6 clubs 2d |
+ | 7 diamonds 07 | 7 hearts 14 | 7 spades 21 | 7 clubs 2e |
+ | 8 diamonds 08 | 8 hearts 15 | 8 spades 22 | 8 clubs 2f |
+ | 9 diamonds 09 | 9 hearts 16 | 9 spades 23 | 9 clubs 30 |
+ | 10 diamonds 0a | 10 hearts 17 | 10 spades 24 | 10 clubs 31 |
+ | J diamonds 0b | J hearts 18 | J spades 25 | J clubs 32 |
+ | Q diamonds 0c | Q hearts 19 | Q spades 26 | Q clubs 33 |
+ | K diamonds 0d | K hearts 1a | K spades 27 | K clubs 34 |
+
+*/
+
+void sentx6p_state::set_card1(uint8_t value, int select_bits)
+{
+ for (int i = 0; i < 6; i++)
+ {
+ if (select_bits & (1 << i))
+ {
+ m_lcd_card1[i] = value;
+
+ int val = m_lcd_card1[i];
+ if (val == 0)
+ {
+ m_suite1[i] = 0;
+ m_number1[i] = 0;
+ }
+ else
+ {
+ int suite = (val-1) / 13;
+ int number = (val-1) % 13;
+
+ m_suite1[i] = suite+1;
+ m_number1[i] = number+1;
+ }
+ }
+ }
+}
+
+void sentx6p_state::set_card2(uint8_t value, int select_bits)
+{
+ for (int i = 0; i < 6; i++)
+ {
+ if (select_bits & (1 << i))
+ {
+ m_lcd_card2[i] = value;
+
+ int val = m_lcd_card2[i];
+ if (val == 0)
+ {
+ m_suite2[i] = 0;
+ m_number2[i] = 0;
+ }
+ else
+ {
+ int suite = (val-1) / 13;
+ int number = (val-1) % 13;
+
+ m_suite2[i] = suite+1;
+ m_number2[i] = number+1;
+ }
+ }
+ }
+}
+
+void sentx6p_state::set_options(uint8_t value, int select_bits)
+{
+ for (int i = 0; i < 6; i++)
+ {
+ if (select_bits & (1 << i))
+ {
+ m_lcd_options[i] = value;
+
+ // assume same mapping as selector bit below
+ m_option_fold[i] = (value & 0x01) ? 1 : 0;
+ m_option_check[i] = (value & 0x02) ? 1 : 0;
+ m_option_bet[i] = (value & 0x04) ? 1 : 0;
+ m_option_call[i] = (value & 0x08) ? 1 : 0;
+ m_option_raise[i] = (value & 0x10) ? 1 : 0;
+ m_option_allin[i] = (value & 0x20) ? 1 : 0;
+ }
+ }
+}
+
+/*
+ c0 = no selection highlight (00)
+ c1 = fold selected (01)
+ c2 = check selected (02)
+ c4 = bet selected (04)
+ c8 = call selected (08)
+ d0 = raise selected (10)
+ e0 = all in selected (20)
+*/
+
+void sentx6p_state::set_options_select(uint8_t value, int select_bits)
+{
+ for (int i = 0; i < 6; i++)
+ {
+ if (select_bits & (1 << i))
+ {
+ m_lcd_options_select[i] = value;
+
+ m_select_fold[i] = (value & 0x01) ? 1 : 0;
+ m_select_check[i] = (value & 0x02) ? 1 : 0;
+ m_select_bet[i] = (value & 0x04) ? 1 : 0;
+ m_select_call[i] = (value & 0x08) ? 1 : 0;
+ m_select_raise[i] = (value & 0x10) ? 1 : 0;
+ m_select_allin[i] = (value & 0x20) ? 1 : 0;
+ }
+ }
+}
+
+
+
+void sentx6p_state::set_controller_led(uint8_t value, int select_bits)
+{
+ for (int i = 0; i < 6; i++)
+ {
+ if (select_bits & (1 << i))
+ {
+ m_lcd_led[i] = value;
+
+ m_led[i] = value ^ 1;
+ }
+ }
+}
+
+WRITE8_MEMBER(sentx6p_state::sentx_tx_w)
+{
+ int select_bits = (m_porta_data >> 8) & 0x3f;
+
+ // TX function is at 0x029773
+ // starts by writing controller select, then checking if controller is selected, then transmits data
+
+ // RX function is at 0x029811
+ // similar logic to write controller ID, check if selected, then recieve data
+
+ switch (data)
+ {
+ case 0x00: // card 1 off
+ case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: // card 1 show Diamonds A,2,3,4,5,6,7,8,10,J,Q,K
+ case 0x0e: case 0x0f: case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: // card 1 show Hearts A,2,3,4,5,6,7,8,10,J,Q,K
+ case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: // card 1 show Spades A,2,3,4,5,6,7,8,10,J,Q,K
+ case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // card 1 show Clubs A,2,3,4,5,6,7,8,10,J,Q,K
+ set_card1(data & 0x3f, select_bits);
+ break;
+
+ case 0x40: // card 2 off
+ case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: // card 1 show Diamonds A,2,3,4,5,6,7,8,10,J,Q,K
+ case 0x4e: case 0x4f: case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5a: // card 1 show Hearts A,2,3,4,5,6,7,8,10,J,Q,K
+ case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: // card 1 show Spades A,2,3,4,5,6,7,8,10,J,Q,K
+ case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: // card 1 show Clubs A,2,3,4,5,6,7,8,10,J,Q,K
+ set_card2(data & 0x3f, select_bits);
+ break;
+
+ // cases 0x78 - 0x7f are transmissions in the other direction (from controller to main unit, used for sending buttons)
+
+ case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: // show selection options
+ case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
+ case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
+ case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7: case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
+ set_options(data & 0x3f, select_bits);
+ break;
+
+ case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: // show selection cursor
+ case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf:
+ case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
+ case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff:
+ set_options_select(data & 0x3f, select_bits);
+ break;
+
+ case 0x38:
+ case 0x39:
+ set_controller_led(data & 0x01, select_bits);
+ break;
+
+ case 0x3a:
+ // reset controller? (the input code also seems to check for 3a in one place coming in the other direction)
+ break;
+
+ default:
+ logerror("unknown LCD command %02x with controller select %02x\n", data, select_bits);
+ break;
+ }
+
+}
+
+
+
+
+void sentx6p_state::sentx6p(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &sentx6p_state::mem_map_2m_texas);
+ m_maincpu->set_pal(true);
+
+ spg2xx_base(config);
+
+ m_screen->set_refresh_hz(50);
+
+ m_maincpu->porta_in().set(FUNC(sentx6p_state::sentx_porta_r));
+ m_maincpu->portb_in().set(FUNC(sentx6p_state::sentx_portb_r));
+ m_maincpu->portc_in().set(FUNC(sentx6p_state::sentx_portc_r));
+
+ m_maincpu->porta_out().set(FUNC(sentx6p_state::porta_w));
+ m_maincpu->portb_out().set(FUNC(sentx6p_state::portb_w));
+ m_maincpu->portc_out().set(FUNC(sentx6p_state::portc_w));
+
+ m_maincpu->uart_tx().set(FUNC(sentx6p_state::sentx_tx_w));
+
+ config.set_default_layout(layout_sentx6p);
+}
+
+ROM_START( sentx6p )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ // chksum:05B58350 is @ 0x3000.
+ // This is the correct sum of 0x3010 - 0x1fffff (the first half of the ROM area after the checksum string)
+ // The 2nd half is not summed (and not used by the game?) but definitely exists in ROM (same data on 2 units)
+ ROM_LOAD16_WORD_SWAP( "senario texas holdem.bin", 0x000000, 0x400000, CRC(7c7d2d33) SHA1(71631074ba66e3b0cdeb86ebca3931599f3a911c) )
+ROM_END
+
+// "go 02d1d0" "do r1 = ff" to get past initial screen (currently bypassed by setting controller sense in RAM earlier, see hack in machine_reset)
+// a 'deluxe' version of this also exists with extra game modes
+CONS( 2004, sentx6p, 0, 0, sentx6p, sentx6p, sentx6p_state, empty_init, "Senario / Play Vision", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (UK)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a UK Play Vision branded box, values in GBP
+
diff --git a/src/mame/drivers/spg2xx_shredmjr.cpp b/src/mame/drivers/spg2xx_shredmjr.cpp
new file mode 100644
index 00000000000..c4e40701e5b
--- /dev/null
+++ b/src/mame/drivers/spg2xx_shredmjr.cpp
@@ -0,0 +1,190 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+#include "includes/spg2xx.h"
+
+class shredmjr_game_state : public spg2xx_game_state
+{
+public:
+ shredmjr_game_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_porta_data(0x0000),
+ m_shiftamount(0)
+ { }
+
+ void shredmjr(machine_config &config);
+ void taikeegr(machine_config &config);
+
+ void init_taikeegr();
+
+protected:
+ DECLARE_READ16_MEMBER(porta_r);
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+
+private:
+ uint16_t m_porta_data;
+ int m_shiftamount;
+
+};
+
+
+// Shredmaster Jr uses the same input order as the regular Taikee Guitar, but reads all inputs through a single multplexed bit
+WRITE16_MEMBER(shredmjr_game_state::porta_w)
+{
+ if (data != m_porta_data)
+ {
+ if ((data & 0x0800) != (m_porta_data & 0x0800))
+ {
+ if (data & 0x0800)
+ {
+ //logerror("0x0800 low -> high\n");
+ }
+ else
+ {
+ //logerror("0x0800 high -> low\n");
+ }
+ }
+
+ if ((data & 0x0200) != (m_porta_data & 0x0200))
+ {
+ if (data & 0x0200)
+ {
+ //logerror("0x0200 low -> high\n");
+ m_shiftamount++;
+ }
+ else
+ {
+ //logerror("0x0200 high -> low\n");
+ }
+ }
+
+ if ((data & 0x0100) != (m_porta_data & 0x0100))
+ {
+ if (data & 0x0100)
+ {
+ //logerror("0x0100 low -> high\n");
+ m_shiftamount = 0;
+ }
+ else
+ {
+ //logerror("0x0100 high -> low\n");
+ }
+ }
+ }
+
+ m_porta_data = data;
+}
+
+READ16_MEMBER(shredmjr_game_state::porta_r)
+{
+ //logerror("porta_r with shift amount %d \n", m_shiftamount);
+ uint16_t ret = 0x0000;
+
+ uint16_t portdata = m_io_p1->read();
+
+ portdata = (portdata >> m_shiftamount) & 0x1;
+
+ if (portdata)
+ ret |= 0x0400;
+
+ return ret;
+}
+
+static INPUT_PORTS_START( taikeegr )
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Strum Bar Down")
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Strum Bar Up")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Whamming Bar")
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Yellow")
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Green")
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Red")
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Blue")
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Pink")
+ PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("P3")
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+void shredmjr_game_state::shredmjr(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &shredmjr_game_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(shredmjr_game_state::porta_r));
+ m_maincpu->porta_out().set(FUNC(shredmjr_game_state::porta_w));
+}
+
+void shredmjr_game_state::taikeegr(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &shredmjr_game_state::mem_map_4m);
+ m_maincpu->set_pal(true);
+
+ spg2xx_base(config);
+
+ m_screen->set_refresh_hz(50);
+// m_screen->set_size(320, 312);
+
+ m_maincpu->porta_in().set_ioport("P1");
+// m_maincpu->portb_in().set_ioport("P2");
+// m_maincpu->portc_in().set_ioport("P3");
+}
+
+
+void shredmjr_game_state::init_taikeegr()
+{
+ u16 *src = (u16*)memregion("maincpu")->base();
+
+ for (int i = 0x00000; i < 0x800000/2; i++)
+ {
+ u16 dat = src[i];
+ dat = bitswap<16>(dat, 15,14,13,12, 11,10,9,8, 7,6,5,4, 0,1,2,3 );
+ src[i] = dat;
+ }
+
+ std::vector<u16> buffer(0x800000/2);
+
+ for (int i = 0; i < 0x800000/2; i++)
+ {
+ int j = 0;
+
+ switch (i & 0x00e00)
+ {
+ case 0x00000: j = (i & 0xfff1ff) | 0x000; break;
+ case 0x00200: j = (i & 0xfff1ff) | 0x800; break;
+ case 0x00400: j = (i & 0xfff1ff) | 0x400; break;
+ case 0x00600: j = (i & 0xfff1ff) | 0xc00; break;
+ case 0x00800: j = (i & 0xfff1ff) | 0x200; break;
+ case 0x00a00: j = (i & 0xfff1ff) | 0xa00; break;
+ case 0x00c00: j = (i & 0xfff1ff) | 0x600; break;
+ case 0x00e00: j = (i & 0xfff1ff) | 0xe00; break;
+ }
+
+ buffer[j] = src[i];
+ }
+
+ std::copy(buffer.begin(), buffer.end(), &src[0]);
+}
+
+
+ROM_START( taikeegr )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "taikee_guitar.bin", 0x000000, 0x800000, CRC(8cbe2feb) SHA1(d72e816f259ba6a6260d6bbaf20c5e9b2cf7140b) )
+ROM_END
+
+ROM_START( shredmjr )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "shredmasterjr.bin", 0x000000, 0x800000, CRC(95a6dcf1) SHA1(44893cd6ebe6b7f33a73817b72ae7be70c3126dc) )
+ROM_END
+
+// there are multiple versions of this with different songs, was also sold by dreamGEAR as 'Shredmaster Jr.' (different title screen)
+// for the UK version the title screen always shows "Guitar Rock", however there are multiple boxes with different titles and song selections.
+// ROM is glued on the underside and soldered to the PCB, very difficult to remove without damaging.
+CONS( 2007, taikeegr, 0, 0, taikeegr, taikeegr, shredmjr_game_state, init_taikeegr, "TaiKee", "Rockstar Guitar / Guitar Rock (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad music timings (too slow)
+CONS( 2007, shredmjr, taikeegr, 0, shredmjr, taikeegr, shredmjr_game_state, init_taikeegr, "dreamGEAR", "Shredmaster Jr (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad music timings (too slow)
diff --git a/src/mame/drivers/spg2xx_telestory.cpp b/src/mame/drivers/spg2xx_telestory.cpp
new file mode 100644
index 00000000000..7d29585ada0
--- /dev/null
+++ b/src/mame/drivers/spg2xx_telestory.cpp
@@ -0,0 +1,303 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+#include "includes/spg2xx.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+class telestory_state : public spg2xx_game_state
+{
+public:
+ telestory_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_cart(*this, "cartslot"),
+ m_cart_region(nullptr)
+ { }
+
+ void telestory(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void mem_map_4m_tsram(address_map& map);
+
+ DECLARE_READ16_MEMBER(porta_r);
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_READ16_MEMBER(portc_r);
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portc_w) override;
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_telestory);
+
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+};
+
+
+void telestory_state::mem_map_4m_tsram(address_map &map)
+{
+ map(0x000000, 0x3fffff).bankr("cartbank");
+ map(0x3e0000, 0x3fffff).ram(); // is this in the cart or in the system?
+}
+
+static INPUT_PORTS_START( telestory ) // there is a hidden test mode, if you return rand() on this port you get it, TODO: figure out button combination
+ PORT_START("P1") // I/O test also lists 'Headphone 1' but it isn't mapped to any of these ports?
+ PORT_DIPNAME( 0x0001, 0x0001, "Port 1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Pause / Menu")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Read To Me")
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Red / Triangle")
+ PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Blue / Square")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Yellow / Star")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green / Circle")
+ PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Right Arrow / Next Page") // Test mode calls this Right Arrow / LED (so probalby LED output too)
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) // port changes on these bits advance the word in manual mode (scroll wheel)
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) // port changes on these bits advance the word in manual mode (scroll wheel)
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Left Arrow / Previous Page")
+
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "Port 2" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_DIPNAME( 0x0001, 0x0001, "Port 3" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+READ16_MEMBER(telestory_state::porta_r)
+{
+ uint16_t data = m_io_p1->read();
+ //logerror("%s: porta_r: %04x\n", machine().describe_context(), data);
+ return data;
+}
+
+WRITE16_MEMBER(telestory_state::porta_w)
+{
+ /*
+ not used as an output very often
+
+ ':maincpu' (0145D5): porta_w (0000)
+ ':maincpu' (0145DC): porta_w (0000)
+ ':maincpu' (0145F4): porta_w (0000)
+ ':maincpu' (0145F4): porta_w (6000)
+ */
+ logerror("%s: porta_w (%04x)\n", machine().describe_context(), data);
+}
+
+READ16_MEMBER(telestory_state::portb_r)
+{
+ // not used?
+ uint16_t data = m_io_p2->read();
+ logerror("%s: portb_r %04x\n", machine().describe_context(), data);
+ return data;
+}
+
+WRITE16_MEMBER(telestory_state::portb_w)
+{
+ // not used?
+ logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
+}
+
+// What is here? accessed using serial protocol with clocked bits
+READ16_MEMBER(telestory_state::portc_r)
+{
+ //logerror("%s: portc_r\n", machine().describe_context());
+ return machine().rand() & 0x0c00; // bits need to change state or it doesn't boot
+}
+
+WRITE16_MEMBER(telestory_state::portc_w)
+{
+ //logerror("%s: portc_w (%04x)\n", machine().describe_context(), data);
+}
+
+
+
+void telestory_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+}
+
+void telestory_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(telestory_state::cart_load_telestory)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ if (size > 0x800000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(0x800000, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+void telestory_state::telestory(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &telestory_state::mem_map_4m_tsram);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(telestory_state::porta_r));
+ m_maincpu->porta_out().set(FUNC(telestory_state::porta_w));
+ m_maincpu->portb_in().set(FUNC(telestory_state::portb_r));
+ m_maincpu->portb_out().set(FUNC(telestory_state::portb_w));
+ m_maincpu->portc_in().set(FUNC(telestory_state::portc_r));
+ m_maincpu->portc_out().set(FUNC(telestory_state::portc_w));
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "telestory_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(telestory_state::cart_load_telestory));
+ m_cart->set_must_be_loaded(true);
+
+ SOFTWARE_LIST(config, "telestory_cart").set_original("telestory_cart");
+}
+
+ROM_START( telestry )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ // no internal ROM, only RAM
+ROM_END
+
+
+/* Sound data for the narrator is written to the SIO data port
+ 013127: D319 3D54 [3d54] = r1 (Cinderella) - 4-bit data?
+ The hidden test mode calls the speech test 'CELP' (possibly "Code-excited linear prediction" based?)
+ https://en.wikipedia.org/wiki/Code-excited_linear_prediction
+
+ TODO: check if it's a common implementation eg. Speex
+ SIO port is not currently implemented in spg2xx_io.cpp however
+*/
+CONS( 2006, telestry, 0, 0, telestory, telestory, telestory_state, empty_init, "JAKKS Pacific Inc / Toymax", "Telestory", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/spg2xx_tvgogo.cpp b/src/mame/drivers/spg2xx_tvgogo.cpp
new file mode 100644
index 00000000000..47208b85a09
--- /dev/null
+++ b/src/mame/drivers/spg2xx_tvgogo.cpp
@@ -0,0 +1,265 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+#include "includes/spg2xx.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+class tvgogo_state : public spg2xx_game_state
+{
+public:
+ tvgogo_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_cart(*this, "cartslot"),
+ m_cart_region(nullptr)
+ { }
+
+ void tvgogo(machine_config &config);
+
+private:
+ uint8_t m_i2cunk;
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ DECLARE_WRITE8_MEMBER(tvg_i2c_w);
+ DECLARE_READ8_MEMBER(tvg_i2c_r);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_tvgogo);
+
+ required_device<generic_slot_device> m_cart;
+ memory_region *m_cart_region;
+};
+
+
+static INPUT_PORTS_START( tvgogo )
+ PORT_START("P1")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Back")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Select")
+ PORT_DIPNAME( 0x0004, 0x0004, "P1" )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_DIPNAME( 0x0001, 0x0001, "P3" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+void tvgogo_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+}
+
+void tvgogo_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+}
+
+
+DEVICE_IMAGE_LOAD_MEMBER(tvgogo_state::cart_load_tvgogo)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ if (size > 0x800000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(0x800000, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+
+WRITE8_MEMBER(tvgogo_state::tvg_i2c_w)
+{
+ // unsure what is mapped here (Camera?) but it expects to be able to read back the same byte it writes before it boots.
+ m_i2cunk = data;
+ logerror("%s: tvg_i2c_w %04x %02x\n", machine().describe_context(), offset, data);
+}
+
+READ8_MEMBER(tvgogo_state::tvg_i2c_r)
+{
+ uint8_t ret = m_i2cunk;
+ logerror("%s: tvg_i2c_r %04x %02x\n", machine().describe_context(), offset, ret);
+ return ret;
+}
+
+
+void tvgogo_state::tvgogo(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &tvgogo_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set_ioport("P1");
+ m_maincpu->portb_in().set_ioport("P2");
+ m_maincpu->portc_in().set_ioport("P3");
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tvgogo_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(tvgogo_state::cart_load_tvgogo));
+ m_cart->set_must_be_loaded(true);
+
+ m_maincpu->i2c_w().set(FUNC(tvgogo_state::tvg_i2c_w));
+ m_maincpu->i2c_r().set(FUNC(tvgogo_state::tvg_i2c_r));
+
+ SOFTWARE_LIST(config, "tvgogo_cart").set_original("tvgogo");
+}
+
+ROM_START( tvgogo )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ // no internal ROM? (Camera might have an MCU tho)
+ROM_END
+
+
+// Toyquest games
+CONS( 2005, tvgogo, 0, 0, tvgogo, tvgogo, tvgogo_state, empty_init, "Toyquest", "GoGo TV Video Vision", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // or TV Go Go - the game addons call it the 'Video Vision console'
diff --git a/src/mame/drivers/spg2xx_vii.cpp b/src/mame/drivers/spg2xx_vii.cpp
new file mode 100644
index 00000000000..00f71242817
--- /dev/null
+++ b/src/mame/drivers/spg2xx_vii.cpp
@@ -0,0 +1,189 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+/* 'Zone' systems */
+
+#include "includes/spg2xx.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+
+class vii_state : public spg2xx_game_state
+{
+public:
+ vii_state(const machine_config &mconfig, device_type type, const char *tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_cart(*this, "cartslot"),
+ m_io_motionx(*this, "MOTIONX"),
+ m_io_motiony(*this, "MOTIONY"),
+ m_io_motionz(*this, "MOTIONZ"),
+ m_cart_region(nullptr),
+ m_ctrl_poll_timer(nullptr)
+ { }
+
+ void vii(machine_config &config);
+
+private:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ static const device_timer_id TIMER_CTRL_POLL = 0;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ DECLARE_WRITE16_MEMBER(vii_portb_w);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_vii);
+
+ virtual void poll_controls();
+
+ required_device<generic_slot_device> m_cart;
+ required_ioport m_io_motionx;
+ required_ioport m_io_motiony;
+ required_ioport m_io_motionz;
+ memory_region *m_cart_region;
+
+ emu_timer *m_ctrl_poll_timer;
+ uint8_t m_controller_input[8];
+};
+
+
+void vii_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_CTRL_POLL:
+ poll_controls();
+ break;
+ default:
+ logerror("Unknown timer ID: %d\n", id);
+ break;
+ }
+}
+
+WRITE16_MEMBER(vii_state::vii_portb_w)
+{
+ switch_bank(((data & 0x80) >> 7) | ((data & 0x20) >> 4));
+}
+
+
+static INPUT_PORTS_START( vii )
+ PORT_START("P1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Button A")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Button B")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Button C")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Button D")
+
+ PORT_START("MOTIONX")
+ PORT_BIT( 0x3ff, 0x200, IPT_PADDLE ) PORT_MINMAX(0x000, 0x3ff) PORT_SENSITIVITY(50) PORT_KEYDELTA(50) PORT_NAME("Motion Control X")
+
+ PORT_START("MOTIONY")
+ PORT_BIT( 0x3ff, 0x200, IPT_PADDLE ) PORT_MINMAX(0x000, 0x3ff) PORT_SENSITIVITY(50) PORT_KEYDELTA(50) PORT_NAME("Motion Control Y") PORT_PLAYER(2)
+
+ PORT_START("MOTIONZ")
+ PORT_BIT( 0x3ff, 0x200, IPT_PADDLE ) PORT_MINMAX(0x000, 0x3ff) PORT_SENSITIVITY(50) PORT_KEYDELTA(50) PORT_NAME("Motion Control Z") PORT_PLAYER(3)
+INPUT_PORTS_END
+
+void vii_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ // if there's a cart, override the standard banking
+ if (m_cart && m_cart->exists())
+ {
+ std::string region_tag;
+ m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
+ m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
+ m_bank->set_entry(0);
+ }
+
+ m_ctrl_poll_timer = timer_alloc(TIMER_CTRL_POLL);
+ m_ctrl_poll_timer->adjust(attotime::never);
+
+ save_item(NAME(m_controller_input));
+}
+
+void vii_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+
+ m_controller_input[0] = 0;
+ m_controller_input[4] = 0;
+ m_controller_input[6] = 0xff;
+ m_controller_input[7] = 0;
+
+ m_ctrl_poll_timer->adjust(attotime::from_hz(60), 0, attotime::from_hz(60));
+}
+
+
+void vii_state::poll_controls()
+{
+ int32_t x = m_io_motionx ? ((int32_t)m_io_motionx->read() - 0x200) : 0;
+ int32_t y = m_io_motiony ? ((int32_t)m_io_motiony->read() - 0x200) : 0;
+ int32_t z = m_io_motionz ? ((int32_t)m_io_motionz->read() - 0x200) : 0;
+
+ uint8_t old_input[8];
+ memcpy(old_input, m_controller_input, 8);
+
+ m_controller_input[0] = m_io_p1->read();
+ m_controller_input[1] = (uint8_t)x;
+ m_controller_input[2] = (uint8_t)y;
+ m_controller_input[3] = (uint8_t)z;
+ m_controller_input[4] = 0;
+ x = (x >> 8) & 3;
+ y = (y >> 8) & 3;
+ z = (z >> 8) & 3;
+ m_controller_input[5] = (z << 4) | (y << 2) | x;
+ m_controller_input[6] = 0xff;
+ m_controller_input[7] = 0;
+
+ if (memcmp(old_input, m_controller_input, 8))
+ {
+ for(int i = 0; i < 8; i++)
+ m_maincpu->uart_rx(m_controller_input[i]);
+ }
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(vii_state::cart_load_vii)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ if (size < 0x800000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+void vii_state::vii(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &vii_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->portb_out().set(FUNC(vii_state::vii_portb_w));
+ m_maincpu->i2c_w().set(FUNC(vii_state::i2c_w));
+ m_maincpu->i2c_r().set(FUNC(vii_state::i2c_r));
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "vii_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(vii_state::cart_load_vii));
+
+ SOFTWARE_LIST(config, "vii_cart").set_original("vii");
+}
+
+ROM_START( vii )
+ ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "vii.bin", 0x0000, 0x2000000, CRC(04627639) SHA1(f883a92d31b53c9a5b0cdb112d07cd793c95fc43))
+ROM_END
+
+// Jungle Soft TV games
+CONS( 2007, vii, 0, 0, vii, vii, vii_state, empty_init, "Jungle Soft / KenSingTon / Siatronics", "Vii", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // motion controls are awkward, but playable for the most part
diff --git a/src/mame/drivers/spg2xx_zone.cpp b/src/mame/drivers/spg2xx_zone.cpp
new file mode 100644
index 00000000000..9de42371fe4
--- /dev/null
+++ b/src/mame/drivers/spg2xx_zone.cpp
@@ -0,0 +1,296 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+/* 'Zone' systems */
+
+#include "includes/spg2xx.h"
+
+class wireless60_state : public spg2xx_game_state
+{
+public:
+ wireless60_state(const machine_config& mconfig, device_type type, const char* tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_bankmask(0x7)
+ { }
+
+ void wireless60(machine_config& config);
+
+ void init_lx_jg7415();
+ void init_zone100();
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ uint8_t m_w60_controller_input;
+ uint16_t m_w60_porta_data;
+ uint16_t m_w60_p1_ctrl_mask;
+ uint16_t m_w60_p2_ctrl_mask;
+ uint8_t m_bankmask;
+
+ DECLARE_WRITE16_MEMBER(wireless60_porta_w);
+ DECLARE_WRITE16_MEMBER(wireless60_portb_w);
+ DECLARE_READ16_MEMBER(wireless60_porta_r);
+
+private:
+};
+
+class zone40_state : public wireless60_state
+{
+public:
+ zone40_state(const machine_config& mconfig, device_type type, const char* tag) :
+ wireless60_state(mconfig, type, tag),
+ m_romregion(*this, "maincpu")
+ { }
+
+ void zone40(machine_config &config);
+
+ void init_zone40();
+
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ virtual void mem_map_z40(address_map &map);
+ DECLARE_READ16_MEMBER(z40_rom_r);
+ DECLARE_READ16_MEMBER(zone40_porta_r);
+ DECLARE_WRITE16_MEMBER(zone40_porta_w);
+ required_region_ptr<uint16_t> m_romregion;
+ uint8_t m_z40_rombase;
+};
+
+
+WRITE16_MEMBER(wireless60_state::wireless60_porta_w)
+{
+ //logerror("%s: wireless60_porta_w %04x\n", machine().describe_context(), data);
+
+ m_w60_porta_data = (data & 0x300) | m_w60_p1_ctrl_mask | m_w60_p2_ctrl_mask;
+ switch (m_w60_porta_data & 0x300)
+ {
+ case 0x300:
+ m_w60_controller_input = -1;
+ break;
+
+ case 0x200:
+ m_w60_controller_input++;
+ break;
+
+ default:
+ uint16_t temp1 = m_io_p1->read();
+ uint16_t temp2 = m_io_p2->read();
+ uint16_t temp3 = 1 << m_w60_controller_input;
+ if (temp1 & temp3) m_w60_porta_data ^= m_w60_p1_ctrl_mask;
+ if (temp2 & temp3) m_w60_porta_data ^= m_w60_p2_ctrl_mask;
+ break;
+ }
+}
+
+READ16_MEMBER(wireless60_state::wireless60_porta_r)
+{
+ //logerror("%s: wireless60_porta_r\n", machine().describe_context());
+ return m_w60_porta_data;
+}
+
+WRITE16_MEMBER(wireless60_state::wireless60_portb_w)
+{
+ logerror("%s: wireless60_portb_w (bankswitch) %04x\n", machine().describe_context(), data);
+ switch_bank(data & m_bankmask);
+}
+
+WRITE16_MEMBER(zone40_state::zone40_porta_w)
+{
+ wireless60_porta_w(space, offset, data);
+
+ if ((data & 0x00ff) != m_z40_rombase)
+ {
+ m_z40_rombase = data & 0x00ff;
+ m_maincpu->invalidate_cache();
+ }
+}
+
+READ16_MEMBER(zone40_state::zone40_porta_r)
+{
+ uint16_t ret = wireless60_porta_r(space, offset) & (0x0300 | m_w60_p1_ctrl_mask | m_w60_p2_ctrl_mask);
+ ret = (ret & 0xff00) | m_z40_rombase;
+ return ret;
+}
+
+
+READ16_MEMBER(zone40_state::z40_rom_r)
+{
+ // due to granularity of rom bank this manual method is safer
+ return m_romregion[(offset + (m_z40_rombase * 0x20000)) & 0x1ffffff];
+}
+
+void zone40_state::mem_map_z40(address_map &map)
+{
+ map(0x000000, 0x3fffff).r(FUNC(zone40_state::z40_rom_r));
+}
+
+void wireless60_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+
+ save_item(NAME(m_w60_controller_input));
+ save_item(NAME(m_w60_porta_data));
+
+ m_w60_p1_ctrl_mask = 0x0400;
+ m_w60_p2_ctrl_mask = 0x0800;
+}
+
+void zone40_state::machine_start()
+{
+ wireless60_state::machine_start();
+
+ save_item(NAME(m_z40_rombase));
+
+ m_z40_rombase = 0xe0;
+ m_w60_p1_ctrl_mask = 0x0400;
+ m_w60_p2_ctrl_mask = 0x1000;
+}
+
+void wireless60_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+ m_w60_controller_input = -1;
+ m_w60_porta_data = 0;
+}
+
+void zone40_state::machine_reset()
+{
+ wireless60_state::machine_reset();
+ m_z40_rombase = 0xe0;
+ m_maincpu->invalidate_cache();
+ m_maincpu->reset();
+}
+
+static INPUT_PORTS_START( wirels60 )
+ PORT_START("P1")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Menu")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Start")
+
+ PORT_START("P2")
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_NAME("Joypad Up")
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_NAME("Joypad Down")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_NAME("Joypad Left")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_NAME("Joypad Right")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("A Button")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("B Button")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Menu")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("Start")
+INPUT_PORTS_END
+
+
+void wireless60_state::wireless60(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &wireless60_state::mem_map_4m);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_out().set(FUNC(wireless60_state::wireless60_porta_w));
+ m_maincpu->portb_out().set(FUNC(wireless60_state::wireless60_portb_w));
+ m_maincpu->porta_in().set(FUNC(wireless60_state::wireless60_porta_r));
+}
+
+void zone40_state::zone40(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zone40_state::mem_map_z40);
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_out().set(FUNC(zone40_state::zone40_porta_w));
+ m_maincpu->porta_in().set(FUNC(zone40_state::zone40_porta_r));
+}
+
+
+void wireless60_state::init_lx_jg7415()
+{
+ uint8_t blocks[32] = {
+ // these parts of the ROM contain the code that gets selected
+ 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f, 0x10, 0x11, 0x16, 0x17, 0x18, 0x19, 0x1e, 0x1f,
+ // these parts of the ROM contain code / data but go unused, this seems intentional, some of these areas don't read consistently so likely this double size ROM was used knowing that some areas were bad and could be avoided
+ 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d, 0x12, 0x13, 0x14, 0x15, 0x1a, 0x1b, 0x1c, 0x1d
+ };
+
+ uint8_t *src = memregion("maincpu")->base();
+ std::vector<u8> buffer(0x10000000);
+
+ for (int addr = 0; addr < 0x10000000; addr++)
+ {
+ int bank = (addr & 0xf800000) >> 23;
+ int newbank = blocks[bank];
+ int newaddr = (addr & 0x07fffff) | (newbank << 23);
+ buffer[addr] = src[newaddr];
+ }
+
+ std::copy(buffer.begin(), buffer.end(), &src[0]);
+
+ m_bankmask = 0xf;
+}
+
+void wireless60_state::init_zone100()
+{
+ m_bankmask = 0xf;
+}
+
+void zone40_state::init_zone40()
+{
+ uint16_t *ROM = (uint16_t*)memregion("maincpu")->base();
+ int size = memregion("maincpu")->bytes();
+
+ for (int i = 0; i < size/2; i++)
+ {
+ ROM[i] = ROM[i] ^ 0xbb88;
+
+ ROM[i] = bitswap<16>(ROM[i], 11, 10, 3, 2, 4, 12, 5, 13,
+ 9, 1, 8, 0, 6, 7, 14, 15);
+ }
+}
+
+ROM_START( zone40 )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "zone40.bin", 0x0000, 0x4000000, CRC(4ba1444f) SHA1(de83046ab93421486668a247972ad6d3cda19440) )
+ROM_END
+
+ROM_START( zone60 )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "zone60.bin", 0x0000, 0x4000000, CRC(4cb637d1) SHA1(1f97cbdb4299ac0fbafc2a3aa592066cb0727066))
+ROM_END
+
+ROM_START( wirels60 )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "wirels60.bin", 0x0000, 0x4000000, CRC(b4df8b28) SHA1(00e3da542e4bc14baf4724ad436f66d4c0f65c84))
+ROM_END
+
+ROM_START( zone100 )
+ ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "zone100.bin", 0x0000, 0x8000000, CRC(b966a54e) SHA1(e38156ebc4e2f2935b1acbeca33d1866d45c4f65) )
+ROM_END
+
+// PCB marked 'Zone 100 110728 V2.1'
+ROM_START( lx_jg7415 )
+ ROM_REGION( 0x10000000, "maincpu", ROMREGION_ERASE00 )
+ // reads of some unused areas were not 100% consistent, but this seems intentional, the game has a ROM twice the size it needs and is wired up in such a way that those bad areas are unused by the game
+ // if adding a clone make sure to check if there are actual differences in the used areas
+ ROM_LOAD16_WORD_SWAP( "rom.bin", 0x0000, 0x10000000, CRC(59442e00) SHA1(7e91cf6b19c37f9b4fa4dc21e241c6634d6a6f95) )
+ROM_END
+
+// these don't have real motion controls
+CONS( 2009, zone40, 0, 0, zone40, wirels60, zone40_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2010, zone60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 200?, zone100, 0, 0, wireless60, wirels60, wireless60_state, init_zone100, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 100", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // unit was black, menus still show white controllers, unlike wireless 60
+CONS( 2010, wirels60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2011, lx_jg7415,0, 0, wireless60, wirels60, wireless60_state, init_lx_jg7415, "Lexibook", "Lexibook JG7415 120-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+
+
diff --git a/src/mame/drivers/spg2xx_zone_32bit.cpp b/src/mame/drivers/spg2xx_zone_32bit.cpp
new file mode 100644
index 00000000000..c7e746b447b
--- /dev/null
+++ b/src/mame/drivers/spg2xx_zone_32bit.cpp
@@ -0,0 +1,476 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+
+/* 'Zone' '32-bit' systems */
+
+#include "includes/spg2xx.h"
+
+class zon32bit_state : public spg2xx_game_state
+{
+public:
+ zon32bit_state(const machine_config& mconfig, device_type type, const char* tag) :
+ spg2xx_game_state(mconfig, type, tag),
+ m_romregion(*this, "maincpu")
+ { }
+
+ void zon32bit(machine_config& config);
+
+ void mem_map_zon32bit(address_map &map);
+
+ void init_zon32bit() { m_game = 0; };
+ void init_mywicodx() { m_game = 1; };
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ DECLARE_READ16_MEMBER(z32_rom_r);
+
+ required_region_ptr<uint16_t> m_romregion;
+
+ DECLARE_READ16_MEMBER(porta_r);
+ DECLARE_READ16_MEMBER(portb_r);
+ DECLARE_READ16_MEMBER(portc_r);
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portb_w) override;
+ virtual DECLARE_WRITE16_MEMBER(portc_w) override;
+
+private:
+ int m_porta_dat;
+ int m_portb_dat;
+ int m_portc_dat;
+
+ int m_upperbank;
+
+ int m_hackbank;
+ int m_game;
+};
+
+READ16_MEMBER(zon32bit_state::porta_r)
+{
+ return m_porta_dat;
+}
+
+
+WRITE16_MEMBER(zon32bit_state::porta_w)
+{
+ //if (data != 0x0101)
+ // logerror("%s: porta_w (%04x)\n", machine().describe_context(), data);
+
+ m_porta_dat = data;
+
+ // where is the banking?! this gets written from the RAM-based code when the lower bank needs to change, but the upper bank needs to change in places too
+ // (and all these bits get unset again after this write, so this probably isn't the bank)
+ if (data == 0x0e01)
+ {
+ m_hackbank ^= 1;
+ }
+
+ if (data == 0x0301)
+ {
+ m_hackbank = 2;
+ }
+
+ /*
+ if (data == 0x0335)
+ {
+ logerror("%s: port a write 0x0355, port c is %04x %04X\n", machine().describe_context(), data, data & 0x1800);
+
+ m_upperbank = (m_portc_dat & 0x1800);
+ }
+ */
+}
+
+READ16_MEMBER(zon32bit_state::portc_r)
+{
+ // 0x03ff seem to be inputs for buttons (and some kind of output?)
+ // 0xfc00 gets masked for other reasons (including banking?)
+
+ // returning same value written for 0x0400 means controls don't respond (some kind of direction flag?)
+
+ uint16_t dat = m_io_p3->read() & ~0xf800;
+
+ dat |= (m_portc_dat & 0xf800);
+
+ return dat;
+}
+
+
+READ16_MEMBER(zon32bit_state::portb_r)
+{
+ return m_portb_dat;
+}
+
+WRITE16_MEMBER(zon32bit_state::portb_w)
+{
+ if (data != 0x0001)
+ logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
+
+ m_portb_dat = data;
+}
+
+WRITE16_MEMBER(zon32bit_state::portc_w)
+{
+ // very noisy
+ // is the code actually sending the sound to the remotes?
+
+ //logerror("%s: portc_w (%04x)\n", machine().describe_context(), data);
+
+ //if ((pc >= 0x77261) && (pc <= 0x77268))
+ // logerror("%s: port c %04x %04X-- BANK STUFF\n", machine().describe_context(), data, data & 0x1800);
+
+ //logerror("%s: port c %04x %04x\n", machine().describe_context(), data, data & 0x1800);
+
+ /*
+
+ this logic seems to apply for some of the mini-games, but cases where the lower bank doesn't change, this sequence doesn't happen either...
+
+ we can only trigger bank on 0335 writes, because it gets lost shortly after (unless that's an issue with the io code in spg2xx_io.cpp)
+
+ ':maincpu' (077250): port c 0000 0000
+ ':maincpu' (077263): port c fe00 1800-- BANK STUFF
+ ':maincpu' (0677DC): porta_w (0311)
+ ':maincpu' (0677E9): porta_w (0301)
+ ':maincpu' (0677F6): porta_w (0335) // bank take effect?
+ ':maincpu' (067803): port c fc00 1800
+ ':maincpu' (067810): port c fe00 1800
+ ':maincpu' (06781B): port c f800 1800
+ */
+
+// bits 0x0600 are explicitly set when changing bank, but this logic doesn't work for all cases, causes bad bank changes after boot in some games
+#if 0
+ if ((data & 0x0600) == (0x0600))
+ {
+ if ((m_portc_dat & 0x0600) != 0x0600)
+ m_upperbank = data & 0x1800;
+ }
+
+#else // ugly PC based hacked to ensure we always have the correct bank
+ int pc = m_maincpu->pc();
+ if (m_game == 0)
+ {
+ if ((pc == 0x077263) && m_hackbank == 1) // when using upper code bank
+ {
+ //printf("zon32bit change upper bank from upper code bank %04x\n", data & 0x1800);
+ m_upperbank = data & 0x1800;
+ }
+
+ if ((pc == 0x05ff63) && m_hackbank == 0) // when using lower code bank
+ {
+ //printf("zon32bit change upper bank from lower code bank %04x\n", data & 0x1800);
+ m_upperbank = data & 0x1800;
+ }
+ }
+ else if (m_game == 1)
+ {
+ if ((pc == 0x09369c) && m_hackbank == 0) // when using lower code bank
+ {
+ printf("mywicodx change upper bank from main menu code bank %04x\n", data & 0x1800);
+ m_upperbank = data & 0x1800;
+ }
+
+ if ((pc == 0x530) && m_hackbank == 1)
+ {
+ printf("mywicodx change upper bank from other menu code bank %04x\n", data & 0x1800);
+ m_upperbank = data & 0x1800;
+ }
+
+ if ((pc == 0x159E2) && m_hackbank == 2)
+ {
+ printf("mywicodx change guitar music bank %04x\n", data & 0x1800);
+ m_upperbank = data & 0x1800;
+ }
+
+ }
+#endif
+
+ m_portc_dat = data;
+
+//077261: r4 = r2
+//077262: [r4] = r3 // writes to 3d0b (port c?)
+//077263: sp += 04
+}
+
+
+void zon32bit_state::mem_map_zon32bit(address_map &map)
+{
+ map(0x000000, 0x3fffff).r(FUNC(zon32bit_state::z32_rom_r));
+}
+
+READ16_MEMBER(zon32bit_state::z32_rom_r)
+{
+ /*
+ This has upper and lower bank, which can be changed independently.
+ Banking hookup is currently very hacky as bank values are written
+ to ports then erased at the moment, maybe they latch somehow?
+ */
+
+ if (m_game == 0) // zon32bit
+ {
+ if (offset < 0x200000)
+ {
+ if (m_hackbank == 0) // if lower bank is 0
+ return m_romregion[offset + 0x000000];
+ else
+ { // if lower bank is 1
+ return m_romregion[offset + 0x400000];
+ }
+ }
+ else
+ {
+ offset &= 0x1fffff;
+
+ if (m_hackbank == 0) // if lower bank is 0
+ {
+ if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x0400000 / 2)]; // this upper bank is needed to boot to the menu
+ else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x1000000 / 2)]; // golf, tennis, several mini games
+ else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x1400000 / 2)]; // baseball, more minigames
+ else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x0400000 / 2)]; // ? (not used?)
+ }
+ else // if lower bank is 1
+ {
+ // these banks are used for different 'mini' games (and boxing) with the 2nd lower bank enabled
+ if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x0c00000 / 2)]; // 31-44 some mini games
+ else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x1800000 / 2)]; // 45-49 some mini games + boxing
+ else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x1c00000 / 2)]; // 50-59 some mini games
+ else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x0400000 / 2)]; // ? (not used?)
+ }
+ }
+ }
+ else if (m_game == 1) // mywicodx
+ {
+ if (offset < 0x200000)
+ {
+ if (m_hackbank == 0) // if lower bank is 0 (main menu)
+ {
+ return m_romregion[offset + (0x2000000 / 2)];
+ }
+ else if (m_hackbank == 1) // if lower bank is 0 (debug menu code / extra cames)
+ {
+ return m_romregion[offset + (0x3000000 / 2)];
+ }
+ else // Mi Guitar
+ {
+ return m_romregion[offset + (0x0000000 / 2)];
+ }
+ }
+ else
+ {
+ offset &= 0x1fffff;
+
+ if (m_hackbank == 0)
+ {
+ if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x2400000 / 2)]; // this upper bank is needed to boot to the menu, boxing
+ else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x2800000 / 2)]; // ? tennis, golf
+ else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x2c00000 / 2)]; // ? table tennis, bowling, basketball, baseball
+ else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x2400000 / 2)]; // ? (not used?)
+ }
+ else if (m_hackbank == 1)
+ {
+ if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x3400000 / 2)]; // base code for other bank
+ else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x3800000 / 2)]; //
+ else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x3c00000 / 2)]; //
+ else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x3400000 / 2)]; //
+ }
+ else
+ {
+ if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x0400000 / 2)]; // song data 1
+ else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x0800000 / 2)]; // song data 2
+ else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x0c00000 / 2)]; // song data 3
+ else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x0400000 / 2)]; //
+ }
+ }
+ }
+
+ return 0x0000;// m_romregion[offset];
+}
+
+void zon32bit_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+}
+
+
+void zon32bit_state::machine_reset()
+{
+ spg2xx_game_state::machine_reset();
+
+ m_porta_dat = 0x0000;
+ m_portb_dat = 0x0000;
+
+ m_hackbank = 0;
+}
+
+
+static INPUT_PORTS_START( zon32bit )
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "P1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P2")
+ PORT_DIPNAME( 0x0001, 0x0001, "P2" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START("P3")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Up (vertical) Left (horizontal)")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Down (vertical) Right (horizontal)")
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Left (vertical) Down (horizontal)")
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Right (vertical) Up (horizontal)")
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON4 )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 )
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
+ PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Pause / Menu")
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+void zon32bit_state::zon32bit(machine_config &config)
+{
+ SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
+ m_maincpu->set_addrmap(AS_PROGRAM, &zon32bit_state::mem_map_zon32bit);
+ m_maincpu->set_force_no_drc(true); // uses JVS opcode, not implemented in recompiler
+
+ spg2xx_base(config);
+
+ m_maincpu->porta_in().set(FUNC(zon32bit_state::porta_r));
+ m_maincpu->portb_in().set(FUNC(zon32bit_state::portb_r));
+ m_maincpu->portc_in().set(FUNC(zon32bit_state::portc_r));
+
+ m_maincpu->porta_out().set(FUNC(zon32bit_state::porta_w));
+ m_maincpu->portb_out().set(FUNC(zon32bit_state::portb_w));
+ m_maincpu->portc_out().set(FUNC(zon32bit_state::portc_w));
+}
+
+ROM_START( mywicodx )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
+ // the first bank contains the Mi Guitar game, the 2nd half of the ROM is where the Menu starts
+ ROM_LOAD16_WORD_SWAP( "mywicodx.u2", 0x0000000, 0x4000000, CRC(ec7c5d2f) SHA1(330fb839c485713f7bec5bf9d2d42841612c5b45))
+ROM_END
+
+
+ROM_START( zon32bit )
+ ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "41sports.bin", 0x0000, 0x2000000, CRC(86eee6e0) SHA1(3f6cab6649aebf596de5a8af21658bb1a27edb10) )
+ROM_END
+
+
+// Box advertises this as '40 Games Included' but the cartridge, which was glued directly to the PCB, not removable, is a 41-in-1. Maybe some versions exist with a 40 game selection.
+CONS( 200?, zon32bit, 0, 0, zon32bit, zon32bit, zon32bit_state, init_zon32bit, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 32-bit Gaming Console System (Family Sport 41-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+// My Wico Deluxe was also available under the MiWi brand (exact model unknown, but it was a cart there instead of built in)
+// Box claimed 53 Arcade Games + 8 Sports games + 24 Music games, although it's unclear where 24 Music Games comes from, there are 3, which are identical aside from the title screen.
+// The Mi Guitar menu contains 24 games, but they're dupes, and just counting those would exclude the other Mi Fit and Mi Papacon menus (which also contain dupes)
+CONS( 200?, mywicodx, 0, 0, zon32bit, zon32bit, zon32bit_state, init_mywicodx, "<unknown>", "My Wico Deluxe (Family Sport 85-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
diff --git a/src/mame/drivers/vii.cpp b/src/mame/drivers/vii.cpp
deleted file mode 100644
index 98c3e39dcc5..00000000000
--- a/src/mame/drivers/vii.cpp
+++ /dev/null
@@ -1,5017 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Ryan Holtz
-/******************************************************************************
-
- Short Description:
-
- Systems which run on the SPG243 SoC
-
- die markings show
- "SunPlus QL8041" ( also known as Sunplus SPG240 & PAC300 )
-
- All GameKeyReady units
- Disney Princess (GKR)
- Wheel of Fortune (GKR)
- JAKKS WWE (GKR)
- Fantastic 4 (GKR)
- Justice League (GKR)
- Dora the Explorer Nursery Rhyme (GKR)
- Dora the Explorer Play Park (GKR)
- Spiderman 5-in-1 (GKR)
- etc.
-
- (other non GKR JAKKS games)
- X-Men (Wolverine pad)
- Avatar: The Last Airbender
- Superman in Super Villain Showdown
-
- (other games)
- Mattel Classic Sports
-
- "SunPlus QL8041C" ( known as Sunplus SPG2??, seems to be compatible with above, so probably just a chip revision )
-
- Clickstart ( see clickstart.cpp instead)
- Wheel of Fortune 2nd Edition
- Spider-man - Villain Roundup
-
- "SunPlus QU7074-P69A"
-
- The Batman
- Star Wars (non-gamekey, which model? falcon? - check)
- Dream Life
-
- "SunPlus QL8167b" (is the scrambling built into the CPU, or external?)
-
- Lexibook Zeus IG900 20-in-1
-
- "SunPlus QL8139C"
-
- Radica Cricket
- V Smile Baby (Sweden) - see vsmileb.cpp
-
- ---
-
- Very likely the same
-
- "Sunplus QL8167" (these might have ROM scrambling if that is a 8167 feature)
-
- Disney Princess Magical Adventure
- Go Diego Go
- Shrek - Over the Hedge (this unit shows a 'GameKey Unlock More Games' on startup, but has no port, not even on the internal PCB)
- Marvel Heroes (Spider-man)
- Spiderman 3 (Movie - black)
-
-
- ---
-
- It is unknown if the following are close to this architecture or not (no dumps yet)
-
- "SunPlus QU7073-P69A"
-
- Mortal Kombat
-
- "Sunplus PU7799-P680?" (difficult to read)
-
- Mission Paintball
-
- ---
-
- These are definitely different but still unSP based
-
- "SunPlus PA7801" ( known as Sunplus SPG110? )
- - see spg110.cpp instead
-
- "GCM394" (this is clearly newer, has extra opcodes, different internal map etc. also scaling and higher resolutions based on Spongebob)
- - see sunplus_gcm394.cpp instead
-
- Status:
-
- Mostly working
-
- To-Do:
-
- Proper driver_device inheritance to untangle the mess of members
-
- Detailed list of bugs:
-
- All systems:
- Various inaccuracies in samples/envelopes.
-
- jak_wall, jak_sdoo:
- Game seems unhappy with NVRAM, clears contents on each boot.
- jak_pooh:
- In the 'Light Tag' minigame (select the rock) the game usually softlocks when you find a friend (with or without DRC)
- jak_care:
- All but one mini-game waits on RAM address 0x0165 changing from 0x00f9 to 0x00f8
- The bottom left game "Wish Bear's Wishing Tree" appears to fail for more complex reasons.
- jak_disf:
- Shows corrupt logo on first boot with no valid nvram (possibly hardware does too - verify if possible to invalidate EEPROM on device)
- lexizeus:
- Some corrupt sound effects and a few corrupt ground tiles a few minutes in. (checksum is good, and a video recorded
- from one of these doesn't exhibit these problems, so either emulation issue or alt revision?)
- pvmil:
- Question order depends on SoC RNG, only reads when it wants a new value, so unless RNG runs on a timer question order ends up the same
-
- vii:
- When loading a cart from file manager, sometimes MAME will crash.
- The "MOTOR" option in the diagnostic menu does nothing when selected.
- The "SPEECH IC" option in the diagnostic menu does nothing when selected.
- On 'vii_vc1' & 'vii_vc2' cart, the left-right keys are transposed with the up-down keys.
- - This is not a bug per se, as the games are played with the controller physically rotated 90 degrees.
-
- Note:
- Cricket, Skateboarder, Skannerz and Football 2 list a 32-bit checksum at the start of ROM.
- This is the byte sum of the file, excluding the first 16 byte (where the checksum is stored)
-
- Test Modes:
- Justice League : press UP, DOWN, LEFT, BT3 on the JAKKS logo in that order, quickly, to get test menu
- WWE : press UP, BT1, BT2 together during startup logos
-
- Disney Friends, MS Pacman, WallE, Batman (and some other HotGen GameKeys) for test mode, hold UP,
- press A, press DOWN during startup
-
- Capcom test (same access as other Hotgen games) mode looks like this (tested on PAL unit, same ROM as dumped one)
-
- RAM OK 2800
- 111111
- 5432109876543210
- IOA ............111. (values go from . to 1 when inputs are moved, never 0 as in MAME!, core bug?)
- GAMEKEY E0
- IOB0
- IOC XXX.........X...
- SPRITES
-
- Care Bears : Hold analog stck up, rotate stick 360 degress back to up, press 'A' while still holding up
-
- TODO:
- Work out how to access the hidden TEST menus for all games (most JAKKS games should have one at least)
-
-*******************************************************************************/
-
-#include "emu.h"
-
-#include "cpu/unsp/unsp.h"
-#include "machine/i2cmem.h"
-#include "machine/eepromser.h"
-#include "machine/spg2xx.h"
-
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
-#include "bus/jakks_gamekey/slot.h"
-
-#include "screen.h"
-#include "softlist.h"
-#include "speaker.h"
-
-#include "pvmil.lh"
-#include "sentx6p.lh"
-
-class spg2xx_game_state : public driver_device
-{
-public:
- spg2xx_game_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_screen(*this, "screen"),
- m_bank(*this, "cartbank"),
- m_io_p1(*this, "P1"),
- m_io_p2(*this, "P2"),
- m_io_p3(*this, "P3"),
- m_i2cmem(*this, "i2cmem")
- { }
-
- void spg2xx_base(machine_config &config);
- void jakks(machine_config &config);
- void jakks_i2c(machine_config &config);
- void walle(machine_config &config);
- void rad_skat(machine_config &config);
- void rad_skatp(machine_config &config);
- void rad_sktv(machine_config &config);
- void rad_crik(machine_config &config);
- void non_spg_base(machine_config &config);
- void lexizeus(machine_config &config);
- void taikeegr(machine_config &config);
-
- void init_crc();
- void init_zeus();
- void init_taikeegr();
- void init_wiwi18();
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- void switch_bank(uint32_t bank);
-
- DECLARE_WRITE8_MEMBER(i2c_w);
- DECLARE_READ8_MEMBER(i2c_r);
-
- DECLARE_READ16_MEMBER(jakks_porta_r);
-
- DECLARE_READ16_MEMBER(rad_porta_r);
- DECLARE_READ16_MEMBER(rad_portb_r);
- DECLARE_READ16_MEMBER(rad_portc_r);
-
- DECLARE_WRITE16_MEMBER(jakks_porta_w);
- DECLARE_WRITE16_MEMBER(jakks_portb_w);
-
- required_device<spg2xx_device> m_maincpu;
- required_device<screen_device> m_screen;
- optional_memory_bank m_bank;
-
- DECLARE_READ16_MEMBER(walle_portc_r);
- DECLARE_WRITE16_MEMBER(walle_portc_w);
-
- virtual void mem_map_4m(address_map &map);
- virtual void mem_map_2m(address_map &map);
- virtual void mem_map_1m(address_map &map);
-
- uint32_t m_current_bank;
-
- uint16_t m_walle_portc_data;
-
- required_ioport m_io_p1;
- optional_ioport m_io_p2;
- optional_ioport m_io_p3;
- optional_device<i2cmem_device> m_i2cmem;
-};
-
-
-class spg2xx_lexiseal_game_state : public spg2xx_game_state
-{
-public:
- spg2xx_lexiseal_game_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag)
- { }
-
- void lexiseal(machine_config& config);
-
-protected:
- //virtual void machine_start() override;
- //virtual void machine_reset() override;
-
- DECLARE_WRITE16_MEMBER(portb_w);
-};
-
-class spg2xx_pdc100_game_state : public spg2xx_game_state
-{
-public:
- spg2xx_pdc100_game_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag)
- { }
-
- void pdc100(machine_config& config);
-
-protected:
- //virtual void machine_start() override;
- virtual void machine_reset() override;
-
- DECLARE_WRITE16_MEMBER(porta_w);
-};
-
-class wireless60_state : public spg2xx_game_state
-{
-public:
- wireless60_state(const machine_config& mconfig, device_type type, const char* tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_bankmask(0x7)
- { }
-
- void wireless60(machine_config& config);
-
- void init_lx_jg7415();
- void init_zone100();
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- uint8_t m_w60_controller_input;
- uint16_t m_w60_porta_data;
- uint16_t m_w60_p1_ctrl_mask;
- uint16_t m_w60_p2_ctrl_mask;
- uint8_t m_bankmask;
-
- DECLARE_WRITE16_MEMBER(wireless60_porta_w);
- DECLARE_WRITE16_MEMBER(wireless60_portb_w);
- DECLARE_READ16_MEMBER(wireless60_porta_r);
-
-private:
-};
-
-class zon32bit_state : public spg2xx_game_state
-{
-public:
- zon32bit_state(const machine_config& mconfig, device_type type, const char* tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_romregion(*this, "maincpu")
- { }
-
- void zon32bit(machine_config& config);
-
- void mem_map_zon32bit(address_map &map);
-
- void init_zon32bit() { m_game = 0; };
- void init_mywicodx() { m_game = 1; };
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- DECLARE_READ16_MEMBER(z32_rom_r);
-
- required_region_ptr<uint16_t> m_romregion;
-
- DECLARE_READ16_MEMBER(porta_r);
- DECLARE_READ16_MEMBER(portb_r);
- DECLARE_READ16_MEMBER(portc_r);
-
- DECLARE_WRITE16_MEMBER(porta_w);
- DECLARE_WRITE16_MEMBER(portb_w);
- DECLARE_WRITE16_MEMBER(portc_w);
-
-private:
- int m_porta_dat;
- int m_portb_dat;
- int m_portc_dat;
-
- int m_upperbank;
-
- int m_hackbank;
- int m_game;
-};
-
-class zone40_state : public wireless60_state
-{
-public:
- zone40_state(const machine_config& mconfig, device_type type, const char* tag) :
- wireless60_state(mconfig, type, tag),
- m_romregion(*this, "maincpu")
- { }
-
- void zone40(machine_config &config);
-
- void init_zone40();
-
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
-private:
- virtual void mem_map_z40(address_map &map);
- DECLARE_READ16_MEMBER(z40_rom_r);
- DECLARE_READ16_MEMBER(zone40_porta_r);
- DECLARE_WRITE16_MEMBER(zone40_porta_w);
- required_region_ptr<uint16_t> m_romregion;
- uint8_t m_z40_rombase;
-};
-
-class pvmil_state : public spg2xx_game_state
-{
-public:
- pvmil_state(const machine_config &mconfig, device_type type, const char *tag)
- : spg2xx_game_state(mconfig, type, tag)
- , m_portcdata(0x0000)
- , m_latchcount(0)
- , m_latchbit(0)
- , m_outdat(0)
- , m_p4inputs(*this, "EXTRA")
- , m_leds(*this, "led%u", 0U)
- { }
-
- void pvmil(machine_config &config);
-
- DECLARE_READ_LINE_MEMBER(pvmil_p4buttons_r);
-
-protected:
- virtual void machine_start() override;
-
- DECLARE_WRITE16_MEMBER(pvmil_porta_w);
- DECLARE_WRITE16_MEMBER(pvmil_portb_w);
- DECLARE_WRITE16_MEMBER(pvmil_portc_w);
-
-private:
- uint16_t m_portcdata;
- int m_latchcount;
- int m_latchbit;
- uint16_t m_outdat;
- required_ioport m_p4inputs;
- output_finder<4> m_leds;
-};
-
-
-class sentx6p_state : public spg2xx_game_state
-{
-public:
- sentx6p_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_porta_data(0x0000),
- m_suite1(*this, "SUITE_LEFT_BZ%u", 0U),
- m_suite2(*this, "SUITE_RIGHT_BZ%u", 0U),
- m_number1(*this, "NUMBER_LEFT_BZ%u", 0U),
- m_number2(*this, "NUMBER_RIGHT_BZ%u", 0U),
- m_select_fold(*this, "SELECT_FOLD_BZ%u", 0U),
- m_select_check(*this, "SELECT_CHECK_BZ%u", 0U),
- m_select_bet(*this, "SELECT_BET_BZ%u", 0U),
- m_select_call(*this, "SELECT_CALL_BZ%u", 0U),
- m_select_raise(*this, "SELECT_RAISE_BZ%u", 0U),
- m_select_allin(*this, "SELECT_ALLIN_BZ%u", 0U),
- m_option_fold(*this, "OPTION_FOLD_BZ%u", 0U),
- m_option_check(*this, "OPTION_CHECK_BZ%u", 0U),
- m_option_bet(*this, "OPTION_BET_BZ%u", 0U),
- m_option_call(*this, "OPTION_CALL_BZ%u", 0U),
- m_option_raise(*this, "OPTION_RAISE_BZ%u", 0U),
- m_option_allin(*this, "OPTION_ALLIN_BZ%u", 0U),
-
- m_led(*this, "LED_BZ%u", 0U)
- { }
-
- void sentx6p(machine_config &config);
-
- void mem_map_2m_texas(address_map &map);
-
- DECLARE_INPUT_CHANGED_MEMBER(ok_latch)
- {
- if (newval == 1)
- {
- m_inputlatches[param] |= 0x02;
- logerror("latching OK button for Player %d\n", param+1);
- }
- }
-
- DECLARE_INPUT_CHANGED_MEMBER(select_latch)
- {
- if (newval == 1)
- {
- m_inputlatches[param] |= 0x01;
- logerror("latching Select button for Player %d\n", param+1);
- }
- }
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
-private:
- READ16_MEMBER(sentx_porta_r);
- READ16_MEMBER(sentx_portb_r);
- READ16_MEMBER(sentx_portc_r);
-
- DECLARE_WRITE16_MEMBER(sentx_porta_w);
- DECLARE_WRITE16_MEMBER(sentx_portb_w);
- DECLARE_WRITE16_MEMBER(sentx_portc_w);
-
- DECLARE_WRITE8_MEMBER(sentx_tx_w);
-
- uint8_t m_lcd_card1[6];
- uint8_t m_lcd_card2[6];
- uint8_t m_lcd_options[6];
- uint8_t m_lcd_options_select[6];
- uint8_t m_lcd_led[6];
-
- void set_card1(uint8_t value, int select_bits);
- void set_card2(uint8_t value, int select_bits);
- void set_options(uint8_t value, int select_bits);
- void set_options_select(uint8_t value, int select_bits);
- void set_controller_led(uint8_t value, int select_bits);
-
- void controller_send_data(int which);
-
- uint8_t m_inputlatches[6];
-
- uint16_t m_porta_data;
-
- output_finder<6> m_suite1;
- output_finder<6> m_suite2;
- output_finder<6> m_number1;
- output_finder<6> m_number2;
-
- output_finder<6> m_select_fold;
- output_finder<6> m_select_check;
- output_finder<6> m_select_bet;
- output_finder<6> m_select_call;
- output_finder<6> m_select_raise;
- output_finder<6> m_select_allin;
-
- output_finder<6> m_option_fold;
- output_finder<6> m_option_check;
- output_finder<6> m_option_bet;
- output_finder<6> m_option_call;
- output_finder<6> m_option_raise;
- output_finder<6> m_option_allin;
-
- output_finder<6> m_led;
-};
-
-class jakks_gkr_state : public spg2xx_game_state
-{
-public:
- jakks_gkr_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_porta_key_mode(false),
- m_cart(*this, "cartslot"),
- m_cart_region(nullptr)
- { }
-
- void jakks_gkr(machine_config &config);
- void jakks_gkr_i2c(machine_config &config);
- void jakks_gkr_1m_i2c(machine_config &config);
- void jakks_gkr_2m_i2c(machine_config &config);
- void jakks_gkr_nk(machine_config &config);
- void jakks_gkr_nk_i2c(machine_config &config);
- void jakks_gkr_dy(machine_config &config);
- void jakks_gkr_dy_i2c(machine_config &config);
- void jakks_gkr_dp_i2c(machine_config &config);
- void jakks_gkr_sw_i2c(machine_config &config);
- void jakks_gkr_nm_i2c(machine_config &config);
- void jakks_gkr_cc_i2c(machine_config &config);
- void jakks_gkr_wf_i2c(machine_config &config);
- void jakks_gkr_mv_i2c(machine_config &config);
- void jakks_gkr_wp(machine_config &config);
- void jakks_gkr_cb(machine_config &config);
-
- DECLARE_READ_LINE_MEMBER(i2c_gkr_r);
-
-private:
- virtual void machine_start() override;
-
- DECLARE_WRITE16_MEMBER(gkr_portc_w);
- DECLARE_WRITE16_MEMBER(jakks_porta_key_io_w);
- DECLARE_READ16_MEMBER(jakks_porta_key_io_r);
- bool m_porta_key_mode;
-
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_gamekey);
-
- required_device<jakks_gamekey_slot_device> m_cart;
- memory_region *m_cart_region;
-};
-
-class vii_state : public spg2xx_game_state
-{
-public:
- vii_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_cart(*this, "cartslot"),
- m_io_motionx(*this, "MOTIONX"),
- m_io_motiony(*this, "MOTIONY"),
- m_io_motionz(*this, "MOTIONZ"),
- m_cart_region(nullptr),
- m_ctrl_poll_timer(nullptr)
- { }
-
- void vii(machine_config &config);
-
-private:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- static const device_timer_id TIMER_CTRL_POLL = 0;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
- DECLARE_WRITE16_MEMBER(vii_portb_w);
-
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_vii);
-
- virtual void poll_controls();
-
- required_device<generic_slot_device> m_cart;
- required_ioport m_io_motionx;
- required_ioport m_io_motiony;
- required_ioport m_io_motionz;
- memory_region *m_cart_region;
-
- emu_timer *m_ctrl_poll_timer;
- uint8_t m_controller_input[8];
-};
-
-class telestory_state : public spg2xx_game_state
-{
-public:
- telestory_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_cart(*this, "cartslot"),
- m_cart_region(nullptr)
- { }
-
- void telestory(machine_config &config);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- void mem_map_4m_tsram(address_map& map);
-
- DECLARE_READ16_MEMBER(porta_r);
- DECLARE_WRITE16_MEMBER(porta_w);
-
- DECLARE_READ16_MEMBER(portb_r);
- DECLARE_WRITE16_MEMBER(portb_w);
-
- DECLARE_READ16_MEMBER(portc_r);
- DECLARE_WRITE16_MEMBER(portc_w);
-
-
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_telestory);
-
- required_device<generic_slot_device> m_cart;
- memory_region *m_cart_region;
-};
-
-
-class icanguit_state : public spg2xx_game_state
-{
-public:
- icanguit_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_cart(*this, "cartslot"),
- m_cart_region(nullptr),
- m_porta_in(*this, "P1_%u", 0U),
- m_portc_in(*this, "P3_%u", 0U)
- { }
-
- void icanguit(machine_config &config);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_icanguit);
-
- DECLARE_READ16_MEMBER(porta_r);
- virtual DECLARE_WRITE16_MEMBER(porta_w);
-
- virtual DECLARE_READ16_MEMBER(portb_r);
- virtual DECLARE_WRITE16_MEMBER(portb_w);
-
- DECLARE_READ16_MEMBER(portc_r);
- DECLARE_WRITE16_MEMBER(portc_w);
-
- required_device<generic_slot_device> m_cart;
- memory_region *m_cart_region;
-
- uint16_t m_inlatch_a;
- uint16_t m_inlatch_c;
- optional_ioport_array<6> m_porta_in;
- optional_ioport_array<6> m_portc_in;
-
-};
-
-class icanpian_state : public icanguit_state
-{
-public:
- icanpian_state(const machine_config &mconfig, device_type type, const char *tag) :
- icanguit_state(mconfig, type, tag)
- // m_eeprom(*this, "eeprom")
- { }
-
- void icanpian(machine_config &config);
-
-protected:
- virtual DECLARE_WRITE16_MEMBER(porta_w) override;
-
- virtual DECLARE_READ16_MEMBER(portb_r) override;
- virtual DECLARE_WRITE16_MEMBER(portb_w) override;
-
- //optional_device<eeprom_serial_93cxx_device> m_eeprom;
-};
-
-class tvgogo_state : public spg2xx_game_state
-{
-public:
- tvgogo_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_cart(*this, "cartslot"),
- m_cart_region(nullptr)
- { }
-
- void tvgogo(machine_config &config);
-
-private:
- uint8_t m_i2cunk;
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
- DECLARE_WRITE8_MEMBER(tvg_i2c_w);
- DECLARE_READ8_MEMBER(tvg_i2c_r);
-
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load_tvgogo);
-
- required_device<generic_slot_device> m_cart;
- memory_region *m_cart_region;
-};
-
-
-class dreamlif_state : public spg2xx_game_state
-{
-public:
- dreamlif_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_eeprom(*this, "eeprom")
- { }
-
- void dreamlif(machine_config &config);
-
-private:
- DECLARE_READ16_MEMBER(portb_r);
- DECLARE_WRITE16_MEMBER(portb_w);
-
- required_device<eeprom_serial_93cxx_device> m_eeprom;
-};
-
-class shredmjr_game_state : public spg2xx_game_state
-{
-public:
- shredmjr_game_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag),
- m_porta_data(0x0000),
- m_shiftamount(0)
- { }
-
- void shredmjr(machine_config &config);
-
-protected:
- DECLARE_READ16_MEMBER(porta_r);
- DECLARE_WRITE16_MEMBER(porta_w);
-
-private:
- uint16_t m_porta_data;
- int m_shiftamount;
-
-};
-
-
-/*************************
-* Machine Hardware *
-*************************/
-
-void spg2xx_game_state::switch_bank(uint32_t bank)
-{
- if (m_bank)
- {
- if (bank != m_current_bank)
- {
- m_current_bank = bank;
- m_bank->set_entry(bank);
- m_maincpu->invalidate_cache();
- }
- }
-}
-
-WRITE8_MEMBER(spg2xx_game_state::i2c_w)
-{
- logerror("%s: i2c_w %05x %04x\n", machine().describe_context(), offset, data);
-}
-
-READ8_MEMBER(spg2xx_game_state::i2c_r)
-{
- logerror("%s: i2c_r %04x\n", machine().describe_context(), offset);
- return 0x0000;
-}
-
-WRITE16_MEMBER(wireless60_state::wireless60_porta_w)
-{
- //logerror("%s: wireless60_porta_w %04x\n", machine().describe_context(), data);
-
- m_w60_porta_data = (data & 0x300) | m_w60_p1_ctrl_mask | m_w60_p2_ctrl_mask;
- switch (m_w60_porta_data & 0x300)
- {
- case 0x300:
- m_w60_controller_input = -1;
- break;
-
- case 0x200:
- m_w60_controller_input++;
- break;
-
- default:
- uint16_t temp1 = m_io_p1->read();
- uint16_t temp2 = m_io_p2->read();
- uint16_t temp3 = 1 << m_w60_controller_input;
- if (temp1 & temp3) m_w60_porta_data ^= m_w60_p1_ctrl_mask;
- if (temp2 & temp3) m_w60_porta_data ^= m_w60_p2_ctrl_mask;
- break;
- }
-}
-
-READ16_MEMBER(wireless60_state::wireless60_porta_r)
-{
- //logerror("%s: wireless60_porta_r\n", machine().describe_context());
- return m_w60_porta_data;
-}
-
-WRITE16_MEMBER(wireless60_state::wireless60_portb_w)
-{
- logerror("%s: wireless60_portb_w (bankswitch) %04x\n", machine().describe_context(), data);
- switch_bank(data & m_bankmask);
-}
-
-WRITE16_MEMBER(zone40_state::zone40_porta_w)
-{
- wireless60_porta_w(space, offset, data);
-
- if ((data & 0x00ff) != m_z40_rombase)
- {
- m_z40_rombase = data & 0x00ff;
- m_maincpu->invalidate_cache();
- }
-}
-
-
-READ16_MEMBER(zon32bit_state::porta_r)
-{
- return m_porta_dat;
-}
-
-
-WRITE16_MEMBER(zon32bit_state::porta_w)
-{
- //if (data != 0x0101)
- // logerror("%s: porta_w (%04x)\n", machine().describe_context(), data);
-
- m_porta_dat = data;
-
- // where is the banking?! this gets written from the RAM-based code when the lower bank needs to change, but the upper bank needs to change in places too
- // (and all these bits get unset again after this write, so this probably isn't the bank)
- if (data == 0x0e01)
- {
- m_hackbank ^= 1;
- }
-
- if (data == 0x0301)
- {
- m_hackbank = 2;
- }
-
- /*
- if (data == 0x0335)
- {
- logerror("%s: port a write 0x0355, port c is %04x %04X\n", machine().describe_context(), data, data & 0x1800);
-
- m_upperbank = (m_portc_dat & 0x1800);
- }
- */
-}
-
-READ16_MEMBER(zon32bit_state::portc_r)
-{
- // 0x03ff seem to be inputs for buttons (and some kind of output?)
- // 0xfc00 gets masked for other reasons (including banking?)
-
- // returning same value written for 0x0400 means controls don't respond (some kind of direction flag?)
-
- uint16_t dat = m_io_p3->read() & ~0xf800;
-
- dat |= (m_portc_dat & 0xf800);
-
- return dat;
-}
-
-
-READ16_MEMBER(zon32bit_state::portb_r)
-{
- return m_portb_dat;
-}
-
-WRITE16_MEMBER(zon32bit_state::portb_w)
-{
- if (data != 0x0001)
- logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
-
- m_portb_dat = data;
-}
-
-WRITE16_MEMBER(zon32bit_state::portc_w)
-{
- // very noisy
- // is the code actually sending the sound to the remotes?
-
- //logerror("%s: portc_w (%04x)\n", machine().describe_context(), data);
-
- //if ((pc >= 0x77261) && (pc <= 0x77268))
- // logerror("%s: port c %04x %04X-- BANK STUFF\n", machine().describe_context(), data, data & 0x1800);
-
- //logerror("%s: port c %04x %04x\n", machine().describe_context(), data, data & 0x1800);
-
- /*
-
- this logic seems to apply for some of the mini-games, but cases where the lower bank doesn't change, this sequence doesn't happen either...
-
- we can only trigger bank on 0335 writes, because it gets lost shortly after (unless that's an issue with the io code in spg2xx_io.cpp)
-
- ':maincpu' (077250): port c 0000 0000
- ':maincpu' (077263): port c fe00 1800-- BANK STUFF
- ':maincpu' (0677DC): porta_w (0311)
- ':maincpu' (0677E9): porta_w (0301)
- ':maincpu' (0677F6): porta_w (0335) // bank take effect?
- ':maincpu' (067803): port c fc00 1800
- ':maincpu' (067810): port c fe00 1800
- ':maincpu' (06781B): port c f800 1800
- */
-
-// bits 0x0600 are explicitly set when changing bank, but this logic doesn't work for all cases, causes bad bank changes after boot in some games
-#if 0
- if ((data & 0x0600) == (0x0600))
- {
- if ((m_portc_dat & 0x0600) != 0x0600)
- m_upperbank = data & 0x1800;
- }
-
-#else // ugly PC based hacked to ensure we always have the correct bank
- int pc = m_maincpu->pc();
- if (m_game == 0)
- {
- if ((pc == 0x077263) && m_hackbank == 1) // when using upper code bank
- {
- //printf("zon32bit change upper bank from upper code bank %04x\n", data & 0x1800);
- m_upperbank = data & 0x1800;
- }
-
- if ((pc == 0x05ff63) && m_hackbank == 0) // when using lower code bank
- {
- //printf("zon32bit change upper bank from lower code bank %04x\n", data & 0x1800);
- m_upperbank = data & 0x1800;
- }
- }
- else if (m_game == 1)
- {
- if ((pc == 0x09369c) && m_hackbank == 0) // when using lower code bank
- {
- printf("mywicodx change upper bank from main menu code bank %04x\n", data & 0x1800);
- m_upperbank = data & 0x1800;
- }
-
- if ((pc == 0x530) && m_hackbank == 1)
- {
- printf("mywicodx change upper bank from other menu code bank %04x\n", data & 0x1800);
- m_upperbank = data & 0x1800;
- }
-
- if ((pc == 0x159E2) && m_hackbank == 2)
- {
- printf("mywicodx change guitar music bank %04x\n", data & 0x1800);
- m_upperbank = data & 0x1800;
- }
-
- }
-#endif
-
- m_portc_dat = data;
-
-//077261: r4 = r2
-//077262: [r4] = r3 // writes to 3d0b (port c?)
-//077263: sp += 04
-}
-
-
-
-READ16_MEMBER(zone40_state::zone40_porta_r)
-{
- uint16_t ret = wireless60_porta_r(space, offset) & (0x0300 | m_w60_p1_ctrl_mask | m_w60_p2_ctrl_mask);
- ret = (ret & 0xff00) | m_z40_rombase;
- return ret;
-}
-
-
-void vii_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_CTRL_POLL:
- poll_controls();
- break;
- default:
- logerror("Unknown timer ID: %d\n", id);
- break;
- }
-}
-
-WRITE16_MEMBER(vii_state::vii_portb_w)
-{
- switch_bank(((data & 0x80) >> 7) | ((data & 0x20) >> 4));
-}
-
-
-READ_LINE_MEMBER(jakks_gkr_state::i2c_gkr_r)
-{
- if (m_cart && m_cart->exists())
- {
- return m_cart->read_cart_seeprom();
- }
- else
- {
- return m_i2cmem->read_sda();
- }
-}
-
-WRITE16_MEMBER(spg2xx_game_state::walle_portc_w)
-{
- m_walle_portc_data = data & mem_mask;
- if (BIT(mem_mask, 1))
- m_i2cmem->write_scl(BIT(data, 1));
- if (BIT(mem_mask, 0))
- m_i2cmem->write_sda(BIT(data, 0));
-}
-
-WRITE16_MEMBER(jakks_gkr_state::gkr_portc_w)
-{
- m_walle_portc_data = data & mem_mask;
-
- if (m_cart && m_cart->exists())
- {
- m_cart->write_cart_seeprom(space,offset,data,mem_mask);
- }
- else
- {
- if (m_i2cmem)
- {
- if (BIT(mem_mask, 1))
- m_i2cmem->write_scl(BIT(data, 1));
- if (BIT(mem_mask, 0))
- m_i2cmem->write_sda(BIT(data, 0));
- }
- }
-}
-
-READ16_MEMBER(spg2xx_game_state::jakks_porta_r)
-{
- //logerror("%s: jakks_porta_r\n", machine().describe_context());
- return m_io_p1->read();
-}
-
-WRITE16_MEMBER(spg2xx_game_state::jakks_porta_w)
-{
- //logerror("%s: jakks_porta_w %04x\n", machine().describe_context(), data);
-}
-
-WRITE16_MEMBER(spg2xx_game_state::jakks_portb_w)
-{
- //logerror("%s: jakks_portb_w %04x\n", machine().describe_context(), data);
-}
-
-READ16_MEMBER(jakks_gkr_state::jakks_porta_key_io_r)
-{
- //logerror("%s: jakks_porta_key_io_r\n", machine().describe_context());
- if (m_porta_key_mode == false)
- {
- return m_io_p1->read();
- }
- else
- {
- /* masks with 0xf, inverts, and combines it with a previous read (when data written to jakks_porta_key_io_w was 0x0000) and expects result to be 0x0000
- could just expect data written to be returned, but that would be a strange check.
- all systems seem to respond to the same result, so how is the per-system lock implemented? */
- return (m_io_p1->read() & 0xfff0) | 0x000f;
- }
-}
-
-WRITE16_MEMBER(jakks_gkr_state::jakks_porta_key_io_w)
-{
- logerror("%s: jakks_porta_key_io_w %04x\n", machine().describe_context(), data);
- // only seen 0xffff and 0x0000 written here.. writes 0xffff before the 2nd part of the port a gamekey check read.
- if (data == 0xffff)
- {
- m_porta_key_mode = true;
- }
- else
- {
- m_porta_key_mode = false;
- }
-}
-
-READ16_MEMBER(spg2xx_game_state::rad_porta_r)
-{
- uint16_t data = m_io_p1->read();
- logerror("Port A Read: %04x\n", data);
- return data;
-}
-
-READ16_MEMBER(spg2xx_game_state::rad_portb_r)
-{
- uint16_t data = m_io_p2->read();
- logerror("Port B Read: %04x\n", data);
- return data;
-}
-
-READ16_MEMBER(spg2xx_game_state::rad_portc_r)
-{
- uint16_t data = m_io_p3->read();
- logerror("Port C Read: %04x\n", data);
- return data;
-}
-
-void pvmil_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- m_leds.resolve();
- save_item(NAME(m_portcdata));
- save_item(NAME(m_latchcount));
- save_item(NAME(m_latchbit));
- save_item(NAME(m_outdat));
-}
-
-
-WRITE16_MEMBER(pvmil_state::pvmil_porta_w)
-{
- logerror("%s: pvmil_porta_w %04x\n", machine().describe_context(), data);
-}
-
-WRITE16_MEMBER(pvmil_state::pvmil_portb_w)
-{
- logerror("%s: pvmil_portb_w %04x\n", machine().describe_context(), data);
-}
-
-
-READ_LINE_MEMBER(pvmil_state::pvmil_p4buttons_r)
-{
- return m_latchbit;
-}
-
-
-WRITE16_MEMBER(pvmil_state::pvmil_portc_w)
-{
- // ---- -432 1--- r-?c
- // 4,3,2,1 = player controller LEDs
- // r = reset input multiplexer
- // ? = unknown
- // m = input multiplexer clock
-
- // p4 input reading
- // the code to read them is interesting tho, it even includes loops that poll port a 16 times before/after, why?
- logerror("%s: pvmil_portc_w %04x\n", machine().describe_context(), data);
-
- uint16_t bit;
-
- // for logging bits changed on the port
- if (0)
- {
- for (int i = 0; i < 16; i++)
- {
- bit = 1 << i;
- if ((m_portcdata & bit) != (data & bit))
- {
- if (data & bit)
- {
- logerror("port c %04x low to high\n", bit);
- }
- else
- {
- logerror("port c %04x high to low\n", bit);
- }
- }
-
- if ((m_portcdata & 0x0400) != (data & 0x0400))
- {
- logerror("-------------------------------------------------\n");
- }
- }
- }
-
- // happens on startup, before it starts reading inputs for the first time, assume 'reset counter'
- bit = 0x0008;
- if ((m_portcdata & bit) != (data & bit))
- {
- if (data & bit)
- {
- logerror("reset read counter\n");
- m_latchcount = 0;
- }
- }
-
- bit = 0x0001;
- if ((m_portcdata & bit) != (data & bit))
- {
- if (!(data & bit))
- {
- //logerror("latch with count of %d (outbit is %d)\n", m_latchcount, (m_portcdata & 0x0002)>>1 );
- // what is bit 0x0002? it gets flipped in the same code as the inputs are read.
- // it doesn't follow any obvious pattern
- m_outdat &= ~(1 << m_latchcount);
- m_outdat |= ((data & 0x0002) >> 1) << m_latchcount;
- if (0)
- popmessage("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
- (m_outdat & 0x8000) ? 1 : 0, (m_outdat & 0x4000) ? 1 : 0, (m_outdat & 0x2000) ? 1 : 0, (m_outdat & 0x1000) ? 1 : 0,
- (m_outdat & 0x0800) ? 1 : 0, (m_outdat & 0x0400) ? 1 : 0, (m_outdat & 0x0200) ? 1 : 0, (m_outdat & 0x0100) ? 1 : 0,
- (m_outdat & 0x0080) ? 1 : 0, (m_outdat & 0x0040) ? 1 : 0, (m_outdat & 0x0020) ? 1 : 0, (m_outdat & 0x0010) ? 1 : 0,
- (m_outdat & 0x0008) ? 1 : 0, (m_outdat & 0x0004) ? 1 : 0, (m_outdat & 0x0002) ? 1 : 0, (m_outdat & 0x0001) ? 1 : 0);
-
-
- m_latchbit = (((m_p4inputs->read()) << m_latchcount) & 0x8000) ? 1 : 0;
-
- m_latchcount++;
- if (m_latchcount == 16)
- m_latchcount = 0;
- }
- }
-
- m_portcdata = data;
-
- if (0)
- popmessage("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
- (m_portcdata & 0x8000) ? 1 : 0, (m_portcdata & 0x4000) ? 1 : 0, (m_portcdata & 0x2000) ? 1 : 0, (m_portcdata & 0x1000) ? 1 : 0,
- (m_portcdata & 0x0800) ? 1 : 0, (m_portcdata & 0x0400) ? 1 : 0, (m_portcdata & 0x0200) ? 1 : 0, (m_portcdata & 0x0100) ? 1 : 0,
- (m_portcdata & 0x0080) ? 1 : 0, (m_portcdata & 0x0040) ? 1 : 0, (m_portcdata & 0x0020) ? 1 : 0, (m_portcdata & 0x0010) ? 1 : 0,
- (m_portcdata & 0x0008) ? 1 : 0, (m_portcdata & 0x0004) ? 1 : 0, (m_portcdata & 0x0002) ? 1 : 0, (m_portcdata & 0x0001) ? 1 : 0);
-
- m_leds[0] = (m_portcdata & 0x0080) ? 0 : 1;
- m_leds[1] = (m_portcdata & 0x0100) ? 0 : 1;
- m_leds[2] = (m_portcdata & 0x0200) ? 0 : 1;
- m_leds[3] = (m_portcdata & 0x0400) ? 0 : 1;
-}
-
-
-void spg2xx_game_state::mem_map_4m(address_map &map)
-{
- map(0x000000, 0x3fffff).bankr("cartbank");
-}
-
-void spg2xx_game_state::mem_map_2m(address_map &map)
-{
- map(0x000000, 0x1fffff).mirror(0x200000).bankr("cartbank");
-}
-
-void sentx6p_state::mem_map_2m_texas(address_map &map)
-{
- map(0x000000, 0x1fffff).bankr("cartbank");
- map(0x3f0000, 0x3f7fff).ram();
-}
-
-void telestory_state::mem_map_4m_tsram(address_map &map)
-{
- map(0x000000, 0x3fffff).bankr("cartbank");
- map(0x3e0000, 0x3fffff).ram(); // is this in the cart or in the system?
-}
-
-
-void zon32bit_state::mem_map_zon32bit(address_map &map)
-{
- map(0x000000, 0x3fffff).r(FUNC(zon32bit_state::z32_rom_r));
-}
-
-READ16_MEMBER(zon32bit_state::z32_rom_r)
-{
- /*
- This has upper and lower bank, which can be changed independently.
- Banking hookup is currently very hacky as bank values are written
- to ports then erased at the moment, maybe they latch somehow?
- */
-
- if (m_game == 0) // zon32bit
- {
- if (offset < 0x200000)
- {
- if (m_hackbank == 0) // if lower bank is 0
- return m_romregion[offset + 0x000000];
- else
- { // if lower bank is 1
- return m_romregion[offset + 0x400000];
- }
- }
- else
- {
- offset &= 0x1fffff;
-
- if (m_hackbank == 0) // if lower bank is 0
- {
- if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x0400000 / 2)]; // this upper bank is needed to boot to the menu
- else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x1000000 / 2)]; // golf, tennis, several mini games
- else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x1400000 / 2)]; // baseball, more minigames
- else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x0400000 / 2)]; // ? (not used?)
- }
- else // if lower bank is 1
- {
- // these banks are used for different 'mini' games (and boxing) with the 2nd lower bank enabled
- if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x0c00000 / 2)]; // 31-44 some mini games
- else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x1800000 / 2)]; // 45-49 some mini games + boxing
- else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x1c00000 / 2)]; // 50-59 some mini games
- else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x0400000 / 2)]; // ? (not used?)
- }
- }
- }
- else if (m_game == 1) // mywicodx
- {
- if (offset < 0x200000)
- {
- if (m_hackbank == 0) // if lower bank is 0 (main menu)
- {
- return m_romregion[offset + (0x2000000 / 2)];
- }
- else if (m_hackbank == 1) // if lower bank is 0 (debug menu code / extra cames)
- {
- return m_romregion[offset + (0x3000000 / 2)];
- }
- else // Mi Guitar
- {
- return m_romregion[offset + (0x0000000 / 2)];
- }
- }
- else
- {
- offset &= 0x1fffff;
-
- if (m_hackbank == 0)
- {
- if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x2400000 / 2)]; // this upper bank is needed to boot to the menu, boxing
- else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x2800000 / 2)]; // ? tennis, golf
- else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x2c00000 / 2)]; // ? table tennis, bowling, basketball, baseball
- else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x2400000 / 2)]; // ? (not used?)
- }
- else if (m_hackbank == 1)
- {
- if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x3400000 / 2)]; // base code for other bank
- else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x3800000 / 2)]; //
- else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x3c00000 / 2)]; //
- else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x3400000 / 2)]; //
- }
- else
- {
- if ((m_upperbank & 0x1800) == 0x1000) return m_romregion[offset + (0x0400000 / 2)]; // song data 1
- else if ((m_upperbank & 0x1800) == 0x0800) return m_romregion[offset + (0x0800000 / 2)]; // song data 2
- else if ((m_upperbank & 0x1800) == 0x1800) return m_romregion[offset + (0x0c00000 / 2)]; // song data 3
- else if ((m_upperbank & 0x1800) == 0x0000) return m_romregion[offset + (0x0400000 / 2)]; //
- }
- }
- }
-
- return 0x0000;// m_romregion[offset];
-
-}
-
-
-
-READ16_MEMBER(zone40_state::z40_rom_r)
-{
- // due to granularity of rom bank this manual method is safer
- return m_romregion[(offset + (m_z40_rombase * 0x20000)) & 0x1ffffff];
-}
-
-void zone40_state::mem_map_z40(address_map &map)
-{
- map(0x000000, 0x3fffff).r(FUNC(zone40_state::z40_rom_r));
-}
-
-
-void spg2xx_game_state::mem_map_1m(address_map &map)
-{
- map(0x000000, 0x0fffff).mirror(0x300000).bankr("cartbank");
-}
-
-static INPUT_PORTS_START( vii )
- PORT_START("P1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Button A")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Button B")
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Button C")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Button D")
-
- PORT_START("MOTIONX")
- PORT_BIT( 0x3ff, 0x200, IPT_PADDLE ) PORT_MINMAX(0x000, 0x3ff) PORT_SENSITIVITY(50) PORT_KEYDELTA(50) PORT_NAME("Motion Control X")
-
- PORT_START("MOTIONY")
- PORT_BIT( 0x3ff, 0x200, IPT_PADDLE ) PORT_MINMAX(0x000, 0x3ff) PORT_SENSITIVITY(50) PORT_KEYDELTA(50) PORT_NAME("Motion Control Y") PORT_PLAYER(2)
-
- PORT_START("MOTIONZ")
- PORT_BIT( 0x3ff, 0x200, IPT_PADDLE ) PORT_MINMAX(0x000, 0x3ff) PORT_SENSITIVITY(50) PORT_KEYDELTA(50) PORT_NAME("Motion Control Z") PORT_PLAYER(3)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( batman )
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Menu")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("B Button")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("X Button")
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( walle )
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button")
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", i2cmem_device, read_sda)
- PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_sith_i2c )
- PORT_START("P1")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 )
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 )
- PORT_BIT( 0xf3df, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
- PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("JOYX")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-
- PORT_START("JOYY")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_pooh )
- PORT_START("P1")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu / Pause")
- PORT_BIT( 0xf7df, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
-
- PORT_START("JOYX")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-
- PORT_START("JOYY")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_care )
- PORT_START("P1")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Menu / Pause")
- PORT_BIT( 0xf7df, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
-
- PORT_START("JOYX")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-
- PORT_START("JOYY")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_nm_i2c )
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 )
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
- PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED )
-
-
- PORT_START("DIALX") // for Pole Position, joystick can be twisted like a dial/wheel (limited?) (check range)
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_cc_i2c )
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("C")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("D")
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
- PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_wf_i2c )
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("A")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x01c0, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu")
- PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
- PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC
-
- /* on real unit you can spin the wheel (and must make sure it completes a full circle, or you lose your turn) instead of pressing 'B' for a random spin but where does it map? (it can be tested in secret test mode)
- PORT_START("DIALX")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
-
- PORT_START("DIALY")
- PORT_BIT(0x0fff, 0x0000, IPT_AD_STICK_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_MINMAX(0x00,0x0fff)
- */
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_gkr )
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 )
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 )
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 )
- PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Menu / Pause")
- PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (not verified for all games, state can be seen in secret test menu of many tho)
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) // this causes WWE to think the unit is a '2nd Controller' and tells you to plug the 1st one in.
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_sdoo_i2c ) // GameKeyReady units had 2 main buttons, later releases reduced that to 1 button (as the internal games don't require 2 and no GameKeys were released)
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 )
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) // debug input, skips levels!
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED ) // must be low or other inputs don't work?
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu / Pause")
- PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r) // is this correct? doesn't seem to work
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( jak_gkr_i2c )
- PORT_INCLUDE(jak_gkr)
-
- PORT_MODIFY("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( jak_dpr_i2c )
- PORT_START("P1")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON2 )
- PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Start / Menu / Pause")
- PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(jakks_gkr_state, i2c_gkr_r)
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag, set to NTSC (unverified here)
- PORT_BIT( 0xfff6, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-
-static INPUT_PORTS_START( wirels60 )
- PORT_START("P1")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down")
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Menu")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Start")
-
- PORT_START("P2")
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_NAME("Joypad Up")
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_NAME("Joypad Down")
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_NAME("Joypad Left")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_NAME("Joypad Right")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("A Button")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("B Button")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Menu")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("Start")
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( zon32bit )
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "P1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Up (vertical) Left (horizontal)")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Down (vertical) Right (horizontal)")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Left (vertical) Down (horizontal)")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Right (vertical) Up (horizontal)")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON4 )
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 )
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("B")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Pause / Menu")
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( rad_skat )
- PORT_START("P1")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Full Left")
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Full Right")
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Slight Left") // you have to use this for the menus (eg trick lists)
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Slight Right")
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Front")
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Back")
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED )
- // there only seem to be 3 buttons on the pad part, so presumably all the above are the skateboard, and below are the pad?
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("M Button")
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("X Button")
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("O Button")
- PORT_BIT( 0xf800, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) // read but unused?
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( rad_skatp )
- PORT_INCLUDE(rad_skat)
-
- PORT_MODIFY("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( rad_sktv )
- /* how does the Scanner connect? probably some serial port with comms protocol, not IO ports?
- internal test mode shows 'uart' ports (which currently fail)
-
- To access internal test hold DOWN and BUTTON1 together on startup until a coloured screen appears.
- To cycle through the tests again hold DOWN and press BUTTON1 */
-
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "IN1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( wiwi18 )
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "IN0" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, "Possible Input" )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
-
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "IN1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( mattelcs ) // there is a 'secret test mode' that previously got activated before inputs were mapped, might need unused inputs to active?
- PORT_START("P1")
- PORT_BIT( 0x0007, IP_ACTIVE_LOW, IPT_UNUSED ) // must be IP_ACTIVE_LOW or you can't switch to Football properly?
- PORT_DIPNAME( 0x0018, 0x0000, "Game Select Slider" ) // technically not a dipswitch, a 3 position slider, but how best map it?
- PORT_DIPSETTING( 0x0008, "Baseball (Left)" )
- PORT_DIPSETTING( 0x0010, "Basketball (Middle)" )
- PORT_DIPSETTING( 0x0000, "Football (Right)" )
- // no 4th position possible
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Difficulty ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Hard ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
- PORT_BIT( 0xffa0, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P2")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Joypad Up")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Joypad Down")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("Joypad Left")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("Joypad Right")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Sound") // toggles between sound+music, sound only, and no sound
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Hike / Pitch")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shoot / Run")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Kick / Hit")
- PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-/* hold 'Console Down' while powering up to get the test menu, including input tests
- the ball (Wired) and bat (IR) are read some other way as they don't seem to appear in the ports. */
-static INPUT_PORTS_START( rad_crik )
- PORT_START("P1")
- PORT_BIT( 0x003f, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Console Enter") // these are the controls on the base unit
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Console Down")
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Console Left")
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_NAME("Console Right")
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Console Up")
- PORT_BIT( 0xf800, IP_ACTIVE_LOW, IPT_UNKNOWN )
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( dreamlif )
- PORT_START("P1")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("A")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("B")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("C")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Yes")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("No")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // must be low or the Tiger logo gets skipped, also must be low for service mode (hold pause while booting) to work
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Pause")
- PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-// there is a speaker volume for the 'guitar' mode, but it's presumably an analog feature, not read by the game.
-static INPUT_PORTS_START( icanguit )
- PORT_START("P1")
- // uses multiplexed ports instead, see below
-
- PORT_START("P1_0")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Fret 1, Row 1")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("Fret 2, Row 1")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_NAME("Fret 3, Row 1")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("Fret 4, Row 1")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("Fret 5, Row 1")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("Fret 6, Row 1") // Frets 6-12 only have 2 rows (1 and 6)
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Fret 9, Row 1")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Fret 10, Row 1")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Fret 11, Row 1")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Fret 12, Row 1")
- PORT_BIT( 0xfc00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P1_1")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("Fret 1, Row 2")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("Fret 2, Row 2")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Fret 3, Row 2")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("Fret 4, Row 2")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("Fret 5, Row 2")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("Fret 7, Row 1")
- PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P1_2")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("Fret 1, Row 3")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("Fret 2, Row 3")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("Fret 3, Row 3")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("Fret 4, Row 3")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("Fret 5, Row 3")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Fret 8, Row 1")
- PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P1_3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("Fret 1, Row 4")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fret 2, Row 4")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fret 3, Row 4")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("Fret 4, Row 4")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Fret 5, Row 4")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Fret 8, Row 6")
- PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P1_4")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("Fret 1, Row 5")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("Fret 2, Row 5")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("Fret 3, Row 5")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Fret 4, Row 5")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Fret 5, Row 5")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Fret 7, Row 6")
- PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P1_5")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Fret 1, Row 6")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("Fret 2, Row 6")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("Fret 3, Row 6")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Fret 4, Row 6")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("Fret 5, Row 6")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Fret 6, Row 6") // Frets 6-12 only have 2 rows (1 and 6)
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Fret 9, Row 6")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Fret 10, Row 6")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Fret 11, Row 6")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Fret 12, Row 6")
- PORT_BIT( 0xfc00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // might be some kind of seeprom in here?
-
- PORT_START("P3")
- // uses multiplexed ports instead, see below
-
- PORT_START("P3_0")
- PORT_BIT( 0x0007, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("String 1") // these seem to respond on release, but are definitely active high based on visual indicators
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("String 2")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("String 3")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("String 4")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("String 5")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("String 6")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_DIPNAME( 0x0400, 0x0000, "TV or Guitar Mode" )
- PORT_DIPSETTING( 0x0000, "TV Mode" )
- PORT_DIPSETTING( 0x0400, "Guitar Mode" )
- PORT_BIT( 0xf800, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P3_1")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
- PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P3_2")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Home")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Enter")
- PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P3_3")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pause")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
- PORT_BIT( 0xfffc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P3_4")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // doesn't highlight during menus, but changes sound in 'Guitar Mode' and switches between levels after selecting song
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // doesn't highlight during menus, but changes sound in 'Guitar Mode' and switches between levels after selecting song
- PORT_BIT( 0xfff8, IP_ACTIVE_LOW, IPT_UNKNOWN )
-
- PORT_START("P3_5")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Whammy Up")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Whammy Down")
- PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-INPUT_PORTS_END
-
-// this has an entire piano keyboard + extras
-// there is a volume dial for the internal speakers when used in non-TV mode, but presumably it is not CPU visible
-// there should be a metronome key, but nothing seems to have that effect, maybe due to incomplete sound emulation?
-static INPUT_PORTS_START( icanpian )
- PORT_START("P1")
- // uses multiplexed ports instead, see below
-
- PORT_START("P1_0")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2)PORT_NAME("Octave 0 F (Green)")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("Octave 0 F# (Purple)")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Octave 0 G (Yellow)")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("Octave 0 G# (Dark Blue)")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("Octave 0 A (Flesh)")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("Octave 0 A# (Dark Green)")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("Octave 0 B (Pink)")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("Octave 0 C (White)")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("Octave 0 C# (Black)")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("Octave 0 D (Blue)")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("Octave 0 D# (Red)")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("Octave 0 E (Orange)")
- PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P1_1")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("Octave 1 F (Green)")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("Octave 1 F# (Purple)")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Octave 1 G (Yellow)")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("Octave 1 G# (Dark Blue)")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Octave 1 A (Flesh)")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Octave 1 A# (Dark Green)")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Octave 1 B (Pink)")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_NAME("Octave 1 C (White)")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Octave 1 C# (Black)")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("Octave 1 D (Blue)")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Octave 1 D# (Red)")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME("Octave 1 E (Orange)")
- PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P1_2")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("Octave 2 F (Green)")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Octave 2 F# (Purple)")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Octave 2 G (Yellow)")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Octave 2 G# (Dark Blue)")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_NAME("Octave 2 A (Flesh)")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Octave 2 A# (Dark Green)")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("Octave 2 B (Pink)")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("Octave 2 C (White)")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Octave 2 C# (Black)")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("Octave 2 D (Blue)")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Octave 2 D# (Red)")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Octave 2 E (Orange)")
- PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // might be some kind of seeprom in here? (or not? only I Can Play Guitar seems to offer a 'resume', something does get accessed on startup tho? and the machine tells you 'high scores')
-
- PORT_START("P3")
- // uses multiplexed ports instead, see below
-
- PORT_START("P3_0")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Change Instrument")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Cycle Hands")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Display Mode 1")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Display Mode 2")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Display Mode 3")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Display Mode 4")
- PORT_BIT( 0x07c0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // unused?
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // presumably power / low battery, kils the game
- PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P3_1")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Tempo Up")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("Tempo Default")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Tempo Down")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Pause")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Metronome")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) // will skip intro scenes etc. like other buttons but no more physical buttons on KB to map here
- PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P3_2") // the system ALWAYS requires a cartridge, but has 2 modes of operation depending on a switch. The only way to use it as a normal keyboard is by flipping this switch.
- PORT_DIPNAME( 0x0001, 0x0000, "System Mode" ) // or implement this as a toggle key? (it's a slider switch)
- PORT_DIPSETTING( 0x0001, "Keyboard Mode (no TV output)" )
- PORT_DIPSETTING( 0x0000, "TV Mode" )
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Scroll Up")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("Scroll Down")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Enter")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Home")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_UNUSED ) // will skip intro scenes etc. like other buttons but no more physical buttons on KB to map here
- PORT_BIT( 0xffc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( rad_fb2 ) // controls must be multiplexed somehow, as there's no room for P2 controls otherwise (unless P2 controls were never finished and it was only sold in a single mat version, Radica left useless P2 menu options in the mini Genesis consoles)
- PORT_START("P1")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) // 'left'
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // 'up'
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) // 'right'
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // acts a 'motion ball' in menu (this is an analog input from the ball tho? at least in rad_fb in xavix.cpp so this might just be a debug input here)
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // 'p2 right'
- // none of the remaining inputs seem to do anything
- PORT_BIT( 0xffe0, IP_ACTIVE_LOW, IPT_UNKNOWN )
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_CUSTOM ) // NTSC (1) / PAL (0) flag
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( lexizeus ) // how many buttons does this have? I accidentally entered a secret test mode before that seemed to indicate 6, but can't get there again
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "P1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Button 1") // shoot in Tiger Rescue & Deep
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Pause")
-
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Button 1 Rapid") // same function as button 1 but with rapid toggle on/off
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Button 2 Rapid") // same function as button 2 but with rapid toggle on/off
- PORT_DIPNAME( 0x0004, 0x0004, "P3" )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Button 2") // toggles ball / number view in pool
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( lexiseal )
- PORT_START("P1")
- PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
- PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
- PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
- PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
- PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON2 )
- PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNUSED ) // doesn't respond as 'select'
- PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON3 ) // pause / start
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 )
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON5 )
- PORT_BIT( 0xfffc, IP_ACTIVE_LOW, IPT_UNUSED )
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( tvgogo )
- PORT_START("P1")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Back")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Select")
- PORT_DIPNAME( 0x0004, 0x0004, "P1" )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "P2" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P3")
- PORT_DIPNAME( 0x0001, 0x0001, "P3" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( pvmil ) // hold "console start" + "console select" on boot for test mode
- PORT_START("P1")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("Player 1 A")
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("Player 1 B")
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Player 1 C")
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Player 1 D")
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Player 2 A")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Player 2 B")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Player 2 C")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("Player 2 D")
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_NAME("Player 3 A")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_NAME("Player 3 B")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) PORT_NAME("Player 3 C")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(3) PORT_NAME("Player 3 D")
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("Player 1 Lifeline")
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START ) PORT_CODE(KEYCODE_1) PORT_NAME("Console Start")
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CODE(KEYCODE_5) PORT_NAME("Console Select")
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("P3")
- PORT_BIT( 0x0003, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(pvmil_state, pvmil_p4buttons_r) // Player 4 buttons read through here
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("Player 2 Lifeline")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(3) PORT_NAME("Player 3 Lifeline")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(4) PORT_NAME("Player 4 Lifeline")
- PORT_BIT( 0xff80, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("EXTRA")
- PORT_BIT( 0x0fff, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_NAME("Player 4 A")
- PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_NAME("Player 4 B")
- PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) PORT_NAME("Player 4 C")
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(4) PORT_NAME("Player 4 D")
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( taikeegr )
- PORT_START("P1")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Strum Bar Down")
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Strum Bar Up")
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Whamming Bar")
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Yellow")
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Green")
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Red")
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Blue")
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Pink")
- PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNKNOWN )
-
- PORT_START("P2")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
-INPUT_PORTS_END
-
-
-static INPUT_PORTS_START( sentx6p )
- PORT_START("P1")
- PORT_DIPNAME( 0x0001, 0x0001, "Port 1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- // is this really just the battery sensor, or does it have some other meaning, like data ready?
- PORT_DIPNAME( 0x8000, 0x0000, "Low Battery" )
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( On ) )
-
- PORT_START("P2")
- // these must be sense lines
- PORT_DIPNAME( 0x0001, 0x0001, "Player 1 Connected" )
- PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
- PORT_DIPSETTING( 0x0001, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x0002, 0x0002, "Player 2 Connected" )
- PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x0004, 0x0004, "Player 3 Connected" )
- PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x0008, 0x0008, "Player 4 Connected" )
- PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x0010, 0x0010, "Player 5 Connected" )
- PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Yes ) )
- PORT_DIPNAME( 0x0020, 0x0020, "Player 6 Connected" )
- PORT_DIPSETTING( 0x0000, DEF_STR( No ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Yes ) )
-
- PORT_DIPNAME( 0x0040, 0x0040, "Port 2" )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P3")
- PORT_DIPNAME( 0x0001, 0x0001, "Port 3" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CODE(KEYCODE_5) PORT_NAME("Console Select") // the Console buttons also work for Player 1
- PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CODE(KEYCODE_1) PORT_NAME("Console Ok")
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- // these are presuambly read through the UART as the LCD screens are driven by it, currently not hooked up
- // using PORT_CHANGED_MEMBER because we assume the controller latches them for sending as inputs are only read every few frames
- PORT_START("CTRL1")
- PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 0)
- PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 0)
-
- PORT_START("CTRL2")
- PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 1)
- PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 1)
-
- PORT_START("CTRL3")
- PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 2)
- PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 2)
-
- PORT_START("CTRL4")
- PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 3)
- PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 3)
-
- PORT_START("CTRL5")
- PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(5) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 4)
- PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(5) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 4)
-
- PORT_START("CTRL6")
- PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(6) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,select_latch, 5)
- PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(6) PORT_CHANGED_MEMBER(DEVICE_SELF, sentx6p_state,ok_latch, 5)
-
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( telestory ) // there is a hidden test mode, if you return rand() on this port you get it, TODO: figure out button combination
- PORT_START("P1") // I/O test also lists 'Headphone 1' but it isn't mapped to any of these ports?
- PORT_DIPNAME( 0x0001, 0x0001, "Port 1" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Pause / Menu")
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Read To Me")
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Red / Triangle")
- PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Blue / Square")
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Yellow / Star")
- PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green / Circle")
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Right Arrow / Next Page") // Test mode calls this Right Arrow / LED (so probalby LED output too)
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) // port changes on these bits advance the word in manual mode (scroll wheel)
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) // port changes on these bits advance the word in manual mode (scroll wheel)
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Left Arrow / Previous Page")
-
-
- PORT_START("P2")
- PORT_DIPNAME( 0x0001, 0x0001, "Port 2" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-
- PORT_START("P3")
- PORT_DIPNAME( 0x0001, 0x0001, "Port 3" )
- PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-INPUT_PORTS_END
-
-static INPUT_PORTS_START( pdc100 )
- PORT_START("P1")
- PORT_BIT( 0x00ff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Left Trigger")
- PORT_BIT( 0x0e00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Right Trigger")
- PORT_BIT( 0xe000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P2")
- PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
- PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
- PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
- PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 )
- PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Pause")
- PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
- PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-
- PORT_START("P3")
- PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-INPUT_PORTS_END
-
-READ16_MEMBER(dreamlif_state::portb_r)
-{
- uint16_t ret = 0x0000;
- logerror("%s: portb_r\n", machine().describe_context());
- ret |= m_eeprom->do_read() << 3;
- return ret;
-}
-
-WRITE16_MEMBER(dreamlif_state::portb_w)
-{
- logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
- m_eeprom->di_write(BIT(data, 2));
- m_eeprom->cs_write(BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
- m_eeprom->clk_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE);
-}
-
-
-
-READ16_MEMBER(icanguit_state::porta_r)
-{
- logerror("%s: porta_r\n", machine().describe_context());
- return m_inlatch_a;
-}
-
-
-READ16_MEMBER(icanguit_state::portc_r)
-{
- logerror("%s: portc_r\n", machine().describe_context());
- return m_inlatch_c;
-}
-
-
-WRITE16_MEMBER(icanguit_state::portc_w)
-{
- logerror("%s: portc_w (%04x)\n", machine().describe_context(), data);
-}
-
-
-READ16_MEMBER(icanguit_state::portb_r)
-{
- logerror("%s: portb_r\n", machine().describe_context());
- return m_io_p2->read();
-}
-
-WRITE16_MEMBER(icanguit_state::portb_w)
-{
- logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
-}
-
-WRITE16_MEMBER(icanguit_state::porta_w)
-{
- //logerror("%s: porta_w (%04x)\n", machine().describe_context(), data);
-
- if (data == 0x0000)
- {
- m_inlatch_a = m_inlatch_c = 0x0000;
- }
- else if (data == 0x0400)
- {
- m_inlatch_a = m_porta_in[5]->read();
- m_inlatch_c = m_portc_in[5]->read();
- }
- else if (data == 0x0800)
- {
- m_inlatch_a = m_porta_in[4]->read();
- m_inlatch_c = m_portc_in[4]->read();
- }
- else if (data == 0x1000)
- {
- m_inlatch_a = m_porta_in[3]->read();
- m_inlatch_c = m_portc_in[3]->read();
- }
- else if (data == 0x2000)
- {
- m_inlatch_a = m_porta_in[2]->read();
- m_inlatch_c = m_portc_in[2]->read();
- }
- else if (data == 0x4000)
- {
- m_inlatch_a = m_porta_in[1]->read();
- m_inlatch_c = m_portc_in[1]->read();
- }
- else if (data == 0x8000)
- {
- m_inlatch_a = m_porta_in[0]->read();
- m_inlatch_c = m_portc_in[0]->read();
- }
- else
- {
- logerror("%s: unknown porta_w (%04x)\n", machine().describe_context(), data);
- }
-}
-
-// icanpian differences
-
-WRITE16_MEMBER(icanpian_state::porta_w)
-{
- if (data == 0x0000)
- {
- m_inlatch_a = m_inlatch_c = 0x0000;
- }
- else if (data == 0x1000)
- {
- m_inlatch_a = m_porta_in[2]->read();
- m_inlatch_c = m_portc_in[2]->read();
- }
- else if (data == 0x2000)
- {
- m_inlatch_a = m_porta_in[1]->read();
- m_inlatch_c = m_portc_in[1]->read();
- }
- else if (data == 0x4000)
- {
- m_inlatch_a = m_porta_in[0]->read();
- m_inlatch_c = m_portc_in[0]->read();
- }
- else
- {
- logerror("%s: unknown porta_w (%04x)\n", machine().describe_context(), data);
- }
-}
-
-// accesses are made for what appears to be a serial eeprom on port B, very similar to dreamlif, but beyond blanking it at the start it doesn't
-// seem to ever be used, maybe it was never added to hardware, or just never used?
-READ16_MEMBER(icanpian_state::portb_r)
-{
-/*
- uint16_t ret = 0x0000;
- logerror("%s: portbxx_r\n", machine().describe_context());
- ret |= m_eeprom->do_read() ? 0xffff : 0x0000;
- return ret;
-*/
- return 0x0000;
-}
-
-WRITE16_MEMBER(icanpian_state::portb_w)
-{
-/*
- logerror("%s: portbxx_w (%04x)\n", machine().describe_context(), data);
- m_eeprom->di_write(BIT(data, 2));
- m_eeprom->cs_write(BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
- m_eeprom->clk_write(BIT(data, 1) ? ASSERT_LINE : CLEAR_LINE);
-*/
-}
-
-void icanguit_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- // if there's a cart, override the standard banking
- if (m_cart && m_cart->exists())
- {
- std::string region_tag;
- m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
- m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
- m_bank->set_entry(0);
- }
-}
-
-void icanguit_state::machine_reset()
-{
- spg2xx_game_state::machine_reset();
- m_inlatch_a = 0x0000;
- m_inlatch_c = 0x0000;
-}
-
-
-DEVICE_IMAGE_LOAD_MEMBER(icanguit_state::cart_load_icanguit)
-{
- uint32_t size = m_cart->common_get_size("rom");
-
- if (size < 0x800000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
- return image_init_result::FAIL;
- }
-
- m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
- m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
-
- return image_init_result::PASS;
-}
-
-void tvgogo_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- // if there's a cart, override the standard banking
- if (m_cart && m_cart->exists())
- {
- std::string region_tag;
- m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
- m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
- m_bank->set_entry(0);
- }
-}
-
-void tvgogo_state::machine_reset()
-{
- spg2xx_game_state::machine_reset();
-}
-
-
-DEVICE_IMAGE_LOAD_MEMBER(tvgogo_state::cart_load_tvgogo)
-{
- uint32_t size = m_cart->common_get_size("rom");
-
- if (size > 0x800000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
- return image_init_result::FAIL;
- }
-
- m_cart->rom_alloc(0x800000, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
- m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
-
- return image_init_result::PASS;
-}
-
-
-
-void vii_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- // if there's a cart, override the standard banking
- if (m_cart && m_cart->exists())
- {
- std::string region_tag;
- m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
- m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
- m_bank->set_entry(0);
- }
-
- m_ctrl_poll_timer = timer_alloc(TIMER_CTRL_POLL);
- m_ctrl_poll_timer->adjust(attotime::never);
-
- save_item(NAME(m_controller_input));
-}
-
-void vii_state::machine_reset()
-{
- spg2xx_game_state::machine_reset();
-
- m_controller_input[0] = 0;
- m_controller_input[4] = 0;
- m_controller_input[6] = 0xff;
- m_controller_input[7] = 0;
-
- m_ctrl_poll_timer->adjust(attotime::from_hz(60), 0, attotime::from_hz(60));
-}
-
-void spg2xx_game_state::machine_start()
-{
- if (m_bank)
- {
- m_bank->configure_entries(0, (memregion("maincpu")->bytes() + 0x7fffff) / 0x800000, memregion("maincpu")->base(), 0x800000);
- m_bank->set_entry(0);
- }
-
- save_item(NAME(m_current_bank));
- save_item(NAME(m_walle_portc_data));
-}
-
-void spg2xx_game_state::machine_reset()
-{
- m_current_bank = -1;
- switch_bank(0);
- m_maincpu->reset();
-}
-
-void spg2xx_pdc100_game_state::machine_reset()
-{
- m_current_bank = -1;
- switch_bank(7); // must boot from upper bank
- m_maincpu->reset();
-}
-
-WRITE16_MEMBER(spg2xx_pdc100_game_state::porta_w)
-{
- //logerror("%s: porta_w %04x\n", machine().describe_context(), data);
-
- // simply writes 0000 at times during bootup while initializing stuff, which causes an invalid bankswitch mid-code execution
- if (data & 0xff00)
- switch_bank(data & 0x0007);
-}
-
-WRITE16_MEMBER(spg2xx_lexiseal_game_state::portb_w)
-{
- //logerror("%s: portb_w %04x\n", machine().describe_context(), data);
-
- // only 2 banks
- if (data == 0x5f)
- switch_bank(0);
- else if (data == 0xdf)
- switch_bank(1);
-}
-
-
-
-void wireless60_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- save_item(NAME(m_w60_controller_input));
- save_item(NAME(m_w60_porta_data));
-
- m_w60_p1_ctrl_mask = 0x0400;
- m_w60_p2_ctrl_mask = 0x0800;
-}
-
-void zon32bit_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-}
-
-void zone40_state::machine_start()
-{
- wireless60_state::machine_start();
-
- save_item(NAME(m_z40_rombase));
-
- m_z40_rombase = 0xe0;
- m_w60_p1_ctrl_mask = 0x0400;
- m_w60_p2_ctrl_mask = 0x1000;
-}
-
-void wireless60_state::machine_reset()
-{
- spg2xx_game_state::machine_reset();
- m_w60_controller_input = -1;
- m_w60_porta_data = 0;
-}
-
-void zon32bit_state::machine_reset()
-{
- spg2xx_game_state::machine_reset();
-
- m_porta_dat = 0x0000;
- m_portb_dat = 0x0000;
-
- m_hackbank = 0;
-}
-
-void zone40_state::machine_reset()
-{
- wireless60_state::machine_reset();
- m_z40_rombase = 0xe0;
- m_maincpu->invalidate_cache();
- m_maincpu->reset();
-}
-
-
-void vii_state::poll_controls()
-{
- int32_t x = m_io_motionx ? ((int32_t)m_io_motionx->read() - 0x200) : 0;
- int32_t y = m_io_motiony ? ((int32_t)m_io_motiony->read() - 0x200) : 0;
- int32_t z = m_io_motionz ? ((int32_t)m_io_motionz->read() - 0x200) : 0;
-
- uint8_t old_input[8];
- memcpy(old_input, m_controller_input, 8);
-
- m_controller_input[0] = m_io_p1->read();
- m_controller_input[1] = (uint8_t)x;
- m_controller_input[2] = (uint8_t)y;
- m_controller_input[3] = (uint8_t)z;
- m_controller_input[4] = 0;
- x = (x >> 8) & 3;
- y = (y >> 8) & 3;
- z = (z >> 8) & 3;
- m_controller_input[5] = (z << 4) | (y << 2) | x;
- m_controller_input[6] = 0xff;
- m_controller_input[7] = 0;
-
- if (memcmp(old_input, m_controller_input, 8))
- {
- for(int i = 0; i < 8; i++)
- m_maincpu->uart_rx(m_controller_input[i]);
- }
-}
-
-DEVICE_IMAGE_LOAD_MEMBER(vii_state::cart_load_vii)
-{
- uint32_t size = m_cart->common_get_size("rom");
-
- if (size < 0x800000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
- return image_init_result::FAIL;
- }
-
- m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
- m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
-
- return image_init_result::PASS;
-}
-
-void spg2xx_game_state::spg2xx_base(machine_config &config)
-{
- SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
- m_screen->set_refresh_hz(60);
- m_screen->set_size(320, 262);
- m_screen->set_visarea(0, 320-1, 0, 240-1);
- m_screen->set_screen_update("maincpu", FUNC(spg2xx_device::screen_update));
- m_screen->screen_vblank().set(m_maincpu, FUNC(spg2xx_device::vblank));
-
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
- m_maincpu->add_route(ALL_OUTPUTS, "lspeaker", 0.5);
- m_maincpu->add_route(ALL_OUTPUTS, "rspeaker", 0.5);
-}
-
-void spg2xx_game_state::non_spg_base(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
-
- spg2xx_base(config);
-}
-
-void vii_state::vii(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &vii_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->portb_out().set(FUNC(vii_state::vii_portb_w));
- m_maincpu->i2c_w().set(FUNC(vii_state::i2c_w));
- m_maincpu->i2c_r().set(FUNC(vii_state::i2c_r));
-
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "vii_cart");
- m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_device_load(FUNC(vii_state::cart_load_vii));
-
- SOFTWARE_LIST(config, "vii_cart").set_original("vii");
-}
-
-void icanguit_state::icanguit(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &icanguit_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set(FUNC(icanguit_state::porta_r));
- m_maincpu->porta_out().set(FUNC(icanguit_state::porta_w));
- m_maincpu->portb_in().set(FUNC(icanguit_state::portb_r));
- m_maincpu->portb_out().set(FUNC(icanguit_state::portb_w));
- m_maincpu->portc_in().set(FUNC(icanguit_state::portc_r));
- m_maincpu->portc_out().set(FUNC(icanguit_state::portc_w));
-
-
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "icanguit_cart");
- m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_device_load(FUNC(icanguit_state::cart_load_icanguit));
- m_cart->set_must_be_loaded(true);
-
- SOFTWARE_LIST(config, "icanguit_cart").set_original("icanguit");
-}
-
-void icanpian_state::icanpian(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &icanpian_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set(FUNC(icanpian_state::porta_r));
- m_maincpu->porta_out().set(FUNC(icanpian_state::porta_w));
- m_maincpu->portb_in().set(FUNC(icanpian_state::portb_r));
- m_maincpu->portb_out().set(FUNC(icanpian_state::portb_w));
- m_maincpu->portc_in().set(FUNC(icanpian_state::portc_r));
- m_maincpu->portc_out().set(FUNC(icanpian_state::portc_w));
-
-// EEPROM_93C66_16BIT(config, m_eeprom); // unknown part
-// m_eeprom->erase_time(attotime::from_usec(1));
-// m_eeprom->write_time(attotime::from_usec(1));
-
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "icanpian_cart");
- m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_device_load(FUNC(icanpian_state::cart_load_icanguit));
- m_cart->set_must_be_loaded(true);
-
- SOFTWARE_LIST(config, "icanpian_cart").set_original("icanpian");
-}
-
-
-READ16_MEMBER(telestory_state::porta_r)
-{
- uint16_t data = m_io_p1->read();
- //logerror("%s: porta_r: %04x\n", machine().describe_context(), data);
- return data;
-}
-
-WRITE16_MEMBER(telestory_state::porta_w)
-{
- /*
- not used as an output very often
-
- ':maincpu' (0145D5): porta_w (0000)
- ':maincpu' (0145DC): porta_w (0000)
- ':maincpu' (0145F4): porta_w (0000)
- ':maincpu' (0145F4): porta_w (6000)
- */
- logerror("%s: porta_w (%04x)\n", machine().describe_context(), data);
-}
-
-READ16_MEMBER(telestory_state::portb_r)
-{
- // not used?
- uint16_t data = m_io_p2->read();
- logerror("%s: portb_r %04x\n", machine().describe_context(), data);
- return data;
-}
-
-WRITE16_MEMBER(telestory_state::portb_w)
-{
- // not used?
- logerror("%s: portb_w (%04x)\n", machine().describe_context(), data);
-}
-
-// What is here? accessed using serial protocol with clocked bits
-READ16_MEMBER(telestory_state::portc_r)
-{
- //logerror("%s: portc_r\n", machine().describe_context());
- return machine().rand() & 0x0c00; // bits need to change state or it doesn't boot
-}
-
-WRITE16_MEMBER(telestory_state::portc_w)
-{
- //logerror("%s: portc_w (%04x)\n", machine().describe_context(), data);
-}
-
-
-
-void telestory_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- // if there's a cart, override the standard banking
- if (m_cart && m_cart->exists())
- {
- std::string region_tag;
- m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
- m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
- m_bank->set_entry(0);
- }
-}
-
-void telestory_state::machine_reset()
-{
- spg2xx_game_state::machine_reset();
-}
-
-DEVICE_IMAGE_LOAD_MEMBER(telestory_state::cart_load_telestory)
-{
- uint32_t size = m_cart->common_get_size("rom");
-
- if (size > 0x800000)
- {
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
- return image_init_result::FAIL;
- }
-
- m_cart->rom_alloc(0x800000, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE);
- m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
-
- return image_init_result::PASS;
-}
-
-void telestory_state::telestory(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &telestory_state::mem_map_4m_tsram);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set(FUNC(telestory_state::porta_r));
- m_maincpu->porta_out().set(FUNC(telestory_state::porta_w));
- m_maincpu->portb_in().set(FUNC(telestory_state::portb_r));
- m_maincpu->portb_out().set(FUNC(telestory_state::portb_w));
- m_maincpu->portc_in().set(FUNC(telestory_state::portc_r));
- m_maincpu->portc_out().set(FUNC(telestory_state::portc_w));
-
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "telestory_cart");
- m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_device_load(FUNC(telestory_state::cart_load_telestory));
- m_cart->set_must_be_loaded(true);
-
- SOFTWARE_LIST(config, "telestory_cart").set_original("telestory_cart");
-}
-
-
-
-WRITE8_MEMBER(tvgogo_state::tvg_i2c_w)
-{
- // unsure what is mapped here (Camera?) but it expects to be able to read back the same byte it writes before it boots.
- m_i2cunk = data;
- logerror("%s: tvg_i2c_w %04x %02x\n", machine().describe_context(), offset, data);
-}
-
-READ8_MEMBER(tvgogo_state::tvg_i2c_r)
-{
- uint8_t ret = m_i2cunk;
- logerror("%s: tvg_i2c_r %04x %02x\n", machine().describe_context(), offset, ret);
- return ret;
-}
-
-
-void tvgogo_state::tvgogo(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &tvgogo_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set_ioport("P2");
- m_maincpu->portc_in().set_ioport("P3");
-
- GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tvgogo_cart");
- m_cart->set_width(GENERIC_ROM16_WIDTH);
- m_cart->set_device_load(FUNC(tvgogo_state::cart_load_tvgogo));
- m_cart->set_must_be_loaded(true);
-
- m_maincpu->i2c_w().set(FUNC(tvgogo_state::tvg_i2c_w));
- m_maincpu->i2c_r().set(FUNC(tvgogo_state::tvg_i2c_r));
-
- SOFTWARE_LIST(config, "tvgogo_cart").set_original("tvgogo");
-}
-
-
-void wireless60_state::wireless60(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &wireless60_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_out().set(FUNC(wireless60_state::wireless60_porta_w));
- m_maincpu->portb_out().set(FUNC(wireless60_state::wireless60_portb_w));
- m_maincpu->porta_in().set(FUNC(wireless60_state::wireless60_porta_r));
-}
-
-void zon32bit_state::zon32bit(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &zon32bit_state::mem_map_zon32bit);
- m_maincpu->set_force_no_drc(true); // uses JVS opcode, not implemented in recompiler
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set(FUNC(zon32bit_state::porta_r));
- m_maincpu->portb_in().set(FUNC(zon32bit_state::portb_r));
- m_maincpu->portc_in().set(FUNC(zon32bit_state::portc_r));
-
- m_maincpu->porta_out().set(FUNC(zon32bit_state::porta_w));
- m_maincpu->portb_out().set(FUNC(zon32bit_state::portb_w));
- m_maincpu->portc_out().set(FUNC(zon32bit_state::portc_w));
-
-
-}
-
-void zone40_state::zone40(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &zone40_state::mem_map_z40);
-
- spg2xx_base(config);
-
- m_maincpu->porta_out().set(FUNC(zone40_state::zone40_porta_w));
- m_maincpu->porta_in().set(FUNC(zone40_state::zone40_porta_r));
-}
-
-
-void spg2xx_game_state::jakks(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set(FUNC(spg2xx_game_state::jakks_porta_r));
- m_maincpu->porta_out().set(FUNC(spg2xx_game_state::jakks_porta_w));
- m_maincpu->portb_out().set(FUNC(spg2xx_game_state::jakks_portb_w));
-}
-
-void spg2xx_game_state::jakks_i2c(machine_config &config)
-{
- jakks(config);
- I2CMEM(config, m_i2cmem, 0).set_data_size(0x200);
-}
-
-void jakks_gkr_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- // if there's a cart, override the standard banking
- if (m_cart && m_cart->exists())
- {
- std::string region_tag;
- m_cart_region = memregion(region_tag.assign(m_cart->tag()).append(JAKKSSLOT_ROM_REGION_TAG).c_str());
- m_bank->configure_entries(0, (m_cart_region->bytes() + 0x7fffff) / 0x800000, m_cart_region->base(), 0x800000);
- m_bank->set_entry(0);
- }
-}
-
-DEVICE_IMAGE_LOAD_MEMBER(jakks_gkr_state::cart_load_gamekey)
-{
- return m_cart->call_load();
-}
-
-void jakks_gkr_state::jakks_gkr(machine_config &config)
-{
- jakks(config);
-
- m_maincpu->porta_in().set(FUNC(jakks_gkr_state::jakks_porta_key_io_r));
- m_maincpu->porta_out().set(FUNC(jakks_gkr_state::jakks_porta_key_io_w));
- m_maincpu->portc_in().set_ioport("P3");
- m_maincpu->portc_out().set(FUNC(jakks_gkr_state::gkr_portc_w));
-
- m_maincpu->set_rowscroll_offset(0);
-
- JAKKS_GAMEKEY_SLOT(config, m_cart, 0, jakks_gamekey, nullptr);
-}
-
-void jakks_gkr_state::jakks_gkr_i2c(machine_config &config)
-{
- jakks_gkr(config);
- I2CMEM(config, m_i2cmem, 0).set_data_size(0x200);
-}
-
-
-void jakks_gkr_state::jakks_gkr_1m_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
-}
-
-void jakks_gkr_state::jakks_gkr_2m_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_2m);
-}
-
-void jakks_gkr_state::jakks_gkr_nk(machine_config &config)
-{
- jakks_gkr(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- SOFTWARE_LIST(config, "jakks_gamekey_nk").set_original("jakks_gamekey_nk");
-}
-
-void jakks_gkr_state::jakks_gkr_nk_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- SOFTWARE_LIST(config, "jakks_gamekey_nk").set_original("jakks_gamekey_nk");
-}
-
-void jakks_gkr_state::jakks_gkr_dy(machine_config &config)
-{
- jakks_gkr(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- SOFTWARE_LIST(config, "jakks_gamekey_dy").set_original("jakks_gamekey_dy");
-}
-
-void jakks_gkr_state::jakks_gkr_dy_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- SOFTWARE_LIST(config, "jakks_gamekey_dy").set_original("jakks_gamekey_dy");
-}
-
-void jakks_gkr_state::jakks_gkr_mv_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- SOFTWARE_LIST(config, "jakks_gamekey_mv").set_original("jakks_gamekey_mv");
-}
-
-
-void jakks_gkr_state::jakks_gkr_dp_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- SOFTWARE_LIST(config, "jakks_gamekey_dp").set_original("jakks_gamekey_dp");
-}
-
-void jakks_gkr_state::jakks_gkr_sw_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- m_maincpu->adc_in<0>().set_ioport("JOYX");
- m_maincpu->adc_in<1>().set_ioport("JOYY");
- SOFTWARE_LIST(config, "jakks_gamekey_sw").set_original("jakks_gamekey_sw");
-}
-
-void jakks_gkr_state::jakks_gkr_wp(machine_config &config)
-{
- jakks_gkr(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- m_maincpu->adc_in<0>().set_ioport("JOYX");
- m_maincpu->adc_in<1>().set_ioport("JOYY");
- //SOFTWARE_LIST(config, "jakks_gamekey_wp").set_original("jakks_gamekey_wp"); // NO KEYS RELEASED
-}
-
-void jakks_gkr_state::jakks_gkr_cb(machine_config &config)
-{
- jakks_gkr(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- m_maincpu->adc_in<0>().set_ioport("JOYX");
- m_maincpu->adc_in<1>().set_ioport("JOYY");
- //SOFTWARE_LIST(config, "jakks_gamekey_cb").set_original("jakks_gamekey_cb"); // NO KEYS RELEASED
-}
-
-void jakks_gkr_state::jakks_gkr_nm_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- m_maincpu->adc_in<0>().set_ioport("DIALX");
- SOFTWARE_LIST(config, "jakks_gamekey_nm").set_original("jakks_gamekey_nm");
-}
-
-void jakks_gkr_state::jakks_gkr_cc_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- // shows 'E0' in gamekey test menu on real HW (maybe related to value key needs to return if one existed)
- //SOFTWARE_LIST(config, "jakks_gamekey_cc").set_original("jakks_gamekey_cc"); // no game keys were released
-}
-
-void jakks_gkr_state::jakks_gkr_wf_i2c(machine_config &config)
-{
- jakks_gkr_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
- //m_maincpu->adc_in<0>().set_ioport("DIALX"); // wheel does not seem to map here
- //m_maincpu->adc_in<1>().set_ioport("DIALY");
- //SOFTWARE_LIST(config, "jakks_gamekey_wf").set_original("jakks_gamekey_wf"); // no game keys were released
-}
-
-
-void spg2xx_game_state::lexizeus(machine_config &config)
-{
- non_spg_base(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set_ioport("P2");
- m_maincpu->portc_in().set_ioport("P3");
-}
-
-void spg2xx_game_state::walle(machine_config &config)
-{
- jakks_i2c(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_2m);
- m_maincpu->portc_in().set_ioport("P3");
- m_maincpu->portc_out().set(FUNC(spg2xx_game_state::walle_portc_w));
-}
-
-void spg2xx_game_state::rad_skat(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set_ioport("P2");
- m_maincpu->portc_in().set_ioport("P3");
- m_maincpu->i2c_w().set(FUNC(spg2xx_game_state::i2c_w));
- m_maincpu->i2c_r().set(FUNC(spg2xx_game_state::i2c_r));
-}
-
-void dreamlif_state::dreamlif(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &dreamlif_state::mem_map_4m);
-
- spg2xx_base(config);
-
- EEPROM_93C66_16BIT(config, m_eeprom); // HT93LC66A
-
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set(FUNC(dreamlif_state::portb_r));
- m_maincpu->portb_out().set(FUNC(dreamlif_state::portb_w));
-
-}
-
-void spg2xx_game_state::rad_skatp(machine_config &config)
-{
- rad_skat(config);
- m_maincpu->set_pal(true);
- m_screen->set_refresh_hz(50);
-// m_screen->set_size(320, 312);
-}
-
-void spg2xx_game_state::rad_sktv(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set(FUNC(spg2xx_game_state::rad_porta_r));
- m_maincpu->portb_in().set(FUNC(spg2xx_game_state::rad_portb_r));
- m_maincpu->portc_in().set(FUNC(spg2xx_game_state::rad_portc_r));
- m_maincpu->i2c_w().set(FUNC(spg2xx_game_state::i2c_w));
- m_maincpu->i2c_r().set(FUNC(spg2xx_game_state::i2c_r));
-}
-
-void spg2xx_game_state::rad_crik(machine_config &config)
-{
- SPG28X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set_ioport("P2");
- m_maincpu->portc_in().set_ioport("P3");
- m_maincpu->i2c_w().set(FUNC(spg2xx_game_state::i2c_w));
- m_maincpu->i2c_r().set(FUNC(spg2xx_game_state::i2c_r));
-}
-
-void pvmil_state::pvmil(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &pvmil_state::mem_map_4m);
- m_maincpu->set_pal(true);
-
- spg2xx_base(config);
-
- m_screen->set_refresh_hz(50);
- //m_screen->set_size(320, 312);
-
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set_ioport("P2");
- m_maincpu->portc_in().set_ioport("P3");
- m_maincpu->porta_out().set(FUNC(pvmil_state::pvmil_porta_w));
- m_maincpu->portb_out().set(FUNC(pvmil_state::pvmil_portb_w));
- m_maincpu->portc_out().set(FUNC(pvmil_state::pvmil_portc_w));
-
- config.set_default_layout(layout_pvmil);
-}
-
-void spg2xx_game_state::taikeegr(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m);
- m_maincpu->set_pal(true);
-
- spg2xx_base(config);
-
- m_screen->set_refresh_hz(50);
-// m_screen->set_size(320, 312);
-
- m_maincpu->porta_in().set_ioport("P1");
-// m_maincpu->portb_in().set_ioport("P2");
-// m_maincpu->portc_in().set_ioport("P3");
-}
-
-
-void spg2xx_pdc100_game_state::pdc100(machine_config &config)
-{
- non_spg_base(config);
- m_maincpu->porta_out().set(FUNC(spg2xx_pdc100_game_state::porta_w));
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set_ioport("P2");
- m_maincpu->portc_in().set_ioport("P3"); // not used?
-}
-
-void spg2xx_lexiseal_game_state::lexiseal(machine_config &config)
-{
- non_spg_base(config);
- m_maincpu->portb_out().set(FUNC(spg2xx_lexiseal_game_state::portb_w));
- m_maincpu->porta_in().set_ioport("P1");
- m_maincpu->portb_in().set_ioport("P2");
- m_maincpu->portc_in().set_ioport("P3");
-}
-
-
-// Shredmaster Jr uses the same input order as the regular Taikee Guitar, but reads all inputs through a single multplexed bit
-WRITE16_MEMBER(shredmjr_game_state::porta_w)
-{
- if (data != m_porta_data)
- {
- if ((data & 0x0800) != (m_porta_data & 0x0800))
- {
- if (data & 0x0800)
- {
- //logerror("0x0800 low -> high\n");
- }
- else
- {
- //logerror("0x0800 high -> low\n");
- }
- }
-
- if ((data & 0x0200) != (m_porta_data & 0x0200))
- {
- if (data & 0x0200)
- {
- //logerror("0x0200 low -> high\n");
- m_shiftamount++;
- }
- else
- {
- //logerror("0x0200 high -> low\n");
- }
- }
-
- if ((data & 0x0100) != (m_porta_data & 0x0100))
- {
- if (data & 0x0100)
- {
- //logerror("0x0100 low -> high\n");
- m_shiftamount = 0;
- }
- else
- {
- //logerror("0x0100 high -> low\n");
- }
- }
- }
-
- m_porta_data = data;
-}
-
-READ16_MEMBER(shredmjr_game_state::porta_r)
-{
- //logerror("porta_r with shift amount %d \n", m_shiftamount);
- uint16_t ret = 0x0000;
-
- uint16_t portdata = m_io_p1->read();
-
- portdata = (portdata >> m_shiftamount) & 0x1;
-
- if (portdata)
- ret |= 0x0400;
-
- return ret;
-}
-
-void shredmjr_game_state::shredmjr(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &shredmjr_game_state::mem_map_4m);
-
- spg2xx_base(config);
-
- m_maincpu->porta_in().set(FUNC(shredmjr_game_state::porta_r));
- m_maincpu->porta_out().set(FUNC(shredmjr_game_state::porta_w));
-}
-
-
-void sentx6p_state::machine_start()
-{
- spg2xx_game_state::machine_start();
-
- m_suite1.resolve();
- m_suite2.resolve();
- m_number1.resolve();
- m_number2.resolve();
-
- m_select_fold.resolve();
- m_select_check.resolve();
- m_select_bet.resolve();
- m_select_call.resolve();
- m_select_raise.resolve();
- m_select_allin.resolve();
-
- m_option_fold.resolve();
- m_option_check.resolve();
- m_option_bet.resolve();
- m_option_call.resolve();
- m_option_raise.resolve();
- m_option_allin.resolve();
-
- m_led.resolve();
-}
-
-void sentx6p_state::machine_reset()
-{
- spg2xx_game_state::machine_reset();
-
- for (int i = 0; i < 6; i++)
- {
- m_lcd_card1[i] = 0x00;
- m_lcd_card2[i] = 0x00;
- m_lcd_options[i] = 0x00;
- m_lcd_options_select[i] = 0x00;
- m_lcd_led[i] = 0x00;
-
- m_inputlatches[i] = 0x00;
- }
-
- /* HACK: this address needs to contain '1' so that it thinks the first controller
- is present, otherwise it hangs on boot. How does this get set?
- following addresses are for the other controllers, and get set based on Port B
- status flags */
- address_space &mem = m_maincpu->space(AS_PROGRAM);
- mem.write_word(0x1e08,0x0001);
-}
-
-void sentx6p_state::controller_send_data(int which)
-{
- // 0x78 have to be set, this is probably because there is an unused space in the commands
- // going the other way at 0x78 - 0x7f
- // bit 3 (0x04) can also be set, doesn't care
-
- uint8_t send = m_inputlatches[which] | 0x78;
-
- m_maincpu->uart_rx( send );
-
- if (m_inputlatches[which] & 0x03)
- {
- m_inputlatches[which] = 0x00;
- logerror("clearing input latches for player %d\n", which + 1);
- }
-}
-
-READ16_MEMBER(sentx6p_state::sentx_porta_r)
-{
- int select_bits = (m_porta_data >> 8) & 0x3f;
- logerror("%s: sentx_porta_r (with controller select bits %02x)\n", machine().describe_context(), select_bits);
-
- /* 0000 = no controller? (system buttons only?)
- 0100 = controller 1?
- 0200 = controller 2?
- 0400 = controller 3?
- 0800 = controller 4?
- 1000 = controller 5?
- 2000 = controller 6?
-
- this is an assumption based on startup, where the port is polled after writing those values
- */
-
- // the code around 029811 uses a ram value shifted left 8 times as the select bits (select_bits) on write
- // then does a mask with them on the reads from this port, without shifting, comparing with 0
-
- // the 'select bits' must also be active when the controller wants to send data, the UART read function
- // won't proceed if they're zero, but the port is written with 0 before that
-
- //logerror("%08x\n", m_maincpu->pc());
-
- // regular logic for writing to the LCDs
- uint16_t ret = (m_io_p1->read() & 0xffc0) | select_bits;
-
- // hacks needed for reading from the UART to work
-
- // the select bit must be high here to read from the controller?
- if (m_maincpu->pc() == 0x2981e)
- {
- ret ^= 0x3f;
- }
-
- // but must be low again here after writing the select bits in order to not
- // get stuck in a timeout loop
- if (m_maincpu->pc() == 0x29834)
- {
- ret &= ~0x3f;
-
- // presumably the inputs can only be sent once the controller is actually selected, otherwise
- // there would be competing UART sources?
- for (int i = 0; i < 6; i++)
- {
- if (select_bits & (1 << i))
- {
- controller_send_data(i);
- }
- }
- }
-
- return ret;
-}
-
-READ16_MEMBER(sentx6p_state::sentx_portb_r)
-{
- return m_io_p2->read();
-}
-
-READ16_MEMBER(sentx6p_state::sentx_portc_r)
-{
- return m_io_p3->read();
-}
-
-WRITE16_MEMBER(sentx6p_state::sentx_porta_w)
-{
- logerror("%s: sentx_porta_w %04x\n", machine().describe_context(), data);
-
- COMBINE_DATA(&m_porta_data);
-}
-
-WRITE16_MEMBER(sentx6p_state::sentx_portb_w)
-{
- logerror("%s: sentx_portb_w %04x\n", machine().describe_context(), data);
-}
-
-WRITE16_MEMBER(sentx6p_state::sentx_portc_w)
-{
- logerror("%s: sentx_portc_w %04x\n", machine().describe_context(), data);
-}
-
-/*
- Card Table
- (the controller must contain an MCU under the glob to receive thes commands
- and convert them to actual LCD segments)
-
- off 00
- | A diamonds 01 | A hearts 0e | A spades 1b | A clubs 28 |
- | 2 diamonds 02 | 2 hearts 0f | 2 spades 1c | 2 clubs 29 |
- | 3 diamonds 03 | 3 hearts 10 | 3 spades 1d | 3 clubs 2a |
- | 4 diamonds 04 | 4 hearts 11 | 4 spades 1e | 4 clubs 2b |
- | 5 diamonds 05 | 5 hearts 12 | 5 spades 1f | 5 clubs 2c |
- | 6 diamonds 06 | 6 hearts 13 | 6 spades 20 | 6 clubs 2d |
- | 7 diamonds 07 | 7 hearts 14 | 7 spades 21 | 7 clubs 2e |
- | 8 diamonds 08 | 8 hearts 15 | 8 spades 22 | 8 clubs 2f |
- | 9 diamonds 09 | 9 hearts 16 | 9 spades 23 | 9 clubs 30 |
- | 10 diamonds 0a | 10 hearts 17 | 10 spades 24 | 10 clubs 31 |
- | J diamonds 0b | J hearts 18 | J spades 25 | J clubs 32 |
- | Q diamonds 0c | Q hearts 19 | Q spades 26 | Q clubs 33 |
- | K diamonds 0d | K hearts 1a | K spades 27 | K clubs 34 |
-
-*/
-
-void sentx6p_state::set_card1(uint8_t value, int select_bits)
-{
- for (int i = 0; i < 6; i++)
- {
- if (select_bits & (1 << i))
- {
- m_lcd_card1[i] = value;
-
- int val = m_lcd_card1[i];
- if (val == 0)
- {
- m_suite1[i] = 0;
- m_number1[i] = 0;
- }
- else
- {
- int suite = (val-1) / 13;
- int number = (val-1) % 13;
-
- m_suite1[i] = suite+1;
- m_number1[i] = number+1;
- }
- }
- }
-}
-
-void sentx6p_state::set_card2(uint8_t value, int select_bits)
-{
- for (int i = 0; i < 6; i++)
- {
- if (select_bits & (1 << i))
- {
- m_lcd_card2[i] = value;
-
- int val = m_lcd_card2[i];
- if (val == 0)
- {
- m_suite2[i] = 0;
- m_number2[i] = 0;
- }
- else
- {
- int suite = (val-1) / 13;
- int number = (val-1) % 13;
-
- m_suite2[i] = suite+1;
- m_number2[i] = number+1;
- }
- }
- }
-}
-
-void sentx6p_state::set_options(uint8_t value, int select_bits)
-{
- for (int i = 0; i < 6; i++)
- {
- if (select_bits & (1 << i))
- {
- m_lcd_options[i] = value;
-
- // assume same mapping as selector bit below
- m_option_fold[i] = (value & 0x01) ? 1 : 0;
- m_option_check[i] = (value & 0x02) ? 1 : 0;
- m_option_bet[i] = (value & 0x04) ? 1 : 0;
- m_option_call[i] = (value & 0x08) ? 1 : 0;
- m_option_raise[i] = (value & 0x10) ? 1 : 0;
- m_option_allin[i] = (value & 0x20) ? 1 : 0;
- }
- }
-}
-
-/*
- c0 = no selection highlight (00)
- c1 = fold selected (01)
- c2 = check selected (02)
- c4 = bet selected (04)
- c8 = call selected (08)
- d0 = raise selected (10)
- e0 = all in selected (20)
-*/
-
-void sentx6p_state::set_options_select(uint8_t value, int select_bits)
-{
- for (int i = 0; i < 6; i++)
- {
- if (select_bits & (1 << i))
- {
- m_lcd_options_select[i] = value;
-
- m_select_fold[i] = (value & 0x01) ? 1 : 0;
- m_select_check[i] = (value & 0x02) ? 1 : 0;
- m_select_bet[i] = (value & 0x04) ? 1 : 0;
- m_select_call[i] = (value & 0x08) ? 1 : 0;
- m_select_raise[i] = (value & 0x10) ? 1 : 0;
- m_select_allin[i] = (value & 0x20) ? 1 : 0;
- }
- }
-}
-
-
-
-void sentx6p_state::set_controller_led(uint8_t value, int select_bits)
-{
- for (int i = 0; i < 6; i++)
- {
- if (select_bits & (1 << i))
- {
- m_lcd_led[i] = value;
-
- m_led[i] = value ^ 1;
- }
- }
-}
-
-WRITE8_MEMBER(sentx6p_state::sentx_tx_w)
-{
- int select_bits = (m_porta_data >> 8) & 0x3f;
-
- // TX function is at 0x029773
- // starts by writing controller select, then checking if controller is selected, then transmits data
-
- // RX function is at 0x029811
- // similar logic to write controller ID, check if selected, then recieve data
-
- switch (data)
- {
- case 0x00: // card 1 off
- case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: // card 1 show Diamonds A,2,3,4,5,6,7,8,10,J,Q,K
- case 0x0e: case 0x0f: case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: // card 1 show Hearts A,2,3,4,5,6,7,8,10,J,Q,K
- case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: // card 1 show Spades A,2,3,4,5,6,7,8,10,J,Q,K
- case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // card 1 show Clubs A,2,3,4,5,6,7,8,10,J,Q,K
- set_card1(data & 0x3f, select_bits);
- break;
-
- case 0x40: // card 2 off
- case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: // card 1 show Diamonds A,2,3,4,5,6,7,8,10,J,Q,K
- case 0x4e: case 0x4f: case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5a: // card 1 show Hearts A,2,3,4,5,6,7,8,10,J,Q,K
- case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: // card 1 show Spades A,2,3,4,5,6,7,8,10,J,Q,K
- case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f: case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: // card 1 show Clubs A,2,3,4,5,6,7,8,10,J,Q,K
- set_card2(data & 0x3f, select_bits);
- break;
-
- // cases 0x78 - 0x7f are transmissions in the other direction (from controller to main unit, used for sending buttons)
-
- case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: // show selection options
- case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f:
- case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
- case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7: case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
- set_options(data & 0x3f, select_bits);
- break;
-
- case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: // show selection cursor
- case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf:
- case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
- case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff:
- set_options_select(data & 0x3f, select_bits);
- break;
-
- case 0x38:
- case 0x39:
- set_controller_led(data & 0x01, select_bits);
- break;
-
- case 0x3a:
- // reset controller? (the input code also seems to check for 3a in one place coming in the other direction)
- break;
-
- default:
- logerror("unknown LCD command %02x with controller select %02x\n", data, select_bits);
- break;
- }
-
-}
-
-
-
-
-void sentx6p_state::sentx6p(machine_config &config)
-{
- SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
- m_maincpu->set_addrmap(AS_PROGRAM, &sentx6p_state::mem_map_2m_texas);
- m_maincpu->set_pal(true);
-
- spg2xx_base(config);
-
- m_screen->set_refresh_hz(50);
-
- m_maincpu->porta_in().set(FUNC(sentx6p_state::sentx_porta_r));
- m_maincpu->portb_in().set(FUNC(sentx6p_state::sentx_portb_r));
- m_maincpu->portc_in().set(FUNC(sentx6p_state::sentx_portc_r));
-
- m_maincpu->porta_out().set(FUNC(sentx6p_state::sentx_porta_w));
- m_maincpu->portb_out().set(FUNC(sentx6p_state::sentx_portb_w));
- m_maincpu->portc_out().set(FUNC(sentx6p_state::sentx_portc_w));
-
- m_maincpu->uart_tx().set(FUNC(sentx6p_state::sentx_tx_w));
-
- config.set_default_layout(layout_sentx6p);
-}
-
-
-ROM_START( vii )
- ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "vii.bin", 0x0000, 0x2000000, CRC(04627639) SHA1(f883a92d31b53c9a5b0cdb112d07cd793c95fc43))
-ROM_END
-
-ROM_START( jak_batm )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "batman.bin", 0x000000, 0x400000, CRC(46f848e5) SHA1(5875d57bb3fe0cac5d20e626e4f82a0e5f9bb94c) )
-ROM_END
-
-ROM_START( jak_wall )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(bd554cba) SHA1(6cd06a036ab12e7b0e1fd8003db873b0bb783868) )
- // both of these dumps are bad, but in slightly different ways, note the random green pixels around the text (bad data is reported in secret test mode)
- //ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(6bc90b16) SHA1(184d72de059057aae7800da510fcf05ed1da9ec9))
-ROM_END
-
-ROM_START( jak_wwe )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakkswwegkr.bin", 0x000000, 0x200000, CRC(b078a812) SHA1(7d97c0e2171b3fd91b280480c9ffd5651828195a) )
-ROM_END
-
-ROM_START( jak_fan4 )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksffgkr.bin", 0x000000, 0x200000, CRC(8755a1f7) SHA1(7214da15fe61881da27b81575fbdb54cc0f1d6aa) )
-ROM_END
-
-ROM_START( jak_just )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksjlagkr.bin", 0x000000, 0x200000, CRC(182989f0) SHA1(799229c537d6fe629ba9e1e4051d1bb9ca445d44) )
-ROM_END
-
-ROM_START( jak_dora )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksdoragkr.bin", 0x000000, 0x200000, CRC(bcaa132d) SHA1(3894b980fbc4144731b2a7a94acebb29e30de67c) )
-ROM_END
-
-ROM_START( jak_nick )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksnicktoonsgkr.bin", 0x000000, 0x200000, CRC(4dec1656) SHA1(b3002ab15e75068102f4955a3f0c52fb6d5cda56) )
-ROM_END
-
-ROM_START( jak_sbfc )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksspongebobgkr.bin", 0x000000, 0x200000, CRC(9871303c) SHA1(78bc2687e1514094db8bb875e1117df3fcb3d201) )
-ROM_END
-
-ROM_START( jak_dorr )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksdora2gkr.bin", 0x000000, 0x200000, CRC(6c09bcd9) SHA1(4bcad79658832f319d16b4f63257e127f6862d79) )
-ROM_END
-
-
-ROM_START( jak_spdm )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksspidermangkr.bin", 0x000000, 0x200000, CRC(1b2ee700) SHA1(30ea69c489e1238b004f473f972b682e35573138) )
-ROM_END
-
-ROM_START( jak_pooh )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakkspoohgkr.bin", 0x000000, 0x200000, CRC(0d97df55) SHA1(f108621a83c7b2263dd1531d82311627c3a02002) )
-ROM_END
-
-ROM_START( jak_care )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "carebeargkr.bin", 0x000000, 0x200000, CRC(e6096eb7) SHA1(92ee1a6df374f8b355ba2280dc43d764f6f69dfe) )
-ROM_END
-
-ROM_START( jak_wof )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakkswheeloffortunegkr.bin", 0x000000, 0x200000, CRC(6a879620) SHA1(95478764a61741569041c2299528f6464651d593) )
-ROM_END
-
-ROM_START( jak_disn )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "disneygkr.bin", 0x000000, 0x100000, CRC(7a5ebcd7) SHA1(9add8c2a6e3f0409c8957a2ba2d054fd2c4c39c1) )
-ROM_END
-
-ROM_START( jak_disf )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "disneyfriendsgkr.bin", 0x000000, 0x200000, CRC(77bca50b) SHA1(6e0f4fd229ee11eac721b5dbe79cf9002d3dbd64) )
-ROM_END
-
-ROM_START( jak_dpr )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksdisneyprincessgkr.bin", 0x000000, 0x200000, CRC(e26003ce) SHA1(ee15243281df6f09b96185c34582d7091604c954) )
-ROM_END
-
-ROM_START( jak_dprs )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "disneyprincess2gkr.bin", 0x000000, 0x200000, CRC(b670bdde) SHA1(c33ce7ada72a0c44bc881b5792cd33a9f2f0fb08) )
-ROM_END
-
-ROM_START( jak_mpac )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksmspacmangkr.bin", 0x000000, 0x100000, CRC(cab40f77) SHA1(30731acc461150d96aafa7a0451cfb1a25264678) )
-ROM_END
-
-ROM_START( jak_sdoo )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksscoobydoogkr.bin", 0x000000, 0x400000, CRC(61062ce5) SHA1(9d21767fd855385ef83e4209c429ecd4bf7e5384) )
-ROM_END
-
-ROM_START( jak_dbz )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksdragonballzgkr.bin", 0x000000, 0x200000, CRC(d52c3b20) SHA1(fd5ce41c143cad9bca3372054f4ff98b52c33874) )
-ROM_END
-
-ROM_START( jak_sith )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "jakksstarwarsgkr.bin", 0x000000, 0x200000, CRC(932cde19) SHA1(b88b748c235e9eeeda574e4d5b4077ae9da6fbd0) )
-ROM_END
-
-ROM_START( jak_capc )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "capcomgkr.bin", 0x000000, 0x200000, CRC(6d47cce4) SHA1(263926a991d55459aa3cee90049d2202c1e3a70e) )
-ROM_END
-
-ROM_START( lexizeus )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "lexibook1g900us.bin", 0x0000, 0x800000, CRC(c2370806) SHA1(cbb599c29c09b62b6a9951c724cd9fc496309cf9))
-ROM_END
-
-ROM_START( lexiseal )
- ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "lexibook_seal.bin", 0x0000, 0x1000000, CRC(3529f154) SHA1(f5f142600c6b2d037b97e007364ea2fa228e0163) )
-ROM_END
-
-ROM_START( zone40 )
- ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "zone40.bin", 0x0000, 0x4000000, CRC(4ba1444f) SHA1(de83046ab93421486668a247972ad6d3cda19440) )
-ROM_END
-
-ROM_START( zone60 )
- ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "zone60.bin", 0x0000, 0x4000000, CRC(4cb637d1) SHA1(1f97cbdb4299ac0fbafc2a3aa592066cb0727066))
-ROM_END
-
-ROM_START( wirels60 )
- ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "wirels60.bin", 0x0000, 0x4000000, CRC(b4df8b28) SHA1(00e3da542e4bc14baf4724ad436f66d4c0f65c84))
-ROM_END
-
-ROM_START( mywicodx )
- ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
- // the first bank contains the Mi Guitar game, the 2nd half of the ROM is where the Menu starts
- ROM_LOAD16_WORD_SWAP( "mywicodx.u2", 0x0000000, 0x4000000, CRC(ec7c5d2f) SHA1(330fb839c485713f7bec5bf9d2d42841612c5b45))
-ROM_END
-
-// PCB marked 'Zone 100 110728 V2.1'
-ROM_START( lx_jg7415 )
- ROM_REGION( 0x10000000, "maincpu", ROMREGION_ERASE00 )
- // reads of some unused areas were not 100% consistent, but this seems intentional, the game has a ROM twice the size it needs and is wired up in such a way that those bad areas are unused by the game
- // if adding a clone make sure to check if there are actual differences in the used areas
- ROM_LOAD16_WORD_SWAP( "rom.bin", 0x0000, 0x10000000, CRC(59442e00) SHA1(7e91cf6b19c37f9b4fa4dc21e241c6634d6a6f95) )
-ROM_END
-
-ROM_START( zone100 )
- ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "zone100.bin", 0x0000, 0x8000000, CRC(b966a54e) SHA1(e38156ebc4e2f2935b1acbeca33d1866d45c4f65) )
-ROM_END
-
-ROM_START( zon32bit )
- ROM_REGION( 0x2000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "41sports.bin", 0x0000, 0x2000000, CRC(86eee6e0) SHA1(3f6cab6649aebf596de5a8af21658bb1a27edb10) )
-ROM_END
-
-ROM_START( rad_skat )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "skateboarder.bin", 0x000000, 0x400000, CRC(08b9ab91) SHA1(6665edc4740804956136c68065890925a144626b) )
-ROM_END
-
-ROM_START( rad_skatp ) // rom was dumped from the NTSC version, but region comes from an io port, so ROM is probably the same
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "skateboarder.bin", 0x000000, 0x400000, CRC(08b9ab91) SHA1(6665edc4740804956136c68065890925a144626b) )
-ROM_END
-
-ROM_START( rad_sktv )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "skannerztv.bin", 0x000000, 0x200000, CRC(e92278e3) SHA1(eb6bee5e661128d83784960dfff50379c36bfaeb) )
-
- /* The external scanner MCU is a Winbond from 2000: SA5641
- the scanner plays sound effects when scanning, without being connected to the main unit, so a way to dump / emulate
- this MCU is also needed for complete emulation
-
- TODO: find details on MCU so that we know capacity etc. */
-ROM_END
-
-ROM_START( rad_fb2 )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "football2.bin", 0x000000, 0x400000, CRC(96b4f0d2) SHA1(e91f2ac679fb0c026ffe216eb4ab58802f361a17) )
-ROM_END
-
-ROM_START( rad_crik ) // only released in EU?
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "cricket.bin", 0x000000, 0x200000, CRC(6fa0aaa9) SHA1(210d2d4f542181f59127ce2f516d0408dc6de7a8) )
-ROM_END
-
-
-ROM_START( mattelcs )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "mattelclassicsports.bin", 0x000000, 0x100000, CRC(e633e7ad) SHA1(bf3e325a930cf645a7e32195939f3c79c6d35dac) )
-ROM_END
-
-ROM_START( dreamlif )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "dreamlife.bin", 0x000000, 0x800000, CRC(632e0237) SHA1(a8586e8a626d75cf7782f13cfd9f1b938af23d56) )
-ROM_END
-
-
-
-
-ROM_START( icanguit )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- // no internal ROM, requires a cartridge
-ROM_END
-
-ROM_START( icanpian )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- // no internal ROM, requires a cartridge
-ROM_END
-
-ROM_START( telestry )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- // no internal ROM?
-ROM_END
-
-ROM_START( tvgogo )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- // no internal ROM? (Camera might have an MCU tho)
-ROM_END
-
-ROM_START( pvmil )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) // Fujistu 29Z0002TN, read as ST M29W320FB
- ROM_LOAD16_WORD_SWAP( "millionare4.bin", 0x000000, 0x400000, CRC(9c43d0f2) SHA1(fb4ba0115000b10b7c0e0d44b9fa3234c900e694) )
-ROM_END
-
-ROM_START( taikeegr )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "taikee_guitar.bin", 0x000000, 0x800000, CRC(8cbe2feb) SHA1(d72e816f259ba6a6260d6bbaf20c5e9b2cf7140b) )
-ROM_END
-
-ROM_START( shredmjr )
- ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "shredmasterjr.bin", 0x000000, 0x800000, CRC(95a6dcf1) SHA1(44893cd6ebe6b7f33a73817b72ae7be70c3126dc) )
-ROM_END
-
-ROM_START( wiwi18 )
- ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
- ROM_LOAD16_WORD_SWAP( "26gl128.bin", 0x000000, 0x1000000, CRC(0b103ac9) SHA1(14434908f429942096fb8db5b5630603fd54fb2c) )
-ROM_END
-
-ROM_START( pdc100 )
- ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
- // only 1st half of this is used "Jumper resistor (0 ohm) that short A25 to ground"
- // 2nd half just contains what seems to be random garbage
- ROM_LOAD16_WORD_SWAP( "pdc100.bin", 0x000000, 0x8000000, CRC(57285b49) SHA1(cfb4be7877ec263d24063a004c56985db5c0f4e2) )
-ROM_END
-
-
-ROM_START( sentx6p )
- ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
- // chksum:05B58350 is @ 0x3000.
- // This is the correct sum of 0x3010 - 0x1fffff (the first half of the ROM area after the checksum string)
- // The 2nd half is not summed (and not used by the game?) but definitely exists in ROM (same data on 2 units)
- ROM_LOAD16_WORD_SWAP( "senario texas holdem.bin", 0x000000, 0x400000, CRC(7c7d2d33) SHA1(71631074ba66e3b0cdeb86ebca3931599f3a911c) )
-ROM_END
-
-void spg2xx_game_state::init_crc()
-{
- // several games have a byte sum checksum listed at the start of ROM, this little helper function logs what it should match.
- const int length = memregion("maincpu")->bytes();
- const uint8_t* rom = memregion("maincpu")->base();
-
- uint32_t checksum = 0x00000000;
- // the first 0x10 bytes are where the "chksum:xxxxxxxx " string is listed, so skip over them
- for (int i = 0x10; i < length; i++)
- {
- checksum += rom[i];
- }
-
- logerror("Calculated Byte Sum of bytes from 0x10 to 0x%08x is %08x)\n", length - 1, checksum);
-}
-
-void spg2xx_game_state::init_zeus()
-{
- uint16_t *ROM = (uint16_t*)memregion("maincpu")->base();
- int size = memregion("maincpu")->bytes();
-
- for (int i = 0x8000 / 2; i < size / 2; i++)
- {
- // global 16-bit xor
- ROM[i] = ROM[i] ^ 0x8a1d;
-
- // 4 single bit conditional xors
- if (ROM[i] & 0x0020)
- ROM[i] ^= 0x0100;
-
- if (ROM[i] & 0x0040)
- ROM[i] ^= 0x1000;
-
- if (ROM[i] & 0x4000)
- ROM[i] ^= 0x0001;
-
- if (ROM[i] & 0x0080)
- ROM[i] ^= 0x0004;
-
- // global 16-bit bitswap
- ROM[i] = bitswap<16>(ROM[i], 7, 12, 9, 14, 4, 6, 0, 10, 15, 1, 3, 2, 5, 13, 8, 11);
- }
-}
-
-
-void spg2xx_game_state::init_taikeegr()
-{
- u16 *src = (u16*)memregion("maincpu")->base();
-
- for (int i = 0x00000; i < 0x800000/2; i++)
- {
- u16 dat = src[i];
- dat = bitswap<16>(dat, 15,14,13,12, 11,10,9,8, 7,6,5,4, 0,1,2,3 );
- src[i] = dat;
- }
-
- std::vector<u16> buffer(0x800000/2);
-
- for (int i = 0; i < 0x800000/2; i++)
- {
- int j = 0;
-
- switch (i & 0x00e00)
- {
- case 0x00000: j = (i & 0xfff1ff) | 0x000; break;
- case 0x00200: j = (i & 0xfff1ff) | 0x800; break;
- case 0x00400: j = (i & 0xfff1ff) | 0x400; break;
- case 0x00600: j = (i & 0xfff1ff) | 0xc00; break;
- case 0x00800: j = (i & 0xfff1ff) | 0x200; break;
- case 0x00a00: j = (i & 0xfff1ff) | 0xa00; break;
- case 0x00c00: j = (i & 0xfff1ff) | 0x600; break;
- case 0x00e00: j = (i & 0xfff1ff) | 0xe00; break;
- }
-
- buffer[j] = src[i];
- }
-
- std::copy(buffer.begin(), buffer.end(), &src[0]);
-}
-
-void zone40_state::init_zone40()
-{
- uint16_t *ROM = (uint16_t*)memregion("maincpu")->base();
- int size = memregion("maincpu")->bytes();
-
- for (int i = 0; i < size/2; i++)
- {
- ROM[i] = ROM[i] ^ 0xbb88;
-
- ROM[i] = bitswap<16>(ROM[i], 11, 10, 3, 2, 4, 12, 5, 13,
- 9, 1, 8, 0, 6, 7, 14, 15);
- }
-}
-
-void wireless60_state::init_lx_jg7415()
-{
- uint8_t blocks[32] = {
- // these parts of the ROM contain the code that gets selected
- 0x00, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0e, 0x0f, 0x10, 0x11, 0x16, 0x17, 0x18, 0x19, 0x1e, 0x1f,
- // these parts of the ROM contain code / data but go unused, this seems intentional, some of these areas don't read consistently so likely this double size ROM was used knowing that some areas were bad and could be avoided
- 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d, 0x12, 0x13, 0x14, 0x15, 0x1a, 0x1b, 0x1c, 0x1d
- };
-
- uint8_t *src = memregion("maincpu")->base();
- std::vector<u8> buffer(0x10000000);
-
- for (int addr = 0; addr < 0x10000000; addr++)
- {
- int bank = (addr & 0xf800000) >> 23;
- int newbank = blocks[bank];
- int newaddr = (addr & 0x07fffff) | (newbank << 23);
- buffer[addr] = src[newaddr];
- }
-
- std::copy(buffer.begin(), buffer.end(), &src[0]);
-
- m_bankmask = 0xf;
-}
-
-void wireless60_state::init_zone100()
-{
- m_bankmask = 0xf;
-}
-
-void spg2xx_game_state::init_wiwi18()
-{
- uint16_t* rom = (uint16_t*)memregion("maincpu")->base();
- rom[0x1ca259] = 0xf165;
-}
-
-
-
-
-
-// year, name, parent, compat, machine, input, class, init, company, fullname, flags
-
-// Jungle Soft TV games
-CONS( 2007, vii, 0, 0, vii, vii, vii_state, empty_init, "Jungle Soft / KenSingTon / Siatronics", "Vii", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // motion controls are awkward, but playable for the most part
-// these don't have real motion controls
-CONS( 2009, zone40, 0, 0, zone40, wirels60, zone40_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2010, zone60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 200?, zone100, 0, 0, wireless60, wirels60, wireless60_state, init_zone100, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 100", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // unit was black, menus still show white controllers, unlike wireless 60
-CONS( 2010, wirels60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2011, lx_jg7415,0, 0, wireless60, wirels60, wireless60_state, init_lx_jg7415, "Lexibook", "Lexibook JG7415 120-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-
-
-// Box advertises this as '40 Games Included' but the cartridge, which was glued directly to the PCB, not removable, is a 41-in-1. Maybe some versions exist with a 40 game selection.
-CONS( 200?, zon32bit, 0, 0, zon32bit, zon32bit, zon32bit_state, init_zon32bit, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 32-bit Gaming Console System (Family Sport 41-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-// My Wico Deluxe was also available under the MiWi brand (exact model unknown, but it was a cart there instead of built in)
-// Box claimed 53 Arcade Games + 8 Sports games + 24 Music games, although it's unclear where 24 Music Games comes from, there are 3, which are identical aside from the title screen.
-// The Mi Guitar menu contains 24 games, but they're dupes, and just counting those would exclude the other Mi Fit and Mi Papacon menus (which also contain dupes)
-CONS( 200?, mywicodx, 0, 0, zon32bit, zon32bit, zon32bit_state, init_mywicodx, "<unknown>", "My Wico Deluxe (Family Sport 85-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-
-// JAKKS Pacific Inc TV games
-CONS( 2004, jak_batm, 0, 0, jakks, batman, spg2xx_game_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "The Batman (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2008, jak_wall, 0, 0, walle, walle, spg2xx_game_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wall-E (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-
-// 'Game-Key Ready' JAKKS games (these can also take per-game specific expansion cartridges, although not all games had them released)
-// Some of these were available in versions without Game-Key ports, it is unconfirmed if code was the same unless otherwise stated
-// For units released AFTER the GameKey promotion was cancelled it appears the code is the same as the PCB inside is the same, just the external port closed off, earlier units might be different hardware in some cases.
-// units released BEFORE the GameKey support were sometimes different hardware, eg. the Spider-Man and Disney units were SPG110 based
-CONS( 2005, jak_wwe, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "WWE (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // WW (no game-keys released)
-CONS( 2005, jak_fan4, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Fantastic Four (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // F4 (no game-keys released)
-CONS( 2005, jak_just, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Taniko", "Justice League (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // DC (no game-keys released)
-CONS( 2005, jak_dora, 0, 0, jakks_gkr_nk, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dora the Explorer - Nursery Rhyme Adventure (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys (same as Nicktoons & Spongebob) (3 released) - The upper part of this one is pink/purple.
-CONS( 2005, jak_dorr, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dora the Explorer - Race to Play Park (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys (same as Nicktoons & Spongebob) (3 released) - The upper part of this one is blue
-CONS( 2004, jak_nick, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Nicktoons (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys
-CONS( 2005, jak_sbfc, 0, 0, jakks_gkr_nk_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "SpongeBob SquarePants - The Fry Cook Games (JAKKS Pacific TV Game, Game-Key Ready) (AUG 18 2005 21:31:56)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NK keys
-CONS( 2005, jak_sdoo, 0, 0, jakks_gkr_2m_i2c, jak_sdoo_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Jolliford Management", "Scooby-Doo! and the Mystery of the Castle (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // SD (no game-keys released) (was dumped from a later unit with GameKey port missing, but internal PCB still supported it, code likely the same)
-CONS( 2005, jak_disn, 0, 0, jakks_gkr_dy, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Disney (JAKKS Pacific TV Game, Game-Key Ready) (08 FEB 2005 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
-CONS( 2005, jak_disf, 0, 0, jakks_gkr_dy_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Disney Friends (JAKKS Pacific TV Game, Game-Key Ready) (17 MAY 2005 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
-CONS( 2005, jak_dpr, 0, 0, jakks_gkr_dp_i2c, jak_dpr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / 5000ft, Inc", "Disney Princess (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DP keys (1 key released)
-CONS( 2005, jak_dprs, 0, 0, jakks_gkr_dp_i2c, jak_dpr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / 5000ft, Inc", "Disney Princesses (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DP keys (1 key released) (unit looks identical to above, including just having 'Disney Princess' logo, but this one has the 'board game' as a frontend and a slightly different on-screen title)
-CONS( 2005, jak_sith, 0, 0, jakks_gkr_sw_i2c, jak_sith_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Griptonite Games", "Star Wars - Revenge of the Sith (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses SW keys (1 released)
-CONS( 2005, jak_dbz, 0, 0, jakks_gkr_1m_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Dragon Ball Z (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // DB (no game-keys released, 1 in development but cancelled)
-CONS( 2005, jak_mpac, 0, 0, jakks_gkr_nm_i2c, jak_nm_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Namco / HotGen Ltd", "Ms. Pac-Man 5-in-1 (Ms. Pac-Man, Pole Position, Galaga, Xevious, Mappy) (JAKKS Pacific TV Game, Game-Key Ready) (07 FEB 2005 A SKU F)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NM (3 keys available [Dig Dug, New Rally-X], [Rally-X, Pac-Man, Bosconian], [Pac-Man, Bosconian])
-CONS( 2005, jak_capc, 0, 0, jakks_gkr_cc_i2c, jak_cc_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Capcom / HotGen Ltd", "Capcom 3-in-1 (1942, Commando, Ghosts'n Goblins) (JAKKS Pacific TV Game, Game-Key Ready) (29 MAR 2005 B)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses CC keys (no game-keys released)
-CONS( 2005, jak_wof, 0, 0, jakks_gkr_wf_i2c, jak_wf_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wheel of Fortune (JAKKS Pacific TV Game, Game-Key Ready) (Jul 11 2005 ORIG)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses WF keys (no game-keys released) analog wheel not emulated
-// There is a 'Second Edition' version of Wheel of Fortune with a Gold case, GameKey port removed, and a '2' over the usual Game Key Ready logo, internals are different too, not Game-Key Ready
-CONS( 2004, jak_spdm, 0, 0, jakks_gkr_mv_i2c, jak_gkr_i2c, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Spider-Man (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // MV (1 key available)
-CONS( 2005, jak_pooh, 0, 0, jakks_gkr_wp, jak_pooh, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Backbone Entertainment", "Winnie the Pooh - Piglet's Special Day (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // WP (no game-keys released)
-CONS( 2005, jak_care, 0, 0, jakks_gkr_cb, jak_care, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Backbone Entertainment", "Care Bears TV Games (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // CB (no game-keys released)
-
-// Some versions of the Shrek - Over the Hedge unit show the GameKey logo on startup (others don't) there is no evidence to suggest it was ever released with a GameKey port tho, and the internal PCB has no place for one on the versions we've seen (which show the logo)
-
-// Radica TV games
-CONS( 2006, rad_skat, 0, 0, rad_skat, rad_skat, spg2xx_game_state, init_crc, "Radica", "Play TV Skateboarder (NTSC)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2006, rad_skatp, rad_skat, 0, rad_skatp,rad_skatp, spg2xx_game_state, init_crc, "Radica", "Connectv Skateboarder (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2006, rad_crik, 0, 0, rad_crik, rad_crik, spg2xx_game_state, init_crc, "Radica", "Connectv Cricket (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // Version 3.00 20/03/06 is listed in INTERNAL TEST
-CONS( 2007, rad_sktv, 0, 0, rad_sktv, rad_sktv, spg2xx_game_state, init_crc, "Radica", "Skannerz TV", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
-CONS( 2007, rad_fb2, 0, 0, rad_skat, rad_fb2, spg2xx_game_state, init_crc, "Radica", "Play TV Football 2", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // offers a 2 player option in menus, but seems to have only been programmed for, and released as, a single player unit, P2 controls appear unfinished.
-
-// Mattel games
-CONS( 2005, mattelcs, 0, 0, rad_skat, mattelcs, spg2xx_game_state, empty_init, "Mattel", "Mattel Classic Sports", MACHINE_IMPERFECT_SOUND )
-
-// Hasbro games
-CONS( 2005, dreamlif, 0, 0, dreamlif, dreamlif, dreamlif_state, empty_init, "Hasbro", "Dream Life (Version 1.0, Feb 07 2005)", MACHINE_IMPERFECT_SOUND )
-
-// Fisher-Price games
-CONS( 2007, icanguit, 0, 0, icanguit, icanguit, icanguit_state, empty_init, "Fisher-Price", "I Can Play Guitar", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // how is data saved?
-CONS( 2006, icanpian, 0, 0, icanpian, icanpian, icanpian_state, empty_init, "Fisher-Price", "I Can Play Piano", MACHINE_IMPERFECT_SOUND ) // 2006 date from Manual
-
-// Toyquest games
-CONS( 2005, tvgogo, 0, 0, tvgogo, tvgogo, tvgogo_state, empty_init, "Toyquest", "GoGo TV Video Vision", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // or TV Go Go - the game addons call it the 'Video Vision console'
-
-// JAKKS Pacific / Toymax
-
-/* Sound data for the narrator is written to the SIO data port
- 013127: D319 3D54 [3d54] = r1 (Cinderella) - 4-bit data?
- The hidden test mode calls the speech test 'CELP' (possibly "Code-excited linear prediction" based?)
- https://en.wikipedia.org/wiki/Code-excited_linear_prediction
-
- TODO: check if it's a common implementation eg. Speex
- SIO port is not currently implemented in spg2xx_io.cpp however
-*/
-CONS( 2006, telestry, 0, 0, telestory, telestory, telestory_state, empty_init, "JAKKS Pacific Inc / Toymax", "Telestory", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
-
-
-// Similar, SPG260?, scrambled
-CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad sound and some corrupt bg tilemap entries in Tiger Rescue, verify ROM data (same game runs in Zone 60 without issue)
-
-CONS( 200?, lexiseal, 0, 0, lexiseal, lexiseal, spg2xx_lexiseal_game_state, init_zeus, "Lexibook / Sit Up Limited", "Seal 50-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // also has bad sound in Tiger Rescue, but no corrupt tilemap
-
-// there are other regions of this, including a Finnish version "Haluatko miljonääriksi?" (see https://millionaire.fandom.com/wiki/Haluatko_miljon%C3%A4%C3%A4riksi%3F_(Play_Vision_game) )
-CONS( 2006, pvmil, 0, 0, pvmil, pvmil, pvmil_state, empty_init, "Play Vision", "Who Wants to Be a Millionaire? (Play Vision, Plug and Play, UK)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-
-// there are multiple versions of this with different songs, was also sold by dreamGEAR as 'Shredmaster Jr.' (different title screen)
-// for the UK version the title screen always shows "Guitar Rock", however there are multiple boxes with different titles and song selections.
-// ROM is glued on the underside and soldered to the PCB, very difficult to remove without damaging.
-CONS( 2007, taikeegr, 0, 0, taikeegr, taikeegr, spg2xx_game_state, init_taikeegr, "TaiKee", "Rockstar Guitar / Guitar Rock (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad music timings (too slow)
-CONS( 2007, shredmjr, taikeegr, 0, shredmjr, taikeegr, shredmjr_game_state, init_taikeegr, "dreamGEAR", "Shredmaster Jr (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad music timings (too slow)
-
-// "go 02d1d0" "do r1 = ff" to get past initial screen (currently bypassed by setting controller sense in RAM earlier, see hack in machine_reset)
-// a 'deluxe' version of this also exists with extra game modes
-CONS( 2004, sentx6p, 0, 0, sentx6p, sentx6p, sentx6p_state, empty_init, "Senario / Play Vision", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (UK)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a UK Play Vision branded box, values in GBP
-
-// box marked 'Wireless game console' 'Drahtlose Spielekonsole' 87 Sports games included : 18 hyper sports games, 69 arcade games.
-// Unit marked 'Hamy System' 'WiWi'
-// actually a cartridge, but all hardware is in the cart, overriding any internal hardware entirely. see nes_vt.cp 'mc_sp69' for the '69 arcade game' part
-CONS( 200?, wiwi18, 0, 0, rad_skat, wiwi18, spg2xx_game_state, init_wiwi18, "Hamy System", "WiWi 18-in-1 Sports Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-
-// Conny devices
-
-// there were older models eg. PDC30 with fewer games, and some differences (eg "Jo Ma" instead of "Jo Ma 2")
-// "Jo Ma 2" shows "Licensed by Mitchell Corporation" (Mitchell made the original Puzzloop on which this style of game is based) Videos of the original Jo Ma show it lacking this text.
-
-// Other known units
-// PDC Teenage Mutant Ninja Turtles
-// PDC Dora the Explorer
-// PDC 30
-// PDC 40
-// PDC 200
-
-// This was dumped from an Anncia branded unit, although there's no ingame branding, so ROM is probably the same for all PDC100 units
-CONS( 2008, pdc100, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny", "PDC100 - Pocket Dream Console", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index 1d03d70e78a..ee94d248bf1 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -42,6 +42,7 @@
#include "bus/bbc/fdc/fdc.h"
#include "bus/bbc/analogue/analogue.h"
#include "bus/bbc/1mhzbus/1mhzbus.h"
+#include "bus/bbc/modem/modem.h"
#include "bus/bbc/internal/internal.h"
#include "bus/bbc/tube/tube.h"
#include "bus/bbc/userport/userport.h"
@@ -84,6 +85,7 @@ public:
, m_intube(*this, "intube")
, m_extube(*this, "extube")
, m_1mhzbus(*this, "1mhzbus")
+ , m_modem(*this, "modem")
, m_userport(*this, "userport")
, m_internal(*this, "internal")
, m_exp(*this, "exp")
@@ -243,6 +245,7 @@ protected:
optional_device<bbc_tube_slot_device> m_intube;
optional_device<bbc_tube_slot_device> m_extube;
optional_device<bbc_1mhzbus_slot_device> m_1mhzbus;
+ optional_device<bbc_modem_slot_device> m_modem;
optional_device<bbc_userport_slot_device> m_userport;
optional_device<bbc_internal_slot_device> m_internal;
optional_device<bbc_exp_slot_device> m_exp;
@@ -396,8 +399,7 @@ public:
static constexpr feature_type imperfect_features() { return feature::KEYBOARD; }
void torchf(machine_config &config);
- void torchh21(machine_config &config);
- void torchh10(machine_config &config);
+ void torchh(machine_config &config);
};
diff --git a/src/mame/includes/jazz.h b/src/mame/includes/jazz.h
index e4f1d75f847..793b7410ee1 100644
--- a/src/mame/includes/jazz.h
+++ b/src/mame/includes/jazz.h
@@ -14,7 +14,7 @@
#include "machine/28fxxx.h"
// various hardware
-#include "machine/jazz_mct_adr.h"
+#include "machine/mct_adr.h"
#include "machine/dp83932c.h"
#include "machine/mc146818.h"
#include "machine/ins8250.h"
@@ -93,7 +93,7 @@ protected:
required_device<r4000_device> m_cpu;
required_device<ram_device> m_ram;
required_device<ram_device> m_vram;
- required_device<jazz_mct_adr_device> m_mct_adr;
+ required_device<mct_adr_device> m_mct_adr;
required_device<nscsi_bus_device> m_scsibus;
required_device<ncr53c94_device> m_scsi;
required_device<n82077aa_device> m_fdc;
diff --git a/src/mame/includes/spg2xx.h b/src/mame/includes/spg2xx.h
new file mode 100644
index 00000000000..745ee8ca05a
--- /dev/null
+++ b/src/mame/includes/spg2xx.h
@@ -0,0 +1,84 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz, David Haywood
+#pragma once
+
+#ifndef MAME_INCLUDES_SPG2XX_H
+#define MAME_INCLUDES_SPG2XX_H
+
+#include "emu.h"
+
+#include "cpu/unsp/unsp.h"
+#include "machine/i2cmem.h"
+#include "machine/spg2xx.h"
+
+
+#include "screen.h"
+#include "softlist.h"
+#include "speaker.h"
+
+
+
+class spg2xx_game_state : public driver_device
+{
+public:
+ spg2xx_game_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_screen(*this, "screen"),
+ m_bank(*this, "cartbank"),
+ m_io_p1(*this, "P1"),
+ m_io_p2(*this, "P2"),
+ m_io_p3(*this, "P3"),
+ m_i2cmem(*this, "i2cmem")
+ { }
+
+ void spg2xx_base(machine_config &config);
+ void rad_skat(machine_config &config);
+ void rad_skatp(machine_config &config);
+ void rad_sktv(machine_config &config);
+ void rad_crik(machine_config &config);
+ void non_spg_base(machine_config &config);
+ void abltenni(machine_config &config);
+
+ void init_crc();
+ void init_wiwi18();
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void switch_bank(uint32_t bank);
+
+ DECLARE_WRITE8_MEMBER(i2c_w);
+ DECLARE_READ8_MEMBER(i2c_r);
+
+ virtual DECLARE_WRITE16_MEMBER(porta_w);
+ virtual DECLARE_WRITE16_MEMBER(portb_w);
+ virtual DECLARE_WRITE16_MEMBER(portc_w);
+
+ DECLARE_READ16_MEMBER(rad_porta_r);
+ DECLARE_READ16_MEMBER(rad_portb_r);
+ DECLARE_READ16_MEMBER(rad_portc_r);
+
+
+ required_device<spg2xx_device> m_maincpu;
+ required_device<screen_device> m_screen;
+ optional_memory_bank m_bank;
+
+
+ virtual void mem_map_4m(address_map &map);
+ virtual void mem_map_2m(address_map &map);
+ virtual void mem_map_1m(address_map &map);
+
+ uint32_t m_current_bank;
+
+ required_ioport m_io_p1;
+ optional_ioport m_io_p2;
+ optional_ioport m_io_p3;
+ optional_device<i2cmem_device> m_i2cmem;
+};
+
+
+
+
+#endif // MAME_INCLUDES_SPG2XX_H
diff --git a/src/mame/machine/jazz_mct_adr.cpp b/src/mame/machine/mct_adr.cpp
index 8c4c13b325f..2882bcca339 100644
--- a/src/mame/machine/jazz_mct_adr.cpp
+++ b/src/mame/machine/mct_adr.cpp
@@ -19,6 +19,9 @@
* https://github.com/torvalds/linux/tree/master/arch/mips/jazz/
* http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/arc/jazz/
*
+ * https://www.linux-mips.org/archives/riscy/1993-08/msg00064.html
+ * https://www.linux-mips.org/archives/riscy/1993-08/msg00069.html
+ *
* TODO
* - proper width dma
* - dma address translation errors
@@ -27,15 +30,17 @@
*/
#include "emu.h"
-#include "jazz_mct_adr.h"
+#include "mct_adr.h"
#define VERBOSE 0
#include "logmacro.h"
-DEFINE_DEVICE_TYPE(JAZZ_MCT_ADR, jazz_mct_adr_device, "jazz_mct_adr", "Jazz MCT-ADR")
+DEFINE_DEVICE_TYPE(MCT_ADR, mct_adr_device, "mct_adr", "MCT-ADR Address Path Controller")
-jazz_mct_adr_device::jazz_mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, JAZZ_MCT_ADR, tag, owner, clock)
+mct_adr_device::mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, MCT_ADR, tag, owner, clock)
+ , device_memory_interface(mconfig, *this)
+ , m_dma_config("dma", ENDIANNESS_LITTLE, 32, 32, 0, address_map_constructor(FUNC(mct_adr_device::dma), this))
, m_bus(*this, finder_base::DUMMY_TAG, -1, 64)
, m_out_int_dma(*this)
, m_out_int_device(*this)
@@ -46,7 +51,7 @@ jazz_mct_adr_device::jazz_mct_adr_device(const machine_config &mconfig, const ch
{
}
-void jazz_mct_adr_device::map(address_map &map)
+void mct_adr_device::map(address_map &map)
{
map(0x000, 0x007).lrw32(NAME([this] () { return m_config; }), NAME([this] (u32 data) { m_config = data; }));
map(0x008, 0x00f).lr32([] () { return 1; }, "revision_level");
@@ -118,7 +123,23 @@ void jazz_mct_adr_device::map(address_map &map)
map(0x238, 0x23b).lr32(NAME([this] () { return m_eisa_iack(); }));
}
-void jazz_mct_adr_device::device_start()
+// HACK: this address map translates i386 bus master DMA device access (the
+// SONIC network controller) to DRAM.
+device_memory_interface::space_config_vector mct_adr_device::memory_space_config() const
+{
+ return space_config_vector{
+ std::make_pair(0, &m_dma_config)
+ };
+}
+
+void mct_adr_device::dma(address_map &map)
+{
+ map(0x00000000U, 0xffffffffU).lrw32(
+ [this](offs_t offset) { return m_bus->read_dword(translate_address(offset << 2)); }, "dma_r",
+ [this](offs_t offset, u32 data, u32 mem_mask) { m_bus->write_dword(translate_address(offset << 2), data, mem_mask); }, "dma_w");
+}
+
+void mct_adr_device::device_start()
{
m_out_int_dma.resolve();
m_out_int_device.resolve();
@@ -131,11 +152,21 @@ void jazz_mct_adr_device::device_start()
m_dma_w[i].resolve_safe();
}
- m_config = 0x104; // REV1, REV2 is 0x410
-
m_ioc_maint = 0;
m_ioc_physical_tag = 0;
m_ioc_logical_tag = 0;
+
+ m_irq_check = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mct_adr_device::irq_check), this));
+ m_dma_check = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mct_adr_device::dma_check), this));
+ m_interval_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mct_adr_device::interval_timer), this));
+
+ m_out_int_timer_asserted = false;
+ m_out_int_device_asserted = false;
+}
+
+void mct_adr_device::device_reset()
+{
+ m_config = 0x104; // REV1, REV2 is 0x410
m_trans_tbl_base = 0;
m_trans_tbl_limit = 0;
m_ioc_byte_mask = 0;
@@ -146,26 +177,19 @@ void jazz_mct_adr_device::device_start()
for (u32 &val : m_dma_reg)
val = 0;
+ m_dma_interrupt_source = 0;
m_memory_refresh_rate = 0x18186;
m_nvram_protect = 0x7;
- m_irq_check = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jazz_mct_adr_device::irq_check), this));
- m_dma_check = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jazz_mct_adr_device::dma_check), this));
- m_interval_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(jazz_mct_adr_device::interval_timer), this));
-
- m_out_int_timer_asserted = false;
- m_out_int_device_asserted = false;
-}
-
-void jazz_mct_adr_device::device_reset()
-{
m_isr = 0;
- m_imr = 0; // 0x10;
+ m_imr = 0x10; // firmware diagnostic expects network interrupts to be unmasked at boot
m_interval_timer->adjust(attotime::from_msec(1), 0, attotime::from_msec(1));
+
+ irq_check(nullptr, 0);
}
-void jazz_mct_adr_device::set_irq_line(int irq, int state)
+void mct_adr_device::set_irq_line(int irq, int state)
{
if ((irq != 3) && (m_isr & (1 << irq)) ^ (state << irq))
LOG("set_irq_line %d state %d m_imr 0x%04x\n", irq, state, m_imr);
@@ -178,7 +202,7 @@ void jazz_mct_adr_device::set_irq_line(int irq, int state)
m_irq_check->adjust(attotime::zero);
}
-TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::irq_check)
+TIMER_CALLBACK_MEMBER(mct_adr_device::irq_check)
{
if (bool(m_isr & m_imr) != m_out_int_device_asserted)
{
@@ -188,13 +212,10 @@ TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::irq_check)
}
}
-u16 jazz_mct_adr_device::isr_r()
+u16 mct_adr_device::isr_r()
{
u16 const pending = m_isr & m_imr;
- // FIXME: really?
- //m_out_int_device(CLEAR_LINE);
-
for (u16 irq = 0; irq < 16; irq++)
if (BIT(pending, irq))
return (irq + 1) << 2;
@@ -202,7 +223,7 @@ u16 jazz_mct_adr_device::isr_r()
return 0;
}
-void jazz_mct_adr_device::imr_w(u16 data)
+void mct_adr_device::imr_w(u16 data)
{
LOG("imr_w 0x%04x (%s)\n", data, machine().describe_context());
@@ -211,7 +232,7 @@ void jazz_mct_adr_device::imr_w(u16 data)
m_irq_check->adjust(attotime::zero);
}
-TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::interval_timer)
+TIMER_CALLBACK_MEMBER(mct_adr_device::interval_timer)
{
if (m_out_int_timer_asserted)
m_out_int_timer(0);
@@ -221,7 +242,7 @@ TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::interval_timer)
m_out_int_timer(1);
}
-void jazz_mct_adr_device::set_drq_line(int channel, int state)
+void mct_adr_device::set_drq_line(int channel, int state)
{
m_drq_active[channel] = state == ASSERT_LINE;
@@ -229,7 +250,7 @@ void jazz_mct_adr_device::set_drq_line(int channel, int state)
m_dma_check->adjust(attotime::zero);
}
-TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::dma_check)
+TIMER_CALLBACK_MEMBER(mct_adr_device::dma_check)
{
bool active = false;
@@ -294,7 +315,7 @@ TIMER_CALLBACK_MEMBER(jazz_mct_adr_device::dma_check)
m_dma_check->adjust(attotime::zero);
}
-u32 jazz_mct_adr_device::translate_address(u32 logical_address)
+u32 mct_adr_device::translate_address(u32 logical_address)
{
u32 page = logical_address >> 12;
if (page < (m_trans_tbl_limit) >> 3)
diff --git a/src/mame/machine/jazz_mct_adr.h b/src/mame/machine/mct_adr.h
index 353b905cea2..6adfa508be1 100644
--- a/src/mame/machine/jazz_mct_adr.h
+++ b/src/mame/machine/mct_adr.h
@@ -1,15 +1,17 @@
// license:BSD-3-Clause
// copyright-holders:Patrick Mackinlay
-#ifndef MAME_MACHINE_JAZZ_MCT_ADR_H
-#define MAME_MACHINE_JAZZ_MCT_ADR_H
+#ifndef MAME_MACHINE_MCT_ADR_H
+#define MAME_MACHINE_MCT_ADR_H
#pragma once
-class jazz_mct_adr_device : public device_t
+class mct_adr_device
+ : public device_t
+ , public device_memory_interface
{
public:
- jazz_mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// configuration
template <typename T> void set_bus(T &&tag, int spacenum) { m_bus.set_tag(std::forward<T>(tag), spacenum); }
@@ -25,7 +27,7 @@ public:
template <unsigned IRQ> DECLARE_WRITE_LINE_MEMBER(irq) { set_irq_line(IRQ, state); }
template <unsigned DRQ> DECLARE_WRITE_LINE_MEMBER(drq) { set_drq_line(DRQ, state); }
- virtual void map(address_map &map);
+ void map(address_map &map);
u16 isr_r();
u16 imr_r() { return m_imr; }
@@ -36,7 +38,13 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
+ // device_memory_interface overrides
+ virtual space_config_vector memory_space_config() const override;
+ //virtual bool memory_translate(int spacenum, int intention, offs_t &address) override;
+
private:
+ void dma(address_map &map);
+
void set_irq_line(int number, int state);
void set_drq_line(int channel, int state);
@@ -46,6 +54,7 @@ private:
u32 translate_address(u32 logical_address);
+ address_space_config m_dma_config;
required_address_space m_bus;
devcb_write_line m_out_int_dma;
@@ -146,6 +155,6 @@ private:
};
// device type definition
-DECLARE_DEVICE_TYPE(JAZZ_MCT_ADR, jazz_mct_adr_device)
+DECLARE_DEVICE_TYPE(MCT_ADR, mct_adr_device)
-#endif // MAME_MACHINE_JAZZ_MCT_ADR_H
+#endif // MAME_MACHINE_MCT_ADR_H
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 4ebeb7f1368..fe2c9e89d6a 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -3231,8 +3231,7 @@ pro128s // 1987 Olivetti Prodest PC 128S
autoc15 // 1988 Autocue 1500
reutapm // 1985 Reuters APM Board
torchf // 1982 Torch CF240
-torchh10 // 1982 Torch CH240/10
-torchh21 // 1982 Torch CH240/21
+torchh // 1982 Torch CH240
@source:bbcbc.cpp
bbcbc // 1985 BBC Bridge Companion
@@ -30146,6 +30145,7 @@ gamsharaj // 2002.08 Gamshara (10021 Ver.A)
gjspace // 2001.12 Gekitoride-Jong Space (10011 Ver.A)
g13jnc // 2001.?? Golgo 13: Juusei no Chinkonka (Japan, GLT1 VER.A)
gunbalina // 2000.12 Gunbalina (GNN1 Ver.A)
+kd2001 // 2011.1? Knock Down 2001 (KD11 Ver.B)
knpuzzle // 2001.12 Kotoba no Puzzle Mojipittan (KPM1 Ver.A)
konotako // 2003.?? Kono Tako (10021 Ver.A)
mrdrilr2 // 2000.07 Mr Driller 2 (DR21 Ver.A)
@@ -39824,7 +39824,17 @@ conyteni //
conyping //
conyfght
-@source:vii.cpp
+@source:spg2xx.cpp
+rad_skat //
+rad_skatp //
+rad_sktv //
+rad_crik //
+rad_fb2 //
+mattelcs //
+abltenni //
+wiwi18 //
+
+@source:spg2xx_jakks.cpp
jak_batm // The Batman, 2004
jak_wall //
jak_wwe //
@@ -39847,34 +39857,57 @@ jak_pooh //
jak_care //
jak_nick //
jak_sbfc //
-lexizeus // Lexibook
-lexiseal //
-vii // KenSingTon / Jungle Soft / Siatronics Vii
+
+@source:spg2xx_zone.cpp
wirels60 // Wireless 60
zone40 // Zone 40
zone60 // Zone 60
zone100 //
+lx_jg7415 //
+
+@source:spg2xx_zone_32bit.cpp
mywicodx //
zon32bit // Zone 32-bit
-lx_jg7415 //
-rad_skat //
-rad_skatp //
-rad_sktv //
-rad_crik //
-rad_fb2 //
-mattelcs //
-dreamlif //
+
+@source:spg2xx_senario.cpp
+senmil
+senbbs
+senapren
+sencosmo
+
+@source:spg2xx_senario_poker.cpp
+sentx6p //
+
+@source:spg2xx_vii.cpp
+vii // KenSingTon / Jungle Soft / Siatronics Vii
+
+@source:spg2xx_ican.cpp
icanguit //
icanpian //
-tvgogo //
+
+@source:spg2xx_playvision.cpp
pvmil //
+
+@source:spg2xx_shredmjr.cpp
taikeegr //
shredmjr //
-sentx6p //
+
+@source:spg2xx_telestory.cpp
telestry //
-wiwi18 //
+
+@source:spg2xx_tvgogo.cpp
+tvgogo //
+
+@source:spg2xx_pdc.cpp
pdc100
+@source:spg2xx_dreamlife.cpp
+dreamlif //
+
+@source:spg2xx_lexibook.cpp
+lexizeus // Lexibook
+lexiseal //
+
@source:vsmile.cpp
vsmile //
vsmilem //
diff --git a/src/mame/video/galpani2.cpp b/src/mame/video/galpani2.cpp
index ec950a0a7b6..63bf9edb0b4 100644
--- a/src/mame/video/galpani2.cpp
+++ b/src/mame/video/galpani2.cpp
@@ -140,6 +140,10 @@ if (machine().input().code_pressed(KEYCODE_Z))
if (layers_ctrl & 0x1) copybg15(screen, bitmap, cliprect);
if (layers_ctrl & 0x2) copybg8(screen, bitmap, cliprect, 0);
if (layers_ctrl & 0x4) copybg8(screen, bitmap, cliprect, 1);
- if (layers_ctrl & 0x8) m_kaneko_spr->render_sprites(bitmap, cliprect, screen.priority(), m_spriteram, m_spriteram.bytes());
+ if (layers_ctrl & 0x8)
+ {
+ m_kaneko_spr->render_sprites(cliprect, m_spriteram, m_spriteram.bytes());
+ m_kaneko_spr->copybitmap(bitmap, cliprect, screen.priority());
+ }
return 0;
}
diff --git a/src/mame/video/kaneko16.cpp b/src/mame/video/kaneko16.cpp
index c978c061f02..1ac1ee998c8 100644
--- a/src/mame/video/kaneko16.cpp
+++ b/src/mame/video/kaneko16.cpp
@@ -83,7 +83,7 @@ u32 kaneko16_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c
if (!m_disp_enable) return 0;
screen_update_common(screen, bitmap, cliprect);
- m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram->buffer(), m_spriteram->bytes());
+ m_kaneko_spr->copybitmap(bitmap, cliprect, screen.priority());
return 0;
}
@@ -229,6 +229,6 @@ u32 kaneko16_berlwall_state::screen_update(screen_device &screen, bitmap_rgb32 &
if (!m_disp_enable) return 0;
screen_update_common(screen, bitmap, cliprect);
- m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram->buffer(), m_spriteram->bytes()/2);
+ m_kaneko_spr->copybitmap(bitmap, cliprect, screen.priority());
return 0;
}
diff --git a/src/mame/video/kaneko_spr.cpp b/src/mame/video/kaneko_spr.cpp
index 598c005f9cd..d55557f69b5 100644
--- a/src/mame/video/kaneko_spr.cpp
+++ b/src/mame/video/kaneko_spr.cpp
@@ -70,12 +70,14 @@ void kaneko16_sprite_device::device_start()
m_first_sprite = std::make_unique<struct tempsprite_t[]>(0x400);
m_sprites_regs = make_unique_clear<u16[]>(0x20/2);
screen().register_screen_bitmap(m_sprites_bitmap);
+ screen().register_screen_bitmap(m_sprites_maskmap);
save_item(NAME(m_sprite_flipx));
save_item(NAME(m_sprite_flipy));
save_pointer(NAME(m_sprites_regs), 0x20/2);
save_item(NAME(m_keep_sprites));
save_item(NAME(m_sprites_bitmap));
+ save_item(NAME(m_sprites_maskmap));
}
@@ -238,12 +240,11 @@ int kaneko16_sprite_device::parse_sprite_type012(int i, struct tempsprite_t *s,
// custom function to draw a single sprite. needed to keep correct sprites - sprites and sprites - tilemaps priorities
-template<class _BitmapClass>
-void kaneko16_sprite_device::draw_sprites_custom(_BitmapClass &dest_bmp,const rectangle &clip,gfx_element *gfx,
+void kaneko16_sprite_device::draw_sprites_custom(const rectangle &clip,gfx_element *gfx,
u32 code,u32 color,bool flipx,bool flipy,int sx,int sy,
- bitmap_ind8 &priority_bitmap, int priority)
+ int priority)
{
- const pen_t pen_base = gfx->colorbase() + gfx->granularity() * (color % gfx->colors());
+ const pen_t pen_base = gfx->granularity() * (color % gfx->colors());
const u8 *source_base = gfx->get_data(code % gfx->elements());
int dx, dy;
@@ -301,17 +302,11 @@ void kaneko16_sprite_device::draw_sprites_custom(_BitmapClass &dest_bmp,const re
if (ex > sx)
{ /* skip if inner loop doesn't draw anything */
- typename _BitmapClass::pixel_t *dest;
- int rgb;
- if (sizeof(*dest) == 2) rgb = 0;
- else rgb = 1;
-
- const pen_t *pal = gfx->palette().pens();
for (int y = sy; y < ey; y++)
{
const u8 *source = source_base + y_index * gfx->rowbytes();
- dest = &dest_bmp.pix(y);
- u8 *pri = &priority_bitmap.pix8(y);
+ u16 *dest = &m_sprites_bitmap.pix16(y);
+ u8 *pri = &m_sprites_maskmap.pix8(y);
int x_index = x_index_base;
for (int x = sx; x < ex; x++)
@@ -319,11 +314,9 @@ void kaneko16_sprite_device::draw_sprites_custom(_BitmapClass &dest_bmp,const re
const u8 c = source[x_index];
if (c != 0)
{
- if (pri[x] < priority)
- {
- if (!rgb) dest[x] = pen_base + c;
- else dest[x] = pal[pen_base + c];
- }
+ if (pri[x] == 0)
+ dest[x] = ((pen_base + c) & 0x3fff) + ((priority & 3) << 14);
+
pri[x] = 0xff; // mark it "already drawn"
}
x_index += dx;
@@ -335,8 +328,7 @@ void kaneko16_sprite_device::draw_sprites_custom(_BitmapClass &dest_bmp,const re
/* Build a list of sprites to display & draw them */
-template<class _BitmapClass>
-void kaneko16_sprite_device::draw_sprites(_BitmapClass &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes)
+void kaneko16_sprite_device::draw_sprites(const rectangle &cliprect, u16* spriteram16, int spriteram16_bytes)
{
/* Sprites *must* be parsed from the first in RAM to the last,
because of the multisprite feature. But they *must* be drawn
@@ -442,18 +434,13 @@ void kaneko16_sprite_device::draw_sprites(_BitmapClass &bitmap, const rectangle
for (s--; s >= m_first_sprite.get(); s--)
{
- const int curr_pri = s->priority;
-
- const u32 primask = m_priority.sprite[curr_pri];
-
draw_sprites_custom(
- bitmap,cliprect,gfx(0),
+ cliprect,gfx(0),
s->code,
s->color,
s->flipx, s->flipy,
s->x, s->y,
- priority_bitmap,
- primask);
+ s->priority);
}
}
@@ -556,49 +543,53 @@ void kaneko16_sprite_device::regs_w(offs_t offset, u16 data, u16 mem_mask)
}
-void kaneko16_sprite_device::copybitmap(bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- copybitmap_trans(bitmap,m_sprites_bitmap,0,0,0,0,cliprect,0);
-}
+void kaneko16_sprite_device::copybitmap(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap) { copybitmap_common(bitmap, cliprect, priority_bitmap); }
+void kaneko16_sprite_device::copybitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap) { copybitmap_common(bitmap, cliprect, priority_bitmap); }
-void kaneko16_sprite_device::copybitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect)
+template<class _BitmapClass>
+void kaneko16_sprite_device::copybitmap_common(_BitmapClass &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap)
{
const pen_t *pal = gfx(0)->palette().pens();
+ typename _BitmapClass::pixel_t *dstbitmap;
+ int rgb;
+ if (sizeof(*dstbitmap) == 2) rgb = 0;
+ else rgb = 1;
+
for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
+ dstbitmap = &bitmap.pix(y);
+ u8 *dstprimap = &priority_bitmap.pix8(y);
u16* srcbitmap = &m_sprites_bitmap.pix16(y);
- u32* dstbitmap = &bitmap.pix32(y);
for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
- const u16 pix = srcbitmap[x];
- if (pix) dstbitmap[x] = pal[pix];
+ const u16 pri = (srcbitmap[x] & 0xc000) >> 14;
+ const u16 pix = srcbitmap[x] & 0x3fff;
+ if (m_priority.sprite[pri] > dstprimap[x])
+ {
+ if (pix & 0x3fff)
+ {
+ if (!rgb) dstbitmap[x] = m_colbase + pix;
+ else dstbitmap[x] = pal[m_colbase + pix];
+ }
+ }
}
}
}
-void kaneko16_sprite_device::render_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes) { render_sprites_common(bitmap, cliprect, priority_bitmap, spriteram16, spriteram16_bytes); }
-void kaneko16_sprite_device::render_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes) { render_sprites_common(bitmap, cliprect, priority_bitmap, spriteram16, spriteram16_bytes); }
-
-template<class _BitmapClass>
-void kaneko16_sprite_device::render_sprites_common(_BitmapClass &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes)
+void kaneko16_sprite_device::render_sprites(const rectangle &cliprect, u16* spriteram16, int spriteram16_bytes)
{
/* Sprites last (rendered with pdrawgfx, so they can slip
in between the layers) */
- if (m_keep_sprites)
- {
- /* keep sprites on screen - used by mgcrystl when you get the first gem and it shows instructions */
- draw_sprites(m_sprites_bitmap, cliprect, priority_bitmap, spriteram16, spriteram16_bytes);
- copybitmap(bitmap,cliprect);
- }
- else
- {
+ m_sprites_maskmap.fill(0, cliprect);
+ /* keep sprites on screen - used by mgcrystl when you get the first gem and it shows instructions */
+ if (!m_keep_sprites)
m_sprites_bitmap.fill(0, cliprect);
- draw_sprites(bitmap,cliprect, priority_bitmap, spriteram16, spriteram16_bytes);
- }
+
+ draw_sprites(cliprect, spriteram16, spriteram16_bytes);
}
kaneko_vu002_sprite_device::kaneko_vu002_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
diff --git a/src/mame/video/kaneko_spr.h b/src/mame/video/kaneko_spr.h
index 00ea0c7640f..69539361711 100644
--- a/src/mame/video/kaneko_spr.h
+++ b/src/mame/video/kaneko_spr.h
@@ -46,16 +46,16 @@ public:
// (legacy) used in the bitmap clear functions
virtual int get_sprite_type(void) =0;
- void render_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes);
- void render_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes);
+ void render_sprites(const rectangle &cliprect, u16* spriteram16, int spriteram16_bytes);
+ void copybitmap(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap);
+ void copybitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap);
template<class _BitmapClass>
- void render_sprites_common(_BitmapClass &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes);
+ void copybitmap_common(_BitmapClass &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap);
void bootleg_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, u16* spriteram16, int spriteram16_bytes);
-
u16 regs_r(offs_t offset);
void regs_w(offs_t offset, u16 data, u16 mem_mask);
@@ -97,21 +97,17 @@ private:
std::unique_ptr<struct tempsprite_t[]> m_first_sprite;
int m_keep_sprites;
bitmap_ind16 m_sprites_bitmap;
+ bitmap_ind8 m_sprites_maskmap;
- template<class _BitmapClass>
- void draw_sprites(_BitmapClass &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, u16* spriteram16, int spriteram16_bytes);
+ void draw_sprites(const rectangle &cliprect, u16* spriteram16, int spriteram16_bytes);
- template<class _BitmapClass>
- void draw_sprites_custom(_BitmapClass &dest_bmp,const rectangle &clip,gfx_element *gfx,
+ void draw_sprites_custom(const rectangle &clip,gfx_element *gfx,
u32 code,u32 color,bool flipx,bool flipy,int sx,int sy,
- bitmap_ind8 &priority_bitmap, int priority);
+ int priority);
int parse_sprite_type012(int i, struct tempsprite_t *s, u16* spriteram16, int spriteram16_bytes);
-
- void copybitmap(bitmap_ind16 &bitmap, const rectangle &cliprect);
- void copybitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
};
//extern const device_type KANEKO16_SPRITE;
diff --git a/src/osd/modules/debugger/debuggdbstub.cpp b/src/osd/modules/debugger/debuggdbstub.cpp
index e30f8712d2f..713e79e1ed7 100644
--- a/src/osd/modules/debugger/debuggdbstub.cpp
+++ b/src/osd/modules/debugger/debuggdbstub.cpp
@@ -587,7 +587,7 @@ void debug_gdbstub::wait_for_debugger(device_t &device, bool firststop)
#endif
std::string socket_name = string_format("socket.localhost:%d", m_debugger_port);
- osd_file::error filerr = m_socket.open(socket_name.c_str());
+ osd_file::error filerr = m_socket.open(socket_name);
if ( filerr != osd_file::error::NONE )
fatalerror("gdbstub: failed to start listening on port %d\n", m_debugger_port);
osd_printf_info("gdbstub: listening on port %d\n", m_debugger_port);
diff --git a/src/osd/modules/debugger/debugimgui.cpp b/src/osd/modules/debugger/debugimgui.cpp
index 487ad42ecc5..fde6882a69b 100644
--- a/src/osd/modules/debugger/debugimgui.cpp
+++ b/src/osd/modules/debugger/debugimgui.cpp
@@ -949,7 +949,7 @@ void debug_imgui::mount_image()
case file_entry_type::DIRECTORY:
{
util::zippath_directory::ptr dir;
- err = util::zippath_directory::open(m_selected_file->fullpath.c_str(), dir);
+ err = util::zippath_directory::open(m_selected_file->fullpath, dir);
}
if(err == osd_file::error::NONE)
{
@@ -958,7 +958,7 @@ void debug_imgui::mount_image()
}
break;
case file_entry_type::FILE:
- m_dialog_image->load(m_selected_file->fullpath.c_str());
+ m_dialog_image->load(m_selected_file->fullpath);
ImGui::CloseCurrentPopup();
break;
}
@@ -1106,7 +1106,7 @@ void debug_imgui::draw_mount_dialog(const char* label)
{
// render dialog
//ImGui::SetNextWindowContentWidth(200.0f);
- if(ImGui::BeginPopupModal(label,NULL,ImGuiWindowFlags_AlwaysAutoResize))
+ if(ImGui::BeginPopupModal(label,nullptr,ImGuiWindowFlags_AlwaysAutoResize))
{
if(m_filelist_refresh)
refresh_filelist();
@@ -1157,7 +1157,7 @@ void debug_imgui::draw_create_dialog(const char* label)
{
// render dialog
//ImGui::SetNextWindowContentWidth(200.0f);
- if(ImGui::BeginPopupModal(label,NULL,ImGuiWindowFlags_AlwaysAutoResize))
+ if(ImGui::BeginPopupModal(label,nullptr,ImGuiWindowFlags_AlwaysAutoResize))
{
ImGui::LabelText("##static1","Filename:");
ImGui::SameLine();
diff --git a/src/osd/modules/debugger/win/consolewininfo.cpp b/src/osd/modules/debugger/win/consolewininfo.cpp
index 88367c09fc9..9610cf68e78 100644
--- a/src/osd/modules/debugger/win/consolewininfo.cpp
+++ b/src/osd/modules/debugger/win/consolewininfo.cpp
@@ -281,7 +281,7 @@ bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
std::string as = slmap.find(opt_name)->second;
/* Make sure a folder was specified, and that it exists */
- if ((!osd::directory::open(as.c_str())) || (as.find(':') == std::string::npos))
+ if ((!osd::directory::open(as)) || (as.find(':') == std::string::npos))
{
/* Default to emu directory */
osd_get_full_path(as, ".");
@@ -321,7 +321,7 @@ bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
buf.erase(0, t1+1);
// load software
- img->load_software( buf.c_str());
+ img->load_software(buf);
}
}
}
@@ -351,7 +351,7 @@ bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
as = buf; // the only path
/* Make sure a folder was specified, and that it exists */
- if ((!osd::directory::open(as.c_str())) || (as.find(':') == std::string::npos))
+ if ((!osd::directory::open(as)) || (as.find(':') == std::string::npos))
{
/* Default to emu directory */
osd_get_full_path(as, ".");
@@ -377,7 +377,7 @@ bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
if (GetOpenFileName(&ofn))
{
auto utf8_buf = osd::text::from_tstring(selectedFilename);
- img->load(utf8_buf.c_str());
+ img->load(utf8_buf);
}
}
}
@@ -406,7 +406,7 @@ bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
as = buf; // the only path
/* Make sure a folder was specified, and that it exists */
- if ((!osd::directory::open(as.c_str())) || (as.find(':') == std::string::npos))
+ if ((!osd::directory::open(as)) || (as.find(':') == std::string::npos))
{
/* Default to emu directory */
osd_get_full_path(as, ".");
@@ -432,7 +432,7 @@ bool consolewin_info::handle_command(WPARAM wparam, LPARAM lparam)
if (GetSaveFileName(&ofn))
{
auto utf8_buf = osd::text::from_tstring(selectedFilename);
- img->create(utf8_buf.c_str(), img->device_get_indexed_creatable_format(0), nullptr);
+ img->create(utf8_buf, img->device_get_indexed_creatable_format(0), nullptr);
}
}
}
@@ -598,7 +598,7 @@ bool consolewin_info::get_softlist_info(device_image_interface *img)
while (sl_root && !passes_tests)
{
std::string test_path = sl_root + sl_dir;
- if (osd::directory::open(test_path.c_str()))
+ if (osd::directory::open(test_path))
{
passes_tests = true;
slmap[opt_name] = test_path;
diff --git a/src/osd/modules/debugger/win/disasmbasewininfo.cpp b/src/osd/modules/debugger/win/disasmbasewininfo.cpp
index c466e059f23..cfd9683ae9c 100644
--- a/src/osd/modules/debugger/win/disasmbasewininfo.cpp
+++ b/src/osd/modules/debugger/win/disasmbasewininfo.cpp
@@ -192,7 +192,7 @@ bool disasmbasewin_info::handle_command(WPARAM wparam, LPARAM lparam)
command = string_format("bpset 0x%X", address);
else
command = string_format("bpclear 0x%X", bp->index());
- machine().debugger().console().execute_command(command.c_str(), true);
+ machine().debugger().console().execute_command(command, true);
}
}
return true;
@@ -220,7 +220,7 @@ bool disasmbasewin_info::handle_command(WPARAM wparam, LPARAM lparam)
{
std::string command;
command = string_format(bp->enabled() ? "bpdisable 0x%X" : "bpenable 0x%X", (uint32_t)bp->index());
- machine().debugger().console().execute_command(command.c_str(), true);
+ machine().debugger().console().execute_command(command, true);
}
}
}
@@ -234,7 +234,7 @@ bool disasmbasewin_info::handle_command(WPARAM wparam, LPARAM lparam)
{
std::string command;
command = string_format("go 0x%X", address);
- machine().debugger().console().execute_command(command.c_str(), true);
+ machine().debugger().console().execute_command(command, true);
}
else
{
diff --git a/src/osd/modules/debugger/win/editwininfo.cpp b/src/osd/modules/debugger/win/editwininfo.cpp
index af3dd1bf66e..1b9f88c6d68 100644
--- a/src/osd/modules/debugger/win/editwininfo.cpp
+++ b/src/osd/modules/debugger/win/editwininfo.cpp
@@ -199,7 +199,7 @@ LRESULT editwin_info::edit_proc(UINT message, WPARAM wparam, LPARAM lparam)
// process
{
auto utf8_buffer = osd::text::from_tstring(buffer);
- process_string(utf8_buffer.c_str());
+ process_string(utf8_buffer);
}
}
break;
diff --git a/src/osd/modules/file/winptty.cpp b/src/osd/modules/file/winptty.cpp
index 1dbc7e5cd05..d4207d1d73d 100644
--- a/src/osd/modules/file/winptty.cpp
+++ b/src/osd/modules/file/winptty.cpp
@@ -100,7 +100,7 @@ osd_file::error win_open_ptty(std::string const &path, std::uint32_t openflags,
else
{
DWORD state = PIPE_NOWAIT;
- SetNamedPipeHandleState(pipe, &state, NULL, NULL);
+ SetNamedPipeHandleState(pipe, &state, nullptr, nullptr);
}
try
diff --git a/src/osd/modules/font/font_dwrite.cpp b/src/osd/modules/font/font_dwrite.cpp
index 04ccf11a7ce..82f70c17672 100644
--- a/src/osd/modules/font/font_dwrite.cpp
+++ b/src/osd/modules/font/font_dwrite.cpp
@@ -366,7 +366,7 @@ public:
// find the font
HR_RET0(find_font(
- familyName.c_str(),
+ familyName,
bold ? DWRITE_FONT_WEIGHT_BOLD : DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL,
diff --git a/src/osd/modules/monitor/monitor_dxgi.cpp b/src/osd/modules/monitor/monitor_dxgi.cpp
index 6638f98806c..36890e36f27 100644
--- a/src/osd/modules/monitor/monitor_dxgi.cpp
+++ b/src/osd/modules/monitor/monitor_dxgi.cpp
@@ -164,7 +164,7 @@ protected:
// if we're verbose, print the list of monitors
{
- for (auto monitor : list())
+ for (const auto &monitor : list())
{
osd_printf_verbose("Video: Monitor %I64u = \"%s\" %s\n", monitor->oshandle(), monitor->devicename(), monitor->is_primary() ? "(primary)" : "");
}
diff --git a/src/osd/modules/monitor/monitor_win32.cpp b/src/osd/modules/monitor/monitor_win32.cpp
index 6bcd6094e83..42e51595915 100644
--- a/src/osd/modules/monitor/monitor_win32.cpp
+++ b/src/osd/modules/monitor/monitor_win32.cpp
@@ -94,7 +94,7 @@ protected:
// if we're verbose, print the list of monitors
{
- for (auto monitor : list())
+ for (const auto &monitor : list())
{
osd_printf_verbose("Video: Monitor %I64u = \"%s\" %s\n", monitor->oshandle(), monitor->devicename(), monitor->is_primary() ? "(primary)" : "");
}
diff --git a/src/osd/modules/output/network.cpp b/src/osd/modules/output/network.cpp
index e92b009670f..4fc4b382da6 100644
--- a/src/osd/modules/output/network.cpp
+++ b/src/osd/modules/output/network.cpp
@@ -160,7 +160,7 @@ public:
void deliver_to_all(std::string msg)
{
- for (auto client: m_clients)
+ for (const auto &client: m_clients)
client->deliver(msg);
}
diff --git a/src/osd/modules/render/bgfx/slider.cpp b/src/osd/modules/render/bgfx/slider.cpp
index 0cc97275497..d5f5e6e5c52 100644
--- a/src/osd/modules/render/bgfx/slider.cpp
+++ b/src/osd/modules/render/bgfx/slider.cpp
@@ -25,7 +25,7 @@ bgfx_slider::bgfx_slider(running_machine &machine, std::string name, float min,
m_max = max;
m_value = def;
- for (std::string string : strings)
+ for (const std::string &string : strings)
{
m_strings.push_back(string);
}
diff --git a/src/osd/osdsync.cpp b/src/osd/osdsync.cpp
index f18efb7fac2..6e368eeb366 100644
--- a/src/osd/osdsync.cpp
+++ b/src/osd/osdsync.cpp
@@ -447,8 +447,7 @@ void osd_work_queue_free(osd_work_queue *queue)
{
osd_work_item *item = (osd_work_item *)queue->free;
queue->free = item->next;
- if (item->event != nullptr)
- delete item->event;
+ delete item->event;
delete item;
}
@@ -457,8 +456,7 @@ void osd_work_queue_free(osd_work_queue *queue)
{
osd_work_item *item = (osd_work_item *)queue->list;
queue->list = item->next;
- if (item->event != nullptr)
- delete item->event;
+ delete item->event;
delete item;
}
diff --git a/src/osd/windows/video.cpp b/src/osd/windows/video.cpp
index ca50be44639..87041eb9657 100644
--- a/src/osd/windows/video.cpp
+++ b/src/osd/windows/video.cpp
@@ -90,7 +90,7 @@ void windows_osd_interface::update(bool skip_redraw)
if (!skip_redraw)
{
// profiler_mark(PROFILER_BLIT);
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
window->update();
// profiler_mark(PROFILER_END);
}
diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp
index 3794e79cd14..ce63d28eba6 100644
--- a/src/osd/windows/window.cpp
+++ b/src/osd/windows/window.cpp
@@ -204,7 +204,7 @@ bool windows_osd_interface::window_init()
void windows_osd_interface::update_slider_list()
{
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
{
// check if any window has dirty sliders
if (window->has_renderer() && window->renderer().sliders_dirty())
@@ -224,7 +224,7 @@ void windows_osd_interface::build_slider_list()
{
m_sliders.clear();
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
{
if (window->has_renderer())
{
@@ -418,7 +418,7 @@ void winwindow_process_events_periodic(running_machine &machine)
static bool is_mame_window(HWND hwnd)
{
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
if (std::static_pointer_cast<win_window_info>(window)->platform_window() == hwnd)
return true;
@@ -582,7 +582,7 @@ void winwindow_take_snap(void)
assert(GetCurrentThreadId() == main_threadid);
// iterate over windows and request a snap
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
{
window->renderer().save();
}
@@ -600,7 +600,7 @@ void winwindow_toggle_fsfx(void)
assert(GetCurrentThreadId() == main_threadid);
// iterate over windows and request a snap
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
{
window->renderer().toggle_fsfx();
}
@@ -618,7 +618,7 @@ void winwindow_take_video(void)
assert(GetCurrentThreadId() == main_threadid);
// iterate over windows and request a snap
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
{
window->renderer().record();
}
@@ -636,7 +636,7 @@ void winwindow_toggle_full_screen(void)
assert(GetCurrentThreadId() == main_threadid);
// if we are in debug mode, never go full screen
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
if (window->machine().debug_flags & DEBUG_FLAG_OSD_ENABLED)
return;
@@ -644,7 +644,7 @@ void winwindow_toggle_full_screen(void)
video_config.windowed = !video_config.windowed;
// iterate over windows and toggle their fullscreen state
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
SendMessage(std::static_pointer_cast<win_window_info>(window)->platform_window(), WM_USER_SET_FULLSCREEN, !video_config.windowed, 0);
// Set the first window as foreground
@@ -661,7 +661,7 @@ void winwindow_toggle_full_screen(void)
bool winwindow_has_focus(void)
{
// see if one of the video windows has focus
- for (auto window : osd_common_t::s_window_list)
+ for (const auto &window : osd_common_t::s_window_list)
{
switch (std::static_pointer_cast<win_window_info>(window)->focus())
{
@@ -752,7 +752,7 @@ void win_window_info::create(running_machine &machine, int index, std::shared_pt
// set main window
if (window->m_index > 0)
{
- for (auto w : osd_common_t::s_window_list)
+ for (const auto &w : osd_common_t::s_window_list)
{
if (w->m_index == 0)
{
@@ -769,7 +769,7 @@ void win_window_info::create(running_machine &machine, int index, std::shared_pt
// see if we are safe for fullscreen
window->m_fullscreen_safe = TRUE;
- for (auto win : osd_common_t::s_window_list)
+ for (const auto &win : osd_common_t::s_window_list)
if (win->monitor() == monitor.get())
window->m_fullscreen_safe = FALSE;
diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp
index a16904c2aa8..45d3486a2af 100644
--- a/src/osd/windows/winmain.cpp
+++ b/src/osd/windows/winmain.cpp
@@ -566,7 +566,7 @@ void windows_osd_interface::init(running_machine &machine)
osd_common_t::init_subsystems();
// notify listeners of screen configuration
- for (auto info : osd_common_t::s_window_list)
+ for (const auto &info : osd_common_t::s_window_list)
{
machine.output().set_value(string_format("Orientation(%s)", info->monitor()->devicename()).c_str(), std::static_pointer_cast<win_window_info>(info)->m_targetorient);
}
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index 73d5a63f002..4401e0c3f83 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -52,6 +52,7 @@ using util::BIT;
#include "cpu/f8/f8dasm.h"
#include "cpu/fr/frdasm.h"
#include "cpu/g65816/g65816ds.h"
+#include "cpu/gigatron/gigatrondasm.h"
#include "cpu/h6280/6280dasm.h"
#include "cpu/h8/h8d.h"
#include "cpu/h8/h8hd.h"
@@ -370,6 +371,7 @@ static const dasm_table_entry dasm_table[] =
{ "f8", be, 0, []() -> util::disasm_interface * { return new f8_disassembler; } },
{ "fr", be, 0, []() -> util::disasm_interface * { return new fr_disassembler; } },
{ "g65816", le, 0, []() -> util::disasm_interface * { return new g65816_disassembler(&g65816_unidasm); } },
+ { "gigatron", be, -1, []() -> util::disasm_interface * { return new gigatron_disassembler; } },
{ "h6280", le, 0, []() -> util::disasm_interface * { return new h6280_disassembler; } },
{ "h8", be, 0, []() -> util::disasm_interface * { return new h8_disassembler; } },
{ "h8h", be, 0, []() -> util::disasm_interface * { return new h8h_disassembler; } },
@@ -602,18 +604,17 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
switch(entry->pcshift) {
case -1:
lr8 = [](offs_t pc) -> u8 { throw std::logic_error("debug_disasm_buffer::debug_data_buffer: r8 access on 16-bits granularity bus\n"); };
- lr16 = [this](offs_t pc) -> u16 {
- const u16 *src = get_ptr<u16>(pc);
- return src[0];
- };
-
switch(entry->endian) {
case le:
+ lr16 = [this](offs_t pc) -> u16 {
+ const u16 *src = get_ptr<u16>(pc);
+ return little_endianize_int16(src[0]);
+ };
lr32 = [this, page_mask](offs_t pc) -> u32 {
offs_t lpc = disasm->pc_real_to_linear(pc);
u32 r = 0;
for(int j=0; j != 2; j++) {
- r |= get<u16>(disasm->pc_linear_to_real(lpc)) << (j*16);
+ r |= little_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc))) << (j*16);
lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask);
}
return r;
@@ -622,7 +623,7 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
offs_t lpc = disasm->pc_real_to_linear(pc);
u64 r = 0;
for(int j=0; j != 4; j++) {
- r |= u64(get<u16>(disasm->pc_linear_to_real(lpc))) << (j*16);
+ r |= u64(little_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc)))) << (j*16);
lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask);
}
return r;
@@ -630,11 +631,15 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
break;
case be:
+ lr16 = [this](offs_t pc) -> u16 {
+ const u16 *src = get_ptr<u16>(pc);
+ return big_endianize_int16(src[0]);
+ };
lr32 = [this, page_mask](offs_t pc) -> u32 {
offs_t lpc = disasm->pc_real_to_linear(pc);
u32 r = 0;
for(int j=0; j != 2; j++) {
- r |= get<u16>(disasm->pc_linear_to_real(lpc)) << ((1-j)*16);
+ r |= big_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc))) << ((1-j)*16);
lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask);
}
return r;
@@ -643,7 +648,7 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
offs_t lpc = disasm->pc_real_to_linear(pc);
u64 r = 0;
for(int j=0; j != 4; j++) {
- r |= u64(get<u16>(disasm->pc_linear_to_real(lpc))) << ((3-j)*16);
+ r |= u64(big_endianize_int16(get<u16>(disasm->pc_linear_to_real(lpc)))) << ((3-j)*16);
lpc = (lpc & ~page_mask) | ((lpc + 1) & page_mask);
}
return r;
@@ -796,46 +801,52 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
case -1:
lr8 = [](offs_t pc) -> u8 { abort(); };
- lr16 = [this](offs_t pc) -> u16 {
- const u16 *p = get_ptr<u16>(pc);
- return p ?
- p[0]
- : 0x0000;
- };
switch(entry->endian) {
case le:
+ lr16 = [this](offs_t pc) -> u16 {
+ const u16 *p = get_ptr<u16>(pc);
+ return p ?
+ little_endianize_int16(p[0])
+ : 0x0000;
+ };
lr32 = [this](offs_t pc) -> u32 {
const u16 *p = get_ptr<u16>(pc);
return p ?
- p[0] |
- (p[1] << 16)
+ little_endianize_int16(p[0]) |
+ (little_endianize_int16(p[1]) << 16)
: 0x00000000;
};
lr64 = [this](offs_t pc) -> u64 {
const u16 *p = get_ptr<u16>(pc);
return p ?
- p[0] |
- (p[1] << 16) |
- (u64(p[2]) << 32) |
- (u64(p[3]) << 48)
+ little_endianize_int16(p[0]) |
+ (little_endianize_int16(p[1]) << 16) |
+ (u64(little_endianize_int16(p[2])) << 32) |
+ (u64(little_endianize_int16(p[3])) << 48)
: 0x0000000000000000;
};
break;
case be:
+ lr16 = [this](offs_t pc) -> u16 {
+ const u16 *p = get_ptr<u16>(pc);
+ return p ?
+ big_endianize_int16(p[0])
+ : 0x0000;
+ };
lr32 = [this](offs_t pc) -> u32 {
const u16 *p = get_ptr<u16>(pc);
return p ?
- (p[0] << 16)|
- p[1]
+ (big_endianize_int16(p[0]) << 16)|
+ big_endianize_int16(p[1])
: 0x00000000;
};
lr64 = [this](offs_t pc) -> u64 {
const u16 *p = get_ptr<u16>(pc);
return p ?
- (u64(p[0]) << 48) |
- (u64(p[1]) << 32) |
- (p[2] << 16) |
- p[3]
+ (u64(big_endianize_int16(p[0])) << 48) |
+ (u64(big_endianize_int16(p[1])) << 32) |
+ (big_endianize_int16(p[2]) << 16) |
+ big_endianize_int16(p[3])
: 0x0000000000000000;
};
break;
@@ -845,28 +856,34 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
case -2:
lr8 = [](offs_t pc) -> u8 { abort(); };
lr16 = [](offs_t pc) -> u16 { abort(); };
- lr32 = [this](offs_t pc) -> u32 {
- const u32 *p = get_ptr<u32>(pc);
- return p ?
- p[0]
- : 0x00000000;
- };
switch(entry->endian) {
case le:
+ lr32 = [this](offs_t pc) -> u32 {
+ const u32 *p = get_ptr<u32>(pc);
+ return p ?
+ little_endianize_int32(p[0])
+ : 0x00000000;
+ };
lr64 = [this](offs_t pc) -> u64 {
const u32 *p = get_ptr<u32>(pc);
return p ?
- p[0] |
- (u64(p[1]) << 32)
+ little_endianize_int32(p[0]) |
+ (u64(little_endianize_int32(p[1])) << 32)
: 0x0000000000000000;
};
break;
case be:
+ lr32 = [this](offs_t pc) -> u32 {
+ const u32 *p = get_ptr<u32>(pc);
+ return p ?
+ big_endianize_int32(p[0])
+ : 0x00000000;
+ };
lr64 = [this](offs_t pc) -> u64 {
const u32 *p = get_ptr<u32>(pc);
return p ?
- (u64(p[0]) << 32) |
- p[1]
+ (u64(big_endianize_int32(p[0])) << 32) |
+ big_endianize_int32(p[1])
: 0x0000000000000000;
};
break;
@@ -877,26 +894,38 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
lr8 = [](offs_t pc) -> u8 { abort(); };
lr16 = [](offs_t pc) -> u16 { abort(); };
lr32 = [](offs_t pc) -> u32 { abort(); };
- lr64 = [this](offs_t pc) -> u64 {
- const u64 *p = get_ptr<u64>(pc);
- return p ?
- p[0]
- : 0x0000000000000000;
+ switch(entry->endian) {
+ case le:
+ lr64 = [this](offs_t pc) -> u64 {
+ const u64 *p = get_ptr<u64>(pc);
+ return p ?
+ little_endianize_int64(p[0])
+ : 0x0000000000000000;
+ };
+ break;
+ case be:
+ lr64 = [this](offs_t pc) -> u64 {
+ const u64 *p = get_ptr<u64>(pc);
+ return p ?
+ big_endianize_int64(p[0])
+ : 0x0000000000000000;
+ };
+ break;
};
break;
case 3:
lr8 = [](offs_t pc) -> u8 { abort(); };
- lr16 = [this](offs_t pc) -> u16 {
- if(pc < base_pc)
- return 0x0000;
- offs_t delta = (pc - base_pc) >> 3;
- if(delta >= size)
- return 0x0000;
- return reinterpret_cast<const u16 *>(&data[delta])[0];
- };
switch(entry->endian) {
case le:
+ lr16 = [this](offs_t pc) -> u16 {
+ if(pc < base_pc)
+ return 0x0000;
+ offs_t delta = (pc - base_pc) >> 3;
+ if(delta >= size)
+ return 0x0000;
+ return little_endianize_int16(reinterpret_cast<const u16 *>(&data[delta])[0]);
+ };
lr32 = [this](offs_t pc) -> u32 {
if(pc < base_pc)
return 0x00000000;
@@ -904,10 +933,18 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
if(delta >= size + 2)
return 0x00000000;
auto p = reinterpret_cast<const u16 *>(&data[delta]);
- return p[0] | (u32(p[1]) << 16);
+ return little_endianize_int16(p[0]) | (u32(little_endianize_int16(p[1])) << 16);
};
break;
case be:
+ lr16 = [this](offs_t pc) -> u16 {
+ if(pc < base_pc)
+ return 0x0000;
+ offs_t delta = (pc - base_pc) >> 3;
+ if(delta >= size)
+ return 0x0000;
+ return big_endianize_int16(reinterpret_cast<const u16 *>(&data[delta])[0]);
+ };
lr32 = [this](offs_t pc) -> u32 {
if(pc < base_pc)
return 0x00000000;
@@ -915,7 +952,7 @@ unidasm_data_buffer::unidasm_data_buffer(util::disasm_interface *_disasm, const
if(delta >= size + 2)
return 0x00000000;
auto p = reinterpret_cast<const u16 *>(&data[delta]);
- return (u32(p[0]) << 16) | p[1];
+ return (u32(big_endianize_int16(p[0])) << 16) | big_endianize_int16(p[1]);
};
break;
}