This commit is contained in:
Peter Ferrie 2019-02-16 12:09:22 -08:00
commit 54fed3ad66
86 changed files with 3043 additions and 1592 deletions

19
hash/fidel_sc6.xml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="fidel_sc6" description="Fidelity SC6 Modules">
<!-- Sensory Chess Challenger 6 -->
<software name="sc6">
<description>SC6: original program</description>
<year>1982</year>
<publisher>Fidelity Electronics</publisher>
<part name="cart" interface="fidel_sc6">
<dataarea name="rom" size="0x1000">
<rom name="101-1035a01" size="0x1000" crc="0024971f" sha1="76b16364913ada2fb94b9e6a8524b924e6832ddf" offset="0x0000" /> <!-- 2332 -->
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -7255,6 +7255,28 @@ has been replaced with an all-zero block. -->
</part>
</software>
<!-- glitches on the bottom of the screen -->
<software name="batmanmv" supported="partial">
<!-- Dumped via Kryoflux -->
<description>Batman: The Movie</description>
<year>1990</year>
<publisher>Ocean Software / Data East</publisher>
<info name="developer" value="Ocean Software" />
<info name="ported by" value="Astros Productions" />
<part name="flop1" interface="floppy_3_5">
<!-- Copy-protected key disk -->
<dataarea name="flop" size = "2169772">
<rom name="Batman The Movie [Ocean] [1990] [3.5DD] [Disk 1 of 2].mfm" size="2169772" crc="26dffced" sha1="48abc5cd55eeecf98b11d590aeed0bc51af47e42" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
<!-- Copy-protected key disk -->
<dataarea name="flop" size = "2171366">
<rom name="Batman The Movie [Ocean] [1990] [3.5DD] [Disk 2 of 2].mfm" size="2171366" crc="fd010c6f" sha1="bfa5c27e4757c6020f05c760bfc289fe17736fce" offset="0"/>
</dataarea>
</part>
</software>
<software name="bibpaint">
<description>Bible Paint and Learn</description>
<year>1992</year>
@ -7611,9 +7633,9 @@ has been replaced with an all-zero block. -->
<software name="crimewav">
<description>Crime Wave</description>
<year>1990</year>
<publisher>Access Software, Inc.</publisher>
<publisher>Access Software</publisher>
<info name="version" value="2.0" />
<info name="developer" value="Access Software, Inc." />
<info name="developer" value="Access Software" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "737280">
<rom name="Crime Wave [Access Software Inc] [1990] [3.5DD] [disk 1 of 4].img" size="737280" crc="2e051a02" sha1="7856ca4b29a0fcd07d164fc7e28a926572384819" offset="0"/>
@ -7741,7 +7763,7 @@ has been replaced with an all-zero block. -->
</software>
<software name="ddragon2">
<description>Double Dragon II - The Revenge</description>
<description>Double Dragon II - The Revenge (5.25")</description>
<year>1989</year>
<publisher>Virgin Mastertronic</publisher>
<info name="developer" value="Binary Design" />
@ -8133,6 +8155,18 @@ has been replaced with an all-zero block. -->
</dataarea>
</part>
</software>
<software name="gunboata" cloneof="gunboat">
<description>Gunboat: River Combat Simulation (Hit Squad release)</description>
<year>1990</year>
<publisher>Accolade</publisher>
<info name="developer" value="Accolade" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "737280">
<rom name="Gunboat (Hit Squad release) [Accolade] [1990] [3.5DD] [Disk 1 of 1].img" size="737280" crc="8a5b28c9" sha1="defc3a56657f5318b3eb2ac206050206c315f84f" offset="0"/>
</dataarea>
</part>
</software>
<software name="hardbal2">
<description>Hardball II</description>
@ -8279,7 +8313,7 @@ has been replaced with an all-zero block. -->
</software>
<software name="ironmnso">
<description>Ivan "Ironman" Stewart's Super Off Road</description>
<description>Ivan "Ironman" Stewart's Super Off Road (5.25")</description>
<year>1990</year>
<publisher>Virgin Games, Inc.</publisher>
<info name="developer" value="Leland Corporation" />
@ -8295,6 +8329,19 @@ has been replaced with an all-zero block. -->
</part>
</software>
<software name="ironmnso35" cloneof="ironmnso">
<description>Ivan "Ironman" Stewart's Super Off Road (16 Blitz release) (3.5")</description>
<year>1992</year>
<publisher>Virgin Mastertronic</publisher>
<info name="developer" value="Leland Corporation" />
<info name="ported by" value="Graftgold" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "737280">
<rom name="Super Off Road (16 Blitz release) [Virgin Games] [1992] [3.5DD] [Disk 1 of 1].img" size="737280" crc="fce3d276" sha1="16d90ffc29f5422f5003f71f10e304b8454d3a48" offset="0"/>
</dataarea>
</part>
</software>
<software name="shogun">
<description>James Clavell's Shogun (set 1)</description>
<year>1987</year>
@ -8775,7 +8822,7 @@ has been replaced with an all-zero block. -->
</part>
</software>
<software name="lombrall35" cloneof="lombrall">
<software name="lombrall35" cloneof="lombrall" supported="partial">
<description>Lombard RAC Rally (3.5")</description>
<year>1989</year>
<publisher>Mandarin Software</publisher>
@ -10923,6 +10970,18 @@ has been replaced with an all-zero block. -->
</part>
</software>
<software name="wwfmania">
<description>WWF Wrestlemania</description>
<year>1991</year>
<publisher>Ocean Software</publisher>
<info name="developer" value="Twilight" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "737280">
<rom name="WWF Wrestlemania [Ocean] [1991] [3.5DD] [Disk 1 of 1].img" size="737280" crc="50a14bbe" sha1="173a37cffb51cda82a65acdfc7987215037c9be4" offset="0"/>
</dataarea>
</part>
</software>
<software name="xenon">
<description>Xenon (5.25")</description>
<year>1988</year>

View File

@ -11301,6 +11301,35 @@
</dataarea>
</part>
</software>
<software name="monkeyit" cloneof="monkeyk">
<description>The Secret of Monkey Island (Italian)</description>
<year>1991</year>
<publisher>Lucasfilm Games</publisher>
<info name="developer" value="Lucasfilm Games" />
<info name="distributor" value="CTO Software" />
<info name="version" value="(VGA) Italian 1.0, 24 May 1991" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "1474560">
<rom name="The Secret of Monkey Island (Italian) [Lucasfilm Games] [1991] [3.5HD] [Disk 1 of 4].img" size="1474560" crc="855256e3" sha1="045f3698543055e11ce6dd570f39e7233feca51a" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
<dataarea name="flop" size = "1474560">
<rom name="The Secret of Monkey Island (Italian) [Lucasfilm Games] [1991] [3.5HD] [Disk 2 of 4].img" size="1474560" crc="56320b7b" sha1="e4c6ac3d5409b4b2d6a397d96a45c0c40b558c5f" offset="0"/>
</dataarea>
</part>
<part name="flop3" interface="floppy_3_5">
<dataarea name="flop" size = "1474560">
<rom name="The Secret of Monkey Island (Italian) [Lucasfilm Games] [1991] [3.5HD] [Disk 3 of 4].img" size="1474560" crc="456bfda5" sha1="14f1075199e39f9a033c073ba4dbed85c8937ebf" offset="0"/>
</dataarea>
</part>
<part name="flop4" interface="floppy_3_5">
<dataarea name="flop" size = "1474560">
<rom name="The Secret of Monkey Island (Italian) [Lucasfilm Games] [1991] [3.5HD] [Disk 4 of 4].img" size="1474560" crc="2aab0101" sha1="689d2958ec39ab1dbdee508c66b4d8aedde71126" offset="0"/>
</dataarea>
</part>
</software>
<software name="sserv2">
<!-- Dumped via Kryoflux, shows as good and unmodified -->

19
hash/jakks_gamekey_mv.xml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="jakks_gamekey_mv" description="JAKKS Pacific 'MV' Game Keys">
<!-- This list is for the 'MV' coded Game Keys, for Marvel (Spider-Man) -->
<software name="bcatdoc">
<description>Black Cat &amp; Doc Ock</description>
<year>2005</year>
<publisher>JAKKS Pacific / Digital Eclipse</publisher>
<part name="cart" interface="jakks_gamekey">
<feature name="slot" value="rom_24lc04"/>
<dataarea name="rom" size="0x800000">
<rom name="jakksspidermanblackcatdocockgk.bin" size="0x200000" crc="34645c17" sha1="0112a0c16350ac02204486492d8cae7b7df5e011" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -18,4 +18,28 @@
</part>
</software>
<software name="volbird">
<description>Nicktoons Vollyball &amp; Birdie Putt</description>
<year>2005</year>
<publisher>JAKKS Pacific / Handheld Games</publisher>
<part name="cart" interface="jakks_gamekey">
<feature name="slot" value="rom_24lc04"/>
<dataarea name="rom" size="0x800000">
<rom name="nicktoonsgkvolleyballbirdie.bin" size="0x200000" crc="7eccb308" sha1="bf7f7ff752ea2652ad099d26e53dade4e4f9e9a1" offset="0" />
</dataarea>
</part>
</software>
<software name="popsnow">
<description>Spongebob Sponge Pop &amp; Snowball Showdown (15 AUGUST 2005 D)</description>
<year>2005</year>
<publisher>JAKKS Pacific / HotGen Ltd</publisher>
<part name="cart" interface="jakks_gamekey">
<feature name="slot" value="rom_24lc04"/>
<dataarea name="rom" size="0x800000">
<rom name="spongebobgkpopsnowball.bin" size="0x200000" crc="8194baeb" sha1="cac7c6989696dc52088013d198314993d72f3c74" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -1,6 +1,8 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="monon_color" description="M&amp;D Monon Color cartridges">
<!-- Cartridges contain a serial flash ROM, and an epoxy blob, it is not clear what is inside the blob. Cartridges appear to work just fine if reprogrammed
with a different game. Note, the current dumps might not be 'clean' as the games save data directly to the 0x50000 area of ROM. -->
<!-- Known games list
@ -22,7 +24,7 @@
Locke Kingdom: The King's Badge Luòkè wángguó-wángzhě huīzhāng N Y NO. 206 RPG 洛克王国-王者徽章
Laboratory Mathematica Olympiad Àoshù shíyàn shì N Y NO. 207 PUZ/EDU 奥数实验室
Logic Fight Luójí pīn yī pīn Y Y NO. 301 PUZ/EDU 逻辑拼一拼
Pleasant goat and big big wolf's comet battle Xǐyángyáng yǔ huītàiláng-juézhàn miē xīng N Y NO. 302 PUZ/EDU 喜羊羊与灰太狼-决战咩星
Pleasant goat and big big wolf's comet battle Xǐyángyáng yǔ huītàiláng-juézhàn miē xīng Y Y NO. 302 PUZ/EDU 喜羊羊与灰太狼-决战咩星
Dragon Ball: The Martial Arts Conference Lóngzhū-wǔdào dàhuì Y Y NO. 303 ACT 龙珠-武道大会
League of Legends: The Ultimate Fight Yīngxióng liánméng-zhōngjí gédòu Y Y NO. 304 FTG 英雄联盟-终极格斗
Ben 10: alien force .. N N? ACT BEN 10: ALIEN FORCE
@ -33,7 +35,7 @@
(1) (Note: One known to exist in the wild, was supposedly bought at a thrift store. Based around Jackie Chan fighting)
-->
<software name="purcfs"> <!-- 101 - Purcell: Ares Fighting Spirit -->
<software name="purcfs" supported="no"> <!-- 101 - Purcell: Ares Fighting Spirit -->
<description>Sài ěr hào: Zhànshén dòu hún</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -45,7 +47,7 @@
</part>
</software>
<software name="lockmagi"> <!-- 102 - Locke Kingdom: Magic Array -->
<software name="lockmagi" supported="no"> <!-- 102 - Locke Kingdom: Magic Array -->
<description>Luòkè wángguó-mófǎ zhèn</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -57,7 +59,7 @@
</part>
</software>
<software name="mechcycl"> <!-- 103 - Mech Cyclone: Fighting Masters -->
<software name="mechcycl" supported="no"> <!-- 103 - Mech Cyclone: Fighting Masters -->
<description>Jī jiǎ xuànfēng-gédòu dàshī (set 1)</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -69,7 +71,7 @@
</part>
</software>
<software name="mechcycla" cloneof="mechcycl"> <!-- 103 - Mech Cyclone: Fighting Masters -->
<software name="mechcycla" cloneof="mechcycl" supported="no"> <!-- 103 - Mech Cyclone: Fighting Masters -->
<description>Jī jiǎ xuànfēng-gédòu dàshī (set 2)</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -81,7 +83,7 @@
</part>
</software>
<software name="zinba"> <!-- 104 - Zinba! : The lost relics -->
<software name="zinba" supported="no"> <!-- 104 - Zinba! : The lost relics -->
<description>Shén pò-shīluò de yíjī</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -93,7 +95,7 @@
</part>
</software>
<software name="purceb"> <!-- 105 - Purcell: Energy Battle -->
<software name="purceb" supported="no"> <!-- 105 - Purcell: Energy Battle -->
<description>Sài ěr hào-néngyuán dà zuòzhàn</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -105,7 +107,7 @@
</part>
</software>
<software name="ironmnhs"> <!-- 106 - Iron Man: Hero Strike -->
<software name="ironmnhs" supported="no"> <!-- 106 - Iron Man: Hero Strike -->
<description>Gāngtiě xiá-yīngxióng fǎnjí zhàn</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -117,7 +119,7 @@
</part>
</software>
<software name="zombhunt"> <!-- 107 - Zombie Hunter -->
<software name="zombhunt" supported="no"> <!-- 107 - Zombie Hunter -->
<description>Jiāngshī lièrén</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -129,7 +131,7 @@
</part>
</software>
<software name="lockba"> <!-- 201 - Locke Kingdom: Big Adventure -->
<software name="lockba" supported="no"> <!-- 201 - Locke Kingdom: Big Adventure -->
<description>Luòkè wángguó-dà màoxiǎn</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -141,7 +143,7 @@
</part>
</software>
<software name="lockice"> <!-- 202 - Locke Kingdom RPG: Ice Blue -->
<software name="lockice" supported="no"> <!-- 202 - Locke Kingdom RPG: Ice Blue -->
<description>Luòkè wángguó-bīng zhī lán</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -153,7 +155,7 @@
</part>
</software>
<software name="lockfire"> <!-- 203 - Locke Kingdom RPG: Black Fire -->
<software name="lockfire" supported="no"> <!-- 203 - Locke Kingdom RPG: Black Fire -->
<description>Luòkè wángguó-hēi zhī yán</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -165,7 +167,7 @@
</part>
</software>
<software name="lockcard"> <!-- 204 - Locke Kingdom: Card Wars -->
<software name="lockcard" supported="no"> <!-- 204 - Locke Kingdom: Card Wars -->
<description>Luòkè wángguó-kǎ pái zhàn jì</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -177,7 +179,7 @@
</part>
</software>
<software name="armorwr"> <!-- 205 - Armor Warrior -->
<software name="armorwr" supported="no"> <!-- 205 - Armor Warrior -->
<description>Kǎijiǎ yǒngshì dàluàn dòu</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -189,7 +191,7 @@
</part>
</software>
<software name="logicft"> <!-- 301 - Logic Fight -->
<software name="logicft" supported="no"> <!-- 301 - Logic Fight -->
<description>Luójí pīn yī pīn</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -201,7 +203,19 @@
</part>
</software>
<software name="drgnbma"> <!-- 303 - Dragon Ball: The Martial Arts Conference -->
<software name="bigwolf" supported="no"> <!-- 302 - Pleasant goat and big big wolf's comet battle -->
<description>Xǐyángyáng yǔ huītàiláng-juézhàn miē xīng</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
<info name="alt_title" value="喜羊羊与灰太狼-决战咩星"/>
<part name="cart" interface="monon_color_cart">
<dataarea name="rom" size="0x1000000">
<rom name="302.bin" size="0x0800000" crc="3cd4190c" sha1="3d910389e345f2b6ac38fce3571d74fc8cbcfabb" offset="0" />
</dataarea>
</part>
</software>
<software name="drgnbma" supported="no"> <!-- 303 - Dragon Ball: The Martial Arts Conference -->
<description>Lóngzhū-wǔdào dàhuì</description>
<year>2011</year>
<publisher>M&amp;D</publisher>
@ -213,7 +227,7 @@
</part>
</software>
<software name="lolfight"> <!-- 304 - League of Legends: The Ultimate Fight -->
<software name="lolfight" supported="no"> <!-- 304 - League of Legends: The Ultimate Fight -->
<description>Yīngxióng liánméng-zhōngjí gédòu</description>
<year>2011</year>
<publisher>M&amp;D</publisher>

18
hash/sega_beena_cart.xml Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="sega_beena_cart" description="Sega Beena Cartridges">
<!-- you must byteswap ROMs to see text, due to endian? -->
<software name="fpc" supported="no">
<description>Fresh Pretty Cure</description> <!-- is this the correct title? -->
<year>2009</year>
<publisher>Sega</publisher>
<part name="cart" interface="sega_beena_cart">
<dataarea name="rom" size="0x800000">
<rom name="beena.bin" size="0x800000" crc="afa3466c" sha1="b49914f97db95f611489487f558d13d7cceb3299" offset="0" />
</dataarea>
</part>
</software>
</softwarelist>

View File

@ -1,44 +1,49 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Belgian AZERTY 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDLK_WORLD_18 0x31 0xb2 ²
ITEM_ID_1 SDLK_AMPERSAND 0x0a 0x26 &
ITEM_ID_2 SDLK_WORLD_73 0x0b 0xe9 é
ITEM_ID_3 SDLK_QUOTEDBL 0x0c 0x22 "
ITEM_ID_4 SDLK_QUOTE 0x0d 0x27 '
ITEM_ID_5 SDLK_LEFTPAREN 0x0e 0x28 (
ITEM_ID_6 SDLK_WORLD_7 0x0f 0xa7 §
ITEM_ID_7 SDLK_WORLD_72 0x10 0xe8 è
ITEM_ID_8 SDLK_EXCLAIM 0x11 0x21 !
ITEM_ID_9 SDLK_WORLD_71 0x12 0xe7 ç
ITEM_ID_0 SDLK_WORLD_64 0x13 0xe0 à
ITEM_ID_MINUS SDLK_RIGHTPAREN 0x14 0x29 )
ITEM_ID_EQUALS SDLK_MINUS 0x15 0x2d -
ITEM_ID_TILDE SDL_SCANCODE_WORLD_18 ²
ITEM_ID_1 SDL_SCANCODE_AMPERSAND &
ITEM_ID_2 SDL_SCANCODE_WORLD_73 é
ITEM_ID_3 SDL_SCANCODE_QUOTEDBL "
ITEM_ID_4 SDL_SCANCODE_QUOTE '
ITEM_ID_5 SDL_SCANCODE_LEFTPAREN (
ITEM_ID_6 SDL_SCANCODE_WORLD_7 §
ITEM_ID_7 SDL_SCANCODE_WORLD_72 è
ITEM_ID_8 SDL_SCANCODE_EXCLAIM !
ITEM_ID_9 SDL_SCANCODE_WORLD_71 ç
ITEM_ID_0 SDL_SCANCODE_WORLD_64 à
ITEM_ID_MINUS SDL_SCANCODE_RIGHTPAREN )
ITEM_ID_EQUALS SDL_SCANCODE_MINUS -
#
# Row 2
#
ITEM_ID_Q SDLK_a 0x18 0x61 A
ITEM_ID_W SDLK_z 0x19 0x7a Z
ITEM_ID_OPENBRACE SDLK_CARET 0x22 0x5e ^
ITEM_ID_CLOSEBRACE SDLK_DOLLAR 0x23 0x24 $
ITEM_ID_Q SDL_SCANCODE_A A
ITEM_ID_W SDL_SCANCODE_Z Z
ITEM_ID_OPENBRACE SDL_SCANCODE_CARET ^
ITEM_ID_CLOSEBRACE SDL_SCANCODE_DOLLAR $
#
# Row 3
#
ITEM_ID_A SDLK_q 0x26 0x71 Q
ITEM_ID_COLON SDLK_m 0x2f 0x6d M
ITEM_ID_QUOTE SDLK_WORLD_89 0x30 0xf9 ù
ITEM_ID_BACKSLASH SDLK_WORLD_21 0x33 0xb5 µ
ITEM_ID_A SDL_SCANCODE_Q Q
ITEM_ID_COLON SDL_SCANCODE_M M
ITEM_ID_QUOTE SDL_SCANCODE_WORLD_89 ù
ITEM_ID_BACKSLASH SDL_SCANCODE_WORLD_21 µ
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_Z SDLK_w 0x34 0x77 W
ITEM_ID_M SDLK_COMMA 0x3a 0x2c ,
ITEM_ID_COMMA SDLK_SEMICOLON 0x3b 0x3b ;
ITEM_ID_STOP SDLK_COLON 0x3c 0x3a :
ITEM_ID_SLASH SDLK_EQUALS 0x3d 0x3d =
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_Z SDL_SCANCODE_W W
ITEM_ID_M SDL_SCANCODE_COMMA ,
ITEM_ID_COMMA SDL_SCANCODE_SEMICOLON ;
ITEM_ID_STOP SDL_SCANCODE_COLON :
ITEM_ID_SLASH SDL_SCANCODE_EQUALS =
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,3 +1,8 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Brazilian QWERTY 107-keys keyboard (Linux)
#
# The 107-keys Brazilian keyboard has an extra key used to type "/".
@ -10,24 +15,24 @@
#
# Row 1
#
ITEM_ID_TILDE SDLK_QUOTE 0x31 0x27 '
ITEM_ID_TILDE SDL_SCANCODE_QUOTE '
#
# Row 2
#
ITEM_ID_OPENBRACE SDLK_COMPOSE 0x22 0x00 ´
ITEM_ID_CLOSEBRACE SDLK_LEFTBRACKET 0x23 0x00 [
ITEM_ID_OPENBRACE SDL_SCANCODE_COMPOSE ´
ITEM_ID_CLOSEBRACE SDL_SCANCODE_LEFTBRACKET [
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_71 0x2f 0xe7 Ç
ITEM_ID_QUOTE SDLK_COMPOSE 0x30 0x00 ~
ITEM_ID_BACKSLASH SDLK_RIGHTBRACKET 0x33 0x00 ]
ITEM_ID_COLON SDL_SCANCODE_WORLD_71 Ç
ITEM_ID_QUOTE SDL_SCANCODE_COMPOSE ~
ITEM_ID_BACKSLASH SDL_SCANCODE_RIGHTBRACKET ]
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_SLASH SDLK_SEMICOLON 0x3d 0x3b ;
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_SLASH SDL_SCANCODE_SEMICOLON ;
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,29 +1,34 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Swiss QWERTZ 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDLK_WORLD_7 0x31 0xa7 §
ITEM_ID_MINUS SDLK_QUOTE 0x14 0x27 '
ITEM_ID_EQUALS SDLK_CARET 0x15 0x00 ^
ITEM_ID_TILDE SDL_SCANCODE_WORLD_7 §
ITEM_ID_MINUS SDL_SCANCODE_QUOTE '
ITEM_ID_EQUALS SDL_SCANCODE_CARET ^
#
# Row 2
#
ITEM_ID_Y SDLK_z 0x1d 0x7a Z
ITEM_ID_OPENBRACE SDLK_WORLD_92 0x22 0xfc ü
ITEM_ID_CLOSEBRACE SDLK_COMPOSE 0x23 0x00 ¨
ITEM_ID_Y SDL_SCANCODE_Z Z
ITEM_ID_OPENBRACE SDL_SCANCODE_WORLD_92 ü
ITEM_ID_CLOSEBRACE SDL_SCANCODE_COMPOSE ¨
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_86 0x2f 0xf6 ö
ITEM_ID_QUOTE SDLK_WORLD_68 0x30 0xe4 ä
ITEM_ID_BACKSLASH SDLK_DOLLAR 0x33 0x24 $
ITEM_ID_COLON SDL_SCANCODE_WORLD_86 ö
ITEM_ID_QUOTE SDL_SCANCODE_WORLD_68 ä
ITEM_ID_BACKSLASH SDL_SCANCODE_DOLLAR $
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_Z SDLK_y 0x34 0x79 Y
ITEM_ID_SLASH SDLK_MINUS 0x3d 0x2d -
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_Z SDL_SCANCODE_Y Y
ITEM_ID_SLASH SDL_SCANCODE_MINUS -
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,29 +1,31 @@
[SDL2]
# MAME/MESS keymap for German QWERTZ 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDLK_CARET 0x31 0x00 ^
ITEM_ID_MINUS SDLK_WORLD_63 0x14 0xdf ß
ITEM_ID_EQUALS SDLK_COMPOSE 0x15 0x00 ´
ITEM_ID_TILDE SDL_SCANCODE_GRAVE ^
ITEM_ID_MINUS SDL_SCANCODE_MINUS ß
ITEM_ID_EQUALS SDL_SCANCODE_EQUALS ´
#
# Row 2
#
ITEM_ID_Y SDLK_z 0x1d 0x7a Z
ITEM_ID_OPENBRACE SDLK_WORLD_92 0x22 0xfc Ü
ITEM_ID_CLOSEBRACE SDLK_PLUS 0x23 0x2b +
ITEM_ID_Y SDL_SCANCODE_Z Z
ITEM_ID_OPENBRACE SDL_SCANCODE_LEFTBRACKET Ü
ITEM_ID_CLOSEBRACE SDL_SCANCODE_RIGHTBRACKET +
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_86 0x2f 0xf6 Ö
ITEM_ID_QUOTE SDLK_WORLD_68 0x30 0xe4 Ä
ITEM_ID_BACKSLASH SDLK_HASH 0x33 0x23 #
ITEM_ID_COLON SDL_SCANCODE_SEMICOLON Ö
ITEM_ID_QUOTE SDL_SCANCODE_APOSTROPHE Ä
ITEM_ID_BACKSLASH SDL_SCANCODE_BACKSLASH #
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_Z SDLK_y 0x34 0x79 Y
ITEM_ID_SLASH SDLK_MINUS 0x3d 0x2d -
ITEM_ID_BACKSLASH2 SDL_SCANCODE_NONUSBACKSLASH <
ITEM_ID_Z SDL_SCANCODE_Y Y
ITEM_ID_SLASH SDL_SCANCODE_SLASH -
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_RALT ALTGR

View File

@ -1,3 +1,8 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Spanish QWERTY 105-keys keyboard (Linux)
# SDL can tell the difference between the two COMPOSE keys but assigns them the same label
# thus both OPENBRACE and QUOTE appear like "` ´" in the user interface.
@ -5,26 +10,26 @@
#
# Row 1
#
ITEM_ID_TILDE SDLK_WORLD_26 0x31 0xba º
ITEM_ID_MINUS SDLK_QUOTE 0x14 0x27 '
ITEM_ID_EQUALS SDLK_WORLD_1 0x15 0xa1 ¡
ITEM_ID_TILDE SDL_SCANCODE_WORLD_26 º
ITEM_ID_MINUS SDL_SCANCODE_QUOTE '
ITEM_ID_EQUALS SDL_SCANCODE_WORLD_1 ¡
#
# Row 2
#
ITEM_ID_OPENBRACE SDLK_COMPOSE 0x22 0x00 `
ITEM_ID_CLOSEBRACE SDLK_PLUS 0x23 0x00 +
ITEM_ID_OPENBRACE SDL_SCANCODE_COMPOSE `
ITEM_ID_CLOSEBRACE SDL_SCANCODE_PLUS +
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_81 0x2f 0xf1 Ñ
ITEM_ID_QUOTE SDLK_COMPOSE 0x30 0x00 ´
ITEM_ID_BACKSLASH SDLK_WORLD_71 0x33 0x00 Ç
ITEM_ID_COLON SDL_SCANCODE_WORLD_81 Ñ
ITEM_ID_QUOTE SDL_SCANCODE_COMPOSE ´
ITEM_ID_BACKSLASH SDL_SCANCODE_WORLD_71 Ç
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_SLASH SDLK_MINUS 0x3d 0x2d -
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_SLASH SDL_SCANCODE_MINUS -
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,43 +1,48 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for French AZERTY 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDLK_WORLD_18 0x31 0xb2 ²
ITEM_ID_1 SDLK_AMPERSAND 0x0a 0x26 &
ITEM_ID_2 SDLK_WORLD_73 0x0b 0xe9 é
ITEM_ID_3 SDLK_QUOTEDBL 0x0c 0x22 "
ITEM_ID_4 SDLK_QUOTE 0x0d 0x27 '
ITEM_ID_5 SDLK_LEFTPAREN 0x0e 0x28 (
ITEM_ID_6 SDLK_MINUS 0x0f 0x2d -
ITEM_ID_7 SDLK_WORLD_72 0x10 0xe8 è
ITEM_ID_8 SDLK_UNDERSCORE 0x11 0x5f _
ITEM_ID_9 SDLK_WORLD_71 0x12 0xe7 ç
ITEM_ID_0 SDLK_WORLD_64 0x13 0xe0 à
ITEM_ID_MINUS SDLK_RIGHTPAREN 0x14 0x29 )
ITEM_ID_TILDE SDL_SCANCODE_WORLD_18 ²
ITEM_ID_1 SDL_SCANCODE_AMPERSAND &
ITEM_ID_2 SDL_SCANCODE_WORLD_73 é
ITEM_ID_3 SDL_SCANCODE_QUOTEDBL "
ITEM_ID_4 SDL_SCANCODE_QUOTE '
ITEM_ID_5 SDL_SCANCODE_LEFTPAREN (
ITEM_ID_6 SDL_SCANCODE_MINUS -
ITEM_ID_7 SDL_SCANCODE_WORLD_72 è
ITEM_ID_8 SDL_SCANCODE_UNDERSCORE _
ITEM_ID_9 SDL_SCANCODE_WORLD_71 ç
ITEM_ID_0 SDL_SCANCODE_WORLD_64 à
ITEM_ID_MINUS SDL_SCANCODE_RIGHTPAREN )
#
# Row 2
#
ITEM_ID_Q SDLK_a 0x18 0x61 A
ITEM_ID_W SDLK_z 0x19 0x7a Z
ITEM_ID_OPENBRACE SDLK_CARET 0x22 0x00 ^
ITEM_ID_CLOSEBRACE SDLK_DOLLAR 0x23 0x00 $
ITEM_ID_Q SDL_SCANCODE_A A
ITEM_ID_W SDL_SCANCODE_Z Z
ITEM_ID_OPENBRACE SDL_SCANCODE_CARET ^
ITEM_ID_CLOSEBRACE SDL_SCANCODE_DOLLAR $
#
# Row 3
#
ITEM_ID_A SDLK_q 0x26 0x51 Q
ITEM_ID_COLON SDLK_m 0x2f 0x6d M
ITEM_ID_QUOTE SDLK_WORLD_89 0x30 0xf9 ù
ITEM_ID_BACKSLASH SDLK_ASTERISK 0x33 0x2a *
ITEM_ID_A SDL_SCANCODE_Q Q
ITEM_ID_COLON SDL_SCANCODE_M M
ITEM_ID_QUOTE SDL_SCANCODE_WORLD_89 ù
ITEM_ID_BACKSLASH SDL_SCANCODE_ASTERISK *
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_Z SDLK_w 0x34 0x77 W
ITEM_ID_M SDLK_COMMA 0x3a 0x2c ,
ITEM_ID_COMMA SDLK_SEMICOLON 0x3b 0x3b ;
ITEM_ID_STOP SDLK_COLON 0x3c 0x3a :
ITEM_ID_SLASH SDLK_EXCLAIM 0x3d 0x21 !
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_Z SDL_SCANCODE_w W
ITEM_ID_M SDL_SCANCODE_COMMA ,
ITEM_ID_COMMA SDL_SCANCODE_SEMICOLON ;
ITEM_ID_STOP SDL_SCANCODE_COLON :
ITEM_ID_SLASH SDL_SCANCODE_EXCLAIM !
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,15 +1,20 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for French AZERTY keyboard (OSX)
#
#
ITEM_ID_1 SDLK_AMPERSAND 0x12 0x26 &
ITEM_ID_2 SDLK_WORLD_0 0x13 0xe9 é
ITEM_ID_3 SDLK_QUOTEDBL 0x14 0x22 "
ITEM_ID_4 SDLK_QUOTE 0x15 0x27 '
ITEM_ID_5 SDLK_LEFTPAREN 0x17 0x28 (
ITEM_ID_6 SDLK_WORLD_1 0x16 0xa7 §
ITEM_ID_7 SDLK_WORLD_3 0x1a 0xe8 č
ITEM_ID_8 SDLK_EXCLAIM 0x1c 0x21 !
ITEM_ID_9 SDLK_WORLD_2 0x19 0xe7 ç
ITEM_ID_0 SDLK_WORLD_4 0x1d 0xe0 ŕ
ITEM_ID_MINUS SDLK_RIGHTPAREN 0x1b 0x29 )
ITEM_ID_EQUALS SDLK_MINUS 0x18 0x2d -
ITEM_ID_1 SDL_SCANCODE_AMPERSAND &
ITEM_ID_2 SDL_SCANCODE_WORLD_0 <20>
ITEM_ID_3 SDL_SCANCODE_QUOTEDBL "
ITEM_ID_4 SDL_SCANCODE_QUOTE '
ITEM_ID_5 SDL_SCANCODE_LEFTPAREN (
ITEM_ID_6 SDL_SCANCODE_WORLD_1 <20>
ITEM_ID_7 SDL_SCANCODE_WORLD_3 <20>
ITEM_ID_8 SDL_SCANCODE_EXCLAIM !
ITEM_ID_9 SDL_SCANCODE_WORLD_2 <20>
ITEM_ID_0 SDL_SCANCODE_WORLD_4 <20>
ITEM_ID_MINUS SDL_SCANCODE_RIGHTPAREN )
ITEM_ID_EQUALS SDL_SCANCODE_MINUS -

View File

@ -1,20 +1,25 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for British QWERTY 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDLK_BACKQUOTE 0x31 0x60 `
ITEM_ID_TILDE SDL_SCANCODE_BACKQUOTE `
#
# Row 2
#
#
# Row 3
#
ITEM_ID_BACKSLASH SDLK_HASH 0x33 0x23 #
ITEM_ID_BACKSLASH SDL_SCANCODE_HASH #
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_BACKSLASH 0x5e 0x5c \
ITEM_ID_BACKSLASH2 SDL_SCANCODE_BACKSLASH \
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,27 +1,32 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Italian QWERTY 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDLK_BACKSLASH 0x31 0x5c \
ITEM_ID_MINUS SDLK_QUOTE 0x14 0x27 '
ITEM_ID_EQUALS SDLK_WORLD_76 0x15 0xec ì
ITEM_ID_TILDE SDL_SCANCODE_BACKSLASH \
ITEM_ID_MINUS SDL_SCANCODE_QUOTE '
ITEM_ID_EQUALS SDL_SCANCODE_WORLD_76 ì
#
# Row 2
#
ITEM_ID_OPENBRACE SDLK_WORLD_72 0x22 0xe8 è
ITEM_ID_CLOSEBRACE SDLK_PLUS 0x23 0x2b +
ITEM_ID_OPENBRACE SDL_SCANCODE_WORLD_72 è
ITEM_ID_CLOSEBRACE SDL_SCANCODE_PLUS +
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_82 0x2f 0xf2 ò
ITEM_ID_QUOTE SDLK_WORLD_64 0x30 0xe0 à
ITEM_ID_BACKSLASH SDLK_WORLD_89 0x33 0xf9 ù
ITEM_ID_COLON SDL_SCANCODE_WORLD_82 ò
ITEM_ID_QUOTE SDL_SCANCODE_WORLD_64 à
ITEM_ID_BACKSLASH SDL_SCANCODE_WORLD_89 ù
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_SLASH SDLK_MINUS 0x3d 0x2d -
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_SLASH SDL_SCANCODE_MINUS -
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,3 +1,8 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Portuguese QWERTY 105-keys keyboard (Linux)
# SDL can tell the difference between the two COMPOSE keys but assigns them the same label
# thus both CLOSEBRACE and BACKSLASH appear like "´ ~" in the user interface.
@ -5,26 +10,26 @@
#
# Row 1
#
ITEM_ID_TILDE SDLK_BACKSLASH 0x31 0x5c \
ITEM_ID_MINUS SDLK_QUOTE 0x14 0x27 '
ITEM_ID_EQUALS SDLK_WORLD_11 0x15 0xab «
ITEM_ID_TILDE SDL_SCANCODE_BACKSLASH \
ITEM_ID_MINUS SDL_SCANCODE_QUOTE '
ITEM_ID_EQUALS SDL_SCANCODE_WORLD_11 «
#
# Row 2
#
ITEM_ID_OPENBRACE SDLK_PLUS 0x22 0x2b +
ITEM_ID_CLOSEBRACE SDLK_COMPOSE 0x23 0x00 ´
ITEM_ID_OPENBRACE SDL_SCANCODE_PLUS +
ITEM_ID_CLOSEBRACE SDL_SCANCODE_COMPOSE ´
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_71 0x2f 0xe7 Ç
ITEM_ID_QUOTE SDLK_WORLD_26 0x30 0xba º
ITEM_ID_BACKSLASH SDLK_COMPOSE 0x33 0x00 ~
ITEM_ID_COLON SDL_SCANCODE_WORLD_71 Ç
ITEM_ID_QUOTE SDL_SCANCODE_WORLD_26 º
ITEM_ID_BACKSLASH SDL_SCANCODE_COMPOSE ~
#
# Row 4
#
ITEM_ID_BACKSLASH2 SDLK_LESS 0x5e 0x3c <
ITEM_ID_SLASH SDLK_MINUS 0x3d 0x2d -
ITEM_ID_BACKSLASH2 SDL_SCANCODE_LESS <
ITEM_ID_SLASH SDL_SCANCODE_MINUS -
#
# Row 5
#
ITEM_ID_RALT SDLK_MODE 0x71 0x00 ALTGR
ITEM_ID_RALT SDL_SCANCODE_MODE ALTGR

View File

@ -1,23 +1,28 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Swedish/Finnish QWERTY 105-keys keyboard (Linux)
#
# Row 1
#
ITEM_ID_TILDE SDLK_LESS 0x32 0x3c <
ITEM_ID_MINUS SDLK_PLUS 0x1b 0x2b +
ITEM_ID_EQUALS SDLK_WORLD_1 0x18 0x00
ITEM_ID_TILDE SDL_SCANCODE_LESS <
ITEM_ID_MINUS SDL_SCANCODE_PLUS +
ITEM_ID_EQUALS SDL_SCANCODE_WORLD_1 0x00
#
# Row 2
#
ITEM_ID_OPENBRACE SDLK_WORLD_3 0x21 0xe5 å
ITEM_ID_CLOSEBRACE SDLK_WORLD_2 0x1e 0x00
ITEM_ID_OPENBRACE SDL_SCANCODE_WORLD_3 å
ITEM_ID_CLOSEBRACE SDL_SCANCODE_WORLD_2
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_5 0x29 0xf6 ö
ITEM_ID_QUOTE SDLK_WORLD_4 0x27 0xe4 ä
ITEM_ID_BACKSLASH2 SDLK_QUOTE 0x2a 0x27 '
ITEM_ID_COLON SDL_SCANCODE_WORLD_5 ö
ITEM_ID_QUOTE SDL_SCANCODE_WORLD_4 ä
ITEM_ID_BACKSLASH2 SDL_SCANCODE_QUOTE '
#
# Row 4
#
ITEM_ID_BACKSLASH SDLK_WORLD_0 0x0a 0xa7 §
ITEM_ID_SLASH SDLK_MINUS 0x2c 0x2d -
ITEM_ID_BACKSLASH SDL_SCANCODE_WORLD_0 §
ITEM_ID_SLASH SDL_SCANCODE_MINUS -

View File

@ -1,23 +1,28 @@
#
# FIXME: This file produces errors and needs to be fixed.
#
[SDL2]
# MAME/MESS keymap for Swedish/Finnish QWERTY compact keyboard (OSX)
#
# Row 1
#
ITEM_ID_TILDE SDLK_WORLD_0 0x0a 0xa7 §
ITEM_ID_MINUS SDLK_PLUS 0x1b 0x2b +
ITEM_ID_EQUALS SDLK_WORLD_1 0x18 0x00
ITEM_ID_TILDE SDL_SCANCODE_WORLD_0 §
ITEM_ID_MINUS SDL_SCANCODE_PLUS +
ITEM_ID_EQUALS SDL_SCANCODE_WORLD_1 0x00
#
# Row 2
#
ITEM_ID_OPENBRACE SDLK_WORLD_3 0x21 0xe5 å
ITEM_ID_CLOSEBRACE SDLK_WORLD_2 0x1e 0x00
ITEM_ID_OPENBRACE SDL_SCANCODE_WORLD_3 å
ITEM_ID_CLOSEBRACE SDL_SCANCODE_WORLD_2
#
# Row 3
#
ITEM_ID_COLON SDLK_WORLD_5 0x29 0xf6 ö
ITEM_ID_QUOTE SDLK_WORLD_4 0x27 0xe4 ä
ITEM_ID_BACKSLASH2 SDLK_QUOTE 0x2a 0x27 '
ITEM_ID_COLON SDL_SCANCODE_WORLD_5 ö
ITEM_ID_QUOTE SDL_SCANCODE_WORLD_4 ä
ITEM_ID_BACKSLASH2 SDL_SCANCODE_QUOTE '
#
# Row 4
#
ITEM_ID_BACKSLASH SDLK_LESS 0x32 0x3c <
ITEM_ID_SLASH SDLK_MINUS 0x2c 0x2d -
ITEM_ID_BACKSLASH SDL_SCANCODE_LESS <
ITEM_ID_SLASH SDL_SCANCODE_MINUS -

View File

@ -3025,6 +3025,7 @@ files {
MAME_DIR .. "src/mame/includes/megadriv_rad.h",
MAME_DIR .. "src/mame/drivers/segapico.cpp",
MAME_DIR .. "src/mame/drivers/sega_sawatte.cpp",
MAME_DIR .. "src/mame/drivers/sega_beena.cpp",
MAME_DIR .. "src/mame/drivers/segapm.cpp",
MAME_DIR .. "src/mame/drivers/sg1000.cpp",
MAME_DIR .. "src/mame/includes/sg1000.h",

View File

@ -13,16 +13,6 @@
#pragma once
#define MCFG_HP80_IO_SLOT_ADD(_tag , _idx) \
MCFG_DEVICE_ADD(_tag, HP80_IO_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(hp80_io_slot_devices, nullptr, false) \
downcast<hp80_io_slot_device &>(*device).set_slot_no(_idx);
#define MCFG_HP80_IO_IRL_CB(_devcb) \
downcast<hp80_io_slot_device &>(*device).set_irl_cb_func(DEVCB_##_devcb);
#define MCFG_HP80_IO_HALT_CB(_devcb) \
downcast<hp80_io_slot_device &>(*device).set_halt_cb_func(DEVCB_##_devcb);
#define HP80_IO_FIRST_SC 3 // Lowest SC used by I/O cards
@ -38,11 +28,22 @@
PORT_CONFSETTING(6 , "9")\
PORT_CONFSETTING(7 , "10")
void hp80_io_slot_devices(device_slot_interface &device);
class hp80_io_slot_device : public device_t,
public device_slot_interface
{
public:
// construction/destruction
hp80_io_slot_device(machine_config const &mconfig, char const *tag, device_t *owner)
: hp80_io_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
hp80_io_slot_devices(*this);
set_default_option(nullptr);
set_fixed(false);
}
hp80_io_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~hp80_io_slot_device();
@ -53,8 +54,8 @@ public:
virtual void device_start() override;
// Callback setups
template <class Object> devcb_base &set_irl_cb_func(Object &&cb) { return m_irl_cb_func.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_halt_cb_func(Object &&cb) { return m_halt_cb_func.set_callback(std::forward<Object>(cb)); }
auto irl_cb() { return m_irl_cb_func.bind(); }
auto halt_cb() { return m_halt_cb_func.bind(); }
// SC getter
uint8_t get_sc() const;
@ -102,6 +103,4 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(HP80_IO_SLOT, hp80_io_slot_device)
void hp80_io_slot_devices(device_slot_interface &device);
#endif // MAME_BUS_HP80_IO_HP80_IO_H

View File

@ -18,6 +18,8 @@
// Size of optional ROMs (8k)
static constexpr offs_t HP80_OPTROM_SIZE = 0x2000;
void hp80_optrom_slot_devices(device_slot_interface &device);
class hp80_optrom_cart_device : public device_t,
public device_slot_card_interface
{
@ -38,6 +40,15 @@ class hp80_optrom_slot_device : public device_t,
{
public:
// construction/destruction
hp80_optrom_slot_device(machine_config const &mconfig, char const *tag, device_t *owner)
: hp80_optrom_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
hp80_optrom_slot_devices(*this);
set_default_option(nullptr);
set_fixed(false);
}
hp80_optrom_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~hp80_optrom_slot_device();
@ -72,6 +83,4 @@ protected:
DECLARE_DEVICE_TYPE(HP80_OPTROM_SLOT, hp80_optrom_slot_device)
DECLARE_DEVICE_TYPE(HP80_OPTROM_CART, hp80_optrom_cart_device)
void hp80_optrom_slot_devices(device_slot_interface &device);
#endif // MAME_BUS_HP80_OPTROMS_HP80_OPTROM_H

View File

@ -114,20 +114,4 @@ private:
// device type definition
DECLARE_DEVICE_TYPE(PCI_BUS, pci_bus_device)
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_PCI_BUS_ADD(_tag, _busnum) \
MCFG_DEVICE_ADD(_tag, PCI_BUS, 0) \
downcast<pci_bus_device *>(device)->set_busnum(_busnum);
#define MCFG_PCI_BUS_DEVICE(_tag, _slot_intf, _def_slot, _fixed) \
MCFG_DEVICE_ADD(_tag, PCI_CONNECTOR, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
#define MCFG_PCI_BUS_SIBLING(_father_tag) \
downcast<pci_bus_device *>(device)->set_father(_father_tag);
#endif // MAME_BUS_LPCI_PCI_H

View File

@ -172,7 +172,8 @@ static void ggenie_sub_cart(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
MACHINE_CONFIG_START(md_rom_ggenie_device::device_add_mconfig)
MCFG_MD_CARTRIDGE_ADD("subslot", ggenie_sub_cart, nullptr)
MCFG_MD_CARTRIDGE_NOT_MANDATORY
MACHINE_CONFIG_END
void md_rom_ggenie_device::device_add_mconfig(machine_config &config)
{
MD_CART_SLOT(config, m_exp, ggenie_sub_cart, nullptr);
m_exp->set_must_be_loaded(false);
}

View File

@ -211,6 +211,16 @@ class md_cart_slot_device : public base_md_cart_slot_device
{
public:
// construction/destruction
template <typename T>
md_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
: md_cart_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
}
md_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual const char *image_interface() const override { return "megadriv_cart"; }
virtual const char *file_extensions() const override { return "smd,bin,md,gen"; }
@ -269,12 +279,4 @@ DECLARE_DEVICE_TYPE(COPERA_CART_SLOT, copera_cart_slot_device)
#define MDSLOT_ROM_REGION_TAG ":cart:rom"
#define MCFG_MD_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
MCFG_DEVICE_ADD(_tag, MD_CART_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
#define MCFG_MD_CARTRIDGE_NOT_MANDATORY \
static_cast<md_cart_slot_device *>(device)->set_must_be_loaded(false);
#endif // MAME_BUS_MEGADRIVE_MD_SLOT_H

View File

@ -79,7 +79,8 @@ static void sk_sub_cart(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
MACHINE_CONFIG_START(md_rom_sk_device::device_add_mconfig)
MCFG_MD_CARTRIDGE_ADD("subslot", sk_sub_cart, nullptr)
MCFG_MD_CARTRIDGE_NOT_MANDATORY
MACHINE_CONFIG_END
void md_rom_sk_device::device_add_mconfig(machine_config &config)
{
MD_CART_SLOT(config, m_exp, sk_sub_cart, nullptr);
m_exp->set_must_be_loaded(false);
}

View File

@ -325,6 +325,7 @@ static void ade_cart(device_slot_interface &device)
}
MACHINE_CONFIG_START(nes_aladdin_device::device_add_mconfig)
MCFG_ALADDIN_MINICART_ADD("ade_slot", ade_cart)
MACHINE_CONFIG_END
void nes_aladdin_device::device_add_mconfig(machine_config &config)
{
NES_ALADDIN_SLOT(config, m_subslot, ade_cart);
}

View File

@ -50,6 +50,16 @@ class nes_aladdin_slot_device : public device_t,
friend class nes_aladdin_device;
public:
// construction/destruction
template <typename T>
nes_aladdin_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts)
: nes_aladdin_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
opts(*this);
set_default_option(nullptr);
set_fixed(false);
}
nes_aladdin_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~nes_aladdin_slot_device();
@ -83,11 +93,6 @@ protected:
DECLARE_DEVICE_TYPE(NES_ALADDIN_SLOT, nes_aladdin_slot_device)
#define MCFG_ALADDIN_MINICART_ADD(_tag, _slot_intf) \
MCFG_DEVICE_ADD(_tag, NES_ALADDIN_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
//----------------------------------
//
// Aladdin Minicart implementation

View File

@ -296,6 +296,7 @@ static void karaoke_studio_cart(device_slot_interface &device)
}
MACHINE_CONFIG_START(nes_karaokestudio_device::device_add_mconfig)
MCFG_KSTUDIO_MINICART_ADD("exp_slot", karaoke_studio_cart)
MACHINE_CONFIG_END
void nes_karaokestudio_device::device_add_mconfig(machine_config &config)
{
NES_KSEXPANSION_SLOT(config, m_subslot, karaoke_studio_cart);
}

View File

@ -49,6 +49,16 @@ class nes_kstudio_slot_device : public device_t,
friend class nes_karaokestudio_device;
public:
// construction/destruction
template <typename T>
nes_kstudio_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts)
: nes_kstudio_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
opts(*this);
set_default_option(nullptr);
set_fixed(false);
}
nes_kstudio_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~nes_kstudio_slot_device();
@ -82,11 +92,6 @@ protected:
DECLARE_DEVICE_TYPE(NES_KSEXPANSION_SLOT, nes_kstudio_slot_device)
#define MCFG_KSTUDIO_MINICART_ADD(_tag, _slot_intf) \
MCFG_DEVICE_ADD(_tag, NES_KSEXPANSION_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
//-----------------------------------------------
//
// Karaoke Studio Expansion cart implementation

View File

@ -429,9 +429,4 @@ DECLARE_DEVICE_TYPE(NES_CART_SLOT, nes_cart_slot_device)
#define NESSLOT_PRGROM_REGION_TAG ":cart:prg_rom"
#define NESSLOT_CHRROM_REGION_TAG ":cart:chr_rom"
#define MCFG_NES_CARTRIDGE_NOT_MANDATORY \
static_cast<nes_cart_slot_device *>(device)->set_must_be_loaded(false);
#endif // MAME_BUS_NES_NES_SLOT_H

View File

@ -285,9 +285,10 @@ static void ntb_cart(device_slot_interface &device)
// device_add_mconfig - add device configuration
//-------------------------------------------------
MACHINE_CONFIG_START(nes_sunsoft_dcs_device::device_add_mconfig)
MCFG_NTB_MINICART_ADD("ntb_slot", ntb_cart)
MACHINE_CONFIG_END
void nes_sunsoft_dcs_device::device_add_mconfig(machine_config &config)
{
NES_NTB_SLOT(config, m_subslot, ntb_cart);
}
//-------------------------------------------------

View File

@ -46,6 +46,16 @@ class nes_ntb_slot_device : public device_t,
friend class nes_sunsoft_dcs_device;
public:
// construction/destruction
template <typename T>
nes_ntb_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts)
: nes_ntb_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
opts(*this);
set_default_option(nullptr);
set_fixed(false);
}
nes_ntb_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~nes_ntb_slot_device();
@ -78,11 +88,6 @@ protected:
DECLARE_DEVICE_TYPE(NES_NTB_SLOT, nes_ntb_slot_device)
#define MCFG_NTB_MINICART_ADD(_tag, _slot_intf) \
MCFG_DEVICE_ADD(_tag, NES_NTB_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, nullptr, false)
//-----------------------------------------------
//
// Nantettate!! Baseball Minicart implementation

View File

@ -65,6 +65,17 @@ class pce_cart_slot_device : public device_t,
{
public:
// construction/destruction
template <typename T>
pce_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt, const char *interface)
: pce_cart_slot_device(mconfig, tag, owner, (uint32_t)0)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
set_intf(interface);
}
pce_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual ~pce_cart_slot_device();
@ -115,15 +126,4 @@ DECLARE_DEVICE_TYPE(PCE_CART_SLOT, pce_cart_slot_device)
#define PCESLOT_ROM_REGION_TAG ":cart:rom"
#define MCFG_PCE_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
MCFG_DEVICE_ADD(_tag, PCE_CART_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
static_cast<pce_cart_slot_device *>(device)->set_intf("pce_cart");
#define MCFG_TG16_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
MCFG_DEVICE_ADD(_tag, PCE_CART_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
static_cast<pce_cart_slot_device *>(device)->set_intf("tg16_cart");
#endif // MAME_BUS_PCE_PCE_SLOT_H

View File

@ -175,6 +175,8 @@ uint8_t hp_hybrid_cpu_device::pa_r() const
hp_hybrid_cpu_device::hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t addrwidth)
: cpu_device(mconfig, type, tag, owner, clock)
, m_pa_changed_func(*this)
, m_opcode_func(*this)
, m_stm_func(*this)
, m_addr_mask((1U << addrwidth) - 1)
, m_relative_mode(true)
, m_r_cycles(DEF_MEM_R_CYCLES)
@ -241,6 +243,11 @@ void hp_hybrid_cpu_device::device_start()
set_icountptr(m_icount);
m_pa_changed_func.resolve_safe();
m_opcode_func.resolve();
m_stm_func.resolve();
// Cache active state of m_stm_func & m_opcode_func
m_opcode_func_defd = bool(m_opcode_func);
m_stm_func_defd = bool(m_stm_func);
}
void hp_hybrid_cpu_device::device_reset()
@ -260,6 +267,7 @@ void hp_hybrid_cpu_device::device_reset()
m_dmapa = 0;
m_dmama = 0;
m_dmac = 0;
m_curr_cycle = 0;
m_forced_bsc_25 = m_boot_mode;
m_last_pa = ~0;
@ -312,7 +320,7 @@ uint16_t hp_hybrid_cpu_device::execute_one(uint16_t opcode)
}
// Indirect addressing in EXE instruction seems to use AEC case A instead of case C
// (because it's an opcode fetch)
return RM(add_mae(AEC_CASE_A , fetch_addr));
return fetch_at(add_mae(AEC_CASE_A , fetch_addr));
} else {
uint16_t next_P;
if (!execute_one_bpc(opcode , next_P) &&
@ -952,6 +960,11 @@ uint16_t hp_hybrid_cpu_device::RM(uint32_t addr)
// Any access to internal registers removes forcing of BSC 2x
m_forced_bsc_25 = false;
if (m_stm_func_defd) {
m_stm_func(m_curr_cycle | CYCLE_RAL_MASK | CYCLE_RD_MASK);
m_curr_cycle = 0;
}
// Memory mapped BPC registers
uint16_t tmp;
switch (addr_wo_bsc) {
@ -1016,6 +1029,10 @@ uint16_t hp_hybrid_cpu_device::RM(uint32_t addr)
return tmp;
} else {
m_icount -= m_r_cycles;
if (m_stm_func_defd) {
m_stm_func(m_curr_cycle | CYCLE_RD_MASK);
m_curr_cycle = 0;
}
return m_cache->read_word(addr);
}
}
@ -1065,6 +1082,11 @@ void hp_hybrid_cpu_device::WM(uint32_t addr , uint16_t v)
// Any access to internal registers removes forcing of BSC 2x
m_forced_bsc_25 = false;
if (m_stm_func_defd) {
m_stm_func(m_curr_cycle | CYCLE_RAL_MASK | CYCLE_WR_MASK);
m_curr_cycle = 0;
}
// Memory mapped BPC registers
switch (addr_wo_bsc) {
case HP_REG_A_ADDR:
@ -1130,6 +1152,10 @@ void hp_hybrid_cpu_device::WM(uint32_t addr , uint16_t v)
m_icount -= REGISTER_RW_CYCLES;
} else {
m_icount -= m_w_cycles;
if (m_stm_func_defd) {
m_stm_func(m_curr_cycle | CYCLE_WR_MASK);
m_curr_cycle = 0;
}
m_program->write_word(addr , v);
}
}
@ -1168,7 +1194,17 @@ bool hp_hybrid_cpu_device::write_emc_reg(uint16_t addr , uint16_t v)
uint16_t hp_hybrid_cpu_device::fetch()
{
m_genpc = add_mae(AEC_CASE_A , m_reg_P);
return RM(m_genpc);
return fetch_at(m_genpc);
}
uint16_t hp_hybrid_cpu_device::fetch_at(uint32_t addr)
{
m_curr_cycle |= CYCLE_IFETCH_MASK;
uint16_t opcode = RM(addr);
if (m_opcode_func_defd) {
m_opcode_func(opcode);
}
return opcode;
}
uint16_t hp_hybrid_cpu_device::get_indirect_target(uint32_t addr)
@ -1586,6 +1622,10 @@ bool hp_5061_3011_cpu_device::execute_no_bpc(uint16_t opcode , uint16_t& next_pc
// 16 bits units.
WM(tmp_addr >> 1 , tmp);
} else {
if (m_stm_func_defd) {
m_stm_func(m_curr_cycle | CYCLE_WR_MASK);
m_curr_cycle = 0;
}
// Extend address, form byte address
uint16_t mask = BIT(tmp_addr , 0) ? 0x00ff : 0xff00;
tmp_addr = add_mae(AEC_CASE_C , tmp_addr >> 1);
@ -1674,6 +1714,7 @@ void hp_5061_3011_cpu_device::handle_dma()
bool tc = BIT(--m_dmac , 15) != 0;
uint16_t tmp;
m_curr_cycle |= CYCLE_DMA_MASK;
// Timing here assumes that DMA transfers are isolated and not done in bursts
if (BIT(m_flags , HPHYBRID_DMADIR_BIT)) {
// "Outward" DMA: memory -> peripheral
@ -1955,6 +1996,10 @@ bool hp_09825_67907_cpu_device::execute_no_bpc(uint16_t opcode , uint16_t& next_
// 16 bits units.
WM(tmp_addr , tmp);
} else {
if (m_stm_func_defd) {
m_stm_func(m_curr_cycle | CYCLE_WR_MASK);
m_curr_cycle = 0;
}
uint16_t mask = BIT(*ptr_reg , 15) ? 0xff00 : 0x00ff;
m_program->write_word(tmp_addr , tmp , mask);
m_icount -= m_w_cycles;
@ -2037,6 +2082,7 @@ void hp_09825_67907_cpu_device::handle_dma()
uint16_t tmp;
// Timing here assumes that DMA transfers are isolated and not done in bursts
m_curr_cycle |= CYCLE_DMA_MASK;
if (BIT(m_dmama , 15)) {
// "Outward" DMA: memory -> peripheral
tmp = RM(AEC_CASE_D , m_dmama);

View File

@ -64,6 +64,29 @@ public:
void set_relative_mode(bool rela) { m_relative_mode = rela; }
void set_rw_cycles(unsigned read_cycles , unsigned write_cycles) { m_r_cycles = read_cycles; m_w_cycles = write_cycles; }
// Possible combinations:
// 00 No r/w cycle in progress
// 01 Non-ifetch rd cycle
// 05 Ifetch rd cycle
// 09 DMA rd cycle
// 02 Wr cycle
// 0a DMA wr cycle
//
// CYCLE_RAL_MASK is set when access is into register space [0..1f]
enum : uint8_t {
CYCLE_RD_MASK = 0x01,
CYCLE_WR_MASK = 0x02,
CYCLE_IFETCH_MASK = 0x04,
CYCLE_DMA_MASK = 0x08,
CYCLE_RAL_MASK = 0x10
};
// Called at start of each memory access
auto stm_cb() { return m_stm_func.bind(); }
// Tap into fetched opcodes
auto opcode_cb() { return m_opcode_func.bind(); }
protected:
hp_hybrid_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t addrwidth);
@ -123,6 +146,7 @@ protected:
void WIO(uint8_t pa , uint8_t ic , uint16_t v);
uint16_t fetch();
uint16_t fetch_at(uint32_t addr);
virtual uint16_t get_indirect_target(uint32_t addr);
virtual void enter_isr();
virtual void handle_dma() = 0;
@ -133,6 +157,10 @@ protected:
devcb_write8 m_pa_changed_func;
uint8_t m_last_pa;
bool m_opcode_func_defd;
devcb_write16 m_opcode_func;
bool m_stm_func_defd;
devcb_write8 m_stm_func;
int m_icount;
uint32_t m_addr_mask;
@ -159,6 +187,8 @@ protected:
uint16_t m_dmac; // DMA counter
uint16_t m_reg_I; // Instruction register
uint32_t m_genpc; // Full PC
uint8_t m_curr_cycle; // Current cycle type
// EMC registers
uint16_t m_reg_ar2[ 4 ]; // AR2 register
uint16_t m_reg_se; // SE register (4 bits)

View File

@ -1793,8 +1793,12 @@ void r4000_base_device::cp1_execute(u32 const op)
break;
case 0x05: // ABS.S
if ((SR & SR_FR) || !(op & ODD_REGS))
{
if (f32_lt(float32_t{ u32(m_f[FSREG]) }, float32_t{ 0 }))
cp1_set(FDREG, f32_mul(float32_t{ u32(m_f[FSREG]) }, i32_to_f32(-1)).v);
else
m_f[FDREG] = m_f[FSREG];
}
break;
case 0x06: // MOV.S
if ((SR & SR_FR) || !(op & ODD_REGS))
@ -2077,8 +2081,12 @@ void r4000_base_device::cp1_execute(u32 const op)
break;
case 0x05: // ABS.D
if ((SR & SR_FR) || !(op & ODD_REGS))
{
if (f64_lt(float64_t{ m_f[FSREG] }, float64_t{ 0 }))
cp1_set(FDREG, f64_mul(float64_t{ m_f[FSREG] }, i32_to_f64(-1)).v);
else
m_f[FDREG] = m_f[FSREG];
}
break;
case 0x06: // MOV.D
if ((SR & SR_FR) || !(op & ODD_REGS))

View File

@ -88,12 +88,12 @@ PAL frame timing
#define BOTTOM_BORDER 4
#define BOTTOM_BLANKING 5
static constexpr uint8_t ntsc_192[6] = { 3, 13, 27, 192, 24, 3 };
static constexpr uint8_t ntsc_224[6] = { 3, 13, 11, 224, 8, 3 };
static constexpr uint8_t ntsc_240[6] = { 3, 13, 3, 240, 0, 3 };
static constexpr uint8_t pal_192[6] = { 3, 13, 54, 192, 48, 3 };
static constexpr uint8_t pal_224[6] = { 3, 13, 38, 224, 32, 3 };
static constexpr uint8_t pal_240[6] = { 3, 13, 30, 240, 24, 3 };
static constexpr u8 ntsc_192[6] = { 3, 13, 27, 192, 24, 3 };
static constexpr u8 ntsc_224[6] = { 3, 13, 11, 224, 8, 3 };
static constexpr u8 ntsc_240[6] = { 3, 13, 3, 240, 0, 3 };
static constexpr u8 pal_192[6] = { 3, 13, 54, 192, 48, 3 };
static constexpr u8 pal_224[6] = { 3, 13, 38, 224, 32, 3 };
static constexpr u8 pal_240[6] = { 3, 13, 30, 240, 24, 3 };
#define VINT_HPOS 0
#define VINT_FLAG_HPOS 1
@ -104,8 +104,8 @@ static constexpr uint8_t pal_240[6] = { 3, 13, 30, 240, 24, 3 };
#define SPROVR_HPOS 6
#define SPRCOL_BASEHPOS 7
static constexpr uint8_t line_315_5124[8] = { 24, 24, 26, 28 /* not verified */, 21, 23, 24, 59 };
static constexpr uint8_t line_315_5377[8] = { 26, 26, 27, 28 /* not verified */, 24, 28, 26, 62 };
static constexpr u8 line_315_5124[8] = { 24, 24, 26, 28 /* not verified */, 21, 23, 24, 59 };
static constexpr u8 line_315_5377[8] = { 26, 26, 27, 28 /* not verified */, 24, 28, 26, 62 };
#define DISPLAY_DISABLED_HPOS 24 /* not verified, works if above 18 (for 'pstrike2') and below 25 (for 'fantdizzy') */
#define DISPLAY_CB_HPOS 2 /* fixes 'roadrash' (SMS game) title scrolling, due to line counter reload timing */
@ -168,16 +168,17 @@ void sega315_5124_device::sega315_5124(address_map &map)
}
sega315_5124_device::sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
sega315_5124_device::sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sega315_5124_device(mconfig, SEGA315_5124, tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0x00, 0x0f, 4, 8, line_315_5124)
{
}
sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing)
sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing)
: device_t(mconfig, type, tag, owner, clock)
, device_memory_interface(mconfig, *this)
, device_video_interface(mconfig, *this)
, device_mixer_interface(mconfig, *this, 2)
, m_cram_size(cram_size)
, m_line_timing(line_timing)
, m_palette_offset(palette_offset)
@ -190,30 +191,31 @@ sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_t
, m_pause_cb(*this)
, m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, address_map_constructor(), address_map_constructor(FUNC(sega315_5124_device::sega315_5124), this))
, m_palette(*this, "palette")
, m_snsnd(*this, "snsnd")
{
}
sega315_5246_device::sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
sega315_5246_device::sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sega315_5124_device(mconfig, SEGA315_5246, tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0x00, 0x0f, 8, 8, line_315_5124)
{
}
sega315_5246_device::sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing)
sega315_5246_device::sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing)
: sega315_5124_device(mconfig, type, tag, owner, clock, cram_size, palette_offset, reg_num_mask, max_sprite_zoom_hcount, max_sprite_zoom_vcount, line_timing)
{
}
// Embedded mode 4 support of the 315-5313 VDP (see 315_5313.cpp), used by Sega Genesis/Mega Drive
sega315_5313_mode4_device::sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing)
sega315_5313_mode4_device::sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing)
: sega315_5246_device(mconfig, type, tag, owner, clock, cram_size, palette_offset, reg_num_mask, max_sprite_zoom_hcount, max_sprite_zoom_vcount, line_timing)
{
}
sega315_5377_device::sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
sega315_5377_device::sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sega315_5246_device(mconfig, SEGA315_5377, tag, owner, clock, SEGA315_5377_CRAM_SIZE, 0x10, 0x0f, 8, 8, line_315_5377)
{
}
@ -328,7 +330,7 @@ void sega315_5124_device::set_frame_timing()
}
READ8_MEMBER( sega315_5124_device::vcount_read )
u8 sega315_5124_device::vcount_read()
{
const int active_scr_start = m_frame_timing[VERTICAL_SYNC] + m_frame_timing[TOP_BLANKING] + m_frame_timing[TOP_BORDER];
int vpos = screen().vpos();
@ -344,7 +346,7 @@ READ8_MEMBER( sega315_5124_device::vcount_read )
}
READ8_MEMBER( sega315_5124_device::hcount_read )
u8 sega315_5124_device::hcount_read()
{
return m_hcounter;
}
@ -592,10 +594,10 @@ void sega315_5124_device::process_line_timer()
}
READ8_MEMBER( sega315_5124_device::data_read )
u8 sega315_5124_device::data_read()
{
/* Return data buffer contents */
const uint8_t temp = m_buffer;
const u8 temp = m_buffer;
/* Clear pending write flag */
m_pending_control_write = false;
@ -653,9 +655,9 @@ void sega315_5124_device::check_pending_flags()
}
READ8_MEMBER( sega315_5124_device::control_read )
u8 sega315_5124_device::control_read()
{
uint8_t temp;
u8 temp;
check_pending_flags();
temp = m_status;
@ -667,7 +669,7 @@ READ8_MEMBER( sega315_5124_device::control_read )
/* Clear status flags */
m_hint_occurred = false;
m_status = uint8_t(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
m_status = u8(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
if (m_irq_state == 1)
{
@ -682,7 +684,7 @@ READ8_MEMBER( sega315_5124_device::control_read )
}
void sega315_5124_device::write_memory(uint8_t data)
void sega315_5124_device::write_memory(u8 data)
{
switch (m_addrmode)
{
@ -702,7 +704,7 @@ void sega315_5124_device::write_memory(uint8_t data)
}
void sega315_5313_mode4_device::write_memory(uint8_t data)
void sega315_5313_mode4_device::write_memory(u8 data)
{
switch (m_addrmode)
{
@ -720,7 +722,7 @@ void sega315_5313_mode4_device::write_memory(uint8_t data)
}
WRITE8_MEMBER( sega315_5124_device::data_write )
void sega315_5124_device::data_write(u8 data)
{
/* Clear pending write flag */
m_pending_control_write = false;
@ -730,7 +732,7 @@ WRITE8_MEMBER( sega315_5124_device::data_write )
}
void sega315_5124_device::load_vram_addr(uint8_t data)
void sega315_5124_device::load_vram_addr(u8 data)
{
// Seems like the latched data is passed straight through
// to the address register when in the middle of doing a command.
@ -742,7 +744,7 @@ void sega315_5124_device::load_vram_addr(uint8_t data)
}
void sega315_5313_mode4_device::load_vram_addr(uint8_t data)
void sega315_5313_mode4_device::load_vram_addr(u8 data)
{
if (m_pending_control_write)
m_control_write_data_latch = data;
@ -751,7 +753,7 @@ void sega315_5313_mode4_device::load_vram_addr(uint8_t data)
}
WRITE8_MEMBER( sega315_5124_device::control_write )
void sega315_5124_device::control_write(u8 data)
{
if (!m_pending_control_write)
{
@ -859,13 +861,13 @@ WRITE8_MEMBER( sega315_5124_device::control_write )
}
uint16_t sega315_5124_device::name_table_row_mode4(int row)
u16 sega315_5124_device::name_table_row_mode4(int row)
{
return ((row >> 3) << 6) & (((m_reg[0x02] & 0x01) << 10) | ((m_reg[0x04] & 0x03) << 11) | 0x23ff);
}
uint16_t sega315_5246_device::name_table_row_mode4(int row)
u16 sega315_5246_device::name_table_row_mode4(int row)
{
return (row >> 3) << 6;
}
@ -897,7 +899,7 @@ void sega315_5124_device::draw_leftmost_pixels_mode4(int *line_buffer, int *prio
// Load data of bit plane 1 for the selected tile.
const int tmp_bit_plane_1 = space().read_byte((tile_selected << 5) + ((parse_line & 0x07) << 2) + 0x01);
const uint8_t pen_bit_1 = BIT(tmp_bit_plane_1, 7 - pixel_x);
const u8 pen_bit_1 = BIT(tmp_bit_plane_1, 7 - pixel_x);
for (int pixel_plot_x = 0; pixel_plot_x < fine_x_scroll; pixel_plot_x++)
{
@ -931,7 +933,7 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
const int fine_x_scroll = (x_scroll & 0x07);
int scroll_mod;
uint16_t name_table_address;
u16 name_table_address;
if (m_y_pixels != 192)
{
name_table_address = ((m_reg[0x02] & 0x0c) << 10) | 0x0700;
@ -953,7 +955,7 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
/* vertical scrolling when bit 7 of reg[0x00] is set */
const int y_scroll = (BIT(m_reg[0x00], 7) && (tile_column > 23)) ? 0 : m_reg9copy;
const uint16_t tile_data = space().read_word(name_table_address + name_table_row_mode4((line + y_scroll) % scroll_mod) + table_column);
const u16 tile_data = space().read_word(name_table_address + name_table_row_mode4((line + y_scroll) % scroll_mod) + table_column);
const int tile_selected = (tile_data & 0x01ff);
const int priority_select = tile_data & PRIORITY_BIT;
@ -978,12 +980,12 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
const uint8_t pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
const uint8_t pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
const uint8_t pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
const uint8_t pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
const u8 pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
const u8 pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
const u8 pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
const u8 pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
uint8_t pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0);
u8 pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0);
if (palette_selected)
pen_selected |= 0x10;
@ -1000,25 +1002,25 @@ void sega315_5124_device::draw_scanline_mode4(int *line_buffer, int *priority_se
}
uint16_t sega315_5124_device::sprite_attributes_addr_mode4(uint16_t base)
u16 sega315_5124_device::sprite_attributes_addr_mode4(u16 base)
{
return base & ((BIT(m_reg[0x05], 0) << 7) | 0x3f7f);
}
uint16_t sega315_5246_device::sprite_attributes_addr_mode4(uint16_t base)
u16 sega315_5246_device::sprite_attributes_addr_mode4(u16 base)
{
return base;
}
uint8_t sega315_5124_device::sprite_tile_mask_mode4(uint8_t tile_number)
u8 sega315_5124_device::sprite_tile_mask_mode4(u8 tile_number)
{
return tile_number & (((m_reg[0x06] & 0x03) << 6) | 0x3f);
}
uint8_t sega315_5246_device::sprite_tile_mask_mode4(uint8_t tile_number)
u8 sega315_5246_device::sprite_tile_mask_mode4(u8 tile_number)
{
return tile_number;
}
@ -1029,7 +1031,7 @@ void sega315_5124_device::sprite_count_overflow(int line, int sprite_index)
/* Overflow is flagged only on active display and when VINT isn't active */
if (!(m_status & STATUS_VINT) && line >= 0 && line < m_frame_timing[ACTIVE_DISPLAY_V])
{
uint8_t sprite_number_bits;
u8 sprite_number_bits;
m_pending_status |= STATUS_SPROVR;
if (sprite_index < 14)
sprite_number_bits = (sprite_index + 1) / 2;
@ -1096,7 +1098,7 @@ void sega315_5124_device::select_sprites(int line)
{
const int sprite_x = space().read_byte(m_sprite_base + sprite_index + 1);
int sprite_tile_selected = space().read_byte(m_sprite_base + sprite_index + 2);
const uint8_t flags = space().read_byte(m_sprite_base + sprite_index + 3);
const u8 flags = space().read_byte(m_sprite_base + sprite_index + 3);
int sprite_line = parse_line - sprite_y;
@ -1265,28 +1267,28 @@ void sega315_5124_device::draw_sprites_mode4(int *line_buffer, int *priority_sel
bool sprite_col_occurred = false;
int sprite_col_x = 255;
uint8_t collision_buffer[256] = { 0 };
u8 collision_buffer[256] = { 0 };
// Draw sprite layer
for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
{
const int sprite_x = m_sprite_x[sprite_buffer_index];
const int sprite_tile_selected = m_sprite_tile_selected[sprite_buffer_index];
const uint16_t sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
const u16 sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
const int zoom_scale = sprite_buffer_index < m_max_sprite_zoom_hcount ? m_sprite_zoom_scale : 1;
const uint8_t bit_plane_0 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x00);
const uint8_t bit_plane_1 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x01);
const uint8_t bit_plane_2 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x02);
const uint8_t bit_plane_3 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x03);
const u8 bit_plane_0 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x00);
const u8 bit_plane_1 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x01);
const u8 bit_plane_2 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x02);
const u8 bit_plane_3 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x03);
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
const uint8_t pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
const uint8_t pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
const uint8_t pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
const uint8_t pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
const uint8_t pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0) | 0x10;
const u8 pen_bit_0 = BIT(bit_plane_0, 7 - pixel_x);
const u8 pen_bit_1 = BIT(bit_plane_1, 7 - pixel_x);
const u8 pen_bit_2 = BIT(bit_plane_2, 7 - pixel_x);
const u8 pen_bit_3 = BIT(bit_plane_3, 7 - pixel_x);
const u8 pen_selected = (pen_bit_3 << 3 | pen_bit_2 << 2 | pen_bit_1 << 1 | pen_bit_0) | 0x10;
if (pen_selected == 0x10) // Transparent palette so skip draw
continue;
@ -1352,15 +1354,15 @@ void sega315_5124_device::draw_sprites_tms9918_mode(int *line_buffer, int line)
bool sprite_col_occurred = false;
int sprite_col_x = 255;
uint8_t collision_buffer[256] = { 0 };
u8 collision_buffer[256] = { 0 };
/* Draw sprite layer */
for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
{
int sprite_x = m_sprite_x[sprite_buffer_index];
int sprite_tile_selected = m_sprite_tile_selected[sprite_buffer_index];
const uint16_t sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
const uint8_t flags = m_sprite_flags[sprite_buffer_index];
const u16 sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
const u8 flags = m_sprite_flags[sprite_buffer_index];
const int pen_selected = m_palette_offset + (flags & 0x0f);
const int zoom_scale = sprite_buffer_index < m_max_sprite_zoom_hcount ? m_sprite_zoom_scale : 1;
@ -1375,7 +1377,7 @@ void sega315_5124_device::draw_sprites_tms9918_mode(int *line_buffer, int line)
sprite_x += (zoom_scale > 1 ? 16 : 8);
}
uint8_t pattern = space().read_byte(sprite_pattern_line + sprite_tile_selected * 8);
u8 pattern = space().read_byte(sprite_pattern_line + sprite_tile_selected * 8);
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
@ -1421,23 +1423,23 @@ void sega315_5124_device::draw_sprites_tms9918_mode(int *line_buffer, int line)
// Display mode 2 (Graphics II Mode)
void sega315_5124_device::draw_scanline_mode2(int *line_buffer, int line)
{
const uint16_t name_table_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const uint16_t color_base = ((m_reg[0x03] & 0x80) << 6);
const u16 name_table_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const u16 color_base = ((m_reg[0x03] & 0x80) << 6);
const int color_mask = ((m_reg[0x03] & 0x7f) << 3) | 0x07;
const uint16_t pattern_base = ((m_reg[0x04] & 0x04) << 11);
const u16 pattern_base = ((m_reg[0x04] & 0x04) << 11);
const int pattern_mask = ((m_reg[0x04] & 0x03) << 8) | 0xff;
const int pattern_offset = (line & 0xc0) << 2;
/* Draw background layer */
for (int tile_column = 0; tile_column < 32; tile_column++)
{
const uint8_t name = space().read_byte(name_table_base + tile_column);
const uint8_t pattern = space().read_byte(pattern_base + (((pattern_offset + name) & pattern_mask) * 8) + (line & 0x07) );
const uint8_t colors = space().read_byte(color_base + (((pattern_offset + name) & color_mask) * 8) + (line & 0x07) );
const u8 name = space().read_byte(name_table_base + tile_column);
const u8 pattern = space().read_byte(pattern_base + (((pattern_offset + name) & pattern_mask) * 8) + (line & 0x07) );
const u8 colors = space().read_byte(color_base + (((pattern_offset + name) & color_mask) * 8) + (line & 0x07) );
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
uint8_t pen_selected;
u8 pen_selected;
const int pixel_plot_x = (tile_column << 3) + pixel_x;
if (BIT(pattern, 7 - pixel_x))
@ -1462,16 +1464,16 @@ void sega315_5124_device::draw_scanline_mode2(int *line_buffer, int line)
// Display mode 0 (Graphics I Mode)
void sega315_5124_device::draw_scanline_mode0(int *line_buffer, int line)
{
const uint16_t name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const uint16_t color_base = ((m_reg[0x03] << 6) & (VRAM_SIZE - 1));
const uint16_t pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
const u16 name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const u16 color_base = ((m_reg[0x03] << 6) & (VRAM_SIZE - 1));
const u16 pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
/* Draw background layer */
for (int tile_column = 0; tile_column < 32; tile_column++)
{
const uint8_t name = space().read_byte(name_base + tile_column);
const uint8_t pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
const uint8_t colors = space().read_byte(color_base + (name >> 3));
const u8 name = space().read_byte(name_base + tile_column);
const u8 pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
const u8 colors = space().read_byte(color_base + (name >> 3));
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
@ -1496,8 +1498,8 @@ void sega315_5124_device::draw_scanline_mode0(int *line_buffer, int line)
// Display mode 1 (Text Mode)
void sega315_5124_device::draw_scanline_mode1(int *line_buffer, int line)
{
const uint16_t name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const uint16_t pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
const u16 name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const u16 pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
for (int pixel_plot_x = 0; pixel_plot_x < 8; pixel_plot_x++)
{
@ -1507,8 +1509,8 @@ void sega315_5124_device::draw_scanline_mode1(int *line_buffer, int line)
/* Draw background layer */
for (int tile_column = 0; tile_column < 40; tile_column++)
{
const uint8_t name = space().read_byte(name_base + tile_column);
const uint8_t pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
const u8 name = space().read_byte(name_base + tile_column);
const u8 pattern = space().read_byte(pattern_base + (name << 3) + (line & 0x07));
for (int pixel_x = 0; pixel_x < 6; pixel_x++)
{
@ -1536,14 +1538,14 @@ void sega315_5124_device::draw_scanline_mode1(int *line_buffer, int line)
// Display mode 3 (Multicolor Mode)
void sega315_5124_device::draw_scanline_mode3(int *line_buffer, int line)
{
const uint16_t name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const uint16_t pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
const u16 name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
const u16 pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
/* Draw background layer */
for (int tile_column = 0; tile_column < 32; tile_column++)
{
const uint8_t name = space().read_byte(name_base + tile_column);
const uint8_t pattern = space().read_byte(pattern_base + (name << 3) + (((line >> 3) & 3) << 1) + ((line & 4) >> 2));
const u8 name = space().read_byte(name_base + tile_column);
const u8 pattern = space().read_byte(pattern_base + (name << 3) + (((line >> 3) & 3) << 1) + ((line & 4) >> 2));
for (int pixel_x = 0; pixel_x < 8; pixel_x++)
{
@ -1635,8 +1637,8 @@ void sega315_5124_device::draw_scanline(int pixel_offset_x, int pixel_plot_y, in
void sega315_5124_device::blit_scanline(int *line_buffer, int *priority_selected, int pixel_offset_x, int pixel_plot_y, int line)
{
uint32_t *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
uint8_t *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
u32 *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
u8 *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
int x = 0;
if (m_vdp_mode == 4 && BIT(m_reg[0x00], 5))
@ -1667,8 +1669,8 @@ void sega315_5377_device::blit_scanline(int *line_buffer, int *priority_selected
}
else
{
uint32_t *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
uint8_t *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
u32 *p_bitmap = &m_tmpbitmap.pix32(pixel_plot_y + line, pixel_offset_x);
u8 *p_y1 = &m_y1_bitmap.pix8(pixel_plot_y + line, pixel_offset_x);
int x = 0;
/* border on left side of the GG active screen */
@ -1756,9 +1758,9 @@ void sega315_5377_device::update_palette()
}
void sega315_5124_device::cram_write(uint8_t data)
void sega315_5124_device::cram_write(u8 data)
{
uint16_t address = m_addr & m_cram_mask;
u16 address = m_addr & m_cram_mask;
if (data != m_CRAM[address])
{
m_CRAM[address] = data;
@ -1767,7 +1769,7 @@ void sega315_5124_device::cram_write(uint8_t data)
}
void sega315_5377_device::cram_write(uint8_t data)
void sega315_5377_device::cram_write(u8 data)
{
if (m_sega315_5124_compatibility_mode)
{
@ -1777,7 +1779,7 @@ void sega315_5377_device::cram_write(uint8_t data)
{
if (m_addr & 1)
{
uint16_t address = (m_addr & m_cram_mask) & ~1;
u16 address = (m_addr & m_cram_mask) & ~1;
if (m_buffer != m_CRAM[address] || data != m_CRAM[address + 1])
{
m_CRAM[address] = m_buffer;
@ -1789,7 +1791,7 @@ void sega315_5377_device::cram_write(uint8_t data)
}
uint32_t sega315_5124_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
u32 sega315_5124_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
copybitmap(bitmap, m_tmpbitmap, 0, 0, 0, 0, cliprect);
return 0;
@ -1819,7 +1821,7 @@ void sega315_5313_mode4_device::stop_timers()
DEVICE INTERFACE
*****************************************************************************/
void sega315_5124_device::vdp_postload()
void sega315_5124_device::device_post_load()
{
set_frame_timing();
}
@ -1886,8 +1888,6 @@ void sega315_5124_device::device_start()
save_item(NAME(m_max_sprite_zoom_hcount));
save_item(NAME(m_max_sprite_zoom_vcount));
save_item(NAME(m_CRAM));
machine().save().register_postload(save_prepost_delegate(FUNC(sega315_5124_device::vdp_postload), this));
}
@ -1899,7 +1899,7 @@ void sega315_5124_device::device_reset()
m_reg[0x02] = 0x0e;
m_reg[0x0a] = 0xff;
m_status = m_pending_status = uint8_t(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
m_status = m_pending_status = u8(~(STATUS_VINT | STATUS_SPROVR | STATUS_SPRCOL));
m_pending_sprcol_x = 0;
m_pending_control_write = false;
m_pending_hint = false;
@ -1934,6 +1934,8 @@ void sega315_5124_device::device_reset()
void sega315_5124_device::device_add_mconfig(machine_config &config)
{
PALETTE(config, m_palette, FUNC(sega315_5124_device::sega315_5124_palette), SEGA315_5124_PALETTE_SIZE);
SEGAPSG(config, m_snsnd, DERIVED_CLOCK(1, 3)).add_route(ALL_OUTPUTS, *this, 1.0, AUTO_ALLOC_INPUT, 0);
}
void sega315_5377_device::device_reset()
@ -1949,6 +1951,11 @@ void sega315_5377_device::device_reset()
void sega315_5377_device::device_add_mconfig(machine_config &config)
{
sega315_5246_device::device_add_mconfig(config);
m_palette->set_entries(SEGA315_5377_PALETTE_SIZE);
m_palette->set_init(FUNC(sega315_5377_device::sega315_5377_palette));
GAMEGEAR(config.replace(), m_snsnd, DERIVED_CLOCK(1, 3));
m_snsnd->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
m_snsnd->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
}

View File

@ -13,6 +13,7 @@
#pragma once
#include "sound/sn76496.h"
#include "emupal.h"
#include "screen.h"
@ -28,7 +29,8 @@ DECLARE_DEVICE_TYPE(SEGA315_5377, sega315_5377_device) /* aka Gamegear (2 A
class sega315_5124_device : public device_t,
public device_memory_interface,
public device_video_interface
public device_video_interface,
public device_mixer_interface
{
public:
static constexpr unsigned WIDTH = 342; /* 342 pixels */
@ -51,7 +53,7 @@ public:
// construction/destruction
sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
void set_is_pal(bool is_pal) { m_is_pal = is_pal; }
@ -59,12 +61,14 @@ public:
auto csync() { return m_csync_cb.bind(); }
auto pause() { return m_pause_cb.bind(); }
DECLARE_READ8_MEMBER( data_read );
DECLARE_WRITE8_MEMBER( data_write );
DECLARE_READ8_MEMBER( control_read );
DECLARE_WRITE8_MEMBER( control_write );
DECLARE_READ8_MEMBER( vcount_read );
DECLARE_READ8_MEMBER( hcount_read );
void psg_w(u8 data) { m_snsnd->write(data); }
void psg_stereo_w(u8 data) { m_snsnd->stereo_w(data); }
u8 data_read();
void data_write(u8 data);
u8 control_read();
void control_write(u8 data);
u8 vcount_read();
u8 hcount_read();
void hcount_latch() { hcount_latch_at_hpos(screen().hpos()); };
void hcount_latch_at_hpos(int hpos);
@ -73,7 +77,7 @@ public:
bitmap_ind8 &get_y1_bitmap() { return m_y1_bitmap; };
/* update the screen */
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
virtual void set_sega315_5124_compatibility_mode(bool sega315_5124_compatibility_mode) { }
@ -81,9 +85,10 @@ protected:
static constexpr unsigned SEGA315_5377_CRAM_SIZE = 0x40; /* 32 colors x 2 bytes per color = 64 bytes */
static constexpr unsigned SEGA315_5124_CRAM_SIZE = 0x20; /* 32 colors x 1 bytes per color = 32 bytes */
sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
sega315_5124_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
// device-level overrides
virtual void device_post_load() override;
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;
@ -98,9 +103,9 @@ protected:
void set_display_settings();
void set_frame_timing();
virtual void update_palette();
virtual void write_memory(uint8_t data);
virtual void cram_write(uint8_t data);
virtual void load_vram_addr(uint8_t data);
virtual void write_memory(u8 data);
virtual void cram_write(u8 data);
virtual void load_vram_addr(u8 data);
virtual void select_display_mode();
virtual void select_extended_res_mode4(bool M1, bool M2, bool M3);
virtual void select_sprites(int line);
@ -109,9 +114,9 @@ protected:
virtual void draw_scanline(int pixel_offset_x, int pixel_plot_y, int line);
virtual void blit_scanline(int *line_buffer, int *priority_selected, int pixel_offset_x, int pixel_plot_y, int line);
virtual void draw_leftmost_pixels_mode4(int *line_buffer, int *priority_selected, int fine_x_scroll, int palette_selected, int tile_line);
virtual uint16_t name_table_row_mode4(int row);
virtual uint16_t sprite_attributes_addr_mode4(uint16_t base);
virtual uint8_t sprite_tile_mask_mode4(uint8_t tile_number);
virtual u16 name_table_row_mode4(int row);
virtual u16 sprite_attributes_addr_mode4(u16 base);
virtual u8 sprite_tile_mask_mode4(u8 tile_number);
void process_line_timer();
void draw_scanline_mode4(int *line_buffer, int *priority_selected, int line);
void draw_sprites_mode4(int *line_buffer, int *priority_selected, int line);
@ -122,44 +127,42 @@ protected:
void draw_scanline_mode0(int *line_buffer, int line);
void check_pending_flags();
void vdp_postload();
uint8_t m_reg[16]; /* All the registers */
uint8_t m_status; /* Status register */
uint8_t m_pending_status; /* Pending status flags */
uint8_t m_reg8copy; /* Internal copy of register 8 (X-Scroll) */
uint8_t m_reg9copy; /* Internal copy of register 9 (Y-Scroll) */
uint8_t m_addrmode; /* Type of VDP action */
uint16_t m_addr; /* Contents of internal VDP address register */
const uint8_t m_cram_size; /* CRAM size */
uint8_t m_cram_mask; /* Mask to switch between SMS and GG CRAM sizes */
u8 m_reg[16]; /* All the registers */
u8 m_status; /* Status register */
u8 m_pending_status; /* Pending status flags */
u8 m_reg8copy; /* Internal copy of register 8 (X-Scroll) */
u8 m_reg9copy; /* Internal copy of register 9 (Y-Scroll) */
u8 m_addrmode; /* Type of VDP action */
u16 m_addr; /* Contents of internal VDP address register */
const u8 m_cram_size; /* CRAM size */
u8 m_cram_mask; /* Mask to switch between SMS and GG CRAM sizes */
bool m_cram_dirty; /* Have there been any changes to the CRAM area */
bool m_hint_occurred;
bool m_pending_hint;
bool m_pending_control_write;
int m_pending_sprcol_x;
uint8_t m_buffer;
uint8_t m_control_write_data_latch;
u8 m_buffer;
u8 m_control_write_data_latch;
bool m_sega315_5124_compatibility_mode; /* when true, GG VDP behaves as SMS VDP */
int m_irq_state; /* The status of the IRQ line of the VDP */
int m_vdp_mode; /* Current mode of the VDP: 0,1,2,3,4 */
int m_y_pixels; /* 192, 224, 240 */
int m_draw_time;
uint8_t m_line_counter;
uint8_t m_hcounter;
uint8_t m_CRAM[SEGA315_5377_CRAM_SIZE]; /* CRAM */
const uint8_t *m_frame_timing;
const uint8_t *m_line_timing;
u8 m_line_counter;
u8 m_hcounter;
u8 m_CRAM[SEGA315_5377_CRAM_SIZE]; /* CRAM */
const u8 *m_frame_timing;
const u8 *m_line_timing;
bitmap_rgb32 m_tmpbitmap;
bitmap_ind8 m_y1_bitmap;
const uint8_t m_palette_offset;
const uint8_t m_reg_num_mask;
const u8 m_palette_offset;
const u8 m_reg_num_mask;
bool m_display_disabled;
uint16_t m_sprite_base;
uint16_t m_sprite_pattern_line[8];
u16 m_sprite_base;
u16 m_sprite_pattern_line[8];
int m_sprite_tile_selected[8];
int m_sprite_x[8];
uint8_t m_sprite_flags[8];
u8 m_sprite_flags[8];
int m_sprite_count;
int m_sprite_height;
int m_sprite_zoom_scale;
@ -192,20 +195,21 @@ protected:
static constexpr device_timer_id TIMER_FLAGS = 7;
required_device<palette_device> m_palette;
required_device<sn76496_base_device> m_snsnd;
};
class sega315_5246_device : public sega315_5124_device
{
public:
sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
sega315_5246_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
virtual uint16_t name_table_row_mode4(int row) override;
virtual uint16_t sprite_attributes_addr_mode4(uint16_t base) override;
virtual uint8_t sprite_tile_mask_mode4(uint8_t tile_number) override;
virtual u16 name_table_row_mode4(int row) override;
virtual u16 sprite_attributes_addr_mode4(u16 base) override;
virtual u8 sprite_tile_mask_mode4(u8 tile_number) override;
virtual void select_extended_res_mode4(bool M1, bool M2, bool M3) override;
};
@ -213,18 +217,18 @@ protected:
class sega315_5377_device : public sega315_5246_device
{
public:
sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
sega315_5377_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void set_sega315_5124_compatibility_mode(bool sega315_5124_compatibility_mode) override;
protected:
sega315_5377_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
sega315_5377_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void update_palette() override;
virtual void cram_write(uint8_t data) override;
virtual void cram_write(u8 data) override;
virtual void blit_scanline(int *line_buffer, int *priority_selected, int pixel_offset_x, int pixel_plot_y, int line) override;
private:
@ -239,10 +243,10 @@ public:
void stop_timers();
protected:
sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint8_t cram_size, uint8_t palette_offset, uint8_t reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const uint8_t *line_timing);
sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing);
virtual void write_memory(uint8_t data) override;
virtual void load_vram_addr(uint8_t data) override;
virtual void write_memory(u8 data) override;
virtual void load_vram_addr(u8 data) override;
virtual void select_sprites(int line) override;
virtual void sprite_collision(int line, int sprite_col_x) override;
virtual void sprite_count_overflow(int line, int sprite_index) override;

View File

@ -161,7 +161,6 @@ DEFINE_DEVICE_TYPE(SEGA315_5313, sega315_5313_device, "sega315_5313", "Sega 315-
sega315_5313_device::sega315_5313_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
// mode 4 support, for SMS compatibility, is implemented in 315_5124.cpp
: sega315_5313_mode4_device(mconfig, SEGA315_5313, tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0x00, 0x1f, 0, 0, line_315_5313_mode4)
, device_mixer_interface(mconfig, *this, 2)
, m_render_bitmap(nullptr)
, m_render_line(nullptr)
, m_render_line_raw(nullptr)
@ -210,7 +209,6 @@ sega315_5313_device::sega315_5313_device(const machine_config &mconfig, const ch
, m_palette_lookup_highlight(nullptr)
, m_space68k(nullptr)
, m_cpu68k(*this, finder_base::DUMMY_TAG)
, m_snsnd(*this, "snsnd")
{
m_use_alt_timing = 0;
m_palwrite_base = -1;
@ -227,7 +225,7 @@ void sega315_5313_device::device_add_mconfig(machine_config &config)
m_palette->set_entries(0x200); // more entries for 32X - not really the cleanest way to do this
SEGAPSG(config, m_snsnd, DERIVED_CLOCK(1, 15)).add_route(ALL_OUTPUTS, *this, 0.5, AUTO_ALLOC_INPUT, 0);
SEGAPSG(config.replace(), m_snsnd, DERIVED_CLOCK(1, 15)).add_route(ALL_OUTPUTS, *this, 0.5, AUTO_ALLOC_INPUT, 0);
}
TIMER_CALLBACK_MEMBER(sega315_5313_device::irq6_on_timer_callback)
@ -968,9 +966,9 @@ WRITE16_MEMBER( sega315_5313_device::vdp_w )
case 0x16:
{
// accessed by either segapsg_device or sn76496_device
if (m_snsnd && ACCESSING_BITS_0_7)
m_snsnd->write(data & 0xff);
//if (m_snsnd && ACCESSING_BITS_8_15) sn->write((data>>8) & 0xff);
if (ACCESSING_BITS_0_7)
psg_w(data & 0xff);
//if (ACCESSING_BITS_8_15) psg_w((data>>8) & 0xff);
break;
}

View File

@ -9,10 +9,9 @@
#include "video/315_5124.h"
#include "cpu/m68000/m68000.h"
#include "machine/timer.h"
#include "sound/sn76496.h"
class sega315_5313_device : public sega315_5313_mode4_device, public device_mixer_interface
class sega315_5313_device : public sega315_5313_mode4_device
{
public:
template <typename T>
@ -187,7 +186,6 @@ private:
address_space *m_space68k;
required_device<m68000_base_device> m_cpu68k;
required_device<sn76496_base_device> m_snsnd;
};

View File

@ -232,10 +232,10 @@ maketree: $(sort $(OBJDIRS))
.PHONY: clang clang-5 mingw doc native
native:
$(MAKE) CEXTRAFLAGS="-march=native -Wall -Wpedantic -Wsign-compare -Wextra -Wno-unused-parameter"
$(MAKE) CEXTRAFLAGS="-march=native -Wall -Wpedantic -Wsign-compare -Wextra "
clang:
$(MAKE) CC=clang++-9 LD=clang++-9 CEXTRAFLAGS="-march=native -Wno-unused-parameter -Weverything -Werror -Wno-unused-template -Wno-non-virtual-dtor -Wno-unreachable-code -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wweak-template-vtables -Wno-exit-time-destructors"
$(MAKE) CC=clang++-9 LD=clang++-9 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-unused-template -Wno-non-virtual-dtor -Wno-unreachable-code -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wweak-template-vtables -Wno-exit-time-destructors"
clang-5:
$(MAKE) CC=clang++-5.0 LD=clang++-5.0 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-inconsistent-missing-destructor-override -Wno-unreachable-code -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-weak-template-vtables -Wno-exit-time-destructors"

View File

@ -232,7 +232,12 @@ namespace netlist
m_ttbl.m_timing_index.data(), m_ttbl.m_timing_nt.data());
desc_s.parse(m_desc);
return pool().make_poolptr<tt_type>(anetlist, name, m_family, m_ttbl, m_desc);
/* update truthtable family definitions */
if (m_family_name != "")
m_family_desc = anetlist.setup().family_from_model(m_family_name);
return pool().make_poolptr<tt_type>(anetlist, name, m_family_desc, m_ttbl, m_desc);
}
private:
typename nld_truthtable_t<m_NI, m_NO>::truthtable_t m_ttbl;
@ -447,7 +452,7 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &sourcefile)
: factory::element_t(name, classname, def_param, sourcefile), m_family(family_TTL())
: factory::element_t(name, classname, def_param, sourcefile), m_family_desc(family_TTL())
{
}
@ -459,7 +464,7 @@ netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstri
ENTRYY(n, 4, s); ENTRYY(n, 5, s); ENTRYY(n, 6, s); \
ENTRYY(n, 7, s); ENTRYY(n, 8, s)
void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile)
std::unique_ptr<netlist_base_factory_truthtable_t> tt_factory_create(tt_desc &desc, const pstring &sourcefile)
{
std::unique_ptr<netlist_base_factory_truthtable_t> ret;
@ -482,9 +487,9 @@ void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile)
nl_assert_always(false, msg);
}
ret->m_desc = desc.desc;
if (desc.family != "")
ret->m_family = setup.family_from_model(desc.family);
setup.factory().register_device(std::move(ret));
ret->m_family_name = desc.family;
return ret;
}
} //namespace devices

View File

@ -220,10 +220,12 @@ namespace devices
const pstring &def_param, const pstring &sourcefile);
std::vector<pstring> m_desc;
const logic_family_desc_t *m_family;
pstring m_family_name;
const logic_family_desc_t *m_family_desc;
};
void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile);
/* the returned element is still missing a pointer to the family ... */
std::unique_ptr<netlist_base_factory_truthtable_t> tt_factory_create(tt_desc &desc, const pstring &sourcefile);
} //namespace devices
} // namespace netlist

View File

@ -954,7 +954,7 @@ logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname,
param_t::param_t(device_t &device, const pstring &name)
: device_object_t(device, device.name() + "." + name)
{
device.setup().register_param(this->name(), *this);
device.setup().register_param_t(this->name(), *this);
}
param_t::param_type_t param_t::param_type() const

View File

@ -47,8 +47,8 @@ namespace netlist { namespace factory
// net_device_t_base_factory
// ----------------------------------------------------------------------------------------
list_t::list_t( setup_t &setup)
: m_setup(setup)
list_t::list_t(log_type &alog)
: m_log(alog)
{
}
@ -56,7 +56,7 @@ namespace netlist { namespace factory
{
for (auto & e : *this)
if (e->name() == factory->name())
m_setup.log().fatal(MF_1_FACTORY_ALREADY_CONTAINS_1, factory->name());
m_log.fatal(MF_1_FACTORY_ALREADY_CONTAINS_1, factory->name());
push_back(std::move(factory));
}
@ -68,7 +68,7 @@ namespace netlist { namespace factory
return e.get();
}
m_setup.log().fatal(MF_1_CLASS_1_NOT_FOUND, devname);
m_log.fatal(MF_1_CLASS_1_NOT_FOUND, devname);
return nullptr; // appease code analysis
}
@ -81,11 +81,11 @@ namespace netlist { namespace factory
return pool().make_poolptr<NETLIB_NAME(wrapper)>(anetlist, name);
}
void library_element_t::macro_actions(netlist_state_t &anetlist, const pstring &name)
void library_element_t::macro_actions(nlparse_t &nparser, const pstring &name)
{
anetlist.setup().namespace_push(name);
anetlist.setup().include(this->name());
anetlist.setup().namespace_pop();
nparser.namespace_push(name);
nparser.include(this->name());
nparser.namespace_pop();
}

View File

@ -35,6 +35,7 @@
namespace netlist {
class device_t;
class nlparse_t;
class setup_t;
class netlist_state_t;
@ -55,9 +56,9 @@ namespace factory {
COPYASSIGNMOVE(element_t, default)
virtual poolptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) = 0;
virtual void macro_actions(netlist_state_t &anetlist, const pstring &name)
virtual void macro_actions(nlparse_t &nparser, const pstring &name)
{
plib::unused_var(anetlist);
plib::unused_var(nparser);
plib::unused_var(name);
}
@ -93,7 +94,7 @@ namespace factory {
class list_t : public std::vector<std::unique_ptr<element_t>>
{
public:
explicit list_t(setup_t &m_setup);
explicit list_t(log_type &alog);
~list_t() = default;
COPYASSIGNMOVE(list_t, delete)
@ -116,7 +117,7 @@ namespace factory {
}
private:
setup_t &m_setup;
log_type &m_log;
};
// -----------------------------------------------------------------------------
@ -140,17 +141,15 @@ namespace factory {
{
public:
library_element_t(setup_t &setup, const pstring &name, const pstring &classname,
library_element_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &source)
: element_t(name, classname, def_param, source)
{
// FIXME: if it is not used, remove it
plib::unused_var(setup);
}
poolptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override;
void macro_actions(netlist_state_t &anetlist, const pstring &name) override;
void macro_actions(nlparse_t &nparser, const pstring &name) override;
private:
};

View File

@ -19,18 +19,215 @@
#include <cmath>
// ----------------------------------------------------------------------------------------
// setup_t
// ----------------------------------------------------------------------------------------
namespace netlist
{
setup_t::setup_t(netlist_t &netlist)
: m_netlist(netlist)
, m_netlist_params(nullptr)
, m_factory(*this)
, m_proxy_cnt(0)
// ----------------------------------------------------------------------------------------
// nl_parse_t
// ----------------------------------------------------------------------------------------
nlparse_t::nlparse_t(netlist_t &netlist)
: m_factory(netlist.log())
, m_log(netlist.log())
, m_frontier_cnt(0)
{ }
void nlparse_t::register_model(const pstring &model_in)
{
auto pos = model_in.find(" ");
if (pos == pstring::npos)
log().fatal(MF_1_UNABLE_TO_PARSE_MODEL_1, model_in);
pstring model = plib::ucase(plib::trim(plib::left(model_in, pos)));
pstring def = plib::trim(model_in.substr(pos + 1));
if (!m_models.insert({model, def}).second)
log().fatal(MF_1_MODEL_ALREADY_EXISTS_1, model_in);
}
void nlparse_t::register_alias(const pstring &alias, const pstring &out)
{
pstring alias_fqn = build_fqn(alias);
pstring out_fqn = build_fqn(out);
register_alias_nofqn(alias_fqn, out_fqn);
}
void nlparse_t::register_dippins_arr(const pstring &terms)
{
std::vector<pstring> list(plib::psplit(terms,", "));
if (list.size() == 0 || (list.size() % 2) == 1)
log().fatal(MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1,
build_fqn(""));
std::size_t n = list.size();
for (std::size_t i = 0; i < n / 2; i++)
{
register_alias(plib::pfmt("{1}")(i+1), list[i * 2]);
register_alias(plib::pfmt("{1}")(n-i), list[i * 2 + 1]);
}
}
void nlparse_t::register_dev(const pstring &classname, const pstring &name)
{
auto f = m_factory.factory_by_name(classname);
if (f == nullptr)
log().fatal(MF_1_CLASS_1_NOT_FOUND, classname);
else
{
/* make sure we parse macro library entries */
f->macro_actions(*this, name);
pstring key = build_fqn(name);
if (device_exists(key))
log().fatal(MF_1_DEVICE_ALREADY_EXISTS_1, name);
else
m_device_factory.insert(m_device_factory.end(), {key, f});
}
}
void nlparse_t::register_link(const pstring &sin, const pstring &sout)
{
register_link_fqn(build_fqn(sin), build_fqn(sout));
}
void nlparse_t::register_link_arr(const pstring &terms)
{
std::vector<pstring> list(plib::psplit(terms,", "));
if (list.size() < 2)
log().fatal(MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL);
for (std::size_t i = 1; i < list.size(); i++)
{
register_link(list[0], list[i]);
}
}
void nlparse_t::include(const pstring &netlist_name)
{
for (auto &source : m_sources)
{
if (source->parse(netlist_name))
return;
}
log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name);
}
void nlparse_t::namespace_push(const pstring &aname)
{
if (m_namespace_stack.empty())
//m_namespace_stack.push(netlist().name() + "." + aname);
m_namespace_stack.push(aname);
else
m_namespace_stack.push(m_namespace_stack.top() + "." + aname);
}
void nlparse_t::namespace_pop()
{
m_namespace_stack.pop();
}
void nlparse_t::register_param(const pstring &param, const double value)
{
if (std::abs(value - std::floor(value)) > 1e-30 || std::abs(value) > 1e9)
register_param(param, plib::pfmt("{1:.9}").e(value));
else
register_param(param, plib::pfmt("{1}")(static_cast<long>(value)));
}
void nlparse_t::register_param(const pstring &param, const pstring &value)
{
pstring fqn = build_fqn(param);
auto idx = m_param_values.find(fqn);
if (idx == m_param_values.end())
{
if (!m_param_values.insert({fqn, value}).second)
log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST,
param);
}
else
{
log().warning(MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3, fqn, idx->second,
value);
m_param_values[fqn] = value;
}
}
void nlparse_t::register_lib_entry(const pstring &name, const pstring &sourcefile)
{
m_factory.register_device(plib::make_unique<factory::library_element_t>(name, name, "", sourcefile));
}
void nlparse_t::register_frontier(const pstring &attach, const double r_IN, const double r_OUT)
{
pstring frontier_name = plib::pfmt("frontier_{1}")(m_frontier_cnt);
m_frontier_cnt++;
register_dev("FRONTIER_DEV", frontier_name);
register_param(frontier_name + ".RIN", r_IN);
register_param(frontier_name + ".ROUT", r_OUT);
register_link(frontier_name + ".G", "GND");
pstring attfn = build_fqn(attach);
pstring front_fqn = build_fqn(frontier_name);
bool found = false;
for (auto & link : m_links)
{
if (link.first == attfn)
{
link.first = front_fqn + ".I";
found = true;
}
else if (link.second == attfn)
{
link.second = front_fqn + ".I";
found = true;
}
}
if (!found)
log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, attach);
register_link(attach, frontier_name + ".Q");
}
void nlparse_t::tt_factory_create(tt_desc &desc, const pstring &sourcefile)
{
auto fac = devices::tt_factory_create(desc, sourcefile);
m_factory.register_device(std::move(fac));
}
pstring nlparse_t::build_fqn(const pstring &obj_name) const
{
if (m_namespace_stack.empty())
//return netlist().name() + "." + obj_name;
return obj_name;
else
return m_namespace_stack.top() + "." + obj_name;
}
void nlparse_t::register_alias_nofqn(const pstring &alias, const pstring &out)
{
if (!m_alias.insert({alias, out}).second)
log().fatal(MF_1_ADDING_ALI1_TO_ALIAS_LIST, alias);
}
void nlparse_t::register_link_fqn(const pstring &sin, const pstring &sout)
{
link_t temp = link_t(sin, sout);
log().debug("link {1} <== {2}\n", sin, sout);
m_links.push_back(temp);
}
bool nlparse_t::device_exists(const pstring &name) const
{
for (auto &d : m_device_factory)
if (d.first == name)
return true;
return false;
}
// ----------------------------------------------------------------------------------------
// setup_t
// ----------------------------------------------------------------------------------------
setup_t::setup_t(netlist_t &netlist)
: nlparse_t(netlist)
, m_netlist(netlist)
, m_netlist_params(nullptr)
, m_proxy_cnt(0)
{
}
@ -38,7 +235,6 @@ setup_t::~setup_t() noexcept
{
// FIXME: can't see a need any longer
m_links.clear();
m_alias.clear();
m_params.clear();
m_terminals.clear();
m_param_values.clear();
@ -54,99 +250,6 @@ const netlist_state_t &setup_t::netlist() const
return m_netlist.nlstate();
}
pstring setup_t::build_fqn(const pstring &obj_name) const
{
if (m_namespace_stack.empty())
//return netlist().name() + "." + obj_name;
return obj_name;
else
return m_namespace_stack.top() + "." + obj_name;
}
void setup_t::namespace_push(const pstring &aname)
{
if (m_namespace_stack.empty())
//m_namespace_stack.push(netlist().name() + "." + aname);
m_namespace_stack.push(aname);
else
m_namespace_stack.push(m_namespace_stack.top() + "." + aname);
}
void setup_t::namespace_pop()
{
m_namespace_stack.pop();
}
void setup_t::register_lib_entry(const pstring &name, const pstring &sourcefile)
{
factory().register_device(plib::make_unique<factory::library_element_t>(*this, name, name, "", sourcefile));
}
void setup_t::register_dev(const pstring &classname, const pstring &name)
{
auto f = factory().factory_by_name(classname);
if (f == nullptr)
log().fatal(MF_1_CLASS_1_NOT_FOUND, classname);
else
{
/* make sure we parse macro library entries */
f->macro_actions(netlist(), name);
pstring key = build_fqn(name);
if (device_exists(key))
log().fatal(MF_1_DEVICE_ALREADY_EXISTS_1, name);
else
m_device_factory.insert(m_device_factory.end(), {key, f});
}
}
bool setup_t::device_exists(const pstring &name) const
{
for (auto &d : m_device_factory)
if (d.first == name)
return true;
return false;
}
void setup_t::register_model(const pstring &model_in)
{
auto pos = model_in.find(" ");
if (pos == pstring::npos)
log().fatal(MF_1_UNABLE_TO_PARSE_MODEL_1, model_in);
pstring model = plib::ucase(plib::trim(plib::left(model_in, pos)));
pstring def = plib::trim(model_in.substr(pos + 1));
if (!m_models.insert({model, def}).second)
log().fatal(MF_1_MODEL_ALREADY_EXISTS_1, model_in);
}
void setup_t::register_alias_nofqn(const pstring &alias, const pstring &out)
{
if (!m_alias.insert({alias, out}).second)
log().fatal(MF_1_ADDING_ALI1_TO_ALIAS_LIST, alias);
}
void setup_t::register_alias(const pstring &alias, const pstring &out)
{
pstring alias_fqn = build_fqn(alias);
pstring out_fqn = build_fqn(out);
register_alias_nofqn(alias_fqn, out_fqn);
}
void setup_t::register_dippins_arr(const pstring &terms)
{
std::vector<pstring> list(plib::psplit(terms,", "));
if (list.size() == 0 || (list.size() % 2) == 1)
log().fatal(MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1,
build_fqn(""));
std::size_t n = list.size();
for (std::size_t i = 0; i < n / 2; i++)
{
register_alias(plib::pfmt("{1}")(i+1), list[i * 2]);
register_alias(plib::pfmt("{1}")(n-i), list[i * 2 + 1]);
}
}
pstring setup_t::termtype_as_str(detail::core_terminal_t &in) const
{
switch (in.type())
@ -171,12 +274,6 @@ pstring setup_t::get_initial_param_val(const pstring &name, const pstring &def)
return def;
}
void setup_t::register_param(const pstring &name, param_t &param)
{
if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second)
log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST, name);
}
void setup_t::register_term(detail::core_terminal_t &term)
{
if (!m_terminals.insert({term.name(), &term}).second)
@ -185,29 +282,10 @@ void setup_t::register_term(detail::core_terminal_t &term)
log().debug("{1} {2}\n", termtype_as_str(term), term.name());
}
void setup_t::register_link_arr(const pstring &terms)
{
std::vector<pstring> list(plib::psplit(terms,", "));
if (list.size() < 2)
log().fatal(MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL);
for (std::size_t i = 1; i < list.size(); i++)
{
register_link(list[0], list[i]);
}
}
void setup_t::register_link_fqn(const pstring &sin, const pstring &sout)
{
link_t temp = link_t(sin, sout);
log().debug("link {1} <== {2}\n", sin, sout);
m_links.push_back(temp);
}
void setup_t::register_link(const pstring &sin, const pstring &sout)
{
register_link_fqn(build_fqn(sin), build_fqn(sout));
}
void setup_t::remove_connections(const pstring &pin)
{
@ -230,62 +308,14 @@ void setup_t::remove_connections(const pstring &pin)
}
void setup_t::register_frontier(const pstring &attach, const double r_IN, const double r_OUT)
void setup_t::register_param_t(const pstring &name, param_t &param)
{
pstring frontier_name = plib::pfmt("frontier_{1}")(m_frontier_cnt);
m_frontier_cnt++;
register_dev("FRONTIER_DEV", frontier_name);
register_param(frontier_name + ".RIN", r_IN);
register_param(frontier_name + ".ROUT", r_OUT);
register_link(frontier_name + ".G", "GND");
pstring attfn = build_fqn(attach);
pstring front_fqn = build_fqn(frontier_name);
bool found = false;
for (auto & link : m_links)
{
if (link.first == attfn)
{
link.first = front_fqn + ".I";
found = true;
}
else if (link.second == attfn)
{
link.second = front_fqn + ".I";
found = true;
}
}
if (!found)
log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, attach);
register_link(attach, frontier_name + ".Q");
if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second)
log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST, name);
}
void setup_t::register_param(const pstring &param, const double value)
{
if (std::abs(value - std::floor(value)) > 1e-30 || std::abs(value) > 1e9)
register_param(param, plib::pfmt("{1:.9}").e(value));
else
register_param(param, plib::pfmt("{1}")(static_cast<long>(value)));
}
void setup_t::register_param(const pstring &param, const pstring &value)
{
pstring fqn = build_fqn(param);
auto idx = m_param_values.find(fqn);
if (idx == m_param_values.end())
{
if (!m_param_values.insert({fqn, value}).second)
log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST,
param);
}
else
{
log().warning(MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3, fqn, idx->second,
value);
m_param_values[fqn] = value;
}
}
const pstring setup_t::resolve_alias(const pstring &name) const
{
@ -937,12 +967,6 @@ const logic_family_desc_t *setup_t::family_from_model(const pstring &model)
return retp;
}
void setup_t::tt_factory_create(tt_desc &desc, const pstring &sourcefile)
{
devices::tt_factory_create(*this, desc, sourcefile);
}
// ----------------------------------------------------------------------------------------
// Sources
// ----------------------------------------------------------------------------------------
@ -952,16 +976,6 @@ bool setup_t::parse_stream(std::unique_ptr<plib::pistream> istrm, const pstring
return parser_t(std::move(plib::ppreprocessor(&m_defines).process(std::move(istrm))), *this).parse(name);
}
void setup_t::include(const pstring &netlist_name)
{
for (auto &source : m_sources)
{
if (source->parse(netlist_name))
return;
}
log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name);
}
std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring &name)
{
for (auto &source : m_sources)
@ -1015,8 +1029,6 @@ void setup_t::prepare_to_run()
{
register_dynamic_log_devices();
/* load the library ... */
/* make sure the solver and parameters are started first! */
for (auto & e : m_device_factory)

View File

@ -14,14 +14,12 @@
#include <vector>
#include "plib/pparser.h"
//#include "plib/pstate.h"
#include "plib/pstream.h"
#include "plib/pstring.h"
#include "plib/putil.h"
#include "netlist_types.h"
#include "nl_config.h"
//#include "nl_errstr.h"
#include "nl_factory.h"
//============================================================
@ -208,27 +206,71 @@ namespace netlist
// setup_t
// ----------------------------------------------------------------------------------------
// setup.register_alias(# alias, # name);
// setup.register_model(model);
// setup.register_dippins_arr( # pin1 ", " # __VA_ARGS__);
// setup.register_dev(# type, # name);
// setup.register_link(# name "." # input, # output);
// setup.register_link_arr( # term1 ", " # __VA_ARGS__);
// setup.register_param(# name, val);
// setup.register_lib_entry(# name, __FILE__);
// setup.include(# name);
// setup.namespace_push(# name);
// NETLIST_NAME(model)(setup);
// setup.namespace_pop();
// setup.register_frontier(# attach, r_in, r_out);
// setup.tt_factory_create(desc, __FILE__);
class setup_t
class nlparse_t
{
public:
using link_t = std::pair<pstring, pstring>;
nlparse_t(netlist_t &netlist);
void register_model(const pstring &model_in);
void register_alias(const pstring &alias, const pstring &out);
void register_dippins_arr(const pstring &terms);
void register_dev(const pstring &classname, const pstring &name);
void register_link(const pstring &sin, const pstring &sout);
void register_link_arr(const pstring &terms);
void register_param(const pstring &param, const pstring &value);
void register_param(const pstring &param, const double value);
void register_lib_entry(const pstring &name, const pstring &sourcefile);
void register_frontier(const pstring &attach, const double r_IN, const double r_OUT);
void tt_factory_create(tt_desc &desc, const pstring &sourcefile);
/* handle namespace */
void namespace_push(const pstring &aname);
void namespace_pop();
/* include other files */
void include(const pstring &netlist_name);
/* parse a source */
pstring build_fqn(const pstring &obj_name) const;
void register_alias_nofqn(const pstring &alias, const pstring &out);
/* also called from devices for latebinding connected terminals */
void register_link_fqn(const pstring &sin, const pstring &sout);
/* used from netlist.cpp (mame) */
bool device_exists(const pstring &name) const;
protected:
std::unordered_map<pstring, pstring> m_models;
std::stack<pstring> m_namespace_stack;
std::unordered_map<pstring, pstring> m_alias;
std::vector<link_t> m_links;
std::unordered_map<pstring, pstring> m_param_values;
source_t::list_t m_sources;
factory::list_t m_factory;
/* need to preserve order of device creation ... */
std::vector<std::pair<pstring, factory::element_t *>> m_device_factory;
private:
log_type &log() { return m_log; }
const log_type &log() const { return m_log; }
log_type &m_log;
unsigned m_frontier_cnt;
};
class setup_t : public nlparse_t
{
public:
explicit setup_t(netlist_t &netlist);
~setup_t() noexcept;
@ -240,53 +282,21 @@ namespace netlist
netlist_t &exec() { return m_netlist; }
const netlist_t &exec() const { return m_netlist; }
pstring build_fqn(const pstring &obj_name) const;
void register_param(const pstring &name, param_t &param);
void register_param_t(const pstring &name, param_t &param);
pstring get_initial_param_val(const pstring &name, const pstring &def) const;
void register_term(detail::core_terminal_t &obj);
void register_dev(const pstring &classname, const pstring &name);
void register_lib_entry(const pstring &name, const pstring &sourcefile);
void register_model(const pstring &model_in);
void register_alias(const pstring &alias, const pstring &out);
void register_dippins_arr(const pstring &terms);
void register_alias_nofqn(const pstring &alias, const pstring &out);
void register_link_arr(const pstring &terms);
void register_link_fqn(const pstring &sin, const pstring &sout);
void register_link(const pstring &sin, const pstring &sout);
void register_param(const pstring &param, const pstring &value);
void register_param(const pstring &param, const double value);
void register_frontier(const pstring &attach, const double r_IN, const double r_OUT);
void remove_connections(const pstring &attach);
bool connect(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
bool device_exists(const pstring &name) const;
param_t *find_param(const pstring &param_in, bool required = true) const;
void register_dynamic_log_devices();
void resolve_inputs();
/* handle namespace */
void namespace_push(const pstring &aname);
void namespace_pop();
/* parse a source */
void include(const pstring &netlist_name);
std::unique_ptr<plib::pistream> get_data_stream(const pstring &name);
bool parse_stream(std::unique_ptr<plib::pistream> istrm, const pstring &name);
@ -317,8 +327,6 @@ namespace netlist
const logic_family_desc_t *family_from_model(const pstring &model);
void tt_factory_create(tt_desc &desc, const pstring &sourcefile);
/* helper - also used by nltool */
const pstring resolve_alias(const pstring &name) const;
@ -357,28 +365,15 @@ namespace netlist
devices::nld_base_proxy *get_d_a_proxy(detail::core_terminal_t &out);
devices::nld_base_proxy *get_a_d_proxy(detail::core_terminal_t &inp);
/* need to preserve order of device creation ... */
std::vector<std::pair<pstring, factory::element_t *>> m_device_factory;
//std::unordered_map<pstring, factory::element_t *> m_device_factory;
std::unordered_map<pstring, pstring> m_alias;
std::unordered_map<pstring, pstring> m_param_values;
std::unordered_map<pstring, detail::core_terminal_t *> m_terminals;
netlist_t &m_netlist;
devices::nld_netlistparams *m_netlist_params;
std::unordered_map<pstring, param_ref_t> m_params;
std::vector<link_t> m_links;
factory::list_t m_factory;
std::unordered_map<pstring, pstring> m_models;
std::stack<pstring> m_namespace_stack;
source_t::list_t m_sources;
plib::ppreprocessor::defines_map_type m_defines;
unsigned m_proxy_cnt;
unsigned m_frontier_cnt;
};
// ----------------------------------------------------------------------------------------

View File

@ -139,7 +139,7 @@ std::unique_ptr<plib::pistream> netlist_data_folder_t::stream(const pstring &fil
try
{
auto strm = plib::make_unique<plib::pifilestream>(name);
return strm;
return std::move(strm);
}
catch (const plib::pexception &e)
{
@ -632,7 +632,7 @@ void tool_app_t::listdevices()
{
pstring out = plib::pfmt("{1:-20} {2}(<id>")(f->classname())(f->name());
f->macro_actions(nt.setup().netlist(), f->name() + "_lc");
f->macro_actions(nt.setup(), f->name() + "_lc");
auto d = f->Create(nt.setup().netlist(), f->name() + "_lc");
// get the list of terminals ...

View File

@ -221,7 +221,7 @@ void bebox_state::bebox_peripherals(machine_config &config)
pcislot0.set_option_machine_config("mpc105", mpc105_config);
add_pci_slot(config, "pcibus:1", 1, "cirrus");
/*MCFG_PCI_BUS_DEVICE(12, nullptr, scsi53c810_pci_read, scsi53c810_pci_write)*/
/*MCFG_PCI_BUS_LEGACY_DEVICE(12, nullptr, scsi53c810_pci_read, scsi53c810_pci_write)*/
SMC37C78(config, m_smc37c78, 24'000'000);
m_smc37c78->intrq_wr_callback().set(FUNC(bebox_state::fdc_interrupt));

View File

@ -640,7 +640,8 @@ void fidel68k_state::fdes2325(machine_config &config)
config.set_default_layout(layout_fidel_desdis_68kg);
}
MACHINE_CONFIG_START(fidel68k_state::eag_base)
void fidel68k_state::eag_base(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 16_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidel68k_state::eag_map);
@ -663,11 +664,11 @@ MACHINE_CONFIG_START(fidel68k_state::eag_base)
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fidel_scc")
MCFG_GENERIC_EXTENSIONS("bin,dat")
MCFG_GENERIC_LOAD(fidelbase_state, scc_cartridge)
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_scc", "bin,dat"));
cartslot.set_device_load(device_image_load_delegate(&fidelbase_state::device_image_load_scc_cartridge, this));
SOFTWARE_LIST(config, "cart_list").set_original("fidel_scc");
MACHINE_CONFIG_END
}
void fidel68k_state::eag(machine_config &config)
{

View File

@ -21,6 +21,13 @@ Sensory Chess Challenger 6 (model SC6):
- external 4KB ROM 2332 101-1035A01, in module slot
- buzzer, 2 7seg LEDs, 8*8 chessboard buttons
released modules, * denotes not dumped yet:
- *BO6: Book Openings I
- *CG6: Greatest Chess Games 1
- SC6: pack-in, original program
SC6 program is contained in BO6 and CG6.
******************************************************************************/
#include "emu.h"
@ -38,12 +45,15 @@ class fidelmcs48_state : public fidelbase_state
{
public:
fidelmcs48_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag)
fidelbase_state(mconfig, type, tag),
m_maincpu(*this, "maincpu")
{ }
void sc6(machine_config &config);
private:
required_device<mcs48_cpu_device> m_maincpu;
// SC6
void sc6_prepare_display();
DECLARE_WRITE8_MEMBER(sc6_mux_w);
@ -52,6 +62,7 @@ private:
DECLARE_READ_LINE_MEMBER(sc6_input6_r);
DECLARE_READ_LINE_MEMBER(sc6_input7_r);
void sc6_map(address_map &map);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(sc6_cartridge);
};
@ -62,6 +73,26 @@ private:
SC6
******************************************************************************/
// cartridge
DEVICE_IMAGE_LOAD_MEMBER(fidelmcs48_state, sc6_cartridge)
{
u32 size = m_cart->common_get_size("rom");
// 4KB ROM only?
if (size != 0x1000)
{
image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid file size");
return image_init_result::FAIL;
}
m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
return image_init_result::PASS;
}
// MCU ports/generic
void fidelmcs48_state::sc6_prepare_display()
@ -120,7 +151,7 @@ READ_LINE_MEMBER(fidelmcs48_state::sc6_input7_r)
void fidelmcs48_state::sc6_map(address_map &map)
{
map(0x0000, 0x0fff).rom();
map(0x0000, 0x0fff).r("cartslot", FUNC(generic_slot_device::read_rom));
}
@ -152,13 +183,13 @@ INPUT_PORTS_END
void fidelmcs48_state::sc6(machine_config &config)
{
/* basic machine hardware */
i8040_device &maincpu(I8040(config, m_maincpu, 11_MHz_XTAL));
maincpu.set_addrmap(AS_PROGRAM, &fidelmcs48_state::sc6_map);
maincpu.p2_out_cb().set(FUNC(fidelmcs48_state::sc6_mux_w));
maincpu.p1_in_cb().set(FUNC(fidelmcs48_state::sc6_input_r));
maincpu.p1_out_cb().set(FUNC(fidelmcs48_state::sc6_select_w));
maincpu.t0_in_cb().set(FUNC(fidelmcs48_state::sc6_input6_r));
maincpu.t1_in_cb().set(FUNC(fidelmcs48_state::sc6_input7_r));
I8040(config, m_maincpu, 11_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidelmcs48_state::sc6_map);
m_maincpu->p2_out_cb().set(FUNC(fidelmcs48_state::sc6_mux_w));
m_maincpu->p1_in_cb().set(FUNC(fidelmcs48_state::sc6_input_r));
m_maincpu->p1_out_cb().set(FUNC(fidelmcs48_state::sc6_select_w));
m_maincpu->t0_in_cb().set(FUNC(fidelmcs48_state::sc6_input6_r));
m_maincpu->t1_in_cb().set(FUNC(fidelmcs48_state::sc6_input7_r));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_sc6);
@ -169,6 +200,13 @@ void fidelmcs48_state::sc6(machine_config &config)
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
vref.set_output(5.0);
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
/* cartridge */
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "fidel_sc6", "bin"));
cartslot.set_device_load(device_image_load_delegate(&fidelmcs48_state::device_image_load_sc6_cartridge, this));
cartslot.set_must_be_loaded(true);
SOFTWARE_LIST(config, "cart_list").set_original("fidel_sc6");
}
@ -178,8 +216,8 @@ void fidelmcs48_state::sc6(machine_config &config)
******************************************************************************/
ROM_START( fscc6 )
ROM_REGION( 0x1000, "maincpu", 0 )
ROM_LOAD("101-1035a01", 0x0000, 0x1000, CRC(0024971f) SHA1(76b16364913ada2fb94b9e6a8524b924e6832ddf) ) // 2332
ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 )
// none here, it's in the module slot
ROM_END

View File

@ -37,11 +37,10 @@
- Fidelity Challenger Printer - thermal printer, MCU=D8048C243
Program/data cartridges, for various boards, some cross-compatible:
- CG6: Greatest Chess Games 1
- CAC: Challenger Advanced Chess - 8KB 101-1038A01
- CB9: Challenger Book Openings 1 - 8KB (label not known)
- CB16: Challenger Book Openings 2 - 8+8KB 101-1042A01,02
- others are alt. titles of these?
- *CG64: 64 Greatest Games
- *EOA-EOE: Challenger Book Openings - Chess Encyclopedia A-E (5 modules)
Board hardware descriptions below.
Detailed RE work done by Kevin 'kevtris' Horton, except where noted
@ -520,51 +519,20 @@ class fidelz80_state : public fidelbase_state
public:
fidelz80_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_mcu(*this, "mcu"),
m_z80pio(*this, "z80pio"),
m_ppi8255(*this, "ppi8255"),
m_i8243(*this, "i8243"),
m_beeper_off(*this, "beeper_off"),
m_beeper(*this, "beeper")
m_ppi8255(*this, "ppi8255")
{ }
void cc10(machine_config &config);
void vcc(machine_config &config);
void bcc(machine_config &config);
void bkc(machine_config &config);
void scc(machine_config &config);
void vsc(machine_config &config);
void brc_base(machine_config &config);
void ubc(machine_config &config);
void vbrc(machine_config &config);
void bv3(machine_config &config);
void dsc(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
private:
// devices/pointers
optional_device<i8041_device> m_mcu;
optional_device<z80pio_device> m_z80pio;
optional_device<i8255_device> m_ppi8255;
optional_device<i8243_device> m_i8243;
optional_device<timer_device> m_beeper_off;
optional_device<beep_device> m_beeper;
// CC10, VCC/UVC
void vcc_prepare_display();
DECLARE_READ8_MEMBER(vcc_speech_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_porta_w);
DECLARE_READ8_MEMBER(vcc_ppi_portb_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_portb_w);
DECLARE_READ8_MEMBER(vcc_ppi_portc_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_portc_w);
DECLARE_WRITE8_MEMBER(cc10_ppi_porta_w);
TIMER_DEVICE_CALLBACK_MEMBER(beeper_off_callback);
DECLARE_MACHINE_START(vcc);
void cc10_map(address_map &map);
void vcc_io(address_map &map);
void vcc_map(address_map &map);
// BCC, BKC
DECLARE_READ8_MEMBER(bcc_input_r);
@ -580,6 +548,7 @@ private:
// VSC
void vsc_prepare_display();
DECLARE_READ8_MEMBER(vsc_speech_r);
DECLARE_READ8_MEMBER(vsc_io_trampoline_r);
DECLARE_WRITE8_MEMBER(vsc_io_trampoline_w);
DECLARE_WRITE8_MEMBER(vsc_ppi_porta_w);
@ -591,15 +560,6 @@ private:
void vsc_io(address_map &map);
void vsc_map(address_map &map);
// VBRC/UBC, BV3
void vbrc_prepare_display();
DECLARE_WRITE8_MEMBER(vbrc_speech_w);
DECLARE_WRITE8_MEMBER(vbrc_mcu_p1_w);
DECLARE_READ8_MEMBER(vbrc_mcu_p2_r);
template<int P> void vbrc_ioexp_port_w(uint8_t data);
void vbrc_main_io(address_map &map);
void vbrc_main_map(address_map &map);
// DSC
void dsc_prepare_display();
DECLARE_WRITE8_MEMBER(dsc_control_w);
@ -653,6 +613,112 @@ void fidelbase_state::machine_reset()
class ccx_state : public fidelbase_state
{
public:
ccx_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_ppi8255(*this, "ppi8255"),
m_beeper_off(*this, "beeper_off"),
m_beeper(*this, "beeper")
{ }
void ccx(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
private:
// devices/pointers
required_device<i8255_device> m_ppi8255;
required_device<timer_device> m_beeper_off;
required_device<beep_device> m_beeper;
TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); }
void ccx_prepare_display();
DECLARE_WRITE8_MEMBER(ccx_ppi_porta_w);
DECLARE_WRITE8_MEMBER(ccx_ppi_portb_w);
DECLARE_READ8_MEMBER(ccx_ppi_portc_r);
DECLARE_WRITE8_MEMBER(ccx_ppi_portc_w);
void ccx_io(address_map &map);
void ccx_map(address_map &map);
};
class card_state : public fidelbase_state
{
public:
card_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_mcu(*this, "mcu"),
m_i8243(*this, "i8243")
{ }
void brc_base(machine_config &config);
void ubc(machine_config &config);
void vbrc(machine_config &config);
void bv3(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
private:
// devices/pointers
required_device<i8041_device> m_mcu;
required_device<i8243_device> m_i8243;
void vbrc_prepare_display();
DECLARE_WRITE8_MEMBER(vbrc_speech_w);
DECLARE_WRITE8_MEMBER(vbrc_mcu_p1_w);
DECLARE_READ8_MEMBER(vbrc_mcu_p2_r);
template<int P> void vbrc_ioexp_port_w(uint8_t data);
void vbrc_main_io(address_map &map);
void vbrc_main_map(address_map &map);
};
class vcc_state : public fidelbase_state
{
public:
vcc_state(const machine_config &mconfig, device_type type, const char *tag) :
fidelbase_state(mconfig, type, tag),
m_ppi8255(*this, "ppi8255")
{ }
void vcc(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
protected:
virtual void machine_start() override;
private:
// devices/pointers
required_device<i8255_device> m_ppi8255;
void vcc_prepare_display();
DECLARE_READ8_MEMBER(vcc_speech_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_porta_w);
DECLARE_READ8_MEMBER(vcc_ppi_portb_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_portb_w);
DECLARE_READ8_MEMBER(vcc_ppi_portc_r);
DECLARE_WRITE8_MEMBER(vcc_ppi_portc_w);
void vcc_io(address_map &map);
void vcc_map(address_map &map);
};
void vcc_state::machine_start()
{
fidelbase_state::machine_start();
// game relies on RAM initialized filled with 1
for (int i = 0; i < 0x400; i++)
m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff);
}
/***************************************************************************
Helper Functions
@ -747,15 +813,6 @@ u16 fidelbase_state::read_inputs(int columns)
return ret;
}
INPUT_CHANGED_MEMBER(fidelz80_state::reset_button)
{
// when RE button is directly wired to RESET pin(s)
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
if (m_mcu)
m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
// cartridge
@ -789,12 +846,12 @@ READ8_MEMBER(fidelbase_state::cartridge_r)
// Devices, I/O
/******************************************************************************
CC10, VCC/UVC
CCX, VCC/UVC
******************************************************************************/
// misc handlers
void fidelz80_state::vcc_prepare_display()
void vcc_state::vcc_prepare_display()
{
// 4 7seg leds (note: sel d0 for extra leds)
u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
@ -802,24 +859,15 @@ void fidelz80_state::vcc_prepare_display()
display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf);
}
READ8_MEMBER(fidelz80_state::vcc_speech_r)
READ8_MEMBER(vcc_state::vcc_speech_r)
{
return m_speech_rom[m_speech_bank << 12 | offset];
}
MACHINE_START_MEMBER(fidelz80_state,vcc)
{
machine_start();
// game relies on RAM initialized filled with 1
for (int i = 0; i < 0x400; i++)
m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, 0xff);
}
// I8255 PPI
WRITE8_MEMBER(fidelz80_state::vcc_ppi_porta_w)
WRITE8_MEMBER(vcc_state::vcc_ppi_porta_w)
{
// d0-d6: digit segment data, bits are xABCDEFG
m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
@ -839,13 +887,13 @@ WRITE8_MEMBER(fidelz80_state::vcc_ppi_porta_w)
}
}
READ8_MEMBER(fidelz80_state::vcc_ppi_portb_r)
READ8_MEMBER(vcc_state::vcc_ppi_portb_r)
{
// d7: TSI BUSY line
return (m_speech->busy_r()) ? 0x80 : 0x00;
}
WRITE8_MEMBER(fidelz80_state::vcc_ppi_portb_w)
WRITE8_MEMBER(vcc_state::vcc_ppi_portb_w)
{
// d0,d2-d5: digit/led select
// _d6: enable language switches
@ -853,39 +901,64 @@ WRITE8_MEMBER(fidelz80_state::vcc_ppi_portb_w)
vcc_prepare_display();
}
READ8_MEMBER(fidelz80_state::vcc_ppi_portc_r)
READ8_MEMBER(vcc_state::vcc_ppi_portc_r)
{
// d0-d3: multiplexed inputs (active low), also language switches
u8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0;
return ~(lan | read_inputs(4)) & 0xf;
}
WRITE8_MEMBER(fidelz80_state::vcc_ppi_portc_w)
WRITE8_MEMBER(vcc_state::vcc_ppi_portc_w)
{
// d4-d7: input mux (inverted)
m_inp_mux = ~data >> 4 & 0xf;
}
// CC10-specific (no speech chip, 1-bit beeper instead)
// CCX-specific (no speech chip, 1-bit beeper instead)
TIMER_DEVICE_CALLBACK_MEMBER(fidelz80_state::beeper_off_callback)
void ccx_state::ccx_prepare_display()
{
m_beeper->set_state(0);
// 4 7seg leds (note: sel d0 for extra leds)
u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
set_display_segmask(0xf, 0x7f);
display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf);
}
WRITE8_MEMBER(fidelz80_state::cc10_ppi_porta_w)
// I8255 PPI
WRITE8_MEMBER(ccx_state::ccx_ppi_porta_w)
{
// d7: enable beeper on falling edge
// d7: enable beeper on falling edge (555 monostable)
if (m_beeper && ~data & m_7seg_data & 0x80)
{
m_beeper->set_state(1);
m_beeper_off->adjust(attotime::from_msec(80)); // duration is approximate
}
// d0-d6: digit segment data (same as VCC)
// d0-d6: digit segment data
m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6);
vcc_prepare_display();
ccx_prepare_display();
}
WRITE8_MEMBER(ccx_state::ccx_ppi_portb_w)
{
// d0,d2-d5: digit/led select
m_led_select = data;
ccx_prepare_display();
}
READ8_MEMBER(ccx_state::ccx_ppi_portc_r)
{
// d0-d3: multiplexed inputs (active low)
return ~read_inputs(4) & 0xf;
}
WRITE8_MEMBER(ccx_state::ccx_ppi_portc_w)
{
// d4-d7: input mux (inverted)
m_inp_mux = ~data >> 4 & 0xf;
}
@ -961,6 +1034,11 @@ void fidelz80_state::vsc_prepare_display()
display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_led_select);
}
READ8_MEMBER(fidelz80_state::vsc_speech_r)
{
return m_speech_rom[m_speech_bank << 12 | offset];
}
// I8255 PPI
@ -1034,7 +1112,7 @@ WRITE8_MEMBER(fidelz80_state::vsc_pio_portb_w)
// misc handlers
void fidelz80_state::vbrc_prepare_display()
void card_state::vbrc_prepare_display()
{
// 14seg led segments, d15(12) is extra led
u16 outdata = bitswap<16>(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8);
@ -1042,7 +1120,7 @@ void fidelz80_state::vbrc_prepare_display()
display_matrix(16, 8, outdata, m_led_select);
}
WRITE8_MEMBER(fidelz80_state::vbrc_speech_w)
WRITE8_MEMBER(card_state::vbrc_speech_w)
{
if (m_speech == nullptr)
return;
@ -1056,7 +1134,7 @@ WRITE8_MEMBER(fidelz80_state::vbrc_speech_w)
// I8243 I/O expander
template<int P>
void fidelz80_state::vbrc_ioexp_port_w(uint8_t data)
void card_state::vbrc_ioexp_port_w(uint8_t data)
{
// P4x-P7x: digit segment data
m_7seg_data = (m_7seg_data & ~(0xf << (4*P))) | ((data & 0xf) << (4*P));
@ -1070,14 +1148,14 @@ void fidelz80_state::vbrc_ioexp_port_w(uint8_t data)
// I8041 MCU
WRITE8_MEMBER(fidelz80_state::vbrc_mcu_p1_w)
WRITE8_MEMBER(card_state::vbrc_mcu_p1_w)
{
// P10-P17: select digits, input mux
m_inp_mux = m_led_select = data;
vbrc_prepare_display();
}
READ8_MEMBER(fidelz80_state::vbrc_mcu_p2_r)
READ8_MEMBER(card_state::vbrc_mcu_p2_r)
{
// P20-P23: I8243 P2
// P24-P27: multiplexed inputs (active low)
@ -1129,9 +1207,9 @@ READ8_MEMBER(fidelz80_state::dsc_input_r)
Address Maps
******************************************************************************/
// CC10, VCC/UVC
// CCX, VCC/UVC
void fidelz80_state::cc10_map(address_map &map)
void ccx_state::ccx_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0x3fff);
@ -1140,14 +1218,20 @@ void fidelz80_state::cc10_map(address_map &map)
map(0x3000, 0x30ff).mirror(0x0f00).ram();
}
void fidelz80_state::vcc_map(address_map &map)
void ccx_state::ccx_io(address_map &map)
{
map.global_mask(0x03);
map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
}
void vcc_state::vcc_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x2fff).rom();
map(0x4000, 0x43ff).mirror(0x1c00).ram();
}
void fidelz80_state::vcc_io(address_map &map)
void vcc_state::vcc_io(address_map &map)
{
map.global_mask(0x03);
map(0x00, 0x03).rw(m_ppi8255, FUNC(i8255_device::read), FUNC(i8255_device::write));
@ -1225,15 +1309,15 @@ void fidelz80_state::vsc_io(address_map &map)
// VBRC/UBC, BV3
void fidelz80_state::vbrc_main_map(address_map &map)
void card_state::vbrc_main_map(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x5fff).rom();
map(0x6000, 0x63ff).mirror(0x1c00).ram();
map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(fidelz80_state::vbrc_speech_w));
map(0xe000, 0xe000).mirror(0x1fff).w(FUNC(card_state::vbrc_speech_w));
}
void fidelz80_state::vbrc_main_io(address_map &map)
void card_state::vbrc_main_io(address_map &map)
{
map.global_mask(0x01);
map(0x00, 0x01).rw(m_mcu, FUNC(i8041_device::upi41_master_r), FUNC(i8041_device::upi41_master_w));
@ -1260,6 +1344,12 @@ void fidelz80_state::dsc_map(address_map &map)
// static or boardless games
INPUT_CHANGED_MEMBER(vcc_state::reset_button)
{
// RE button is directly wired to maincpu RESET pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
static INPUT_PORTS_START( vcc_base )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
@ -1286,14 +1376,42 @@ static INPUT_PORTS_START( vcc_base )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
PORT_START("RESET") // is not on matrix IN.0 d0
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, fidelz80_state, reset_button, nullptr)
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, vcc_state, reset_button, nullptr)
INPUT_PORTS_END
static INPUT_PORTS_START( cc10 )
PORT_INCLUDE( vcc_base )
INPUT_CHANGED_MEMBER(ccx_state::reset_button)
{
// RE button is directly wired to maincpu RESET pin
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
PORT_START("IN.4")
PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED)
static INPUT_PORTS_START( ccx )
PORT_START("IN.0")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV") PORT_CODE(KEYCODE_L)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_A)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_E)
PORT_START("IN.1")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Speaker") PORT_CODE(KEYCODE_SPACE)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM") PORT_CODE(KEYCODE_M)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_B)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_F)
PORT_START("IN.2")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB") PORT_CODE(KEYCODE_P)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_C)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("G7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_G)
PORT_START("IN.3")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("EN") PORT_CODE(KEYCODE_ENTER)
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV") PORT_CODE(KEYCODE_V)
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_D)
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("H8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_H)
PORT_START("RESET") // is not on matrix IN.0 d0
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, ccx_state, reset_button, nullptr)
PORT_START("LEVEL") // hardwired (VCC/GND?)
PORT_CONFNAME( 0x80, 0x00, "Maximum Levels" )
@ -1383,6 +1501,12 @@ static INPUT_PORTS_START( bkc )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD)
INPUT_PORTS_END
INPUT_CHANGED_MEMBER(card_state::reset_button)
{
// reset button is directly wired to maincpu/mcu RESET pins
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
m_mcu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
static INPUT_PORTS_START( vbrc )
PORT_START("IN.0")
@ -1434,7 +1558,7 @@ static INPUT_PORTS_START( vbrc )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs")
PORT_START("RESET") // is not on matrix IN.7 d0
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, fidelz80_state, reset_button, nullptr) PORT_NAME("RE")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("RE")
PORT_START("BARCODE")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner")
@ -1491,7 +1615,7 @@ static INPUT_PORTS_START( bv3 )
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Clubs")
PORT_START("RESET") // is not on matrix IN.7 d0
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, fidelz80_state, reset_button, nullptr) PORT_NAME("Reset")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, card_state, reset_button, nullptr) PORT_NAME("Reset")
PORT_START("BARCODE")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Card Scanner")
@ -1786,21 +1910,21 @@ void fidelz80_state::scc(machine_config &config)
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
void fidelz80_state::cc10(machine_config &config)
void ccx_state::ccx(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::cc10_map);
m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vcc_io);
m_maincpu->set_addrmap(AS_PROGRAM, &ccx_state::ccx_map);
m_maincpu->set_addrmap(AS_IO, &ccx_state::ccx_io);
I8255(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::cc10_ppi_porta_w));
m_ppi8255->out_pa_callback().set(FUNC(ccx_state::ccx_ppi_porta_w));
m_ppi8255->tri_pa_callback().set_constant(0);
m_ppi8255->in_pb_callback().set_ioport("LEVEL");
m_ppi8255->out_pb_callback().set(FUNC(fidelz80_state::vcc_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_r));
m_ppi8255->out_pb_callback().set(FUNC(ccx_state::ccx_ppi_portb_w));
m_ppi8255->in_pc_callback().set(FUNC(ccx_state::ccx_ppi_portc_r));
m_ppi8255->tri_pb_callback().set_constant(0);
m_ppi8255->out_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_w));
m_ppi8255->out_pc_callback().set(FUNC(ccx_state::ccx_ppi_portc_w));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_cc10);
@ -1809,34 +1933,32 @@ void fidelz80_state::cc10(machine_config &config)
SPEAKER(config, "speaker").front_center();
BEEP(config, m_beeper, 1360); // approximation, from 556 timer ic
m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25);
TIMER(config, "beeper_off").configure_generic(FUNC(fidelz80_state::beeper_off_callback));
TIMER(config, "beeper_off").configure_generic(FUNC(ccx_state::beeper_off));
}
void fidelz80_state::vcc(machine_config &config)
void vcc_state::vcc(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 4_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vcc_map);
m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vcc_io);
m_maincpu->set_addrmap(AS_PROGRAM, &vcc_state::vcc_map);
m_maincpu->set_addrmap(AS_IO, &vcc_state::vcc_io);
I8255(config, m_ppi8255);
m_ppi8255->out_pa_callback().set(FUNC(fidelz80_state::vcc_ppi_porta_w));
m_ppi8255->out_pa_callback().set(FUNC(vcc_state::vcc_ppi_porta_w));
m_ppi8255->tri_pa_callback().set_constant(0);
m_ppi8255->in_pb_callback().set(FUNC(fidelz80_state::vcc_ppi_portb_r));
m_ppi8255->out_pb_callback().set(FUNC(fidelz80_state::vcc_ppi_portb_w));
m_ppi8255->in_pb_callback().set(FUNC(vcc_state::vcc_ppi_portb_r));
m_ppi8255->out_pb_callback().set(FUNC(vcc_state::vcc_ppi_portb_w));
m_ppi8255->tri_pb_callback().set_constant(0);
m_ppi8255->in_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_r));
m_ppi8255->out_pc_callback().set(FUNC(fidelz80_state::vcc_ppi_portc_w));
m_ppi8255->in_pc_callback().set(FUNC(vcc_state::vcc_ppi_portc_r));
m_ppi8255->out_pc_callback().set(FUNC(vcc_state::vcc_ppi_portc_w));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_vcc);
MCFG_MACHINE_START_OVERRIDE(fidelz80_state,vcc)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
m_speech->ext_read().set(FUNC(fidelz80_state::vcc_speech_r));
m_speech->ext_read().set(FUNC(vcc_state::vcc_speech_r));
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
}
@ -1868,21 +1990,21 @@ void fidelz80_state::vsc(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
S14001A(config, m_speech, 25000); // R/C circuit, around 25khz
m_speech->ext_read().set(FUNC(fidelz80_state::vcc_speech_r));
m_speech->ext_read().set(FUNC(fidelz80_state::vsc_speech_r));
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
}
void fidelz80_state::brc_base(machine_config &config)
void card_state::brc_base(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 5_MHz_XTAL/2);
m_maincpu->set_addrmap(AS_PROGRAM, &fidelz80_state::vbrc_main_map);
m_maincpu->set_addrmap(AS_IO, &fidelz80_state::vbrc_main_io);
m_maincpu->set_addrmap(AS_PROGRAM, &card_state::vbrc_main_map);
m_maincpu->set_addrmap(AS_IO, &card_state::vbrc_main_io);
config.m_perfect_cpu_quantum = subtag("maincpu");
I8041(config, m_mcu, 5_MHz_XTAL);
m_mcu->p1_out_cb().set(FUNC(fidelz80_state::vbrc_mcu_p1_w));
m_mcu->p2_in_cb().set(FUNC(fidelz80_state::vbrc_mcu_p2_r));
m_mcu->p1_out_cb().set(FUNC(card_state::vbrc_mcu_p1_w));
m_mcu->p2_in_cb().set(FUNC(card_state::vbrc_mcu_p2_r));
m_mcu->p2_out_cb().set(m_i8243, FUNC(i8243_device::p2_w));
m_mcu->prog_out_cb().set(m_i8243, FUNC(i8243_device::prog_w));
m_mcu->t0_in_cb().set_ioport("BARCODE"); // card scanner
@ -1892,16 +2014,16 @@ void fidelz80_state::brc_base(machine_config &config)
m_mcu->t1_in_cb().set("t1_clock", FUNC(clock_device::signal_r)).invert();
I8243(config, m_i8243);
m_i8243->p4_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<0>));
m_i8243->p5_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<1>));
m_i8243->p6_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<2>));
m_i8243->p7_out_cb().set(FUNC(fidelz80_state::vbrc_ioexp_port_w<3>));
m_i8243->p4_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<0>));
m_i8243->p5_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<1>));
m_i8243->p6_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<2>));
m_i8243->p7_out_cb().set(FUNC(card_state::vbrc_ioexp_port_w<3>));
TIMER(config, "display_decay").configure_periodic(FUNC(fidelbase_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_fidel_vbrc);
}
void fidelz80_state::ubc(machine_config &config)
void card_state::ubc(machine_config &config)
{
brc_base(config);
@ -1913,7 +2035,7 @@ void fidelz80_state::ubc(machine_config &config)
vref.add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT);
}
void fidelz80_state::vbrc(machine_config &config)
void card_state::vbrc(machine_config &config)
{
brc_base(config);
@ -1924,7 +2046,7 @@ void fidelz80_state::vbrc(machine_config &config)
m_speech->add_route(ALL_OUTPUTS, "speaker", 0.75);
}
void fidelz80_state::bv3(machine_config &config)
void card_state::bv3(machine_config &config)
{
vbrc(config);
config.set_default_layout(layout_fidel_bv3);
@ -2154,29 +2276,29 @@ ROM_END
******************************************************************************/
// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME, FLAGS
CONS( 1978, cc10, 0, 0, cc10, cc10, fidelz80_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1978, cc10, 0, 0, ccx, ccx, ccx_state, empty_init, "Fidelity Electronics", "Chess Challenger 10 (model CCX, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, cc7, 0, 0, bcc, bcc, fidelz80_state, empty_init, "Fidelity Electronics", "Chess Challenger 7 (model BCC, rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, backgamc, 0, 0, bkc, bkc, fidelz80_state, empty_init, "Fidelity Electronics", "Backgammon Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW )
CONS( 1980, fscc8, 0, 0, scc, scc, fidelz80_state, empty_init, "Fidelity Electronics", "Sensory Chess Challenger 8", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1979, vcc, 0, 0, vcc, vcc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vccsp, vcc, 0, vcc, vccsp, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vccg, vcc, 0, vcc, vccg, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vccfr, vcc, 0, vcc, vccfr, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vcc, 0, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vccsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vccg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, vccfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvc, vcc, 0, vcc, vcc, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvcsp, vcc, 0, vcc, vccsp, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvcg, vcc, 0, vcc, vccg, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvcfr, vcc, 0, vcc, vccfr, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvc, vcc, 0, vcc, vcc, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvcsp, vcc, 0, vcc, vccsp, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvcg, vcc, 0, vcc, vccg, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, uvcfr, vcc, 0, vcc, vccfr, vcc_state, empty_init, "Fidelity Electronics", "Advanced Voice Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1980, vsc, 0, 0, vsc, vsc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (English)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscsp, vsc, 0, vsc, vscsp, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscg, vsc, 0, vsc, vscg, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (German)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vscfr, vsc, 0, vsc, vscfr, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Sensory Chess Challenger (French)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )
CONS( 1980, vbrc, 0, 0, vbrc, vbrc, fidelz80_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, fidelz80_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1982, bridgec3, 0, 0, bv3, bv3, fidelz80_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1980, vbrc, 0, 0, vbrc, vbrc, card_state, empty_init, "Fidelity Electronics", "Voice Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1980, bridgeca, vbrc, 0, ubc, vbrc, card_state, empty_init, "Fidelity Electronics", "Advanced Bridge Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1982, bridgec3, 0, 0, bv3, bv3, card_state, empty_init, "Fidelity Electronics", "Bridge Challenger III", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS | MACHINE_NOT_WORKING )
CONS( 1981, damesc, 0, 0, dsc, dsc, fidelz80_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS )

View File

@ -141,8 +141,8 @@ MACHINE_CONFIG_START(gammagic_state::gammagic)
// I82371SB(config, "i82371sb", 0);
// MCFG_I82439TX_ADD("i82439tx", "maincpu", "user")
MCFG_PCI_BUS_LEGACY_ADD("pcibus", 0)
// MCFG_PCI_BUS_DEVICE(0, "i82439tx", i82439tx_pci_read, i82439tx_pci_write)
// MCFG_PCI_BUS_DEVICE(1, "i82371sb", i82371sb_pci_read, i82371sb_pci_write)
// MCFG_PCI_BUS_LEGACY_DEVICE(0, "i82439tx", i82439tx_pci_read, i82439tx_pci_write)
// MCFG_PCI_BUS_LEGACY_DEVICE(1, "i82371sb", i82371sb_pci_read, i82371sb_pci_write)
/* video hardware */
pcvideo_vga(config);

View File

@ -1331,17 +1331,18 @@ void hp85_state::rombank_mem_map(address_map &map)
map(0x0000, 0x1fff).rom();
}
MACHINE_CONFIG_START(hp85_state::hp85)
MCFG_DEVICE_ADD("cpu" , HP_CAPRICORN , MASTER_CLOCK / 16)
MCFG_DEVICE_PROGRAM_MAP(cpu_mem_map)
MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(hp85_state , irq_callback)
void hp85_state::hp85(machine_config &config)
{
HP_CAPRICORN(config, m_cpu, MASTER_CLOCK / 16);
m_cpu->set_addrmap(AS_PROGRAM, &hp85_state::cpu_mem_map);
m_cpu->set_irq_acknowledge_callback(FUNC(hp85_state::irq_callback));
ADDRESS_MAP_BANK(config, "rombank").set_map(&hp85_state::rombank_mem_map).set_options(ENDIANNESS_LITTLE, 8, 21, HP80_OPTROM_SIZE);
MCFG_SCREEN_ADD("screen" , RASTER)
MCFG_SCREEN_RAW_PARAMS(MASTER_CLOCK / 2 , 312 , 0 , 256 , 256 , 0 , 192)
MCFG_SCREEN_UPDATE_DRIVER(hp85_state , screen_update)
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, hp85_state, vblank_w))
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_raw(MASTER_CLOCK / 2 , 312 , 0 , 256 , 256 , 0 , 192);
m_screen->set_screen_update(FUNC(hp85_state::screen_update));
m_screen->screen_vblank().set(FUNC(hp85_state::vblank_w));
PALETTE(config, m_palette, palette_device::MONOCHROME);
TIMER(config, m_vm_timer).configure_generic(FUNC(hp85_state::vm_timer));
@ -1362,42 +1363,36 @@ MACHINE_CONFIG_START(hp85_state::hp85)
BEEP(config, m_beep, MASTER_CLOCK / 8192).add_route(ALL_OUTPUTS, "mono", 0.5, AUTO_ALLOC_INPUT, 0);
// Tape drive
MCFG_DEVICE_ADD("tape" , HP_1MA6 , 0)
HP_1MA6(config, "tape", 0);
// Optional ROMs
MCFG_DEVICE_ADD("drawer1", HP80_OPTROM_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
MCFG_DEVICE_ADD("drawer2", HP80_OPTROM_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
MCFG_DEVICE_ADD("drawer3", HP80_OPTROM_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
MCFG_DEVICE_ADD("drawer4", HP80_OPTROM_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
MCFG_DEVICE_ADD("drawer5", HP80_OPTROM_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
MCFG_DEVICE_ADD("drawer6", HP80_OPTROM_SLOT, 0)
MCFG_DEVICE_SLOT_INTERFACE(hp80_optrom_slot_devices, NULL, false)
HP80_OPTROM_SLOT(config, m_rom_drawers[0]);
HP80_OPTROM_SLOT(config, m_rom_drawers[1]);
HP80_OPTROM_SLOT(config, m_rom_drawers[2]);
HP80_OPTROM_SLOT(config, m_rom_drawers[3]);
HP80_OPTROM_SLOT(config, m_rom_drawers[4]);
HP80_OPTROM_SLOT(config, m_rom_drawers[5]);
// I/O slots
MCFG_HP80_IO_SLOT_ADD("slot1" , 0)
MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
MCFG_HP80_IO_SLOT_ADD("slot2" , 1)
MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
MCFG_HP80_IO_SLOT_ADD("slot3" , 2)
MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
MCFG_HP80_IO_SLOT_ADD("slot4" , 3)
MCFG_HP80_IO_IRL_CB(WRITE8(*this, hp85_state , irl_w))
MCFG_HP80_IO_HALT_CB(WRITE8(*this, hp85_state , halt_w))
HP80_IO_SLOT(config, m_io_slots[0]).set_slot_no(0);
m_io_slots[0]->irl_cb().set(FUNC(hp85_state::irl_w));
m_io_slots[0]->halt_cb().set(FUNC(hp85_state::halt_w));
HP80_IO_SLOT(config, m_io_slots[1]).set_slot_no(1);
m_io_slots[1]->irl_cb().set(FUNC(hp85_state::irl_w));
m_io_slots[1]->halt_cb().set(FUNC(hp85_state::halt_w));
HP80_IO_SLOT(config, m_io_slots[2]).set_slot_no(2);
m_io_slots[2]->irl_cb().set(FUNC(hp85_state::irl_w));
m_io_slots[2]->halt_cb().set(FUNC(hp85_state::halt_w));
HP80_IO_SLOT(config, m_io_slots[3]).set_slot_no(3);
m_io_slots[3]->irl_cb().set(FUNC(hp85_state::irl_w));
m_io_slots[3]->halt_cb().set(FUNC(hp85_state::halt_w));
// Printer output
BITBANGER(config, m_prt_graph_out, 0);
BITBANGER(config, m_prt_alpha_out, 0);
SOFTWARE_LIST(config, "optrom_list").set_original("hp85_rom");
MACHINE_CONFIG_END
}
ROM_START(hp85)
ROM_REGION(0x6000 , "cpu" , 0)

View File

@ -8,8 +8,8 @@
// **** Temporary header, will hopefully evolve into proper doc ****
//
// What's in:
// - Emulation of 9825B system
// - 12 kw of RAMs
// - Emulation of 9825B and 9825T systems
// - 12 kw (9825B) or 31kw (9825T) of RAM
// - 12 kw of system ROM
// - Keyboard (SHIFT LOCK & RESET not implemented)
// - Display & run light
@ -18,6 +18,8 @@
// - Beeper
// - Internal expansion ROMs
// - I/O expansion slots: 98032, 98034 & 98035 modules can be connected
// - For 9825T: the so-called SKOAL mechanism that transparently overlays RAM & ROM
// in the same address space
// What's not yet in:
// - External expansion ROMs
// - Configurable RAM size
@ -27,8 +29,11 @@
// by re-assembling the source code (this is the reason why it's marked as
// a BAD_DUMP). And thanks to Ansgar Kueckes for adapting his assembler to
// handle HP9825 source files.
// For what regards the 9825T, I'd like to thank again Dyke Shaffer for
// publishing a lot of internal HP docs about the SKOAL card. I recovered the
// content of SKOAL ROM from its printed & scanned dump.
//
// 9825A & 9825T can also be emulated. At the moment I haven't all the necessary
// 9825A can also be emulated. At the moment I haven't all the necessary
// ROM dumps, though.
#include "emu.h"
@ -42,6 +47,10 @@
#include "sound/beep.h"
#include "hp9825.lh"
// Debugging
#define VERBOSE 0
#include "logmacro.h"
// CPU clock (generated by a trimmered RC oscillator)
constexpr unsigned MAIN_CLOCK = 6000000;
@ -81,6 +90,9 @@ namespace {
}
}
// +--------------+
// | hp9825_state |
// +--------------+
class hp9825_state : public driver_device
{
public:
@ -103,15 +115,16 @@ public:
{
}
void hp9825b(machine_config &config);
void hp9825_base(machine_config &config);
protected:
virtual void machine_start() override;
virtual void device_reset() override;
virtual void machine_reset() override;
private:
required_device<hp_09825_67907_cpu_device> m_cpu;
private:
required_device<hp98x5_io_sys_device> m_io_sys;
required_device<timer_device> m_cursor_timer;
required_device<hp9825_tape_device> m_tape;
@ -144,7 +157,6 @@ private:
int m_slot_sc[ 3 ];
void cpu_io_map(address_map &map);
void cpu_mem_map(address_map &map);
DECLARE_READ16_MEMBER(kb_scancode_r);
DECLARE_WRITE16_MEMBER(disp_w);
@ -228,16 +240,6 @@ void hp9825_state::cpu_io_map(address_map &map)
// TODO:
}
void hp9825_state::cpu_mem_map(address_map &map)
{
map.unmap_value_low();
// map(0x0000 , 0x2fff).rom();
// map(0x3400 , 0x3bff).rom();
map(0x0000 , 0x3bff).rom();
map(0x4000 , 0x4fff).rom();
map(0x5000 , 0x7fff).ram();
}
READ16_MEMBER(hp9825_state::kb_scancode_r)
{
uint8_t res = m_scancode;
@ -620,12 +622,11 @@ void hp9825_state::set_dmar_slot(unsigned slot , int state)
m_io_sys->set_dmar(uint8_t(sc) , state);
}
MACHINE_CONFIG_START(hp9825_state::hp9825b)
MACHINE_CONFIG_START(hp9825_state::hp9825_base)
HP_09825_67907(config , m_cpu , MAIN_CLOCK);
// Just guessing... settings borrowed from hp9845
m_cpu->set_rw_cycles(6 , 6);
m_cpu->set_relative_mode(false);
m_cpu->set_addrmap(AS_PROGRAM , &hp9825_state::cpu_mem_map);
m_cpu->set_addrmap(AS_IO , &hp9825_state::cpu_io_map);
m_cpu->set_irq_acknowledge_callback("io_sys" , FUNC(hp98x5_io_sys_device::irq_callback));
m_cpu->pa_changed_cb().set(m_io_sys , FUNC(hp98x5_io_sys_device::pa_w));
@ -826,6 +827,251 @@ static INPUT_PORTS_START(hp9825)
PORT_BIT(IOP_MASK(0) , IP_ACTIVE_HIGH , IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) // Shift
INPUT_PORTS_END
// +---------------+
// | hp9825b_state |
// +---------------+
class hp9825b_state : public hp9825_state
{
public:
hp9825b_state(const machine_config &mconfig, device_type type, const char *tag)
: hp9825_state(mconfig , type , tag)
{
}
void hp9825b(machine_config &config);
private:
void cpu_mem_map(address_map &map);
};
MACHINE_CONFIG_START(hp9825b_state::hp9825b)
hp9825_base(config);
m_cpu->set_addrmap(AS_PROGRAM , &hp9825b_state::cpu_mem_map);
MACHINE_CONFIG_END
void hp9825b_state::cpu_mem_map(address_map &map)
{
map.unmap_value_low();
map(0x0000 , 0x3bff).rom();
map(0x4000 , 0x4fff).rom();
map(0x5000 , 0x7fff).ram();
}
// +---------------+
// | hp9825t_state |
// +---------------+
class hp9825t_state : public hp9825_state
{
public:
hp9825t_state(const machine_config &mconfig, device_type type, const char *tag)
: hp9825_state(mconfig , type , tag)
, m_rom_region(*this , "rom")
, m_skoalrom(*this , "skoalrom")
{
}
void hp9825t(machine_config &config);
protected:
virtual void machine_start() override;
virtual void device_reset() override;
private:
required_memory_region m_rom_region;
required_memory_region m_skoalrom;
std::unique_ptr<uint16_t[]> m_ram;
uint8_t m_cycle_type;
// SKOAL state
bool m_skoalbit; // U53
bool m_second_access; // U57-3
bool m_mref; // U57-4
bool m_ifetch_4400; // U57-5
uint8_t m_special_opt; // U42
uint16_t m_fetch_addr;
void cpu_mem_map(address_map &map);
DECLARE_READ16_MEMBER(cpu_mem_r);
DECLARE_WRITE16_MEMBER(cpu_mem_w);
void stm(uint8_t cycle_type);
void on_cycle_end();
void opcode_fetch(uint16_t opcode);
uint8_t get_skoalrom(uint16_t addr);
bool is_rom(uint16_t addr , uint8_t cycle_type) const;
};
MACHINE_CONFIG_START(hp9825t_state::hp9825t)
hp9825_base(config);
m_cpu->set_addrmap(AS_PROGRAM , &hp9825t_state::cpu_mem_map);
m_cpu->stm_cb().set(FUNC(hp9825t_state::stm));
m_cpu->opcode_cb().set(FUNC(hp9825t_state::opcode_fetch));
MACHINE_CONFIG_END
void hp9825t_state::machine_start()
{
hp9825_state::machine_start();
// 32kw of RAM (the 1st kw is not accessible in normal operation)
m_ram = std::make_unique<uint16_t[]>(32768);
save_pointer(NAME(m_ram) , 32768);
}
void hp9825t_state::device_reset()
{
hp9825_state::device_reset();
// This has to be done before CPU reset or first instruction won't be fetched correctly
m_cycle_type = 0;
m_special_opt = 0xf;
}
void hp9825t_state::cpu_mem_map(address_map &map)
{
map.unmap_value_low();
map(0x0000 , 0x7fff).rw(FUNC(hp9825t_state::cpu_mem_r) , FUNC(hp9825t_state::cpu_mem_w));
}
READ16_MEMBER(hp9825t_state::cpu_mem_r)
{
bool from_rom;
if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_RD_MASK) {
if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_IFETCH_MASK) {
m_fetch_addr = offset;
}
from_rom = is_rom(offset , m_cycle_type);
LOG("rd @%04x CYC=%x %d%d%d%d ROM=%d\n" , offset , m_cycle_type , m_skoalbit , m_second_access , m_mref , m_ifetch_4400 , from_rom);
if (!(m_cycle_type & (hp_hybrid_cpu_device::CYCLE_IFETCH_MASK | hp_hybrid_cpu_device::CYCLE_DMA_MASK))) {
on_cycle_end();
}
m_cycle_type = 0;
// TODO: diagnostic read
} else {
// Read coming from debugger and not from CPU: fake an ifetch
from_rom = is_rom(offset , hp_hybrid_cpu_device::CYCLE_IFETCH_MASK);
}
return from_rom ? m_rom_region->as_u16(offset) : m_ram[ offset ];
}
WRITE16_MEMBER(hp9825t_state::cpu_mem_w)
{
if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_WR_MASK) {
if (!(m_cycle_type & hp_hybrid_cpu_device::CYCLE_DMA_MASK)) {
on_cycle_end();
}
m_cycle_type = 0;
}
// All write cycles go to RAM
m_ram[ offset ] = (m_ram[ offset ] & ~mem_mask) | (data & mem_mask);
}
void hp9825t_state::stm(uint8_t cycle_type)
{
LOG("stm %x\n" , cycle_type);
m_cycle_type = cycle_type;
if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_IFETCH_MASK) {
m_second_access = false;
m_mref = false;
m_ifetch_4400 = false;
// In case of ifetch from register area this is kept at 0 (because cpu_mem_r is not called)
// In case of ifetch from RAM/ROM this is set by cpu_mem_r to the fetch address
m_fetch_addr = 0;
} else if (m_cycle_type & hp_hybrid_cpu_device::CYCLE_RAL_MASK) {
if (!(m_cycle_type & hp_hybrid_cpu_device::CYCLE_DMA_MASK)) {
on_cycle_end();
}
m_cycle_type = 0;
}
}
void hp9825t_state::on_cycle_end()
{
m_second_access = false;
}
void hp9825t_state::opcode_fetch(uint16_t opcode)
{
LOG("oc %04x\n" , opcode);
m_cycle_type = 0;
// memory referencing instructions
m_mref = (opcode & 0x7000) != 0x7000;
m_second_access = true;
m_ifetch_4400 = (m_fetch_addr & 0x7f00) == 0x0900;
if (BIT(m_special_opt , 3) && BIT(m_special_opt , 2)) {
// Set SKOAL bit
if (m_fetch_addr < 0x20) {
// Fetch from registers -> SKOAL bit = 0
m_skoalbit = false;
} else if ((m_fetch_addr & 0x6000) == 0x6000) {
// Fetch in [6000..7fff] range -> SKOAL bit = 0
m_skoalbit = false;
} else {
uint8_t tmp = get_skoalrom(m_fetch_addr);
m_skoalbit = (tmp >> ((~m_fetch_addr >> 12) & 7)) & 1;
}
}
// Decode SKOAL instructions. They are ignored by the hybrid processor
// as they are not recognized.
if ((opcode & 0xffc0) == 0x7040) {
m_special_opt = opcode & 0xf;
if (!BIT(m_special_opt , 3)) {
// RAM/ == 0
m_skoalbit = false;
} else if (!BIT(m_special_opt , 2)) {
// ROM/ == 0
m_skoalbit = true;
}
}
}
uint8_t hp9825t_state::get_skoalrom(uint16_t addr)
{
return m_skoalrom->as_u8(~addr & 0x0fff);
}
bool hp9825t_state::is_rom(uint16_t addr , uint8_t cycle_type) const
{
if ((addr & 0x6000) == 0x6000) {
// [6000..7fff] -> always RAM
return false;
} else if ((cycle_type & hp_hybrid_cpu_device::CYCLE_DMA_MASK) != 0 ||
!BIT(m_special_opt , 1)) {
// DMA cycle or BIT/ == 0 -> RAM
return false;
} else if (addr >= 0x400 && !BIT(m_special_opt , 0)) {
// [0400..5fff] and BIN/ == 0 -> RAM
return false;
} else {
bool addr_0800_7fff = (addr & 0x7800) != 0;
bool addr_0400_07ff = !addr_0800_7fff && BIT(addr , 10);
bool addr_0000_03ff = !addr_0800_7fff && !BIT(addr , 10);
// U58-6
bool force_rom;
// ROM when one or more of these is true:
// - addr in [0000..03ff]
// - Ifetch cycle and addr in [0800..5fff]
// - 2nd access of a memory-referencing instruction not in [0400..07ff] range
// - skoalbit = 1 and instruction fetched in [0900..09ff] range
force_rom =
addr_0000_03ff ||
((cycle_type & hp_hybrid_cpu_device::CYCLE_IFETCH_MASK) != 0 && addr_0800_7fff) ||
(m_second_access && m_mref && (!BIT(m_special_opt , 2) || !addr_0400_07ff)) ||
(m_skoalbit && m_ifetch_4400);
if (force_rom) {
return true;
} else if (addr_0400_07ff && BIT(m_special_opt , 2)) {
return false;
} else {
return m_skoalbit;
}
}
}
ROM_START(hp9825b)
ROM_REGION(0xa000 , "cpu" , ROMREGION_16BIT | ROMREGION_BE)
ROM_LOAD("sysrom1.bin" , 0x0000 , 0x2000 , CRC(fe429268) SHA1(f2fe7c5abca92bd13f81b4385fc4fce0cafb0da0))
@ -839,5 +1085,23 @@ ROM_START(hp9825b)
ROM_LOAD("strings_t.bin",0x9800 , 0x0800 , CRC(b5ca5da5) SHA1(af13abb3c15836c566863c656e1659f7e6f96d04))
ROM_END
ROM_START(hp9825t)
ROM_REGION(0xc000 , "rom" , ROMREGION_16BIT | ROMREGION_BE | ROMREGION_ERASE | ROMREGION_ERASE00)
ROM_LOAD("sysrom1.bin" , 0x0000 , 0x2000 , CRC(fe429268) SHA1(f2fe7c5abca92bd13f81b4385fc4fce0cafb0da0))
ROM_LOAD("sysrom2.bin" , 0x2000 , 0x2000 , CRC(96093b5d) SHA1(c6ec4cafd019887df0fa849b3c7070bb74faee54))
ROM_LOAD("sysrom3.bin" , 0x4000 , 0x2000 , CRC(f9470f67) SHA1(b80cb4a366d93bd7acc3508ce987bb11c5986b2a))
ROM_LOAD("98217.bin" , 0x6000 , 0x0800 , BAD_DUMP CRC(ea1fcf63) SHA1(e535c82897210a1c67c1ca16f44f936d4c470463))
ROM_LOAD("genio_t.bin" , 0x6800 , 0x0800 , CRC(ade1d1ed) SHA1(9af74a65b29ef1885f74164238ecf8d16ac995d6))
ROM_LOAD("plot72.bin" , 0x7000 , 0x0800 , CRC(0a9cb8db) SHA1(d0d126fca108f2715e1e408cb31b09ba69385ac4))
ROM_LOAD("advpgm_t.bin", 0x8000 , 0x0800 , CRC(965b5e5a) SHA1(ff44dd15f8fa4ca03dfd970ed8b200e8a071ec13))
ROM_LOAD("extio_t.bin" , 0x8800 , 0x1000 , CRC(a708b978) SHA1(baf53c8a2b24d059f95252baf1452188eaf6e4be))
ROM_LOAD("strings_t.bin",0x9800 , 0x0800 , CRC(b5ca5da5) SHA1(af13abb3c15836c566863c656e1659f7e6f96d04))
ROM_LOAD("syspgm.bin" , 0xa000 , 0x0800 , CRC(8915588f) SHA1(037f497b5ecc3216fb6b8356767cc361fb0b2945))
ROM_REGION(0x1000 , "skoalrom" , 0)
ROM_LOAD("skoalrom.bin" , 0 , 0x1000 , CRC(5e8124d5) SHA1(dedf7f8a10c62b444f04213956083089e97bf219))
ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP(1980, hp9825b, 0, 0, hp9825b, hp9825, hp9825_state, empty_init, "Hewlett-Packard", "HP 9825B", 0)
COMP(1980, hp9825b, 0, 0, hp9825b, hp9825, hp9825b_state,empty_init, "Hewlett-Packard", "HP 9825B", 0)
COMP(1980, hp9825t, 0, 0, hp9825t, hp9825, hp9825t_state,empty_init, "Hewlett-Packard", "HP 9825T", 0)

View File

@ -377,31 +377,31 @@ WRITE_LINE_MEMBER(md_cons_state::screen_vblank_console)
}
}
MACHINE_CONFIG_START(md_cons_state::ms_megadriv)
void md_cons_state::ms_megadriv(machine_config &config)
{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, nullptr)
MD_CART_SLOT(config, m_cart, md_cart, nullptr);
SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
MACHINE_CONFIG_END
}
MACHINE_CONFIG_START(md_cons_state::ms_megadpal)
void md_cons_state::ms_megadpal(machine_config &config)
{
md_pal(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, nullptr)
MD_CART_SLOT(config, m_cart, md_cart, nullptr);
SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
MACHINE_CONFIG_END
}
void md_cons_state::genesis_tmss(machine_config &config)
{
@ -409,19 +409,19 @@ void md_cons_state::genesis_tmss(machine_config &config)
subdevice<software_list_device>("cart_list")->set_filter("TMSS");
}
MACHINE_CONFIG_START(md_cons_state::dcat16_megadriv)
void md_cons_state::dcat16_megadriv(machine_config &config)
{
dcat16_megadriv_base(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, megadriv)
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// has SD card slot instead?
// MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, nullptr)
// MD_CART_SLOT(config, m_cart, md_cart, nullptr);
// SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
MACHINE_CONFIG_END
}
/*************************************
*
@ -615,16 +615,15 @@ MACHINE_CONFIG_START(md_cons_state::genesis_32x)
SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer);
m_32x->set_palette_tag("gen_vdp:palette");
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// we need to remove and re-add the YM because the balance is different
// due to MAME / MESS having severe issues if the dac output is > 0.40? (sound is corrupted even if DAC is silent?!)
config.device_remove("ymsnd");
MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_NTSC/7)
MCFG_SOUND_ROUTE(0, "lspeaker", (0.50)/2)
MCFG_SOUND_ROUTE(1, "rspeaker", (0.50)/2)
YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7);
m_ymsnd->add_route(0, "lspeaker", (0.50)/2);
m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
@ -651,16 +650,15 @@ MACHINE_CONFIG_START(md_cons_state::mdj_32x)
SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer);
m_32x->set_palette_tag("gen_vdp:palette");
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// we need to remove and re-add the sound system because the balance is different
// due to MAME / MESS having severe issues if the dac output is > 0.40? (sound is corrupted even if DAC is silent?!)
config.device_remove("ymsnd");
MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_NTSC/7)
MCFG_SOUND_ROUTE(0, "lspeaker", (0.50)/2)
MCFG_SOUND_ROUTE(1, "rspeaker", (0.50)/2)
YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7);
m_ymsnd->add_route(0, "lspeaker", (0.50)/2);
m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
@ -687,16 +685,15 @@ MACHINE_CONFIG_START(md_cons_state::md_32x)
SEGA_32X_PAL(config, m_32x, (MASTER_CLOCK_PAL * 3) / 7, m_maincpu, m_scan_timer);
m_32x->set_palette_tag("gen_vdp:palette");
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
// we need to remove and re-add the sound system because the balance is different
// due to MAME / MESS having severe issues if the dac output is > 0.40? (sound is corrupted even if DAC is silent?!)
config.device_remove("ymsnd");
MCFG_DEVICE_ADD("ymsnd", YM2612, MASTER_CLOCK_NTSC/7)
MCFG_SOUND_ROUTE(0, "lspeaker", (0.50)/2)
MCFG_SOUND_ROUTE(1, "rspeaker", (0.50)/2)
YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7);
m_ymsnd->add_route(0, "lspeaker", (0.50)/2);
m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "_32x_cart")
MCFG_GENERIC_EXTENSIONS("32x,bin")
@ -739,14 +736,14 @@ ROM_END
/****************************************** SegaCD emulation ****************************************/
MACHINE_CONFIG_START(md_cons_state::genesis_scd)
void md_cons_state::genesis_scd(machine_config &config)
{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
SEGA_SEGACD_US(config, m_segacd, 0);
m_segacd->set_palette("gen_vdp:palette");
@ -755,16 +752,16 @@ MACHINE_CONFIG_START(md_cons_state::genesis_scd)
CDROM(config, "cdrom").set_interface("scd_cdrom");
SOFTWARE_LIST(config, "cd_list").set_original("segacd");
MACHINE_CONFIG_END
}
MACHINE_CONFIG_START(md_cons_state::md_scd)
void md_cons_state::md_scd(machine_config &config)
{
md_pal(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
SEGA_SEGACD_EUROPE(config, m_segacd, 0);
m_segacd->set_palette("gen_vdp:palette");
@ -773,16 +770,16 @@ MACHINE_CONFIG_START(md_cons_state::md_scd)
CDROM(config, "cdrom").set_interface("scd_cdrom");
SOFTWARE_LIST(config, "cd_list").set_original("megacd");
MACHINE_CONFIG_END
}
MACHINE_CONFIG_START(md_cons_state::mdj_scd)
void md_cons_state::mdj_scd(machine_config &config)
{
md_ntsc(config);
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, md_cons_state, screen_vblank_console))
subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console));
SEGA_SEGACD_JAPAN(config, m_segacd, 0);
m_segacd->set_palette("gen_vdp:palette");
@ -791,7 +788,7 @@ MACHINE_CONFIG_START(md_cons_state::mdj_scd)
CDROM(config, "cdrom").set_interface("scd_cdrom");
SOFTWARE_LIST(config, "cd_list").set_original("megacdj");
MACHINE_CONFIG_END
}
/******************SEGA CD + 32X****************************/

View File

@ -41,7 +41,6 @@ this reason.
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/cxd1095.h"
#include "sound/sn76496.h"
#include "includes/megadriv.h"
@ -607,17 +606,16 @@ void mplay_state::megaplay_bios_map(address_map &map)
READ8_MEMBER(mplay_state::vdp1_count_r)
{
address_space &prg = m_bioscpu->space(AS_PROGRAM);
if (offset & 0x01)
return m_vdp1->hcount_read(prg, offset);
return m_vdp1->hcount_read();
else
return m_vdp1->vcount_read(prg, offset);
return m_vdp1->vcount_read();
}
void mplay_state::megaplay_bios_io_map(address_map &map)
{
map.global_mask(0xff);
map(0x7f, 0x7f).w("sn2", FUNC(sn76496_device::write));
map(0x7f, 0x7f).w(m_vdp1, FUNC(sega315_5124_device::psg_w));
map(0x40, 0x41).mirror(0x3e).r(FUNC(mplay_state::vdp1_count_r));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp1, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
@ -670,9 +668,9 @@ MACHINE_CONFIG_START(mplay_state::megaplay)
/* The Megaplay has an extra BIOS cpu which drives an SMS VDP
which includes an SN76496 for sound */
MCFG_DEVICE_ADD("mtbios", Z80, MASTER_CLOCK / 15) /* ?? */
MCFG_DEVICE_PROGRAM_MAP(megaplay_bios_map)
MCFG_DEVICE_IO_MAP(megaplay_bios_io_map)
Z80(config, m_bioscpu, MASTER_CLOCK / 15); /* ?? */
m_bioscpu->set_addrmap(AS_PROGRAM, &mplay_state::megaplay_bios_map);
m_bioscpu->set_addrmap(AS_IO, &mplay_state::megaplay_bios_io_map);
config.m_minimum_quantum = attotime::from_hz(6000);
@ -692,10 +690,6 @@ MACHINE_CONFIG_START(mplay_state::megaplay)
io2.in_porte_cb().set(FUNC(mplay_state::bios_6404_r));
io2.out_porte_cb().set(FUNC(mplay_state::bios_6404_w));
MCFG_DEVICE_ADD("sn2", SN76496, MASTER_CLOCK/15)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.25) /* 3.58 MHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker",0.25) /* 3.58 MHz */
/* New update functions to handle the extra layer */
MCFG_SCREEN_MODIFY("megadriv")
MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, \
@ -704,10 +698,12 @@ MACHINE_CONFIG_START(mplay_state::megaplay)
MCFG_SCREEN_UPDATE_DRIVER(mplay_state, screen_update_megplay)
// Megaplay has an additional SMS VDP as an overlay
SEGA315_5246(config, m_vdp1, 0);
SEGA315_5246(config, m_vdp1, MASTER_CLOCK / 5); /* ?? */
m_vdp1->set_screen("megadriv");
m_vdp1->set_is_pal(false);
m_vdp1->irq().set_inputline(m_bioscpu, 0);
m_vdp1->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
m_vdp1->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
MACHINE_CONFIG_END

View File

@ -78,7 +78,6 @@ Sonic Hedgehog 2 171-6215A 837-6963-62 610-0239-62 MPR
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/cxd1095.h"
#include "sound/sn76496.h"
#include "rendlay.h"
#include "includes/megadriv.h"
@ -134,8 +133,7 @@ private:
DECLARE_READ8_MEMBER(bios_joypad_r);
DECLARE_WRITE8_MEMBER(bios_port_7f_w);
DECLARE_READ8_MEMBER(vdp1_count_r);
DECLARE_READ8_MEMBER(sms_count_r);
DECLARE_WRITE8_MEMBER(sms_sn_w);
u8 sms_count_r(offs_t offset);
DECLARE_READ8_MEMBER(sms_ioport_dc_r);
DECLARE_READ8_MEMBER(sms_ioport_dd_r);
DECLARE_WRITE8_MEMBER(mt_sms_standard_rom_bank_w);
@ -161,7 +159,7 @@ private:
uint8_t m_mt_cart_select_reg;
uint32_t m_bios_port_ctrl;
int m_current_MACHINE_IS_sms; // is the current game SMS based (running on genesis z80, in VDP compatibility mode)
int m_current_machine_is_sms; // is the current game SMS based (running on genesis z80, in VDP compatibility mode)
uint32_t m_bios_ctrl_inputs;
uint8_t m_bios_ctrl[6];
int m_mt_bank_addr;
@ -322,19 +320,12 @@ INPUT_PORTS_END
/* MEGATECH specific */
READ8_MEMBER(mtech_state::sms_count_r)
u8 mtech_state::sms_count_r(offs_t offset)
{
address_space &prg = m_z80snd->space(AS_PROGRAM);
if (offset & 0x01)
return m_vdp->hcount_read(prg, offset);
return m_vdp->hcount_read();
else
return m_vdp->vcount_read(prg, offset);
}
WRITE8_MEMBER(mtech_state::sms_sn_w)
{
address_space &prg = m_z80snd->space(AS_PROGRAM);
m_vdp->vdp_w(prg, 0x10 >> 1, data, 0x00ff);
return m_vdp->vcount_read();
}
READ8_MEMBER (mtech_state::sms_ioport_dc_r)
@ -398,10 +389,10 @@ void mtech_state::set_genz80_as_sms()
prg.install_write_handler(0xfffc, 0xffff, write8_delegate(FUNC(mtech_state::mt_sms_standard_rom_bank_w),this));
// ports
io.install_read_handler (0x40, 0x41, 0, 0x3e, 0, read8_delegate(FUNC(mtech_state::sms_count_r),this));
io.install_write_handler (0x40, 0x41, 0, 0x3e, 0, write8_delegate(FUNC(mtech_state::sms_sn_w),this));
io.install_readwrite_handler (0x80, 0x80, 0, 0x3e, 0, read8_delegate(FUNC(sega315_5124_device::data_read),(sega315_5124_device *)m_vdp), write8_delegate(FUNC(sega315_5124_device::data_write),(sega315_5124_device *)m_vdp));
io.install_readwrite_handler (0x81, 0x81, 0, 0x3e, 0, read8_delegate(FUNC(sega315_5124_device::control_read),(sega315_5124_device *)m_vdp), write8_delegate(FUNC(sega315_5124_device::control_write),(sega315_5124_device *)m_vdp));
io.install_read_handler (0x40, 0x41, 0, 0x3e, 0, read8sm_delegate(FUNC(mtech_state::sms_count_r),this));
io.install_write_handler (0x40, 0x41, 0, 0x3e, 0, write8smo_delegate(FUNC(sega315_5124_device::psg_w),(sega315_5124_device *)m_vdp));
io.install_readwrite_handler (0x80, 0x80, 0, 0x3e, 0, read8smo_delegate(FUNC(sega315_5124_device::data_read),(sega315_5124_device *)m_vdp), write8smo_delegate(FUNC(sega315_5124_device::data_write),(sega315_5124_device *)m_vdp));
io.install_readwrite_handler (0x81, 0x81, 0, 0x3e, 0, read8smo_delegate(FUNC(sega315_5124_device::control_read),(sega315_5124_device *)m_vdp), write8smo_delegate(FUNC(sega315_5124_device::control_write),(sega315_5124_device *)m_vdp));
io.install_read_handler (0x10, 0x10, read8_delegate(FUNC(mtech_state::sms_ioport_dd_r),this)); // super tetris
@ -452,7 +443,7 @@ void mtech_state::switch_cart(int gameno)
if (!m_cart_is_genesis[gameno])
{
logerror("enabling SMS Z80\n");
m_current_MACHINE_IS_sms = 1;
m_current_machine_is_sms = 1;
set_genz80_as_sms();
//m_z80snd->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
m_z80snd->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
@ -460,7 +451,7 @@ void mtech_state::switch_cart(int gameno)
else
{
logerror("disabling SMS Z80\n");
m_current_MACHINE_IS_sms = 0;
m_current_machine_is_sms = 0;
set_genz80_as_md();
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
//m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
@ -586,18 +577,17 @@ WRITE8_MEMBER(mtech_state::bios_port_7f_w)
READ8_MEMBER(mtech_state::vdp1_count_r)
{
address_space &prg = m_bioscpu->space(AS_PROGRAM);
if (offset & 0x01)
return m_vdp1->hcount_read(prg, offset);
return m_vdp1->hcount_read();
else
return m_vdp1->vcount_read(prg, offset);
return m_vdp1->vcount_read();
}
void mtech_state::megatech_bios_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x3f, 0x3f).w(FUNC(mtech_state::bios_port_ctrl_w));
map(0x7f, 0x7f).w(FUNC(mtech_state::bios_port_7f_w));
map(0x7f, 0x7f).w(FUNC(mtech_state::bios_port_7f_w)); // PSG?
map(0x40, 0x41).mirror(0x3e).r(FUNC(mtech_state::vdp1_count_r));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp1, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
@ -630,7 +620,7 @@ void mtech_state::init_mt_crt()
uint32_t mtech_state::screen_update_main(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
// if we're running an sms game then use the SMS update.. maybe this should be moved to the megadrive emulation core as compatibility mode is a feature of the chip
if (!m_current_MACHINE_IS_sms)
if (!m_current_machine_is_sms)
screen_update_megadriv(screen, bitmap, cliprect);
else
{
@ -652,7 +642,7 @@ uint32_t mtech_state::screen_update_main(screen_device &screen, bitmap_rgb32 &bi
WRITE_LINE_MEMBER(mtech_state::screen_vblank_main)
{
if (!m_current_MACHINE_IS_sms)
if (!m_current_machine_is_sms)
screen_vblank_megadriv(state);
}
@ -696,9 +686,9 @@ MACHINE_CONFIG_START(mtech_state::megatech)
md_ntsc(config);
/* Megatech has an extra SMS based bios *and* an additional screen */
MCFG_DEVICE_ADD("mtbios", Z80, MASTER_CLOCK / 15) /* ?? */
MCFG_DEVICE_PROGRAM_MAP(megatech_bios_map)
MCFG_DEVICE_IO_MAP(megatech_bios_portmap)
Z80(config, m_bioscpu, MASTER_CLOCK / 15); /* ?? */
m_bioscpu->set_addrmap(AS_PROGRAM, &mtech_state::megatech_bios_map);
m_bioscpu->set_addrmap(AS_IO, &mtech_state::megatech_bios_portmap);
cxd1095_device &io1(CXD1095(config, "io1", 0));
io1.in_porta_cb().set_ioport("BIOS_DSW0");
@ -733,15 +723,12 @@ MACHINE_CONFIG_START(mtech_state::megatech)
sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_224_TBORDER_HEIGHT + 224)
MCFG_SCREEN_UPDATE_DRIVER(mtech_state, screen_update_menu)
SEGA315_5246(config, m_vdp1, 0);
SEGA315_5246(config, m_vdp1, MASTER_CLOCK / 5); /* ?? */
m_vdp1->set_screen("menu");
m_vdp1->set_is_pal(false);
m_vdp1->irq().set_inputline(m_bioscpu, 0);
/* sound hardware */
MCFG_DEVICE_ADD("sn2", SN76496, MASTER_CLOCK/15)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
m_vdp1->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
m_vdp1->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
MACHINE_CONFIG_END

View File

@ -185,13 +185,12 @@ void mk1_state::machine_start()
MACHINE_CONFIG_START(mk1_state::mk1)
/* basic machine hardware */
MCFG_DEVICE_ADD( "maincpu", F8, 1000000 ) // MK3850
MCFG_DEVICE_ADD( "maincpu", F8, 2000000 ) // MK3850
MCFG_DEVICE_PROGRAM_MAP(mk1_mem)
MCFG_DEVICE_IO_MAP(mk1_io)
MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE("f3853", f3853_device, int_acknowledge)
config.m_minimum_quantum = attotime::from_hz(60);
f3853_device &f3853(F3853(config, "f3853", 1000000));
f3853_device &f3853(F3853(config, "f3853", 2000000));
f3853.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ);
/* video hardware */

View File

@ -11,7 +11,7 @@
such as Arena(in editmode).
TODO:
- RS232 port
- RS232 port (when connected, I'm only getting "New Game")
******************************************************************************
@ -43,8 +43,8 @@ Scorpio 68000 hardware is very similar, but with chessboard buttons and side led
class novag68k_state : public novagbase_state
{
public:
novag68k_state(const machine_config &mconfig, device_type type, const char *tag)
: novagbase_state(mconfig, type, tag)
novag68k_state(const machine_config &mconfig, device_type type, const char *tag) :
novagbase_state(mconfig, type, tag)
{ }
void diablo68k(machine_config &config);

View File

@ -42,7 +42,8 @@ class novagmcs48_state : public novagbase_state
{
public:
novagmcs48_state(const machine_config &mconfig, device_type type, const char *tag) :
novagbase_state(mconfig, type, tag)
novagbase_state(mconfig, type, tag),
m_maincpu(*this, "maincpu")
{ }
void presto(machine_config &config);
@ -51,6 +52,8 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(octo_cpu_freq);
private:
required_device<mcs48_cpu_device> m_maincpu;
// Presto/Octo
DECLARE_WRITE8_MEMBER(presto_mux_w);
DECLARE_WRITE8_MEMBER(presto_control_w);
@ -150,10 +153,10 @@ INPUT_CHANGED_MEMBER(novagmcs48_state::octo_cpu_freq)
void novagmcs48_state::presto(machine_config &config)
{
/* basic machine hardware */
i8049_device &maincpu(I8049(config, m_maincpu, 6000000)); // LC circuit, measured 6MHz
maincpu.p1_in_cb().set(FUNC(novagmcs48_state::presto_input_r));
maincpu.p2_out_cb().set(FUNC(novagmcs48_state::presto_control_w));
maincpu.bus_out_cb().set(FUNC(novagmcs48_state::presto_mux_w));
I8049(config, m_maincpu, 6000000); // LC circuit, measured 6MHz
m_maincpu->p1_in_cb().set(FUNC(novagmcs48_state::presto_input_r));
m_maincpu->p2_out_cb().set(FUNC(novagmcs48_state::presto_control_w));
m_maincpu->bus_out_cb().set(FUNC(novagmcs48_state::presto_mux_w));
TIMER(config, "display_decay").configure_periodic(FUNC(novagmcs48_state::display_decay_tick), attotime::from_msec(1));
config.set_default_layout(layout_novag_presto);

View File

@ -305,7 +305,8 @@ static void pce_cart(device_slot_interface &device)
device.option_add_internal("sf2", PCE_ROM_SF2);
}
MACHINE_CONFIG_START(pce_state::pce_common)
void pce_state::pce_common(machine_config &config)
{
/* basic machine hardware */
H6280(config, m_maincpu, MAIN_CLOCK/3);
m_maincpu->set_addrmap(AS_PROGRAM, &pce_state::pce_mem);
@ -321,10 +322,10 @@ MACHINE_CONFIG_START(pce_state::pce_common)
MCFG_MACHINE_RESET_OVERRIDE(pce_state, mess_pce )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
MCFG_SCREEN_UPDATE_DRIVER( pce_state, screen_update )
MCFG_SCREEN_PALETTE("huc6260")
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
screen.set_screen_update(FUNC(pce_state::screen_update));
screen.set_palette(m_huc6260);
HUC6260(config, m_huc6260, MAIN_CLOCK);
m_huc6260->next_pixel_data().set("huc6270", FUNC(huc6270_device::next_pixel));
@ -342,24 +343,27 @@ MACHINE_CONFIG_START(pce_state::pce_common)
PCE_CD(config, m_cd, 0);
SOFTWARE_LIST(config, "cd_list").set_original("pcecd");
MACHINE_CONFIG_END
}
MACHINE_CONFIG_START(pce_state::pce)
void pce_state::pce(machine_config &config)
{
pce_common(config);
MCFG_PCE_CARTRIDGE_ADD("cartslot", pce_cart, nullptr)
PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "pce_cart");
SOFTWARE_LIST(config, "cart_list").set_original("pce");
MACHINE_CONFIG_END
}
MACHINE_CONFIG_START(pce_state::tg16)
void pce_state::tg16(machine_config &config)
{
pce_common(config);
MCFG_TG16_CARTRIDGE_ADD("cartslot", pce_cart, nullptr)
PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "tg16_cart");
SOFTWARE_LIST(config, "cart_list").set_original("tg16");
MACHINE_CONFIG_END
}
MACHINE_CONFIG_START(pce_state::sgx)
void pce_state::sgx(machine_config &config)
{
/* basic machine hardware */
H6280(config, m_maincpu, MAIN_CLOCK/3);
m_maincpu->set_addrmap(AS_PROGRAM, &pce_state::sgx_mem);
@ -375,10 +379,10 @@ MACHINE_CONFIG_START(pce_state::sgx)
MCFG_MACHINE_RESET_OVERRIDE(pce_state, mess_pce )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242)
MCFG_SCREEN_UPDATE_DRIVER( pce_state, screen_update )
MCFG_SCREEN_PALETTE("huc6260")
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(MAIN_CLOCK, huc6260_device::WPF, 64, 64 + 1024 + 64, huc6260_device::LPF, 18, 18 + 242);
screen.set_screen_update(FUNC(pce_state::screen_update));
screen.set_palette(m_huc6260);
HUC6260(config, m_huc6260, MAIN_CLOCK);
m_huc6260->next_pixel_data().set("huc6202", FUNC(huc6202_device::next_pixel));
@ -411,14 +415,14 @@ MACHINE_CONFIG_START(pce_state::sgx)
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
MCFG_PCE_CARTRIDGE_ADD("cartslot", pce_cart, nullptr)
PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "pce_cart");
SOFTWARE_LIST(config, "cart_list").set_original("sgx");
SOFTWARE_LIST(config, "pce_list").set_compatible("pce");
PCE_CD(config, m_cd, 0);
SOFTWARE_LIST(config, "cd_list").set_original("pcecd");
MACHINE_CONFIG_END
}
/***************************************************************************

View File

@ -0,0 +1,99 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/******************************************************************************
Sega Beena
non-video 'book' based learning system, like LeapPad etc.
unknown CPU type (inside Sega custom?)
cartridge ROM has 'edinburgh' in the header, maybe a system codename?
ROM is also full of OGG files containing the string 'Encoded with Speex speex-1.0.4'
as well as .mid files for music
TODO: component list!
*******************************************************************************/
#include "emu.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
#include "softlist.h"
#include "speaker.h"
class sega_beena_state : public driver_device
{
public:
sega_beena_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_cart(*this, "cartslot")
, m_cart_region(nullptr)
{ }
void sega_beena(machine_config &config);
private:
virtual void machine_start() override;
virtual void machine_reset() override;
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart);
required_device<generic_slot_device> m_cart;
memory_region *m_cart_region;
};
void sega_beena_state::machine_start()
{
// if there's a cart, override the standard mapping
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());
}
}
void sega_beena_state::machine_reset()
{
}
DEVICE_IMAGE_LOAD_MEMBER(sega_beena_state, cart)
{
uint32_t size = m_cart->common_get_size("rom");
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;
}
static INPUT_PORTS_START( sega_beena )
INPUT_PORTS_END
void sega_beena_state::sega_beena(machine_config &config)
{
// unknown CPU
// no screen
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "sega_beena_cart");
m_cart->set_width(GENERIC_ROM16_WIDTH);
m_cart->set_device_load(device_image_load_delegate(&sega_beena_state::device_image_load_cart, this));
SOFTWARE_LIST(config, "cart_list").set_original("sega_beena_cart");
}
ROM_START( beena )
ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASEFF )
// no BIOS or internal to CPU
ROM_END
// year, name, parent, compat, machine, input, class, init, company, fullname, flags
CONS( 200?, beena, 0, 0, sega_beena, sega_beena, sega_beena_state, empty_init, "Sega", "Beena", MACHINE_IS_SKELETON )

View File

@ -308,7 +308,6 @@ GND 8A 8B GND
#include "machine/mc8123.h"
#include "machine/segacrp2_device.h"
#include "machine/upd4701.h"
#include "sound/sn76496.h"
#include "video/315_5124.h"
#include "speaker.h"
@ -411,8 +410,9 @@ void systeme_state::io_map(address_map &map)
{
map.global_mask(0xff);
map(0x7b, 0x7b).w("sn1", FUNC(segapsg_device::write));
map(0x7e, 0x7f).w("sn2", FUNC(segapsg_device::write));
/* TODO : PSG connection correct? */
map(0x7b, 0x7b).w(m_vdp1, FUNC(sega315_5124_device::psg_w));
map(0x7e, 0x7f).w(m_vdp2, FUNC(sega315_5124_device::psg_w));
map(0x7e, 0x7e).r(m_vdp1, FUNC(sega315_5124_device::vcount_read));
map(0xba, 0xba).rw(m_vdp1, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0xbb, 0xbb).rw(m_vdp1, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
@ -887,9 +887,9 @@ uint32_t systeme_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma
}
MACHINE_CONFIG_START(systeme_state::systeme)
MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635)/2) /* Z80B @ 5.3693Mhz */
MCFG_DEVICE_PROGRAM_MAP(systeme_map)
MCFG_DEVICE_IO_MAP(io_map)
Z80(config, m_maincpu, XTAL(10'738'635)/2); /* Z80B @ 5.3693Mhz */
m_maincpu->set_addrmap(AS_PROGRAM, &systeme_state::systeme_map);
m_maincpu->set_addrmap(AS_IO, &systeme_state::io_map);
I8255(config, m_ppi);
m_ppi->out_pb_callback().set(FUNC(systeme_state::coin_counters_write));
@ -901,23 +901,19 @@ MACHINE_CONFIG_START(systeme_state::systeme)
sega315_5124_device::HEIGHT_NTSC, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT, sega315_5124_device::TBORDER_START + sega315_5124_device::NTSC_192_TBORDER_HEIGHT + 192)
MCFG_SCREEN_UPDATE_DRIVER(systeme_state, screen_update)
SEGA315_5124(config, m_vdp1, 0);
m_vdp1->set_is_pal(false);
m_vdp1->set_addrmap(0, &systeme_state::vdp1_map);
SEGA315_5124(config, m_vdp2, 0);
m_vdp2->set_is_pal(false);
m_vdp2->irq().set_inputline(m_maincpu, 0);
m_vdp2->set_addrmap(0, &systeme_state::vdp2_map);
/* sound hardware */
SPEAKER(config, "mono").front_center();
MCFG_DEVICE_ADD("sn1", SEGAPSG, XTAL(10'738'635)/3)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
SEGA315_5124(config, m_vdp1, XTAL(10'738'635));
m_vdp1->set_is_pal(false);
m_vdp1->set_addrmap(0, &systeme_state::vdp1_map);
m_vdp1->add_route(ALL_OUTPUTS, "mono", 0.50);
MCFG_DEVICE_ADD("sn2", SEGAPSG, XTAL(10'738'635)/3)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
SEGA315_5124(config, m_vdp2, XTAL(10'738'635));
m_vdp2->set_is_pal(false);
m_vdp2->irq().set_inputline(m_maincpu, 0);
m_vdp2->set_addrmap(0, &systeme_state::vdp2_map);
m_vdp2->add_route(ALL_OUTPUTS, "mono", 0.50);
MACHINE_CONFIG_END
void systeme_state::hangonjr(machine_config &config)
@ -944,13 +940,14 @@ void systeme_state::ridleofp(machine_config &config)
ppi.out_pc_callback().append("upd4701", FUNC(upd4701_device::resety_w)).bit(0); // or possibly bit 1
}
MACHINE_CONFIG_START(systeme_state::systemex)
void systeme_state::systemex(machine_config &config)
{
systeme(config);
MCFG_DEVICE_REPLACE("maincpu", MC8123, XTAL(10'738'635)/2) /* Z80B @ 5.3693Mhz */
MCFG_DEVICE_PROGRAM_MAP(systeme_map)
MCFG_DEVICE_IO_MAP(io_map)
MCFG_DEVICE_OPCODES_MAP(decrypted_opcodes_map)
MACHINE_CONFIG_END
mc8123_device &maincpu(MC8123(config.replace(), m_maincpu, XTAL(10'738'635)/2)); /* Z80B @ 5.3693Mhz */
maincpu.set_addrmap(AS_PROGRAM, &systeme_state::systeme_map);
maincpu.set_addrmap(AS_IO, &systeme_state::io_map);
maincpu.set_addrmap(AS_OPCODES, &systeme_state::decrypted_opcodes_map);
}
void systeme_state::systemex_315_5177(machine_config &config)
{
@ -962,13 +959,14 @@ void systeme_state::systemex_315_5177(machine_config &config)
maincpu.set_decrypted_tag(m_decrypted_opcodes);
}
MACHINE_CONFIG_START(systeme_state::systemeb)
void systeme_state::systemeb(machine_config &config)
{
systeme(config);
MCFG_DEVICE_REPLACE("maincpu", MC8123, XTAL(10'738'635)/2) /* Z80B @ 5.3693Mhz */
MCFG_DEVICE_PROGRAM_MAP(systeme_map)
MCFG_DEVICE_IO_MAP(io_map)
MCFG_DEVICE_OPCODES_MAP(banked_decrypted_opcodes_map)
MACHINE_CONFIG_END
mc8123_device &maincpu(MC8123(config.replace(), m_maincpu, XTAL(10'738'635)/2)); /* Z80B @ 5.3693Mhz */
maincpu.set_addrmap(AS_PROGRAM, &systeme_state::systeme_map);
maincpu.set_addrmap(AS_IO, &systeme_state::io_map);
maincpu.set_addrmap(AS_OPCODES, &systeme_state::banked_decrypted_opcodes_map);
}
void systeme_state::init_opaopa()

View File

@ -301,7 +301,7 @@ void sms_state::sg1000m3_io(address_map &map)
{
map.global_mask(0xff);
map.unmap_value_high();
map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc7).mirror(0x38).rw(FUNC(sms_state::sg1000m3_peripheral_r), FUNC(sms_state::sg1000m3_peripheral_w));
@ -313,7 +313,7 @@ void sms_state::sms_io(address_map &map)
map.unmap_value_high();
map(0x00, 0x00).mirror(0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x01, 0x01).mirror(0x3e).w(FUNC(sms_state::sms_io_control_w));
map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).mirror(0x3e).r(FUNC(sms_state::sms_input_port_dc_r));
@ -331,7 +331,7 @@ void sms_state::smskr_io(address_map &map)
map.unmap_value_high();
map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w));
map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).mirror(0x3e).r(FUNC(sms_state::sms_input_port_dc_r));
@ -347,7 +347,7 @@ void sms_state::smsj_io(address_map &map)
map.unmap_value_high();
map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w));
map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::sms_psg_w));
map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).r(FUNC(sms_state::sms_input_port_dc_r));
@ -371,7 +371,7 @@ void sms_state::gg_io(address_map &map)
map(0x06, 0x06).w(FUNC(sms_state::gg_psg_stereo_w));
map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w));
map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w));
map(0x40, 0x7f).rw(FUNC(sms_state::sms_count_r), FUNC(sms_state::gg_psg_w));
map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).r(FUNC(sms_state::sms_input_port_dc_r));
@ -512,15 +512,11 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms_ntsc_base)
sms_base(config);
MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635)/3)
MCFG_DEVICE_PROGRAM_MAP(sms_mem)
MCFG_DEVICE_IO_MAP(sms_io)
Z80(config, m_maincpu, XTAL(10'738'635)/3);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
config.m_minimum_quantum = attotime::from_hz(60);
/* actually, PSG is embedded in the VDP chip */
MCFG_DEVICE_ADD("segapsg", SEGAPSG, XTAL(10'738'635)/3)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
/*
@ -578,11 +574,12 @@ MACHINE_CONFIG_START(sms_state::sms2_ntsc)
MCFG_SCREEN_SMS_NTSC_RAW_PARAMS(XTAL(10'738'635)/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
SEGA315_5246(config, m_vdp, 0);
SEGA315_5246(config, m_vdp, XTAL(10'738'635));
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@ -591,8 +588,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_ntsc)
sms_ntsc_base(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -614,11 +610,12 @@ MACHINE_CONFIG_START(sms_state::sms1_ntsc)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, 0);
SEGA315_5124(config, m_vdp, XTAL(10'738'635));
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Master System II
SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
@ -633,10 +630,10 @@ MACHINE_CONFIG_START(smssdisp_state::sms_sdisp)
m_vdp->irq().set(FUNC(smssdisp_state::sms_store_int_callback));
MCFG_DEVICE_ADD("control", Z80, XTAL(10'738'635)/3)
MCFG_DEVICE_PROGRAM_MAP(sms_store_mem)
Z80(config, m_control_cpu, XTAL(10'738'635)/3);
m_control_cpu->set_addrmap(AS_PROGRAM, &smssdisp_state::sms_store_mem);
/* Both CPUs seem to communicate with the VDP etc? */
MCFG_DEVICE_IO_MAP(sms_io)
m_control_cpu->set_addrmap(AS_IO, &smssdisp_state::sms_io);
config.device_remove("mycard");
config.device_remove("smsexp");
@ -653,15 +650,11 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms_pal_base)
sms_base(config);
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_PAL/15)
MCFG_DEVICE_PROGRAM_MAP(sms_mem)
MCFG_DEVICE_IO_MAP(sms_io)
Z80(config, m_maincpu, MASTER_CLOCK_PAL/15);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
config.m_minimum_quantum = attotime::from_hz(50);
/* actually, PSG is embedded in the VDP chip */
MCFG_DEVICE_ADD("segapsg", SEGAPSG, MASTER_CLOCK_PAL/15)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms2_pal)
@ -672,11 +665,12 @@ MACHINE_CONFIG_START(sms_state::sms2_pal)
MCFG_SCREEN_SMS_PAL_RAW_PARAMS(MASTER_CLOCK_PAL/10)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
SEGA315_5246(config, m_vdp, 0);
SEGA315_5246(config, m_vdp, MASTER_CLOCK_PAL/5);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(true);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@ -684,8 +678,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_pal)
sms_pal_base(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -707,11 +700,12 @@ MACHINE_CONFIG_START(sms_state::sms1_pal)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, 0);
SEGA315_5124(config, m_vdp, MASTER_CLOCK_PAL/5);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(true);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Master System II
SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
@ -725,15 +719,11 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms_paln_base)
sms_base(config);
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_PALN/3)
MCFG_DEVICE_PROGRAM_MAP(sms_mem)
MCFG_DEVICE_IO_MAP(sms_io)
Z80(config, m_maincpu, MASTER_CLOCK_PALN/3);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
config.m_minimum_quantum = attotime::from_hz(50);
/* actually, PSG is embedded in the VDP chip */
MCFG_DEVICE_ADD("segapsg", SEGAPSG, MASTER_CLOCK_PALN/3)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms3_paln)
@ -744,11 +734,12 @@ MACHINE_CONFIG_START(sms_state::sms3_paln)
MCFG_SCREEN_SMS_PAL_RAW_PARAMS(MASTER_CLOCK_PALN/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
SEGA315_5246(config, m_vdp, 0);
SEGA315_5246(config, m_vdp, MASTER_CLOCK_PALN);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(true);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@ -756,8 +747,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_paln)
sms_paln_base(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -779,11 +769,12 @@ MACHINE_CONFIG_START(sms_state::sms1_paln)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, 0);
SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALN);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(true);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Tec Toy Master System III
SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
@ -797,16 +788,12 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms_br_base)
sms_base(config);
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_PALM/3)
MCFG_DEVICE_PROGRAM_MAP(sms_mem)
MCFG_DEVICE_IO_MAP(sms_io)
Z80(config, m_maincpu, MASTER_CLOCK_PALM/3);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io);
// PAL-M has near the same frequency of NTSC
config.m_minimum_quantum = attotime::from_hz(60);
/* actually, PSG is embedded in the VDP chip */
MCFG_DEVICE_ADD("segapsg", SEGAPSG, MASTER_CLOCK_PALM/3)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms3_br)
@ -817,11 +804,12 @@ MACHINE_CONFIG_START(sms_state::sms3_br)
MCFG_SCREEN_SMS_NTSC_RAW_PARAMS(MASTER_CLOCK_PALM/2)
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
SEGA315_5246(config, m_vdp, 0);
SEGA315_5246(config, m_vdp, MASTER_CLOCK_PALM);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false); // PAL-M has same line count of NTSC
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
m_has_bios_full = true;
MACHINE_CONFIG_END
@ -829,8 +817,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_br)
sms_br_base(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_PROGRAM_MAP(sms1_mem) // This adds the SegaScope handlers for 3-D glasses
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */
// PAL-M height/width parameters are the same of NTSC screens.
@ -853,11 +840,12 @@ MACHINE_CONFIG_START(sms_state::sms1_br)
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, 0);
SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALM);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false); // PAL-M has same line count of NTSC
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
// card and expansion slots, not present in Tec Toy Master System III
SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr);
@ -870,8 +858,8 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms2_kr)
sms2_ntsc(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_IO_MAP(smskr_io)
m_maincpu->set_addrmap(AS_IO, &sms_state::smskr_io);
config.device_remove("slot");
SG1000MK3_CART_SLOT(config, "slot", sg1000mk3_cart, nullptr);
@ -883,8 +871,8 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sms1_kr)
sms1_ntsc(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_IO_MAP(smskr_io)
m_maincpu->set_addrmap(AS_IO, &sms_state::smskr_io);
// need to replace the cartridge slot with the Japanese version, so to
// keep the usual media order, remove and reinsert all of them.
@ -907,8 +895,8 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::smsj)
sms1_kr(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_IO_MAP(smsj_io)
m_maincpu->set_addrmap(AS_IO, &sms_state::smsj_io);
MCFG_DEVICE_ADD("ym2413", YM2413, XTAL(10'738'635)/3)
// if this output gain is changed, the gain set when unmute the output need
@ -920,8 +908,8 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::sg1000m3)
sms1_ntsc(config);
MCFG_DEVICE_MODIFY("maincpu")
MCFG_DEVICE_IO_MAP(sg1000m3_io)
m_maincpu->set_addrmap(AS_IO, &sms_state::sg1000m3_io);
// Remove and reinsert all media slots, as done with the sms1_kr config,
// and also replace the expansion slot with the SG-1000 version.
@ -945,9 +933,9 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(sms_state::gamegear)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", Z80, MASTER_CLOCK_GG/9)
MCFG_DEVICE_PROGRAM_MAP(sms_mem)
MCFG_DEVICE_IO_MAP(gg_io)
Z80(config, m_maincpu, MASTER_CLOCK_GG/9);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem);
m_maincpu->set_addrmap(AS_IO, &sms_state::gg_io);
config.m_minimum_quantum = attotime::from_hz(60);
@ -959,21 +947,18 @@ MACHINE_CONFIG_START(sms_state::gamegear)
MCFG_VIDEO_START_OVERRIDE(sms_state,gamegear)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,gamegear)
/* VDP chip of the Gamegear 2 ASIC version */
SEGA315_5377(config, m_vdp, 0);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
/* actually, PSG is embedded in the VDP chip */
MCFG_DEVICE_ADD("gamegear", GAMEGEAR, MASTER_CLOCK_GG/9)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
/* VDP chip of the Gamegear 2 ASIC version */
SEGA315_5377(config, m_vdp, MASTER_CLOCK_GG/3);
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(0, "lspeaker", 1.00);
m_vdp->add_route(1, "rspeaker", 1.00);
/* cartridge */
GAMEGEAR_CART_SLOT(config, "slot", gg_cart, nullptr);

View File

@ -264,7 +264,7 @@ void smsbootleg_state::sms_supergame_io(address_map &map)
map(0x14, 0x14).nopr(); //AM_READ_PORT("IN1") // seem to be from a coinage / timer MCU, changing them directly changes the credits / time value
map(0x18, 0x18).w(FUNC(smsbootleg_state::port18_w));
map(0x40, 0x7f).rw(FUNC(smsbootleg_state::sms_count_r), FUNC(smsbootleg_state::sms_psg_w));
map(0x40, 0x7f).r(FUNC(smsbootleg_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
@ -275,18 +275,15 @@ void smsbootleg_state::sms_supergame_io(address_map &map)
MACHINE_CONFIG_START(smsbootleg_state::sms_supergame)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", Z80, XTAL(10'738'635)/3)
MCFG_DEVICE_PROGRAM_MAP(sms_supergame_map)
MCFG_DEVICE_IO_MAP(sms_supergame_io)
Z80(config, m_maincpu, XTAL(10'738'635)/3);
m_maincpu->set_addrmap(AS_PROGRAM, &smsbootleg_state::sms_supergame_map);
m_maincpu->set_addrmap(AS_IO, &smsbootleg_state::sms_supergame_io);
config.m_minimum_quantum = attotime::from_hz(60);
/* sound hardware */
SPEAKER(config, "mono").front_center();
MCFG_DEVICE_ADD("segapsg", SEGAPSG, XTAL(10'738'635)/3)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL(10'738'635)/2, \
sega315_5124_device::WIDTH , sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH - 2, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256 + 10, \
@ -294,11 +291,12 @@ MACHINE_CONFIG_START(smsbootleg_state::sms_supergame)
MCFG_SCREEN_REFRESH_RATE(XTAL(10'738'635)/2 / (sega315_5124_device::WIDTH * sega315_5124_device::HEIGHT_NTSC))
MCFG_SCREEN_UPDATE_DRIVER(sms_state, screen_update_sms)
SEGA315_5246(config, m_vdp, 0);
SEGA315_5246(config, m_vdp, XTAL(10'738'635));
m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false);
m_vdp->irq().set_inputline(m_maincpu, 0);
m_vdp->pause().set(FUNC(sms_state::sms_pause_callback));
m_vdp->add_route(ALL_OUTPUTS, "mono", 1.00);
MACHINE_CONFIG_END

View File

@ -654,7 +654,7 @@ void zeropnt2_state::machine_start()
void zeropnt2_state::zeropnt2(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */
M68EC020(config, m_maincpu, 32_MHz_XTAL/2); /* 16MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &zeropnt2_state::zeropnt2_map);
m_maincpu->set_vblank_int("screen", FUNC(zeropnt2_state::irq2_line_hold));

View File

@ -13,10 +13,30 @@
Justice League
Dora the Explorer
Mattel Classic Sports
Disney Princess (GKR)
Wheel of Fortune (GKR)
(all GameKeyReady units?)
"SunPlus QL8041C" ( known as Sunplus SPG2?? )
Clickstart ( see clickstart.cpp instead)
Wheel of Fortune 2nd Edition
"SunPlus QL8041C" ( known as Sunplus SPG2?? ) see clickstart.cpp instead
"SunPlus PA7801" ( known as Sunplus SPG110? ) see spg110.cpp instead
Classic Arcade Pinball
EA Sports (NHL95 + Madden 95)
It is unknown if the following are close to this architecture or not (no dumps yet)
"SunPlus QU7073-P69A"
Mortal Kombat
"Sunplus QL8167"
Disney Princess (older)
Go Diego Go
Disney Princess non-GKR is Sunplus QL8167.
Status:
@ -33,12 +53,11 @@
walle:
Game seems unhappy with NVRAM, clears contents on each boot.
rad_skat:
Palette issues on the High Score screen.
rad_fb2:
sometimes when selecting QB training camp the sprites don't appear
controls are not properly mapped
vii:
jak_pooh:
In the 'Light Tag' minigame (select the rock) you can't move left with the DRC (ok with -nodrc)
and the game usually softlocks when you find a friend (with or without DRC)
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.
@ -100,6 +119,7 @@ public:
void spg2xx_base(machine_config &config);
void spg2xx_basep(machine_config &config);
void jakks(machine_config &config);
void jakks_i2c(machine_config &config);
void walle(machine_config &config);
void wireless60(machine_config &config);
void rad_skat(machine_config &config);
@ -174,14 +194,18 @@ public:
{ }
void jakks_gkr(machine_config &config);
void jakks_gkr_1m(machine_config &config);
void jakks_gkr_2m(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_dy(machine_config &config);
void jakks_gkr_dp(machine_config &config);
void jakks_gkr_sw(machine_config &config);
void jakks_gkr_nm(machine_config &config);
void jakks_gkr_wf(machine_config &config);
void jakks_gkr_nk_i2c(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_wf_i2c(machine_config &config);
void jakks_gkr_mv_i2c(machine_config &config);
void jakks_gkr_wp(machine_config &config);
DECLARE_CUSTOM_INPUT_MEMBER(i2c_gkr_r);
@ -349,10 +373,13 @@ WRITE16_MEMBER(jakks_gkr_state::gkr_portc_w)
}
else
{
if (BIT(mem_mask, 1))
m_i2cmem->write_scl(BIT(data, 1));
if (BIT(mem_mask, 0))
m_i2cmem->write_sda(BIT(data, 0));
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));
}
}
}
@ -488,7 +515,7 @@ static INPUT_PORTS_START( walle )
PORT_BIT( 0xfffe, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
static INPUT_PORTS_START( jak_sith )
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 )
@ -506,7 +533,23 @@ static INPUT_PORTS_START( jak_sith )
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 )
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( 0xffff, 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_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)
@ -528,7 +571,7 @@ static INPUT_PORTS_START( jak_nm )
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_wf )
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)
@ -564,9 +607,14 @@ static INPUT_PORTS_START( jak_gkr )
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_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr)
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 ) )
@ -614,7 +662,78 @@ static INPUT_PORTS_START( jak_gkr )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START( jak_disp )
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_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr) // 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_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( jak_gkr_i2c )
PORT_INCLUDE(jak_gkr)
PORT_MODIFY("P3")
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, jakks_gkr_state,i2c_gkr_r, nullptr)
INPUT_PORTS_END
static INPUT_PORTS_START( jak_disp_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)
@ -1154,10 +1273,13 @@ void spg2xx_game_state::jakks(machine_config &config)
m_spg->porta_in().set(FUNC(spg2xx_game_state::jakks_porta_r));
m_spg->porta_out().set(FUNC(spg2xx_game_state::jakks_porta_w));
m_spg->portb_out().set(FUNC(spg2xx_game_state::jakks_portb_w));
I2CMEM(config, m_i2cmem, 0).set_data_size(0x200);
}
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()
{
@ -1180,27 +1302,34 @@ DEVICE_IMAGE_LOAD_MEMBER(jakks_gkr_state, gamekey_cart)
void jakks_gkr_state::jakks_gkr(machine_config &config)
{
walle(config);
jakks(config);
m_spg->porta_in().set(FUNC(jakks_gkr_state::jakks_porta_key_io_r));
m_spg->porta_out().set(FUNC(jakks_gkr_state::jakks_porta_key_io_w));
//m_spg->portb_in().set_ioport("P2");
m_spg->portc_in().set_ioport("P3");
m_spg->portc_out().set(FUNC(jakks_gkr_state::gkr_portc_w));
m_spg-> set_rowscroll_offset(0);
m_spg->set_rowscroll_offset(0);
JAKKS_GAMEKEY_SLOT(config, m_cart, 0, jakks_gamekey, nullptr);
}
void jakks_gkr_state::jakks_gkr_1m(machine_config &config)
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(machine_config &config)
void jakks_gkr_state::jakks_gkr_2m_i2c(machine_config &config)
{
jakks_gkr(config);
jakks_gkr_i2c(config);
m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_2m);
}
@ -1211,40 +1340,64 @@ void jakks_gkr_state::jakks_gkr_nk(machine_config &config)
SOFTWARE_LIST(config, "jakks_gamekey_nk").set_original("jakks_gamekey_nk");
}
void jakks_gkr_state::jakks_gkr_dy(machine_config &config)
void jakks_gkr_state::jakks_gkr_nk_i2c(machine_config &config)
{
jakks_gkr(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_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_dp(machine_config &config)
void jakks_gkr_state::jakks_gkr_mv_i2c(machine_config &config)
{
jakks_gkr(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(machine_config &config)
void jakks_gkr_state::jakks_gkr_sw_i2c(machine_config &config)
{
jakks_gkr(config);
jakks_gkr_i2c(config);
m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
m_spg->adc_in<0>().set_ioport("JOYX");
m_spg->adc_in<1>().set_ioport("JOYY");
SOFTWARE_LIST(config, "jakks_gamekey_sw").set_original("jakks_gamekey_sw");
}
void jakks_gkr_state::jakks_gkr_nm(machine_config &config)
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_spg->adc_in<0>().set_ioport("JOYX");
m_spg->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_nm_i2c(machine_config &config)
{
jakks_gkr_i2c(config);
m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
m_spg->adc_in<0>().set_ioport("DIALX");
SOFTWARE_LIST(config, "jakks_gamekey_nm").set_original("jakks_gamekey_nm");
}
void jakks_gkr_state::jakks_gkr_wf(machine_config &config)
void jakks_gkr_state::jakks_gkr_wf_i2c(machine_config &config)
{
jakks_gkr(config);
jakks_gkr_i2c(config);
m_maincpu->set_addrmap(AS_PROGRAM, &jakks_gkr_state::mem_map_1m);
//m_spg->adc_in<0>().set_ioport("DIALX"); // wheel does not seem to map here
//m_spg->adc_in<1>().set_ioport("DIALY");
@ -1263,7 +1416,7 @@ void spg2xx_game_state::lexizeus(machine_config &config)
void spg2xx_game_state::walle(machine_config &config)
{
jakks(config);
jakks_i2c(config);
m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_2m);
m_spg->portc_in().set_ioport("P3");
m_spg->portc_out().set(FUNC(spg2xx_game_state::walle_portc_w));
@ -1354,6 +1507,28 @@ ROM_START( jak_dora )
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_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_wof )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "jakkswheeloffortunegkr.bin", 0x000000, 0x200000, CRC(6a879620) SHA1(95478764a61741569041c2299528f6464651d593) )
@ -1447,6 +1622,11 @@ ROM_START( mattelcs )
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
/*
Wireless Air 60
(info provided with dump)
@ -1627,29 +1807,29 @@ CONS( 2008, jak_wall, 0, 0, walle, walle, spg2xx_game_state, empty_init, "JAKKS
// '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.
CONS( 2005, jak_wwe, 0, 0, jakks_gkr_1m, jak_gkr, 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, jak_gkr, 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, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / Taniko", "Justice League (JAKKS Pacific TV Game, Game-Key Ready)", MACHINE_NOT_WORKING | 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.
// there is also a Dora the Explorer 'Race to Play Park' which is also a GameKeyReady unit with NK code, and different games - the upper part of this one is blue.
CONS( 2005, jak_sdoo, 0, 0, jakks_gkr_2m, jak_gkr, 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)
CONS( 2005, jak_disf, 0, 0, jakks_gkr_dy, jak_gkr, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Disney Friends (JAKKS Pacific TV Game, Game-Key Ready) (17 MAY 2005 A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
CONS( 2005, jak_disp, 0, 0, jakks_gkr_dp, jak_disp, 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_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_NOT_WORKING | 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_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)
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_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses DY keys (3 released)
CONS( 2005, jak_disp, 0, 0, jakks_gkr_dp_i2c, jak_disp_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)
// There seems to be a second game called 'Disney Princesses' with a 'board game' style front end as well as the minigames, also GKR, see https://www.youtube.com/watch?v=w9p5TI029bQ The one we have is https://www.youtube.com/watch?v=9ppPKVbpoMs the physical package seems identical.
CONS( 2005, jak_sith, 0, 0, jakks_gkr_sw, jak_sith, 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, jak_gkr, 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, jak_nm, 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_wof, 0, 0, jakks_gkr_wf, jak_wf, jakks_gkr_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wheel of Fortune (JAKKS Pacific TV Game, Game-Key Ready)", 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, it is not yet verified to be the same code.
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_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)", 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)
// Nicktoons NK (3 keys available) (same keys as Dora the Explorer)
// SpongeBob SquarePants: The Fry Cook Games NK (3 keys available) ^^
// Spider-Man MV (1 key available)
// no keys released for the following, some were in development but cancelled
// Capcom 3-in-1 CC (no game-keys released)
// Care Bears CB (no game-keys released)
// Winnie the Pooh WP (no game-keys released)
// 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 )
@ -1661,6 +1841,9 @@ CONS( 2007, rad_fb2, 0, 0, rad_skat, rad_fb2, spg2xx_game_state, ini
// 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( 2007, dreamlif, 0, 0, rad_skat, rad_crik, spg2xx_game_state, empty_init, "Hasbro ", "Dream Life", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// might not fit here. First 0x8000 bytes are blank (not too uncommon for these) then rest of rom looks like it's probably encrypted at least
// could be later model VT based instead? even after decrypting (simple word xor) the vectors have a different format and are at a different location to the SunPlus titles
CONS( 2009, zone40, 0, 0, non_spg_base, wirels60, spg2xx_game_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )

View File

@ -1514,6 +1514,17 @@ ROM_START( epo_epp )
ROM_LOAD("excitepingpong.bin", 0x000000, 0x100000, CRC(1fdb9cbd) SHA1(8ed0c1f6d2708ab6e79f0b9553e587c6446e8338) )
ROM_END
ROM_START( epo_epp3 )
ROM_REGION(0x200000, "bios", ROMREGION_ERASE00)
ROM_LOAD("excitepingpong3.bin", 0x000000, 0x200000, CRC(a2ee8bff) SHA1(6e16dbaac9680e1f311c08e3f573d0cf8708b446))
ROM_END
ROM_START( rad_socr )
ROM_REGION(0x800000, "bios", ROMREGION_ERASE00)
ROM_LOAD("soccer.u5", 0x000000, 0x100000, CRC(0564a766) SHA1(bded4f2e0d059731164c35de7df62ef411402901) )
ROM_LOAD("soccer.u4", 0x400000, 0x200000, CRC(e0e2c488) SHA1(907511d945dec51782af268a94b372dfeb7517c5) )
ROM_END
ROM_START( epo_guru )
ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
ROM_LOAD("gururinworld.bin", 0x000000, 0x400000, CRC(e5ae4523) SHA1(0e39ef8f94203d34e49422081667805f50a339a1) )
@ -1539,6 +1550,8 @@ ROM_START( ltv_tam )
ROM_LOAD("letstvtamagotchi.bin", 0x000000, 0x400000, CRC(e3723272) SHA1(e72e128a7a24afb96baafe5f13e13a0d74db4033) )
ROM_END
/*
The e-kara cartridges require the BIOS rom to map into 2nd external bus space as they fetch palette data from
it etc.
@ -1665,10 +1678,13 @@ CONS( 2006, rad_sbw, 0, 0, xavix, rad_snow, xavix_state,
CONS( 2002, rad_bdp, 0, 0, xavix, rad_bdp, xavix_state, init_xavix, "Radica / Mattel / SSD Company LTD", "Barbie Dance Party", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
CONS( 2002, rad_socr, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Radica / Epoch / SSD Company LTD", "Play TV Soccer", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 2000, epo_epp, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// Excite Ping Pong 2 is from 2003, and there's a 3rd game from 2006 also
CONS( 2006, epo_epp3, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Challenge Ai-chan! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 200?, epo_efdx, 0, 0, xavix_i2c_24c08, epo_efdx, xavix_i2c_state, init_epo_efdx, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 2005, epo_guru, 0, 0, xavix, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Gururin World (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
@ -1710,6 +1726,8 @@ CONS( 2006, ltv_tam, 0, 0, xavix_i2c_24lc04, ltv_tam,xavix_i2c_ltv_
these use the SSD 2000 NEC 85605-621 type CPU
XavixPort Golf is "SSD 2003 SuperXaviX MXIC 2003 3009" (not dumped yet, but actually marked as SuperXaviX unlike the others!)
This CPU type adds extra opcodes that don't appear to be present in the 97/98 types
It does not appear to support the bitmap modes or 16-bit ROMs found in the 2002 type
*/
@ -1719,6 +1737,12 @@ ROM_START( epo_sdb )
ROM_LOAD("superdashball.bin", 0x000000, 0x400000, CRC(a004a764) SHA1(47a96822d4d7d6a0f6be5cd729c3747dbab65979) )
ROM_END
ROM_START( epo_ebox )
ROM_REGION(0x400000, "bios", ROMREGION_ERASE00)
ROM_LOAD("exciteboxing.bin", 0x000000, 0x400000, CRC(e25ae4f5) SHA1(7f7b613f0ab8f43f5cad0d13de538921e77cae9c) )
ROM_END
ROM_START( ttv_sw )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 )
ROM_LOAD( "jedi.bin", 0x000000, 0x800000, CRC(51cae5fd) SHA1(1ed8d556f31b4182259ca8c766d60c824d8d9744) )
@ -1739,6 +1763,12 @@ ROM_START( drgqst )
ROM_LOAD( "dragonquest.bin", 0x000000, 0x800000, CRC(3d24413f) SHA1(1677e81cedcf349de7bf091a232dc82c6424efba) )
ROM_END
ROM_START( ban_onep )
ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00)
ROM_LOAD("onepiece.bin", 0x000000, 0x800000, CRC(c5cb5a5f) SHA1(db85f6cc48d77c5a4967b9b8e2999167e3dfc8c8) )
ROM_END
CONS( 2002, epo_ebox, 0, 0, xavix2000_nv, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Boxing (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // doesn't use XaviX2000 extra opcodes, but had that type of CPU
CONS( 2004, epo_sdb, 0, 0, xavix2000_nv, epo_sdb, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND )
CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
@ -1746,6 +1776,9 @@ CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_sta
CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// hangs after starting a game, or after quite a long time in attract mode (first problem could be bad save data read with the eeprom code, 2nd problem might just be how it is, ends up in a dead loop, not executing invalid code)
CONS( 2004, ban_onep, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Bandai / SSD Company LTD", "One Piece Punch Battle (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
/* SuperXaviX (XaviX 2002 type CPU) hardware titles (3rd XaviX generation?)
these use the SSD 2002 NEC 85054-611 type CPU

View File

@ -26,7 +26,6 @@
#include "bus/sg1000_exp/sg1000exp.h"
#include "bus/sms_ctrl/smsctrl.h"
#include "bus/sms_exp/smsexp.h"
#include "sound/sn76496.h"
#include "sound/ym2413.h"
#include "video/315_5124.h"
@ -41,8 +40,6 @@ public:
m_maincpu(*this, "maincpu"),
m_vdp(*this, "sms_vdp"),
m_main_scr(*this, "screen"),
m_psg_sms(*this, "segapsg"),
m_psg_gg(*this, "gamegear"),
m_ym(*this, "ym2413"),
m_port_ctrl1(*this, CONTROL1_TAG),
m_port_ctrl2(*this, CONTROL2_TAG),
@ -120,8 +117,6 @@ protected:
DECLARE_READ8_MEMBER(gg_sio_r);
DECLARE_WRITE8_MEMBER(gg_sio_w);
DECLARE_WRITE8_MEMBER(gg_psg_stereo_w);
DECLARE_WRITE8_MEMBER(gg_psg_w);
DECLARE_WRITE8_MEMBER(sms_psg_w);
DECLARE_READ8_MEMBER(smsj_audio_control_r);
DECLARE_WRITE8_MEMBER(smsj_audio_control_w);
DECLARE_WRITE8_MEMBER(smsj_ym2413_register_port_w);
@ -169,8 +164,6 @@ protected:
required_device<cpu_device> m_maincpu;
required_device<sega315_5124_device> m_vdp;
required_device<screen_device> m_main_scr;
optional_device<segapsg_device> m_psg_sms;
optional_device<gamegear_device> m_psg_gg;
optional_device<ym2413_device> m_ym;
optional_device<sms_control_port_device> m_port_ctrl1;
optional_device<sms_control_port_device> m_port_ctrl2;

View File

@ -21,7 +21,8 @@
#define LOG_WRITE (1 << 8)
#define LOG_INT3 (1 << 9)
#define LOG_PIT (1 << 10)
#define LOG_ALL (LOG_PI1 | LOG_SERIAL | LOG_MOUSEKBD | LOG_PANEL | LOG_SYSID | LOG_READ | LOG_DMA_SEL | LOG_RESET | LOG_WRITE | LOG_INT3 | LOG_PIT)
#define LOG_IRQS (1 << 11)
#define LOG_ALL (LOG_PI1 | LOG_SERIAL | LOG_MOUSEKBD | LOG_PANEL | LOG_SYSID | LOG_READ | LOG_DMA_SEL | LOG_RESET | LOG_WRITE | LOG_INT3 | LOG_PIT | LOG_IRQS)
#define LOG_DEFAULT (LOG_ALL & ~(LOG_SYSID | LOG_MOUSEKBD))
#define VERBOSE (0)
@ -172,26 +173,38 @@ void ioc2_device::device_reset()
void ioc2_device::raise_local_irq(int channel, uint8_t mask)
{
const uint8_t old = m_int3_local_status_reg[channel];
m_int3_local_status_reg[channel] |= mask;
LOGMASKED(LOG_IRQS, "Raising Local%d interrupt mask %02x, interrupt status was %02x, now %02x, %sing interrupt\n", channel, mask, old,
m_int3_local_status_reg[channel], (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? "rais" : "lower");
m_maincpu->set_input_line(channel, (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? ASSERT_LINE : CLEAR_LINE);
}
void ioc2_device::lower_local_irq(int channel, uint8_t mask)
{
const uint8_t old = m_int3_local_status_reg[channel];
m_int3_local_status_reg[channel] &= ~mask;
LOGMASKED(LOG_IRQS, "Lowering Local%d interrupt mask %02x, interrupt status was %02x, now %02x, %sing interrupt\n", channel, mask, old,
m_int3_local_status_reg[channel], (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? "rais" : "lower");
m_maincpu->set_input_line(channel, (m_int3_local_mask_reg[channel] & m_int3_local_status_reg[channel]) ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(ioc2_device::timer0_int)
{
if (state)
{
LOGMASKED(LOG_IRQS, "Raising IRQ line 2\n");
m_maincpu->set_input_line(2, ASSERT_LINE);
}
}
WRITE_LINE_MEMBER(ioc2_device::timer1_int)
{
if (state)
{
LOGMASKED(LOG_IRQS, "Raising IRQ line 3\n");
m_maincpu->set_input_line(3, ASSERT_LINE);
}
}
WRITE_LINE_MEMBER(ioc2_device::pit_clock2_out)
@ -213,20 +226,36 @@ WRITE_LINE_MEMBER(ioc2_device::duart_int_w)
void ioc2_device::set_mappable_int(uint8_t mask, bool state)
{
const uint8_t old = m_int3_map_status_reg;
const uint8_t old0 = m_int3_map_mask_reg[0] & old;
const uint8_t old1 = m_int3_map_mask_reg[1] & old;
if (state)
m_int3_map_status_reg |= mask;
else
m_int3_map_status_reg &= ~mask;
if (m_int3_map_mask_reg[0] & m_int3_map_status_reg)
raise_local_irq(0, INT3_LOCAL0_MAPPABLE0);
else
lower_local_irq(0, INT3_LOCAL0_MAPPABLE0);
const uint8_t new0 = m_int3_map_mask_reg[0] & m_int3_map_status_reg;
if (old0 ^ new0)
{
LOGMASKED(LOG_IRQS, "%sing Mappable interrupt mask %02x, interrupt status was %02x, now %02x, %sing mappable0\n", state ? "Rais" : "Lower", mask, old,
m_int3_map_status_reg, (m_int3_map_mask_reg[0] & m_int3_map_status_reg) ? "rais" : "lower");
if (m_int3_map_mask_reg[0] & m_int3_map_status_reg)
raise_local_irq(0, INT3_LOCAL0_MAPPABLE0);
else
lower_local_irq(0, INT3_LOCAL0_MAPPABLE0);
}
if (m_int3_map_mask_reg[1] & m_int3_map_status_reg)
raise_local_irq(1, INT3_LOCAL1_MAPPABLE1);
else
lower_local_irq(1, INT3_LOCAL1_MAPPABLE1);
const uint8_t new1 = m_int3_map_mask_reg[1] & m_int3_map_status_reg;
if (old1 ^ new1)
{
LOGMASKED(LOG_IRQS, "%sing Mappable interrupt mask %02x, interrupt status was %02x, now %02x, %sing mappable1\n", state ? "Rais" : "Lower", mask, old,
m_int3_map_status_reg, (m_int3_map_mask_reg[0] & m_int3_map_status_reg) ? "rais" : "lower");
if (m_int3_map_mask_reg[1] & m_int3_map_status_reg)
raise_local_irq(1, INT3_LOCAL1_MAPPABLE1);
else
lower_local_irq(1, INT3_LOCAL1_MAPPABLE1);
}
}
READ32_MEMBER(ioc2_device::read)
@ -636,9 +665,15 @@ void ioc2_device::set_map_int_mask(int channel, uint32_t mask)
void ioc2_device::set_timer_int_clear(uint32_t data)
{
if (BIT(data, 0))
{
LOGMASKED(LOG_IRQS, "Lowering IRQ line 2\n");
m_maincpu->set_input_line(2, CLEAR_LINE);
}
if (BIT(data, 1))
{
LOGMASKED(LOG_IRQS, "Lowering IRQ line 3\n");
m_maincpu->set_input_line(3, CLEAR_LINE);
}
}
void ioc2_device::handle_reset_reg_write(uint8_t data)

View File

@ -193,7 +193,6 @@ void sgi_mc_device::set_cpu_buserr(uint32_t address)
uint32_t sgi_mc_device::dma_translate(uint32_t address)
{
machine().debug_break();
for (int entry = 0; entry < 4; entry++)
{
if ((address & 0xffe00000) == (m_dma_tlb_entry_hi[entry] & 0xffe00000))
@ -224,9 +223,22 @@ void sgi_mc_device::dma_tick()
}
else
{
m_space->write_byte(addr, m_space->read_byte(m_dma_gio64_addr));
m_dma_mem_addr++;
m_dma_count--;
const uint32_t remaining = m_dma_count & 0x0000ffff;
uint32_t length = 8;
uint64_t shift = 56;
if (remaining < 8)
length = remaining;
uint64_t data = m_space->read_qword(m_dma_gio64_addr);
for (uint32_t i = 0; i < length; i++)
{
m_space->write_byte(addr, (uint8_t)(data >> shift));
addr++;
shift -= 8;
}
m_dma_mem_addr += length;
m_dma_count -= length;
}
}
else
@ -705,6 +717,9 @@ void sgi_mc_device::device_timer(emu_timer &timer, device_timer_id id, int param
}
else if (id == TIMER_DMA)
{
dma_tick();
while (m_dma_run & (1 << 6))
{
dma_tick();
}
}
}

View File

@ -3,7 +3,6 @@
#include "emu.h"
#include "crsshair.h"
#include "video/315_5124.h"
#include "sound/sn76496.h"
#include "sound/ym2413.h"
#include "includes/sms.h"
@ -203,9 +202,9 @@ WRITE8_MEMBER(sms_state::sms_io_control_w)
READ8_MEMBER(sms_state::sms_count_r)
{
if (offset & 0x01)
return m_vdp->hcount_read(*m_space, offset);
return m_vdp->hcount_read();
else
return m_vdp->vcount_read(*m_space, offset);
return m_vdp->vcount_read();
}
@ -467,9 +466,9 @@ void sms_state::smsj_set_audio_control(uint8_t data)
1,1 : Both PSG and FM enabled
*/
if (m_smsj_audio_control == 0x00 || m_smsj_audio_control == 0x03)
m_psg_sms->set_output_gain(ALL_OUTPUTS, 1.0);
m_vdp->set_output_gain(ALL_OUTPUTS, 1.0);
else
m_psg_sms->set_output_gain(ALL_OUTPUTS, 0.0);
m_vdp->set_output_gain(ALL_OUTPUTS, 0.0);
if (m_smsj_audio_control == 0x01 || m_smsj_audio_control == 0x03)
m_ym->set_output_gain(ALL_OUTPUTS, 1.0);
@ -526,24 +525,12 @@ WRITE8_MEMBER(sms_state::smsj_ym2413_data_port_w)
}
WRITE8_MEMBER(sms_state::sms_psg_w)
{
m_psg_sms->write(data);
}
WRITE8_MEMBER(sms_state::gg_psg_w)
{
m_psg_gg->write(data);
}
WRITE8_MEMBER(sms_state::gg_psg_stereo_w)
{
if (m_cartslot->exists() && m_cartslot->get_sms_mode())
return;
m_psg_gg->stereo_w(data);
m_vdp->psg_stereo_w(data);
}

View File

@ -15426,6 +15426,7 @@ hp95lx //
@source:hp9825.cpp
hp9825b // HP 9825B
hp9825t // HP 9825T
@source:hp9845.cpp
hp9835a //
@ -34203,6 +34204,9 @@ wg3dh // (c) 1996 Atari Games
@source:seattlecmp.cpp
scp300f // Seattle SCP-300F
@source:sega_beena.cpp
beena //
@source:sega_sawatte.cpp
sawatte //
@ -38673,6 +38677,7 @@ jak_wwe //
jak_fan4 //
jak_just //
jak_dora //
jak_dorr //
jak_disf //
jak_disp //
jak_sith //
@ -38680,6 +38685,9 @@ jak_sdoo //
jak_dbz //
jak_mpac //
jak_wof //
jak_spdm //
jak_pooh //
jak_nick //
lexizeus // Lexibook
vii // KenSingTon / Jungle Soft / Siatronics Vii
wrlshunt // Wireless: Hunting Video Game System
@ -38693,6 +38701,7 @@ rad_sktv //
rad_crik //
rad_fb2 //
mattelcs //
dreamlif //
@source:vsmile.cpp
vsmile //
@ -39843,8 +39852,11 @@ rad_snow //
rad_snowp //
rad_madf //
rad_fb //
rad_socr //
epo_epp //
epo_epp3 //
epo_efdx //
epo_ebox //
epo_sdb //
epo_guru //
epo_dmon //
@ -39855,6 +39867,7 @@ rad_sbw //
rad_bdp //
has_wamg //
ltv_tam //
ban_onep //
ekara //
ekaraa //
ekaraj //

View File

@ -671,6 +671,7 @@ sdk80.cpp
sdk85.cpp
sdk86.cpp
seattlecmp.cpp
sega_beena.cpp
sega_sawatte.cpp
segapico.cpp
segapm.cpp

View File

@ -37,9 +37,10 @@
#define LOG_XMAP1 (1 << 5)
#define LOG_REX3 (1 << 6)
#define LOG_COMMANDS (1 << 7)
#define LOG_REJECTS (1 << 8)
#define LOG_ALL (LOG_UNKNOWN | LOG_VC2 | LOG_CMAP0 | LOG_CMAP1 | LOG_XMAP0 | LOG_XMAP1 | LOG_REX3)
#define VERBOSE 0
#define VERBOSE (LOG_UNKNOWN | LOG_VC2 | LOG_CMAP0 | LOG_REX3 | LOG_COMMANDS)
#include "logmacro.h"
DEFINE_DEVICE_TYPE(NEWPORT_VIDEO, newport_video_device, "newport_video", "SGI Newport graphics board")
@ -119,6 +120,8 @@ void newport_video_device::device_start()
save_item(NAME(m_rex3.m_x_save));
save_item(NAME(m_rex3.m_xy_move));
save_item(NAME(m_rex3.m_x_move));
save_item(NAME(m_rex3.m_y_move));
save_item(NAME(m_rex3.m_bres_d));
save_item(NAME(m_rex3.m_bres_s1));
save_item(NAME(m_rex3.m_bres_octant_inc1));
@ -132,6 +135,9 @@ void newport_video_device::device_start()
save_item(NAME(m_rex3.m_x_end_f));
save_item(NAME(m_rex3.m_y_end_f));
save_item(NAME(m_rex3.m_x_start_i));
save_item(NAME(m_rex3.m_y_start_i));
save_item(NAME(m_rex3.m_x_end_i));
save_item(NAME(m_rex3.m_y_end_i));
save_item(NAME(m_rex3.m_xy_start_i));
save_item(NAME(m_rex3.m_xy_end_i));
save_item(NAME(m_rex3.m_x_start_end_i));
@ -154,11 +160,11 @@ void newport_video_device::device_start()
save_item(NAME(m_rex3.m_dcb_data_lsw));
save_item(NAME(m_rex3.m_top_scanline));
save_item(NAME(m_rex3.m_xy_window));
save_item(NAME(m_rex3.m_x_window));
save_item(NAME(m_rex3.m_y_window));
save_item(NAME(m_rex3.m_clip_mode));
save_item(NAME(m_rex3.m_config));
save_item(NAME(m_rex3.m_status));
save_item(NAME(m_rex3.m_iter_x));
save_item(NAME(m_rex3.m_iter_y));
save_item(NAME(m_rex3.m_xfer_width));
save_item(NAME(m_rex3.m_read_active));
@ -790,16 +796,11 @@ READ64_MEMBER(newport_video_device::rex3_r)
LOGMASKED(LOG_REX3, "REX3 Line/Span Setup Read: %08x\n", m_rex3.m_setup);
ret |= (uint64_t)m_rex3.m_setup << 32;
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 ZPattern Enable Read: %08x\n", m_rex3.m_step_z);
ret |= m_rex3.m_step_z;
}
break;
case 0x0100/8:
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 X Start Read: %08x\n", m_rex3.m_x_start);
LOGMASKED(LOG_REX3, "%s: REX3 X Start Read: %08x\n", machine().describe_context(), m_rex3.m_x_start);
ret |= (uint64_t)m_rex3.m_x_start << 32;
}
if (ACCESSING_BITS_0_31)
@ -824,7 +825,7 @@ READ64_MEMBER(newport_video_device::rex3_r)
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 XSave Read: %08x\n", m_rex3.m_x_save);
ret |= (uint64_t)m_rex3.m_x_save << 32;
ret |= (uint64_t)(uint16_t)m_rex3.m_x_save << 32;
}
if (ACCESSING_BITS_0_31)
{
@ -1010,7 +1011,8 @@ READ64_MEMBER(newport_video_device::rex3_r)
case 0x0230/8:
if (m_rex3.m_read_active)
m_rex3.m_host_dataport = do_pixel_word_read();
LOGMASKED(LOG_REX3, "REX3 Host Data Port Read: %08x%08x\n", (uint32_t)(m_rex3.m_host_dataport >> 32), (uint32_t)m_rex3.m_host_dataport);
LOGMASKED(LOG_REX3, "%s: REX3 Host Data Port Read: %08x%08x\n", machine().describe_context(), (uint32_t)(m_rex3.m_host_dataport >> 32),
(uint32_t)m_rex3.m_host_dataport);
ret = m_rex3.m_host_dataport;
break;
case 0x0238/8:
@ -1148,124 +1150,118 @@ READ64_MEMBER(newport_video_device::rex3_r)
return ret;
}
void newport_video_device::write_pixel(uint32_t x, uint32_t y, uint8_t color)
void newport_video_device::write_pixel(uint8_t color)
{
write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, color);
}
void newport_video_device::write_pixel(int16_t x, int16_t y, uint8_t color)
{
if (m_rex3.m_clip_mode & 0x1f)
{
for (uint8_t bit = 0; bit < 5; bit++)
uint8_t bit = 0;
for (; bit < 5; bit++)
{
if (!BIT(m_rex3.m_clip_mode, bit))
continue;
if (x < ((m_rex3.m_smask_x[bit] >> 16) & 0x0fff))
return;
continue;
if (x > (m_rex3.m_smask_x[bit] & 0x0fff))
return;
continue;
if (y < ((m_rex3.m_smask_y[bit] >> 16) & 0x0fff))
return;
continue;
if (y > (m_rex3.m_smask_y[bit] & 0x0fff))
return;
continue;
break;
}
if (bit == 5)
{
return;
}
}
if (x > 1280 || y > 1024)
if (x < 0 || y < 0 || x >= 1280 || y >= 1024)
{
logerror("Warning: Attempting to write pixel to %d,%d - rejecting\n", x, y);
LOGMASKED(LOG_REJECTS, "Warning: Attempting to write pixel to %d,%d - rejecting\n", x, y);
return;
}
m_base[y * (1280 + 64) + x] = color;
}
void newport_video_device::do_v_iline(uint16_t x1, uint16_t y1, uint16_t y2, uint8_t color, bool skip_last)
void newport_video_device::do_v_iline(uint8_t color, bool skip_last)
{
uint16_t window_x = (m_rex3.m_xy_window >> 16) & 0x0fff;
uint16_t window_y = m_rex3.m_xy_window & 0x0fff;
int16_t window_x = (m_rex3.m_xy_window >> 16) & 0x0fff;
int16_t window_y = m_rex3.m_xy_window & 0x0fff;
x1 += window_x;
y1 += window_y;
y2 += window_y;
int16_t x1 = m_rex3.m_x_start_i + window_x;
int16_t y1 = m_rex3.m_y_start_i + window_y;
int16_t y2 = m_rex3.m_y_end_i + window_y;
m_rex3.m_iter_x = x1;
m_rex3.m_iter_y = y1;
int incy = (y2 < y1) ? -1 : 1;
int16_t incy = (y2 < y1) ? -1 : 1;
if (skip_last)
y2 -= incy;
do
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, color);
m_rex3.m_iter_y += incy;
} while (m_rex3.m_iter_y != y2);
write_pixel(x1, y1, color);
y1 += incy;
} while (y1 != y2);
m_rex3.m_iter_x -= window_x;
m_rex3.m_iter_y -= window_y;
m_rex3.m_x_start_i = x1 - window_x;
m_rex3.m_y_start_i = y1 - window_y;
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(m_rex3.m_x_start_i << 11);
write_y_start(m_rex3.m_y_start_i << 11);
}
void newport_video_device::do_h_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint8_t color, bool skip_last)
void newport_video_device::do_h_iline(uint8_t color, bool skip_last)
{
uint16_t window_x = (m_rex3.m_xy_window >> 16) & 0x0fff;
uint16_t window_y = m_rex3.m_xy_window & 0x0fff;
int16_t window_x = (m_rex3.m_xy_window >> 16) & 0x0fff;
int16_t window_y = m_rex3.m_xy_window & 0x0fff;
x1 += window_x;
x2 += window_x;
y1 += window_y;
int16_t x1 = m_rex3.m_x_start_i + window_x;
int16_t y1 = m_rex3.m_y_start_i + window_y;
int16_t x2 = m_rex3.m_x_end_i + window_x;
m_rex3.m_iter_x = x1;
m_rex3.m_iter_y = y1;
int16_t incx = (x2 < x1) ? -1 : 1;
if (skip_last)
x2--;
x2 -= incx;
int addr = m_rex3.m_iter_y * (1280 + 64) + m_rex3.m_iter_x;
int addr = y1 * (1280 + 64) + x1;
do
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, color);
write_pixel(x1, y1, color);
addr++;
m_rex3.m_iter_x++;
} while (m_rex3.m_iter_x != x2);
x1 += incx;
} while (x1 != x2);
m_rex3.m_iter_x -= (m_rex3.m_xy_window >> 16) & 0x0fff;
m_rex3.m_iter_y -= m_rex3.m_xy_window & 0x0fff;
m_rex3.m_x_start_i = x1 - window_x;
m_rex3.m_y_start_i = y1 - window_y;
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(m_rex3.m_x_start_i << 11);
write_y_start(m_rex3.m_y_start_i << 11);
}
void newport_video_device::do_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color, bool skip_last)
void newport_video_device::do_iline(uint8_t color, bool skip_last)
{
uint16_t window_x = (m_rex3.m_xy_window >> 16) & 0x0fff;
uint16_t window_y = m_rex3.m_xy_window & 0x0fff;
int16_t window_x = (m_rex3.m_xy_window >> 16) & 0x0fff;
int16_t window_y = m_rex3.m_xy_window & 0x0fff;
x1 += window_x;
y1 += window_y;
x2 += window_x;
y2 += window_y;
int16_t x1 = m_rex3.m_x_start_i + window_x;
int16_t y1 = m_rex3.m_y_start_i + window_y;
int16_t x2 = m_rex3.m_x_end_i + window_x;
int16_t y2 = m_rex3.m_y_end_i + window_y;
unsigned char c1 = 0;
int incy = 1;
int16_t incy = 1;
int dx;
if (x2 > x1)
dx = x2 - x1;
else
dx = x1 - x2;
int16_t dx = abs(x2 - x1);
int16_t dy = abs(y2 - y1);
int dy;
if (y2 > y1)
dy = y2 - y1;
else
dy = y1 - y2;
int t;
if (dy > dx)
{
t = y2;
int16_t t = y2;
y2 = x2;
x2 = t;
@ -1282,7 +1278,7 @@ void newport_video_device::do_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint1
if (x1 > x2)
{
t = y2;
int16_t t = y2;
y2 = y1;
y1 = t;
@ -1300,18 +1296,15 @@ void newport_video_device::do_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint1
else
incy = -1;
m_rex3.m_iter_x = x1;
m_rex3.m_iter_y = y1;
if (c1)
{
do
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, color);
write_pixel(x1, y1, color);
if (e > 0)
{
m_rex3.m_iter_y = m_rex3.m_iter_y + incy;
y1 += incy;
e = e + diago;
}
else
@ -1319,18 +1312,18 @@ void newport_video_device::do_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint1
e = e + horiz;
}
m_rex3.m_iter_x++;
} while (skip_last ? m_rex3.m_iter_x < x2 : m_rex3.m_iter_x <= x2);
x1++;
} while (skip_last ? x1 < x2 : x1 <= x2);
}
else
{
do
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, color);
write_pixel(x1, y1, color);
if (e > 0)
{
m_rex3.m_iter_y = m_rex3.m_iter_y + incy;
y1 += incy;
e = e + diago;
}
else
@ -1338,51 +1331,51 @@ void newport_video_device::do_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint1
e = e + horiz;
}
m_rex3.m_iter_x++;
} while (skip_last ? m_rex3.m_iter_x < x2 : m_rex3.m_iter_x <= x2);
x1++;
} while (skip_last ? x1 < x2 : x1 <= x2);
}
m_rex3.m_iter_x -= window_x;
m_rex3.m_iter_y -= window_y;
m_rex3.m_x_start_i = x1 - window_x;
m_rex3.m_y_start_i = y1 - window_y;
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(m_rex3.m_x_start_i << 11);
write_y_start(m_rex3.m_y_start_i << 11);
}
uint8_t newport_video_device::do_pixel_read()
{
if (m_rex3.m_xy_start_i == m_rex3.m_xy_end_i)
m_rex3.m_read_active = false;
LOGMASKED(LOG_COMMANDS, "Reading from %04x, %04x\n", m_rex3.m_iter_x, m_rex3.m_iter_y);
LOGMASKED(LOG_COMMANDS, "Reading from %04x, %04x\n", m_rex3.m_x_start_i, m_rex3.m_y_start_i);
m_rex3.m_bres_octant_inc1 = 0;
const uint8_t ret = m_base[m_rex3.m_iter_y * (1280 + 64) + m_rex3.m_iter_x];
m_rex3.m_iter_x++;
if (m_rex3.m_iter_x > (m_rex3.m_xy_end_i >> 16))
const uint8_t ret = m_base[m_rex3.m_y_start_i * (1280 + 64) + m_rex3.m_x_start_i];
m_rex3.m_x_start_i++;
if (m_rex3.m_x_start_i > m_rex3.m_x_end_i)
{
m_rex3.m_iter_y++;
m_rex3.m_iter_x = m_rex3.m_x_save;
m_rex3.m_y_start_i++;
m_rex3.m_x_start_i = m_rex3.m_x_save;
}
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(m_rex3.m_x_start_i << 11);
write_y_start(m_rex3.m_y_start_i << 11);
return ret;
}
uint32_t newport_video_device::do_pixel_word_read()
uint64_t newport_video_device::do_pixel_word_read()
{
uint32_t ret = 0;
uint16_t x_start = (uint16_t)(m_rex3.m_xy_start_i >> 16);
uint16_t x_end = (uint16_t)(m_rex3.m_xy_end_i >> 16);
const uint16_t x_start = (uint16_t)(m_rex3.m_xy_start_i >> 16);
const uint16_t x_end = (uint16_t)(m_rex3.m_xy_end_i >> 16);
const bool doubleword = BIT(m_rex3.m_draw_mode1, 10);
const uint16_t max_width = doubleword ? 8 : 4;
uint16_t width = (x_end - x_start) + 1;
if (width > 4)
width = 4;
uint32_t shift = 24;
if (width > max_width)
width = max_width;
uint64_t ret = 0;
uint64_t shift = 56;
for (uint16_t i = 0; i < width; i++)
{
ret |= do_pixel_read() << shift;
ret |= (uint64_t)do_pixel_read() << shift;
shift -= 8;
}
return ret;
@ -1394,72 +1387,37 @@ void newport_video_device::do_rex3_command()
static const char* const s_adrmode_str[8] = {
"Span", "Block", "IntLine", "FracLine", "AALine", "Unk5", "Unk6", "Unk7"
};
static const char* const s_planes_str[8] = {
"None", "RGB/CI", "RGBA", "Unk3", "OLAY", "PUP", "CID", "Unk7"
};
static const char* const s_drawdepth_str[4] = {
"4 bits", "8 bits", "12 bits", "24 bits"
};
static const char* const s_hostdepth_str[4] = {
"4 bits (1-2-1 BGR or 4 CI)", "8 bits (3-3-2 BGR or 8 CI)", "12 bits (4-4-4 BGR or 12 CI)", "32 bits (8-8-8-8 ABGR)"
};
static const char* const s_compare_str[8] = {
"Always", "src < dst", "src = dst", "src <= dst", "src > dst", "src != dst", "src >= dst", "Never"
};
static const char* const s_sfactor_str[8] = {
"0", "1", "dstc", "1-dstc", "srca", "1-srca", "Unk6", "Unk7"
};
static const char* const s_dfactor_str[8] = {
"0", "1", "srcc", "1-srcc", "srca", "1-srca", "Unk6", "Unk7"
};
static const char* const s_logicop_str[16] = {
"0", "src & dst", "src & !dst", "src", "!src & dst", "dst", "src ^ dst", "src | dst",
"!(src | dst)", "!(src ^ dst)", "!dst", "src | !dst", "!src", "!src | dst", "!(src & dst)", "1"
};
const uint32_t mode0 = m_rex3.m_draw_mode0;
const uint32_t mode1 = m_rex3.m_draw_mode1;
m_rex3.m_iter_x = BIT(mode0, 5) ? (int16_t)(m_rex3.m_xy_start_i >> 16) : m_rex3.m_iter_x;
m_rex3.m_iter_y = BIT(mode0, 5) ? (int16_t)m_rex3.m_xy_start_i : m_rex3.m_iter_y;
int16_t end_x = (int16_t)(m_rex3.m_xy_end_i >> 16);
int16_t end_y = (int16_t)m_rex3.m_xy_end_i;
int16_t dx = m_rex3.m_iter_x > end_x ? -1 : 1;
int16_t dy = m_rex3.m_iter_y > end_y ? -1 : 1;
int16_t start_x = m_rex3.m_x_start_i;
int16_t start_y = m_rex3.m_y_start_i;
int16_t end_x = m_rex3.m_x_end_i;
int16_t end_y = m_rex3.m_y_end_i;
int16_t dx = start_x > end_x ? -1 : 1;
int16_t dy = start_y > end_y ? -1 : 1;
LOGMASKED(LOG_COMMANDS, "REX3 Command: %08x|%08x - %s %s:\n", mode0, mode1, s_opcode_str[mode0 & 3], s_adrmode_str[(mode0 >> 2) & 7]);
LOGMASKED(LOG_COMMANDS, " DoSetup:%d, ColorHost:%d, AlphaHost:%d, StopOnX:%d, StopOnY:%d\n", BIT(mode0, 5), BIT(mode0, 6), BIT(mode0, 7),
BIT(mode0, 8), BIT(mode0, 9));
LOGMASKED(LOG_COMMANDS, " SkipFirst:%d, SkipLast:%d, ZPattEn:%d, LSPattEn:%d, LSAdvLast:%d\n", BIT(mode0, 10), BIT(mode0, 11), BIT(mode0, 12),
BIT(mode0, 13), BIT(mode0, 14));
LOGMASKED(LOG_COMMANDS, " Length32:%d, ZOpaque:%d, LSOpaque:%d, Shade:%d, LROnly:%d\n", BIT(mode0, 15), BIT(mode0, 16), BIT(mode0, 17),
BIT(mode0, 18), BIT(mode0, 19));
LOGMASKED(LOG_COMMANDS, " XYOffset:%d, CIClamp:%d, EndFilter:%d, YStride:%d\n", BIT(mode0, 20), BIT(mode0, 21), BIT(mode0, 22), BIT(mode0, 23));
LOGMASKED(LOG_COMMANDS, " Planes:%s, DrawDepth:%s, DblSrc:%d\n", s_planes_str[mode1 & 7], s_drawdepth_str[(mode1 >> 3) & 3], BIT(mode1, 5));
LOGMASKED(LOG_COMMANDS, " GL YFlip:%d, RWPacked:%d, HostDepth:%s\n", BIT(mode1, 6), BIT(mode1, 7), s_hostdepth_str[(mode1 >> 8) & 3]);
LOGMASKED(LOG_COMMANDS, " RWDouble:%d, SwapEndian:%d, Compare:%s\n", BIT(mode1, 10), BIT(mode1, 11), s_compare_str[(mode1 >> 12) & 7]);
LOGMASKED(LOG_COMMANDS, " RGBMode:%d, Dither:%d, FastClear:%d, Blend:%d\n", BIT(mode1, 15), BIT(mode1, 16), BIT(mode1, 17), BIT(mode1, 18));
LOGMASKED(LOG_COMMANDS, " SrcFactor:%s, DstFactor:%s, BackBlend:%d, Prefetch:%d\n", s_sfactor_str[(mode1 >> 19) & 7], s_dfactor_str[(mode1 >> 22) & 7],
BIT(mode1, 25), BIT(mode1, 26));
LOGMASKED(LOG_COMMANDS, " BlendAlpha:%d, LogicOp:%s\n", BIT(mode1, 27), s_logicop_str[(mode1 >> 28) & 15]);
LOGMASKED(LOG_COMMANDS, "REX3 Command: %08x|%08x - %s %s\n", mode0, mode1, s_opcode_str[mode0 & 3], s_adrmode_str[(mode0 >> 2) & 7]);
switch (mode0)
{
case 0x00000000: // NoOp
break;
case 0x00000006: // Block, Draw
{
LOGMASKED(LOG_COMMANDS, "%04x, %04x = %02x\n", m_rex3.m_iter_x, m_rex3.m_iter_y, m_rex3.m_zero_fract & 0xff);
LOGMASKED(LOG_COMMANDS, "%04x, %04x = %02x\n", start_x, start_y, m_rex3.m_zero_fract & 0xff);
m_rex3.m_bres_octant_inc1 = 0;
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, m_rex3.m_zero_fract & 0xff);
m_rex3.m_iter_x++;
if (m_rex3.m_iter_x > (m_rex3.m_xy_end_i >> 16))
write_pixel(m_rex3.m_zero_fract & 0xff);
start_x++;
if (start_x > end_x)
{
m_rex3.m_iter_y++;
m_rex3.m_iter_x = m_rex3.m_x_save;
start_y++;
start_x = m_rex3.m_x_save;
}
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(start_x << 11);
write_y_start(start_y << 11);
break;
}
case 0x00000046: // ColorHost, Block, Draw
@ -1468,59 +1426,60 @@ void newport_video_device::do_rex3_command()
if (BIT(mode1, 7)) // Packed
{
const bool doubleword = BIT(mode1, 10);
uint16_t remaining_length = ((m_rex3.m_xy_end_i >> 16) - m_rex3.m_iter_x) + 1;
uint16_t remaining_length = (end_x - start_x) + 1;
uint16_t length = doubleword ? 8 : 4;
if (remaining_length < length)
length = remaining_length;
LOGMASKED(LOG_COMMANDS, "%04x, %04x = %08x%08x\n", m_rex3.m_iter_x, m_rex3.m_iter_y, (uint32_t)(m_rex3.m_host_dataport >> 32), (uint32_t)m_rex3.m_host_dataport);
LOGMASKED(LOG_COMMANDS, "%04x, %04x = %08x%08x\n", start_x, start_y, (uint32_t)(m_rex3.m_host_dataport >> 32), (uint32_t)m_rex3.m_host_dataport);
uint64_t shift = 56;
for (uint16_t i = 0; i < length; i++)
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, (uint8_t)(m_rex3.m_host_dataport >> shift));
m_rex3.m_iter_x++;
write_pixel(start_x, start_y, (uint8_t)(m_rex3.m_host_dataport >> shift));
start_x++;
shift -= 8;
}
}
else
{
LOGMASKED(LOG_COMMANDS, "%04x, %04x = %02x\n", m_rex3.m_iter_x, m_rex3.m_iter_y, (uint8_t)(m_rex3.m_host_dataport >> 56));
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, m_rex3.m_host_dataport >> 56);
m_rex3.m_iter_x++;
LOGMASKED(LOG_COMMANDS, "%04x, %04x = %02x\n", start_x, start_y, (uint8_t)(m_rex3.m_host_dataport >> 56));
write_pixel(start_x, start_y, m_rex3.m_host_dataport >> 56);
start_x++;
}
if (m_rex3.m_iter_x > (m_rex3.m_xy_end_i >> 16))
if (start_x > end_x)
{
m_rex3.m_iter_y++;
m_rex3.m_iter_x = m_rex3.m_x_save;
start_y++;
start_x = m_rex3.m_x_save;
}
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(start_x << 11);
write_y_start(start_y << 11);
break;
}
case 0x00000045: // ColorHost, Block, Read
case 0x00000065: // ColorHost, Block, Read
{
m_rex3.m_read_active = true;
break;
}
case 0x00000102: // StopOnX, Span, Draw
case 0x00000122: // StopOnX, DoSetup, Span, Draw
case 0x00080122: // LROnly, StopOnX, DoSetup, Span, Draw
{
if (BIT(mode0, 19) && dx < 0) // LROnly
break;
end_x += dx;
end_y += dy;
uint32_t color = m_rex3.m_zero_fract & 0xff;
LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", m_rex3.m_iter_x, m_rex3.m_iter_y, end_x, end_y, color);
for (; m_rex3.m_iter_x != end_x; m_rex3.m_iter_x += dx)
LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", start_x, start_y, end_x, end_y, color);
for (; start_x != end_x; start_x += dx)
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, color);
write_pixel(start_x, start_y, color);
}
m_rex3.m_iter_y++;
start_y++;
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(start_x << 11);
write_y_start(start_y << 11);
break;
}
case 0x00000326: // StopOnX, StopOnY, DoSetup, Block, Draw
@ -1533,53 +1492,59 @@ void newport_video_device::do_rex3_command()
{
color = m_rex3.m_color_vram & 0xff;
}
LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", m_rex3.m_iter_x, m_rex3.m_iter_y, end_x, end_y, m_cmap0.m_palette[color]);
for (; m_rex3.m_iter_y != end_y; m_rex3.m_iter_y += dy)
LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", start_x, start_y, end_x, end_y, m_cmap0.m_palette[color]);
for (; start_y != end_y; start_y += dy)
{
for (m_rex3.m_iter_x = m_rex3.m_x_start_i; m_rex3.m_iter_x != end_x; m_rex3.m_iter_x += dx)
for (; start_x != end_x; start_x += dx)
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, color);
write_pixel(start_x, start_y, color);
}
start_x = m_rex3.m_x_save;
}
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_x_start_i = m_rex3.m_iter_x;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
write_x_start(start_x << 11);
write_y_start(start_y << 11);
break;
}
case 0x00000327: // StopOnX, StopOnY, DoSetup, Block, Scr2Scr
{
int16_t move_x = (int16_t)((m_rex3.m_xy_move >> 16) & 0x0000ffff);
int16_t move_y = (int16_t)m_rex3.m_xy_move;
end_x += dx;
end_y += dy;
LOGMASKED(LOG_COMMANDS, "%04x, %04x - %04x, %04x to %04x, %04x\n", m_rex3.m_iter_x, m_rex3.m_iter_y, end_x, end_y,
m_rex3.m_iter_x + move_x, m_rex3.m_iter_y + move_y);
for (; m_rex3.m_iter_y != end_y; m_rex3.m_iter_y += dy)
LOGMASKED(LOG_COMMANDS, "%04x, %04x - %04x, %04x to %04x, %04x\n", start_x, start_y, end_x, end_y, start_x + m_rex3.m_x_move, start_y + m_rex3.m_y_move);
for (; start_y != end_y; start_y += dy)
{
for (m_rex3.m_iter_x = m_rex3.m_x_start_i; m_rex3.m_iter_x != end_x; m_rex3.m_iter_x += dx)
for (; start_x != end_x; start_x += dx)
{
write_pixel(m_rex3.m_iter_x + move_x, m_rex3.m_iter_y + move_y, m_base[m_rex3.m_iter_y * (1280 + 64) + m_rex3.m_iter_x]);
write_pixel(start_x + m_rex3.m_x_move, start_y + m_rex3.m_y_move, m_base[start_y * (1280 + 64) + start_x]);
}
start_x = m_rex3.m_x_save;
}
write_x_start(start_x << 11);
write_y_start(start_y << 11);
break;
}
case 0x0000000a: // I_Line, Draw
case 0x0000032a: // StopOnX, StopOnY, DoSetup, I_Line, Draw
case 0x00000b2a: // SkipLast, StopOnX, StopOnY, DoSetup, I_Line, Draw
case 0x0000232e: // EnLSPattern, StopOnX, StopOnY, DoSetup, F_Line, Draw
{
LOGMASKED(LOG_COMMANDS, "ILine: %04x, %04x to %04x, %04x = %08x\n", m_rex3.m_iter_x, m_rex3.m_iter_y, end_x, end_y, m_cmap0.m_palette[m_rex3.m_zero_fract]);
if (m_rex3.m_iter_x == end_x)
LOGMASKED(LOG_COMMANDS, "%cLine: %04x, %04x to %04x, %04x = %08x\n", (mode0 & 0x1c) == 3 ? 'F' : 'I',
start_x, start_y, end_x, end_y, m_cmap0.m_palette[m_rex3.m_zero_fract]);
if (start_x == end_x && start_y == end_y)
{
do_v_iline(m_rex3.m_iter_x, m_rex3.m_iter_y, end_y, m_cmap0.m_palette[m_rex3.m_zero_fract], BIT(mode0, 11));
write_pixel(m_cmap0.m_palette[m_rex3.m_zero_fract]);
}
else if (m_rex3.m_iter_y == end_y)
else if (start_x == end_x)
{
do_h_iline(m_rex3.m_iter_x, m_rex3.m_iter_y, end_x, m_cmap0.m_palette[m_rex3.m_zero_fract], BIT(mode0, 11));
do_v_iline(m_cmap0.m_palette[m_rex3.m_zero_fract], BIT(mode0, 11));
}
else if (start_y == end_y)
{
do_h_iline(m_cmap0.m_palette[m_rex3.m_zero_fract], BIT(mode0, 11));
}
else
{
do_iline(m_rex3.m_iter_x, m_rex3.m_iter_y, end_x, end_y, m_cmap0.m_palette[m_rex3.m_zero_fract], BIT(mode0, 11));
do_iline(m_cmap0.m_palette[m_rex3.m_zero_fract], BIT(mode0, 11));
}
break;
}
@ -1592,35 +1557,35 @@ void newport_video_device::do_rex3_command()
const uint32_t pattern = BIT(mode0, 12) ? m_rex3.m_z_pattern : m_rex3.m_ls_pattern;
const uint8_t foreground = m_rex3.m_zero_fract & 0xff;
const uint8_t background = m_rex3.m_color_back & 0xff;
LOGMASKED(LOG_COMMANDS, "%08x at %04x (%04x), %04x (%04x) color %08x\n", pattern, m_rex3.m_xy_start_i >> 16, m_rex3.m_iter_x,
(uint16_t)m_rex3.m_xy_start_i, m_rex3.m_iter_y, foreground);
LOGMASKED(LOG_COMMANDS, "%08x at %04x, %04x color %08x\n", pattern, start_x, start_y, foreground);
end_x += dx;
int16_t end = end_x;
if (BIT(mode0, 15))
{
if ((end_x - m_rex3.m_iter_x) >= 32)
if ((end_x - start_x) >= 32)
{
end = m_rex3.m_x_start_i + 31;
end = start_x + 31;
}
}
for (; m_rex3.m_iter_x != end; m_rex3.m_iter_x += dx)
for (; start_x != end; start_x += dx)
{
if (pattern & (1 << (31 - (m_rex3.m_iter_x - m_rex3.m_x_start_i))))
if (pattern & (1 << (31 - (start_x - m_rex3.m_x_start_i))))
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, foreground);
write_pixel(start_x, start_y, foreground);
}
else if (opaque)
{
write_pixel(m_rex3.m_iter_x, m_rex3.m_iter_y, background);
write_pixel(start_x, start_y, background);
}
}
if (BIT(m_rex3.m_bres_octant_inc1, 24))
m_rex3.m_iter_y--;
start_y--;
else
m_rex3.m_iter_y++;
m_rex3.m_iter_x = m_rex3.m_x_start_i;
m_rex3.m_xy_start_i = (m_rex3.m_iter_x << 16) | m_rex3.m_iter_y;
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
start_y++;
start_x = m_rex3.m_x_save;
write_x_start(start_x << 11);
write_y_start(start_y << 11);
break;
}
default:
@ -1629,6 +1594,38 @@ void newport_video_device::do_rex3_command()
}
}
void newport_video_device::write_x_start(int32_t val)
{
m_rex3.m_x_start = val & 0x07ffff80;
m_rex3.m_x_start_i = (int16_t)(val >> 11);
m_rex3.m_x_start_f = (uint32_t)val & 0x007fff80;
m_rex3.m_xy_start_i = (m_rex3.m_xy_start_i & 0x0000ffff) | (m_rex3.m_x_start_i << 16);
}
void newport_video_device::write_y_start(int32_t val)
{
m_rex3.m_y_start = val & 0x07ffff80;
m_rex3.m_y_start_i = (int16_t)(val >> 11);
m_rex3.m_y_start_f = (uint32_t)val & 0x007fff80;
m_rex3.m_xy_start_i = (m_rex3.m_xy_start_i & 0xffff0000) | (uint16_t)m_rex3.m_y_start_i;
}
void newport_video_device::write_x_end(int32_t val)
{
m_rex3.m_x_end = val & 0x07ffff80;
m_rex3.m_x_end_i = (int16_t)(val >> 11);
m_rex3.m_x_end_f = (uint32_t)val & 0x007fff80;
m_rex3.m_xy_end_i = (m_rex3.m_xy_end_i & 0x0000ffff) | (m_rex3.m_x_end_i << 16);
}
void newport_video_device::write_y_end(int32_t val)
{
m_rex3.m_y_end = val & 0x07ffff80;
m_rex3.m_y_end_i = (int16_t)(val >> 11);
m_rex3.m_y_end_f = (uint32_t)val & 0x007fff80;
m_rex3.m_xy_end_i = (m_rex3.m_xy_end_i & 0xffff0000) | (uint16_t)m_rex3.m_y_end_i;
}
WRITE64_MEMBER(newport_video_device::rex3_w)
{
switch (offset & ~(0x800/8))
@ -1649,13 +1646,13 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
case 0x02:
LOGMASKED(LOG_REX3, " Planes Enabled: R/W RGBA\n");
break;
case 0x03:
case 0x04:
LOGMASKED(LOG_REX3, " Planes Enabled: R/W OLAY\n");
break;
case 0x04:
case 0x05:
LOGMASKED(LOG_REX3, " Planes Enabled: R/W PUP\n");
break;
case 0x05:
case 0x06:
LOGMASKED(LOG_REX3, " Planes Enabled: R/W CID\n");
break;
default:
@ -1677,9 +1674,9 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
LOGMASKED(LOG_REX3, " Plane Draw Depth: 32 bits\n");
break;
}
LOGMASKED(LOG_REX3, " DBuf Source Buffer: %d\n", BIT(data, 5));
LOGMASKED(LOG_REX3, " GL Y Coordinates: %d\n", BIT(data, 6));
LOGMASKED(LOG_REX3, " Enable Pxl Packing: %d\n", BIT(data, 7));
LOGMASKED(LOG_REX3, " DBuf Source Buffer: %d\n", BIT(data32, 5));
LOGMASKED(LOG_REX3, " GL Y Coordinates: %d\n", BIT(data32, 6));
LOGMASKED(LOG_REX3, " Enable Pxl Packing: %d\n", BIT(data32, 7));
switch ((data32 & 0x00000300) >> 8)
{
case 0x00:
@ -1695,15 +1692,15 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
LOGMASKED(LOG_REX3, " HOSTRW Depth: 32 bits\n");
break;
}
LOGMASKED(LOG_REX3, " DWord Transfers: %d\n", BIT(data, 10));
LOGMASKED(LOG_REX3, " Swap Endianness: %d\n", BIT(data, 11));
LOGMASKED(LOG_REX3, " Compare Src > Dest: %d\n", BIT(data, 12));
LOGMASKED(LOG_REX3, " Compare Src = Dest: %d\n", BIT(data, 13));
LOGMASKED(LOG_REX3, " Compare Src < Dest: %d\n", BIT(data, 14));
LOGMASKED(LOG_REX3, " RGB Mode Select: %d\n", BIT(data, 15));
LOGMASKED(LOG_REX3, " Enable Dithering: %d\n", BIT(data, 16));
LOGMASKED(LOG_REX3, " Enable Fast Clear: %d\n", BIT(data, 17));
LOGMASKED(LOG_REX3, " Enable Blending: %d\n", BIT(data, 18));
LOGMASKED(LOG_REX3, " DWord Transfers: %d\n", BIT(data32, 10));
LOGMASKED(LOG_REX3, " Swap Endianness: %d\n", BIT(data32, 11));
LOGMASKED(LOG_REX3, " Compare Src > Dest: %d\n", BIT(data32, 12));
LOGMASKED(LOG_REX3, " Compare Src = Dest: %d\n", BIT(data32, 13));
LOGMASKED(LOG_REX3, " Compare Src < Dest: %d\n", BIT(data32, 14));
LOGMASKED(LOG_REX3, " RGB Mode Select: %d\n", BIT(data32, 15));
LOGMASKED(LOG_REX3, " Enable Dithering: %d\n", BIT(data32, 16));
LOGMASKED(LOG_REX3, " Enable Fast Clear: %d\n", BIT(data32, 17));
LOGMASKED(LOG_REX3, " Enable Blending: %d\n", BIT(data32, 18));
switch ((data32 & 0x00380000) >> 19)
{
case 0x00:
@ -1752,9 +1749,9 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Src Blend Factor: %02x\n", (data32 & 0x00380000) >> 19);
break;
}
LOGMASKED(LOG_REX3, " COLORBACK Dest Blend: %d\n", BIT(data, 25));
LOGMASKED(LOG_REX3, " Enable Pxl Prefetch: %d\n", BIT(data, 26));
LOGMASKED(LOG_REX3, " SFACTOR Src Alpha: %d\n", BIT(data, 27));
LOGMASKED(LOG_REX3, " COLORBACK Dest Blend: %d\n", BIT(data32, 25));
LOGMASKED(LOG_REX3, " Enable Pxl Prefetch: %d\n", BIT(data32, 26));
LOGMASKED(LOG_REX3, " SFACTOR Src Alpha: %d\n", BIT(data32, 27));
switch ((data32 & 0xf0000000) >> 28)
{
case 0x00:
@ -1938,8 +1935,8 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 ZPattern Enable Write: %08x\n", (uint32_t)data);
m_rex3.m_step_z = (uint32_t)data;
LOGMASKED(LOG_REX3, "REX3 ZPattern Enable Write\n");
m_rex3.m_step_z = 1;
}
break;
case 0x0038/8:
@ -1958,37 +1955,39 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 XStart Write: %08x\n", (uint32_t)(data >> 32));
m_rex3.m_x_start = (uint32_t)(data >> 32) & 0x007ffff80;
write_x_start((int32_t)(data >> 32));
m_rex3.m_x_save = (int16_t)(data >> 43);
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 YStart Write: %08x\n", (uint32_t)data);
m_rex3.m_y_start = (uint32_t)data & 0x007ffff80;
write_y_start((int32_t)data);
}
break;
case 0x0108/8:
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 XEnd Write: %08x\n", (uint32_t)(data >> 32));
m_rex3.m_x_end = (uint32_t)(data >> 32) & 0x007ffff80;
write_x_end((int32_t)(data >> 32));
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 YEnd Write: %08x\n", (uint32_t)data);
m_rex3.m_y_end = (uint32_t)data & 0x007ffff80;
write_y_end((int32_t)data);
}
break;
case 0x0110/8:
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 XSave Write: %08x\n", (uint32_t)(data >> 32));
m_rex3.m_x_save = (uint16_t)(data >> 32);
m_rex3.m_x_start_i = m_rex3.m_x_save;
m_rex3.m_x_save = (int16_t)(data >> 32);
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 XYMove Write: %08x\n", (uint32_t)data);
m_rex3.m_xy_move = (uint32_t)data;
m_rex3.m_x_move = (int16_t)(m_rex3.m_xy_move >> 16);
m_rex3.m_y_move = (int16_t)m_rex3.m_xy_move;
}
break;
case 0x0118/8:
@ -2043,38 +2042,38 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 GL XStart Write: %08x\n", (uint32_t)(data >> 32));
m_rex3.m_x_start_f = (uint32_t)(data >> 32) & 0x7fff80;
write_x_start((int32_t)(data >> 32));
m_rex3.m_x_save = (int16_t)((data >> 11) & 0x0fff);
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 GL YStart Write: %08x\n", (uint32_t)data);
m_rex3.m_y_start_f = (uint32_t)data & 0x7fff80;
write_y_start((int32_t)data);
}
break;
case 0x0140/8:
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 GL XEnd Write: %08x\n", (uint32_t)(data >> 32));
m_rex3.m_x_end_f = (uint32_t)(data >> 32) & 0x7fff80;
write_x_end((int32_t)(data >> 32));
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 GL YEnd Write: %08x\n", (uint32_t)data);
m_rex3.m_y_end_f = (uint32_t)data & 0x7fff80;
write_y_end((int32_t)data);
}
break;
case 0x0148/8:
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 XStart (integer) Write: %08x\n", (uint32_t)(data >> 32));
m_rex3.m_x_start_i = (uint16_t)(data >> 32);
m_rex3.m_x_save = m_rex3.m_x_start_i;
m_rex3.m_x_start = ((m_rex3.m_x_start_i & 0x0000ffff) << 11);
write_x_start(((int32_t)(int16_t)(data >> 32)) << 11);
m_rex3.m_x_save = (int16_t)(data >> 32);
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 GL XEnd (copy) Write: %08x\n", (uint32_t)data);
m_rex3.m_x_end_f = (uint32_t)data & 0x007fff80;
write_x_end((int32_t)data);
}
break;
case 0x0150/8:
@ -2082,20 +2081,15 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
{
const uint32_t data32 = (uint32_t)(data >> 32);
LOGMASKED(LOG_REX3, "REX3 XYStart (integer) Write: %08x\n", data32);
m_rex3.m_xy_start_i = data32;
m_rex3.m_x_start_i = data32 >> 16;
m_rex3.m_x_save = m_rex3.m_x_start_i;
m_rex3.m_x_start = ((m_rex3.m_xy_start_i & 0xffff0000) >> 5);
m_rex3.m_y_start = ((m_rex3.m_xy_start_i & 0x0000ffff) << 11);
m_rex3.m_iter_x = data32 >> 16;
m_rex3.m_iter_y = (uint16_t)data32;
write_x_start(((int32_t)(int16_t)(data >> 48)) << 11);
write_y_start(((int32_t)(int16_t)(data >> 32)) << 11);
m_rex3.m_x_save = (int16_t)(data >> 48);
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 XYEnd (integer) Write: %08x\n", (uint32_t)data);
m_rex3.m_xy_end_i = (uint32_t)data;
m_rex3.m_x_end = ((m_rex3.m_xy_end_i & 0xffff0000) >> 5);
m_rex3.m_y_end = ((m_rex3.m_xy_end_i & 0x0000ffff) << 11);
write_x_end(((int32_t)(int16_t)(data >> 16)) << 11);
write_y_end(((int32_t)(int16_t)(data >> 0)) << 11);
}
break;
case 0x0158/8:
@ -2103,13 +2097,9 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
{
const uint32_t data32 = (uint32_t)(data >> 32);
LOGMASKED(LOG_REX3, "REX3 XStartEnd (integer) Write: %08x\n", data32);
m_rex3.m_x_start_end_i = data32;
m_rex3.m_xy_end_i = (uint16_t)m_rex3.m_xy_end_i | ((m_rex3.m_x_start_end_i & 0x0000ffff) << 16);
m_rex3.m_xy_start_i = (uint16_t)m_rex3.m_xy_start_i | ( m_rex3.m_x_start_end_i & 0xffff0000);
m_rex3.m_x_save = m_rex3.m_x_start_i;
m_rex3.m_x_start = ((m_rex3.m_x_start_end_i & 0xffff0000) >> 5);
m_rex3.m_x_end = ((m_rex3.m_x_start_end_i & 0x0000ffff) << 11);
m_rex3.m_iter_x = data32 >> 16;
write_x_start(((int32_t)(int16_t)(data >> 48)) << 11);
write_x_end(((int32_t)(int16_t)(data >> 32)) << 11);
m_rex3.m_x_save = (int16_t)(data >> 48);
}
break;
case 0x0200/8:
@ -2263,6 +2253,8 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
m_rex3.m_xfer_width = 3;
break;
}
LOGMASKED(LOG_REX3, " Enable Data Packing: %d\n", BIT(data, 2));
LOGMASKED(LOG_REX3, " Enable Auto-Increment: %d\n", BIT(data, 3));
LOGMASKED(LOG_REX3, " DCB Reg Select Adr: %d\n", (data & 0x00000070 ) >> 4);
LOGMASKED(LOG_REX3, " DCB Slave Address: %d\n", (data & 0x00000780 ) >> 7);
LOGMASKED(LOG_REX3, " Use Sync XFer ACK: %d\n", (data & 0x00000800 ) >> 11);
@ -2387,8 +2379,8 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
case 0x1330/8:
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 Config Write: %08x\n", data);
m_rex3.m_config = data & 0x1fffff;
LOGMASKED(LOG_REX3, "REX3 Config Write: %08x\n", (uint32_t)(data >> 32));
m_rex3.m_config = (data >> 32) & 0x1fffff;
}
break;
case 0x1340/8:

View File

@ -101,12 +101,14 @@ private:
uint32_t m_alpha_ref;
uint32_t m_setup;
uint32_t m_step_z;
uint32_t m_x_start;
uint32_t m_y_start;
uint32_t m_x_end;
uint32_t m_y_end;
uint32_t m_x_save;
int32_t m_x_start;
int32_t m_y_start;
int32_t m_x_end;
int32_t m_y_end;
int16_t m_x_save;
uint32_t m_xy_move;
int16_t m_x_move;
int16_t m_y_move;
uint32_t m_bres_d;
uint32_t m_bres_s1;
uint32_t m_bres_octant_inc1;
@ -119,9 +121,12 @@ private:
uint32_t m_y_start_f;
uint32_t m_x_end_f;
uint32_t m_y_end_f;
uint32_t m_x_start_i;
int16_t m_x_start_i;
uint32_t m_xy_start_i;
int16_t m_y_start_i;
uint32_t m_xy_end_i;
int16_t m_x_end_i;
int16_t m_y_end_i;
uint32_t m_x_start_end_i;
uint32_t m_color_red;
uint32_t m_color_alpha;
@ -144,11 +149,11 @@ private:
uint32_t m_smask_y[5];
uint32_t m_top_scanline;
uint32_t m_xy_window;
int16_t m_x_window;
int16_t m_y_window;
uint32_t m_clip_mode;
uint32_t m_config;
uint32_t m_status;
int16_t m_iter_x;
int16_t m_iter_y;
uint8_t m_xfer_width;
bool m_read_active;
};
@ -173,12 +178,18 @@ private:
uint32_t vc2_read();
void vc2_write(uint32_t data);
void write_pixel(uint32_t x, uint32_t y, uint8_t color);
void do_v_iline(uint16_t x1, uint16_t y1, uint16_t y2, uint8_t color, bool skip_last);
void do_h_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint8_t color, bool skip_last);
void do_iline(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t color, bool skip_last);
void write_x_start(int32_t val);
void write_y_start(int32_t val);
void write_x_end(int32_t val);
void write_y_end(int32_t val);
void write_pixel(uint8_t color);
void write_pixel(int16_t x, int16_t y, uint8_t color);
void do_v_iline(uint8_t color, bool skip_last);
void do_h_iline(uint8_t color, bool skip_last);
void do_iline(uint8_t color, bool skip_last);
uint8_t do_pixel_read();
uint32_t do_pixel_word_read();
uint64_t do_pixel_word_read();
void do_rex3_command();
required_device<cpu_device> m_maincpu;

View File

@ -372,8 +372,8 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_ind16 &bitmap,
int scrollx = tileregs[0x4];
int basereg;
int flipx = 0;
int flipy = 0;
int flipx = (tileregs[0x03]&0x40)>>6;
int flipy = (tileregs[0x03]&0x80)>>7;
int gfxbase;
// tile 0 is always skipped, doesn't even point to valid data packets in alt mode

View File

@ -456,6 +456,40 @@ _recip_approx(float value)
#endif
/*-------------------------------------------------
mul_64x64 - perform a signed 64 bit x 64 bit
multiply and return the full 128 bit result
-------------------------------------------------*/
#ifdef __x86_64__
#define mul_64x64 _mul_64x64
inline int64_t ATTR_FORCE_INLINE
_mul_64x64(int64_t a, int64_t b, int64_t *hi)
{
__int128 const r(__int128(a) * b);
*hi = int64_t(uint64_t((unsigned __int128)r >> 64));
return int64_t(uint64_t((unsigned __int128)r));
}
#endif
/*-------------------------------------------------
mulu_64x64 - perform an unsigned 64 bit x 64
bit multiply and return the full 128 bit result
-------------------------------------------------*/
#ifdef __x86_64__
#define mulu_64x64 _mulu_64x64
inline uint64_t ATTR_FORCE_INLINE
_mulu_64x64(uint64_t a, uint64_t b, uint64_t *hi)
{
unsigned __int128 const r((unsigned __int128)a * b);
*hi = uint64_t(r >> 64);
return uint64_t(r);
}
#endif
/***************************************************************************
INLINE BIT MANIPULATION FUNCTIONS

View File

@ -403,4 +403,24 @@ static inline float _recip_approx(float z)
}
#endif
/*-------------------------------------------------
mul_64x64 - perform a signed 64 bit x 64 bit
multiply and return the full 128 bit result
-------------------------------------------------*/
#ifdef PTR64
#define mul_64x64 _mul128
#endif
/*-------------------------------------------------
mulu_64x64 - perform an unsigned 64 bit x 64
bit multiply and return the full 128 bit result
-------------------------------------------------*/
#ifdef PTR64
#define mulu_64x64 _umul128
#endif
#endif // MAME_OSD_EIVCX86_H

View File

@ -260,6 +260,64 @@ inline float recip_approx(float value)
#endif
/*-------------------------------------------------
mul_64x64 - perform a signed 64 bit x 64 bit
multiply and return the full 128 bit result
-------------------------------------------------*/
#ifndef mul_64x64
inline int64_t mul_64x64(int64_t a, int64_t b, int64_t *hi)
{
uint64_t const a_hi = uint64_t(a) >> 32;
uint64_t const b_hi = uint64_t(b) >> 32;
uint64_t const a_lo = uint32_t(uint64_t(a));
uint64_t const b_lo = uint32_t(uint64_t(b));
uint64_t const ab_lo = a_lo * b_lo;
uint64_t const ab_m1 = a_hi * b_lo;
uint64_t const ab_m2 = a_lo * b_hi;
uint64_t const ab_hi = a_hi * b_hi;
uint64_t const carry = ((ab_lo >> 32) + uint32_t(ab_m1) + uint32_t(ab_m2)) >> 32;
*hi = ab_hi + (ab_m1 >> 32) + (ab_m2 >> 32) + carry;
// adjust for sign
if (a < 0)
*hi -= b;
if (b < 0)
*hi -= a;
return ab_lo + (ab_m1 << 32) + (ab_m2 << 32);
}
#endif
/*-------------------------------------------------
mulu_64x64 - perform an unsigned 64 bit x 64
bit multiply and return the full 128 bit result
-------------------------------------------------*/
#ifndef mulu_64x64
inline uint64_t mulu_64x64(uint64_t a, uint64_t b, uint64_t *hi)
{
uint64_t const a_hi = uint32_t(a >> 32);
uint64_t const b_hi = uint32_t(b >> 32);
uint64_t const a_lo = uint32_t(a);
uint64_t const b_lo = uint32_t(b);
uint64_t const ab_lo = a_lo * b_lo;
uint64_t const ab_m1 = a_hi * b_lo;
uint64_t const ab_m2 = a_lo * b_hi;
uint64_t const ab_hi = a_hi * b_hi;
uint64_t const carry = ((ab_lo >> 32) + uint32_t(ab_m1) + uint32_t(ab_m2)) >> 32;
*hi = ab_hi + (ab_m1 >> 32) + (ab_m2 >> 32) + carry;
return ab_lo + (ab_m1 << 32) + (ab_m2 << 32);
}
#endif
/***************************************************************************
INLINE BIT MANIPULATION FUNCTIONS

View File

@ -34,8 +34,8 @@
#elif defined(OSD_SDL)
// SDL include
#include <SDL2/SDL.h>
#define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, SDLK_ ## sdlkey, ascii, "ITEM_ID_"#mame, (char *) UI }
#define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, SDLK_ ## sdlkey, ascii, "ITEM_ID_"#mame, (char*) #mame }
#define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, ascii, "ITEM_ID_"#mame, (char *) UI }
#define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii) { ITEM_ID_##mame, SDL_SCANCODE_ ## sdlsc, ascii, "ITEM_ID_"#mame, (char*) #mame }
#elif defined(OSD_UWP)
#define KEY_TRANS_ENTRY0(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii, UI) { ITEM_ID_##mame, KEY_ ## disc, Windows::System::VirtualKey:: ## uwp, ascii, "ITEM_ID_"#mame, (char *) UI }
#define KEY_TRANS_ENTRY1(mame, sdlsc, sdlkey, disc, virtual, uwp, ascii) { ITEM_ID_##mame, KEY_ ## disc, Windows::System::VirtualKey:: ## uwp, ascii, "ITEM_ID_"#mame, (char*) #mame }
@ -43,6 +43,8 @@
// osd mini
#endif
// FIXME: sdl_key can be removed from the table below. It is no longer used.
#if defined(OSD_WINDOWS) || defined(OSD_SDL) || defined(OSD_UWP)
key_trans_entry keyboard_trans_table::s_default_table[] =
{

View File

@ -358,7 +358,6 @@ struct key_trans_entry {
#if defined(OSD_SDL)
int sdl_scancode;
int sdl_key;
#elif defined(OSD_WINDOWS)
int scan_code;
unsigned char virtual_key;

View File

@ -63,24 +63,265 @@ struct key_lookup_table
static key_lookup_table sdl_lookup_table[] =
{
KE7(UNKNOWN, BACKSPACE, TAB, CLEAR, RETURN, PAUSE, ESCAPE)
KE(SPACE)
KE5(COMMA, MINUS, PERIOD, SLASH, 0)
KE8(1, 2, 3, 4, 5, 6, 7, 8)
KE3(9, SEMICOLON, EQUALS)
KE5(LEFTBRACKET,BACKSLASH, RIGHTBRACKET, A, B)
KE8(C, D, E, F, G, H, I, J)
KE8(K, L, M, N, O, P, Q, R)
KE8(S, T, U, V, W, X, Y, Z)
KE8(DELETE, KP_0, KP_1, KP_2, KP_3, KP_4, KP_5, KP_6)
KE8(KP_7, KP_8, KP_9, KP_PERIOD, KP_DIVIDE, KP_MULTIPLY,KP_MINUS, KP_PLUS)
KE8(KP_ENTER, KP_EQUALS, UP, DOWN, RIGHT, LEFT, INSERT, HOME)
KE8(END, PAGEUP, PAGEDOWN, F1, F2, F3, F4, F5)
KE8(F6, F7, F8, F9, F10, F11, F12, F13)
KE8(F14, F15, NUMLOCKCLEAR, CAPSLOCK, SCROLLLOCK, RSHIFT, LSHIFT, RCTRL)
KE5(LCTRL, RALT, LALT, LGUI, RGUI)
KE8(GRAVE, LEFTBRACKET,RIGHTBRACKET, SEMICOLON, APOSTROPHE, BACKSLASH, PRINTSCREEN,MENU)
KE(UNDO)
KE(UNKNOWN)
KE(A)
KE(B)
KE(C)
KE(D)
KE(E)
KE(F)
KE(G)
KE(H)
KE(I)
KE(J)
KE(K)
KE(L)
KE(M)
KE(N)
KE(O)
KE(P)
KE(Q)
KE(R)
KE(S)
KE(T)
KE(U)
KE(V)
KE(W)
KE(X)
KE(Y)
KE(Z)
KE(1)
KE(2)
KE(3)
KE(4)
KE(5)
KE(6)
KE(7)
KE(8)
KE(9)
KE(0)
KE(RETURN)
KE(ESCAPE)
KE(BACKSPACE)
KE(TAB)
KE(SPACE)
KE(MINUS)
KE(EQUALS)
KE(LEFTBRACKET)
KE(RIGHTBRACKET)
KE(BACKSLASH)
KE(NONUSHASH)
KE(SEMICOLON)
KE(APOSTROPHE)
KE(GRAVE)
KE(COMMA)
KE(PERIOD)
KE(SLASH)
KE(CAPSLOCK)
KE(F1)
KE(F2)
KE(F3)
KE(F4)
KE(F5)
KE(F6)
KE(F7)
KE(F8)
KE(F9)
KE(F10)
KE(F11)
KE(F12)
KE(PRINTSCREEN)
KE(SCROLLLOCK)
KE(PAUSE)
KE(INSERT)
KE(HOME)
KE(PAGEUP)
KE(DELETE)
KE(END)
KE(PAGEDOWN)
KE(RIGHT)
KE(LEFT)
KE(DOWN)
KE(UP)
KE(NUMLOCKCLEAR)
KE(KP_DIVIDE)
KE(KP_MULTIPLY)
KE(KP_MINUS)
KE(KP_PLUS)
KE(KP_ENTER)
KE(KP_1)
KE(KP_2)
KE(KP_3)
KE(KP_4)
KE(KP_5)
KE(KP_6)
KE(KP_7)
KE(KP_8)
KE(KP_9)
KE(KP_0)
KE(KP_PERIOD)
KE(NONUSBACKSLASH)
KE(APPLICATION)
KE(POWER)
KE(KP_EQUALS)
KE(F13)
KE(F14)
KE(F15)
KE(F16)
KE(F17)
KE(F18)
KE(F19)
KE(F20)
KE(F21)
KE(F22)
KE(F23)
KE(F24)
KE(EXECUTE)
KE(HELP)
KE(MENU)
KE(SELECT)
KE(STOP)
KE(AGAIN)
KE(UNDO)
KE(CUT)
KE(COPY)
KE(PASTE)
KE(FIND)
KE(MUTE)
KE(VOLUMEUP)
KE(VOLUMEDOWN)
KE(KP_COMMA)
KE(KP_EQUALSAS400)
KE(INTERNATIONAL1)
KE(INTERNATIONAL2)
KE(INTERNATIONAL3)
KE(INTERNATIONAL4)
KE(INTERNATIONAL5)
KE(INTERNATIONAL6)
KE(INTERNATIONAL7)
KE(INTERNATIONAL8)
KE(INTERNATIONAL9)
KE(LANG1)
KE(LANG2)
KE(LANG3)
KE(LANG4)
KE(LANG5)
KE(LANG6)
KE(LANG7)
KE(LANG8)
KE(LANG9)
KE(ALTERASE)
KE(SYSREQ)
KE(CANCEL)
KE(CLEAR)
KE(PRIOR)
KE(RETURN2)
KE(SEPARATOR)
KE(OUT)
KE(OPER)
KE(CLEARAGAIN)
KE(CRSEL)
KE(EXSEL)
KE(KP_00)
KE(KP_000)
KE(THOUSANDSSEPARATOR)
KE(DECIMALSEPARATOR)
KE(CURRENCYUNIT)
KE(CURRENCYSUBUNIT)
KE(KP_LEFTPAREN)
KE(KP_RIGHTPAREN)
KE(KP_LEFTBRACE)
KE(KP_RIGHTBRACE)
KE(KP_TAB)
KE(KP_BACKSPACE)
KE(KP_A)
KE(KP_B)
KE(KP_C)
KE(KP_D)
KE(KP_E)
KE(KP_F)
KE(KP_XOR)
KE(KP_POWER)
KE(KP_PERCENT)
KE(KP_LESS)
KE(KP_GREATER)
KE(KP_AMPERSAND)
KE(KP_DBLAMPERSAND)
KE(KP_VERTICALBAR)
KE(KP_DBLVERTICALBAR)
KE(KP_COLON)
KE(KP_HASH)
KE(KP_SPACE)
KE(KP_AT)
KE(KP_EXCLAM)
KE(KP_MEMSTORE)
KE(KP_MEMRECALL)
KE(KP_MEMCLEAR)
KE(KP_MEMADD)
KE(KP_MEMSUBTRACT)
KE(KP_MEMMULTIPLY)
KE(KP_MEMDIVIDE)
KE(KP_PLUSMINUS)
KE(KP_CLEAR)
KE(KP_CLEARENTRY)
KE(KP_BINARY)
KE(KP_OCTAL)
KE(KP_DECIMAL)
KE(KP_HEXADECIMAL)
KE(LCTRL)
KE(LSHIFT)
KE(LALT)
KE(LGUI)
KE(RCTRL)
KE(RSHIFT)
KE(RALT)
KE(RGUI)
KE(MODE)
KE(AUDIONEXT)
KE(AUDIOPREV)
KE(AUDIOSTOP)
KE(AUDIOPLAY)
KE(AUDIOMUTE)
KE(MEDIASELECT)
KE(WWW)
KE(MAIL)
KE(CALCULATOR)
KE(COMPUTER)
KE(AC_SEARCH)
KE(AC_HOME)
KE(AC_BACK)
KE(AC_FORWARD)
KE(AC_STOP)
KE(AC_REFRESH)
KE(AC_BOOKMARKS)
KE(BRIGHTNESSDOWN)
KE(BRIGHTNESSUP)
KE(DISPLAYSWITCH)
KE(KBDILLUMTOGGLE)
KE(KBDILLUMDOWN)
KE(KBDILLUMUP)
KE(EJECT)
KE(SLEEP)
KE(APP1)
KE(APP2)
{
-1, ""
}
@ -126,7 +367,6 @@ protected:
// sdl_keyboard_device
//============================================================
#define OSD_SDL_INDEX_KEYSYM(keysym) ((keysym)->scancode)
class sdl_keyboard_device : public sdl_device
{
public:
@ -143,13 +383,13 @@ public:
switch (sdlevent.type)
{
case SDL_KEYDOWN:
keyboard.state[OSD_SDL_INDEX_KEYSYM(&sdlevent.key.keysym)] = 0x80;
keyboard.state[sdlevent.key.keysym.scancode] = 0x80;
if (sdlevent.key.keysym.sym < 0x20)
machine().ui_input().push_char_event(osd_common_t::s_window_list.front()->target(), sdlevent.key.keysym.sym);
break;
case SDL_KEYUP:
keyboard.state[OSD_SDL_INDEX_KEYSYM(&sdlevent.key.keysym)] = 0x00;
keyboard.state[sdlevent.key.keysym.scancode] = 0x00;
break;
case SDL_TEXTINPUT:
@ -567,11 +807,6 @@ private:
char *keymap_filename;
FILE *keymap_file;
int line = 1;
int index, len, sk, vk, ak;
char buf[256];
char mks[41];
char sks[41];
char kns[41];
int sdl2section = 0;
keyboard_trans_table &default_table = keyboard_trans_table::instance();
@ -601,41 +836,42 @@ private:
while (!feof(keymap_file))
{
char buf[256];
char *ret = fgets(buf, 255, keymap_file);
if (ret && buf[0] != '\n' && buf[0] != '#')
{
buf[255] = 0;
len = strlen(buf);
int len = strlen(buf);
if (len && buf[len - 1] == '\n')
buf[len - 1] = 0;
if (strncmp(buf, "[SDL2]", 6) == 0)
{
sdl2section = 1;
}
else if (((SDLMAME_SDL2) ^ sdl2section) == 0)
else if (sdl2section == 1)
{
mks[0] = 0;
sks[0] = 0;
memset(kns, 0, ARRAY_LENGTH(kns));
sscanf(buf, "%40s %40s %x %x %40c\n",
mks, sks, &vk, &ak, kns);
char mks[41] = {0};
char sks[41] = {0};
char kns[41] = {0};
index = default_table.lookup_mame_index(mks);
sk = lookup_sdl_code(sks);
int n = sscanf(buf, "%40s %40s %40c\n", mks, sks, kns);
if (n != 3)
osd_printf_error("Keymap: Error on line %d : Expected 3 parameters, got %d\n", line, n);
int index = default_table.lookup_mame_index(mks);
int sk = lookup_sdl_code(sks);
if (sk >= 0 && index >= 0)
{
key_trans_entry &entry = (*custom_table)[index];
entry.sdl_key = sk;
// vk and ak are not really needed
//key_trans_table[index][VIRTUAL_KEY] = vk;
//key_trans_table[index][ASCII_KEY] = ak;
entry.sdl_scancode = sk;
entry.ui_name = auto_alloc_array(machine, char, strlen(kns) + 1);
strcpy(entry.ui_name, kns);
osd_printf_verbose("Keymap: Mapped <%s> to <%s> with ui-text <%s>\n", sks, mks, kns);
}
else
osd_printf_warning("Keymap: Error on line %d - %s key not found: %s\n", line, (sk<0) ? "sdl" : "mame", buf);
osd_printf_error("Keymap: Error on line %d - %s key not found: %s\n", line, (sk<0) ? "sdl" : "mame", buf);
}
}
line++;