mirror of
https://github.com/holub/mame
synced 2025-04-09 18:17:44 +03:00
bus/pce: Moved Super System Card and Arcade Card to slot card devices. (#11726)
* Moved expansion card emulation out of the system into card devices. * Removed machine configuration settings for expansion settings. * Started to modernise the HuCard slot interface. New working software list items (pce.xml) ------------------------ Arcade Card Pro
This commit is contained in:
parent
bc857d259f
commit
8bf993ca5b
13
hash/pce.xml
13
hash/pce.xml
@ -4502,4 +4502,17 @@ https://mametesters.org/view.php?id=6597
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="acardpro">
|
||||
<description>Arcade Card Pro</description>
|
||||
<year>1994</year>
|
||||
<publisher>NEC</publisher>
|
||||
<part name="cart" interface="pce_cart">
|
||||
<feature name="slot" value="acard_pro" />
|
||||
<dataarea name="rom" size="262144">
|
||||
<!-- TODO: same as scdsys? needs to verification -->
|
||||
<rom name="[cd] super cd-rom system (japan) (v3.0).pce" size="262144" crc="6d9a73ef" sha1="79f5ff55dd10187c7fd7b8daab0b3ffbd1f56a2c" status="baddump" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</softwarelist>
|
||||
|
@ -63,7 +63,7 @@ license:CC0-1.0
|
||||
<info name="release" value="19940708"/>
|
||||
<info name="alt_title" value="サザン アイズ 3X3EYES ~三只眼燮成~"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="3 x 3 eyes - sanjiyan hensei (acd, scd)(jpn)" sha1="f31323d30474ba046ba9944c3ac3c1470bc0c126"/>
|
||||
@ -374,7 +374,7 @@ https://www.unseen64.net/2021/01/04/angelus2-holynight-pcengine-cancelled/
|
||||
<info name="release" value="19941125"/>
|
||||
<info name="alt_title" value="バトルフィールド 新日本プロレスリング'94 BATTLEFIELD IN 闘強導夢"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="battlefield '94 in tokyo dome (acd)(jpn)" sha1="866e90f08cee3c5820b148f6c2c0791f5972ff51"/>
|
||||
@ -535,7 +535,7 @@ https://www.unseen64.net/2021/01/04/angelus2-holynight-pcengine-cancelled/
|
||||
<info name="release" value="19940617"/>
|
||||
<info name="alt_title" value="ブランディッシ"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="brandish (acd, scd)(jpn)" sha1="e0c0c55ca145c2e0f1a1efa7a4d5f2f59d34c913"/>
|
||||
@ -1413,7 +1413,7 @@ Returns to intro when pressing Run button on title (player has to hold start in
|
||||
<info name="release" value="19940715"/>
|
||||
<info name="alt_title" value="栄冠は君に"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="eikan ha kimini - koukou yakyuu zenkoku taikai (acd, scd)(jpn)" sha1="4920b87a8ee81abafcdf568ffa3a6761d7c97ac8"/>
|
||||
@ -1675,7 +1675,7 @@ Cheat: Up, up, up, down, down, down, II, II, II, I, I, I during intro for "debug
|
||||
<info name="release" value="19950203"/>
|
||||
<info name="alt_title" value="ファイプロ女子憧夢超女大戦 全女vsJWP"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="fire pro joshi - dome choujo taisen (acd)(jpn)" sha1="a2a2e4108eed453e95f080b746b0797117b886e9"/>
|
||||
@ -1740,7 +1740,7 @@ Uses sound LFO FM
|
||||
<info name="release" value="19950407"/>
|
||||
<info name="alt_title" value="フォ-メ-ションサッカ-95 デッラセリエA"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="formation soccer '95 - della serie a (acd, scd)(jpn)" sha1="e907f2f637eed0a1f0ea52371f51f9dcb6042a6f"/>
|
||||
@ -1941,7 +1941,7 @@ Unsupported [セーブくん] joypad slot peripheral
|
||||
<info name="release" value="19940212"/>
|
||||
<info name="alt_title" value="餓狼伝説2 体験版"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="garou densetsu ii - aratanaru tatakai - sample disc (acd)(jpn)" sha1="978720b488736828bff3d7ecf2f738aec4aa3f36"/>
|
||||
@ -1957,7 +1957,7 @@ Unsupported [セーブくん] joypad slot peripheral
|
||||
<info name="release" value="19940312"/>
|
||||
<info name="alt_title" value="餓狼伝説2"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="garou densetsu ii - aratanaru tatakai [imperfect] (acd)(jpn)" sha1="b5d2dedf90a5b90c4d2b588e5f6985b8f38e18b5"/>
|
||||
@ -1973,7 +1973,7 @@ Unsupported [セーブくん] joypad slot peripheral
|
||||
<info name="release" value="19941202"/>
|
||||
<info name="alt_title" value="餓狼伝説スペシャル"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="garou densetsu special (acd)(jpn)" sha1="3d43a9d59e3a894580a4bbabc85ee0757b09d84a"/>
|
||||
@ -2037,7 +2037,7 @@ Unsupported [セーブくん] joypad slot peripheral
|
||||
<info name="release" value="19951124"/>
|
||||
<info name="alt_title" value="銀河婦警伝説サファイア"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="ginga fukei densetsu sapphire (acd)(jpn)" sha1="5fe3b477286a60e47c367f8dd4d662557a62588b"/>
|
||||
@ -2473,7 +2473,7 @@ New game intro sports glitchy portraits
|
||||
<info name="release" value="19941223"/>
|
||||
<info name="alt_title" value="Jリーグ トリメンダスサッカー'94"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="j. league tremendous soccer '94 (acd, scd)(jpn)" sha1="a5ed925bc880ab8a9546973b88e8cb32bfac50de"/>
|
||||
@ -2505,7 +2505,7 @@ New game intro sports glitchy portraits
|
||||
<info name="release" value="19950224"/>
|
||||
<info name="alt_title" value="雀神伝説"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="janshin densetsu - quest of jongmaster (acd)(jpn)" sha1="afade5dd161d71ae646f3d2361aef56100362160"/>
|
||||
@ -3058,7 +3058,7 @@ Hangs after first attack turn (shoot to the foe behind the tree) (fixed)
|
||||
<info name="release" value="19951013"/>
|
||||
<info name="alt_title" value="リンダキューブ"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="linda (acd, scd)(jpn)" sha1="dc0ae10710aa7ba4f49a3e2606d939230891a340"/>
|
||||
@ -3197,7 +3197,7 @@ Verify [redbook] lip sync and repeat (uses track mode)
|
||||
<info name="release" value="19940915"/>
|
||||
<info name="alt_title" value="マッドストーカー フルメタルフォース"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="mad stalker - full metal force (acd)(jpn)" sha1="c2c1fdb935068405154eca2ab6a4ed68985353dd"/>
|
||||
@ -3210,7 +3210,7 @@ Verify [redbook] lip sync and repeat (uses track mode)
|
||||
<year>1994</year>
|
||||
<publisher>NEC Home Electronics</publisher>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="mad stalker - full metal force - sample disc (acd)(jpn)" sha1="3ee9dd98aa62dac638dc20f22f67029120a1d6d6"/>
|
||||
@ -3226,7 +3226,7 @@ Verify [redbook] lip sync and repeat (uses track mode)
|
||||
<info name="release" value="19961213"/>
|
||||
<info name="alt_title" value="魔導物語I 炎の卒園児"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="madou monogatari i - honou no sotsuenji [imperfect] (acd)(jpn)" sha1="b0af74f366ca5284fb9447df1a456e7f624250f0"/>
|
||||
@ -3246,7 +3246,7 @@ Crashes on (skippable) new game intro, [SCSI] timing sensitive
|
||||
<info name="release" value="19940812"/>
|
||||
<info name="alt_title" value="ぽっぷるメイル"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="magical fantasy adventure - popful mail (acd, scd)(jpn)" sha1="fce1f8fc9fd82e7b918178450846e1fc7e6d432e"/>
|
||||
@ -3342,7 +3342,7 @@ Crashes on (skippable) new game intro, [SCSI] timing sensitive
|
||||
<info name="release" value="19950811"/>
|
||||
<info name="alt_title" value="麻雀ソード プリンセスクエスト外伝"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="mahjong sword - princess quest gaiden (acd, scd)(jpn)" sha1="6ce6561a7f6bf2c2508e1c1c442fc3810ad7db71"/>
|
||||
@ -4251,7 +4251,7 @@ Unsupported [セーブくん] joypad slot peripheral
|
||||
<info name="release" value="19950616"/>
|
||||
<info name="alt_title" value="プリンセスメーカー2"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="princess maker ii (acd, scd)(jpn)" sha1="6aa2c991496a68302daf297f23b96819d63ebefa"/>
|
||||
@ -4284,7 +4284,7 @@ Unsupported [セーブくん] joypad slot peripheral
|
||||
<info name="release" value="19950811"/>
|
||||
<info name="alt_title" value="プライベート アイドル"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="private eyedol (acd, scd)(jpn)" sha1="a80b9c9178b60efd84a9ec5de4dddc59e8f621e3"/>
|
||||
@ -4912,7 +4912,7 @@ Hangs on technique screen after level select (assuming you pick them up in stage
|
||||
<info name="release" value="19940326"/>
|
||||
<info name="alt_title" value="龍虎の拳"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="ryuuko no ken (acd)(jpn)" sha1="50c2a68d3b1ab99802ec865af901e8454df62fc4"/>
|
||||
@ -4925,7 +4925,7 @@ Hangs on technique screen after level select (assuming you pick them up in stage
|
||||
<year>1994</year>
|
||||
<publisher>Hudson</publisher>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="ryuuko no ken - sample disc (acd)(jpn)" sha1="d1c5f36592565e3284bdc970b673fd7b577ad784"/>
|
||||
@ -5100,7 +5100,7 @@ Unsupported [セーブくん] joypad slot peripheral
|
||||
<info name="release" value="19940916"/>
|
||||
<info name="alt_title" value="セクシーアイドル麻雀 ファッション物語"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="sexy idol mahjong fashion monogatari (acd, scd)(jpn)" sha1="a640c7241a0c041eb25f73656545b32da310d020"/>
|
||||
@ -5539,7 +5539,7 @@ Offset [CRTC] screen
|
||||
<info name="release" value="19941223"/>
|
||||
<info name="alt_title" value="卒業2"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="sotsugyou ii - neo generation (acd, scd)(jpn)" sha1="df09e386502dc040c1fea86025a3f7da4f38f682"/>
|
||||
@ -5738,7 +5738,7 @@ Eventually hangs requiring a transfer ready irq [SCSI] (untested)
|
||||
<info name="release" value="19940922"/>
|
||||
<info name="alt_title" value="ストライダー飛竜"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="strider hiryuu (acd)(jpn)" sha1="55730fca43667b79ca69a22092ddeb9e47f8eac4"/>
|
||||
@ -5914,7 +5914,7 @@ Eventually hangs requiring a transfer ready irq [SCSI] (untested)
|
||||
<info name="release" value="19940805"/>
|
||||
<info name="alt_title" value="スーパーリアル麻雀PII・PIIIカスタム"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="super real mahjong p ii iii custom (acd, scd)(jpn)" sha1="3f3b4e7c5c2ae0faabf139eb95e5e6002162928b"/>
|
||||
@ -5946,7 +5946,7 @@ Eventually hangs requiring a transfer ready irq [SCSI] (untested)
|
||||
<info name="release" value="19950303"/>
|
||||
<info name="alt_title" value="スーパーリアル麻雀P.Vカスタム"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="super real mahjong p v custom (acd, scd)(jpn)" sha1="248e967c4069bf047b1a114a7768bb2110f430a4"/>
|
||||
@ -6087,7 +6087,7 @@ Eventually hangs requiring a transfer ready irq [SCSI] (untested)
|
||||
<info name="release" value="19940922"/>
|
||||
<info name="alt_title" value="誕生~デビュー~"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="tanjou debut (acd, scd)(jpn)" sha1="859060b5ada85083f5e262309f5f1b7ec7e3998c"/>
|
||||
@ -6183,7 +6183,7 @@ Eventually hangs requiring a transfer ready irq [SCSI] (untested)
|
||||
<info name="release" value="19950224"/>
|
||||
<info name="alt_title" value="カブキ一刀涼談"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="tengai makyou - kabuki ittou ryoudan (acd)(jpn)" sha1="0ebc331c4d7d963f4a6553e6f2020fa5a1031753"/>
|
||||
@ -6295,7 +6295,7 @@ Eventually hangs requiring a transfer ready irq [SCSI] (untested)
|
||||
<info name="release" value="19940304"/>
|
||||
<info name="alt_title" value="アトラスRenaissance Voyager"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="the atlas - renaissance voyager (acd, scd)(jpn)" sha1="a3b7b45550eef37f2f85fe2d98334341ccd67840"/>
|
||||
@ -6778,7 +6778,7 @@ Cuts off [ADPCM] playback, enables half irq
|
||||
<info name="release" value="19940708"/>
|
||||
<info name="alt_title" value="バスティール2"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="vasteel ii (acd, scd)(jpn)" sha1="fa01d9a03416d35a313740728a797f8792ddfda1"/>
|
||||
@ -6893,7 +6893,7 @@ Hangs or resets after giving yes to "Is it OK?" prompt (fixed)
|
||||
<info name="release" value="19940604"/>
|
||||
<info name="alt_title" value="ワールドヒーローズ2"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="world heroes ii (acd)(jpn)" sha1="67e7c559c1be2034502cb63efea6881fcc6b8e5a"/>
|
||||
@ -6907,7 +6907,7 @@ Hangs or resets after giving yes to "Is it OK?" prompt (fixed)
|
||||
<publisher>Hudson</publisher>
|
||||
<info name="alt_title" value="ワールドヒーローズ2 体験版"/>
|
||||
<info name="usage" value="CD-ROM² Arcade System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="world heroes ii - sample disc (acd)(jpn)" sha1="b3b8bcd66f58ee57f0e7473df1549f51e9096ade"/>
|
||||
@ -6923,7 +6923,7 @@ Hangs or resets after giving yes to "Is it OK?" prompt (fixed)
|
||||
<info name="release" value="19950519"/>
|
||||
<info name="alt_title" value="レッスルエンジェルス ダブルインパクト"/>
|
||||
<info name="usage" value="CD-ROM² Super System Card required" />
|
||||
<sharedfeat name="requirement" value="scdsys"/>
|
||||
<sharedfeat name="requirement" value="pce:acardpro"/>
|
||||
<part name="cdrom" interface="pce_cdrom">
|
||||
<diskarea name="cdrom">
|
||||
<disk name="wrestling angels - double impact (acd, scd)(jpn)" sha1="d79ce768849f21a9010c221d8dd7817a4a1b94f9"/>
|
||||
|
@ -4257,6 +4257,10 @@ if (BUSES["PCE"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/pce/pce_slot.h",
|
||||
MAME_DIR .. "src/devices/bus/pce/pce_rom.cpp",
|
||||
MAME_DIR .. "src/devices/bus/pce/pce_rom.h",
|
||||
MAME_DIR .. "src/devices/bus/pce/pce_scdsys.cpp",
|
||||
MAME_DIR .. "src/devices/bus/pce/pce_scdsys.h",
|
||||
MAME_DIR .. "src/devices/bus/pce/pce_acard.cpp",
|
||||
MAME_DIR .. "src/devices/bus/pce/pce_acard.h",
|
||||
}
|
||||
end
|
||||
|
||||
|
232
src/devices/bus/pce/pce_acard.cpp
Normal file
232
src/devices/bus/pce/pce_acard.cpp
Normal file
@ -0,0 +1,232 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Fabio Priuli, Angelo Salese
|
||||
/***********************************************************************************************************
|
||||
|
||||
|
||||
PC-Engine Arcade Card emulation
|
||||
|
||||
TODO:
|
||||
- Proper Arcade Card Duo support
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "pce_acard.h"
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// pce_acard_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_ACARD_DUO, pce_acard_duo_device, "pce_acard_duo", "Arcade Card Duo")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_ACARD_PRO, pce_acard_pro_device, "pce_acard_pro", "Arcade Card Pro")
|
||||
|
||||
|
||||
pce_acard_duo_device::pce_acard_duo_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_pce_cart_interface( mconfig, *this )
|
||||
, m_ram(*this, "ram", 0x200000, ENDIANNESS_LITTLE)
|
||||
, m_shift(0)
|
||||
, m_shift_reg(0)
|
||||
, m_rotate_reg(0)
|
||||
{
|
||||
}
|
||||
|
||||
pce_acard_duo_device::pce_acard_duo_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_acard_duo_device(mconfig, PCE_ROM_ACARD_DUO, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
pce_acard_pro_device::pce_acard_pro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_acard_duo_device(mconfig, PCE_ROM_ACARD_PRO, tag, owner, clock)
|
||||
, m_scdsys()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// mapper specific start/reset
|
||||
//-------------------------------------------------
|
||||
|
||||
|
||||
void pce_acard_duo_device::device_start()
|
||||
{
|
||||
save_item(STRUCT_MEMBER(m_port, m_ctrl));
|
||||
save_item(STRUCT_MEMBER(m_port, m_base_addr));
|
||||
save_item(STRUCT_MEMBER(m_port, m_addr_offset));
|
||||
save_item(STRUCT_MEMBER(m_port, m_addr_inc));
|
||||
save_item(NAME(m_shift));
|
||||
save_item(NAME(m_shift_reg));
|
||||
save_item(NAME(m_rotate_reg));
|
||||
}
|
||||
|
||||
void pce_acard_pro_device::device_start()
|
||||
{
|
||||
pce_acard_duo_device::device_start();
|
||||
|
||||
m_scdsys.init(*this);
|
||||
m_scdsys.set_region(false);
|
||||
}
|
||||
|
||||
void pce_acard_duo_device::device_reset()
|
||||
{
|
||||
for (auto &port : m_port)
|
||||
{
|
||||
port.m_ctrl = 0;
|
||||
port.m_base_addr = 0;
|
||||
port.m_addr_offset = 0;
|
||||
port.m_addr_inc = 0;
|
||||
}
|
||||
m_shift = 0;
|
||||
m_shift_reg = 0;
|
||||
m_rotate_reg = 0;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
mapper specific handlers
|
||||
-------------------------------------------------*/
|
||||
|
||||
void pce_acard_duo_device::install_memory_handlers(address_space &space)
|
||||
{
|
||||
space.install_readwrite_handler(0x080000, 0x087fff, emu::rw_delegate(*this, FUNC(pce_acard_duo_device::ram_r)), emu::rw_delegate(*this, FUNC(pce_acard_duo_device::ram_w)));
|
||||
// TODO: mirrored?
|
||||
space.install_readwrite_handler(0x1ffa00, 0x1ffaff, 0, 0x100, 0, emu::rw_delegate(*this, FUNC(pce_acard_duo_device::peripheral_r)), emu::rw_delegate(*this, FUNC(pce_acard_duo_device::peripheral_w)));
|
||||
}
|
||||
|
||||
void pce_acard_pro_device::install_memory_handlers(address_space &space)
|
||||
{
|
||||
space.install_rom(0x000000, 0x03ffff, 0x040000, m_rom); // TODO: underdumped or mirrored?
|
||||
space.install_ram(0x0d0000, 0x0fffff, m_scdsys.ram());
|
||||
space.install_read_handler(0x1ff8c0, 0x1ff8c7, 0, 0x130, 0, emu::rw_delegate(*this, FUNC(pce_acard_pro_device::register_r)));
|
||||
pce_acard_duo_device::install_memory_handlers(space);
|
||||
}
|
||||
|
||||
uint8_t pce_acard_duo_device::ram_r(offs_t offset)
|
||||
{
|
||||
return peripheral_r((offset & 0x6000) >> 9);
|
||||
}
|
||||
|
||||
void pce_acard_duo_device::ram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
peripheral_w((offset & 0x6000) >> 9, data);
|
||||
}
|
||||
|
||||
uint8_t pce_acard_duo_device::peripheral_r(offs_t offset)
|
||||
{
|
||||
if ((offset & 0xe0) == 0xe0)
|
||||
{
|
||||
switch (offset & 0x1f)
|
||||
{
|
||||
case 0x00: return (m_shift >> 0) & 0xff;
|
||||
case 0x01: return (m_shift >> 8) & 0xff;
|
||||
case 0x02: return (m_shift >> 16) & 0xff;
|
||||
case 0x03: return (m_shift >> 24) & 0xff;
|
||||
case 0x04: return m_shift_reg;
|
||||
case 0x05: return m_rotate_reg;
|
||||
case 0x1c: return 0x00;
|
||||
case 0x1d: return 0x00;
|
||||
case 0x1e: return 0x10; // Version number (MSB?)
|
||||
case 0x1f: return 0x51; // Arcade Card ID
|
||||
}
|
||||
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
dram_port &port = m_port[(offset & 0x30) >> 4];
|
||||
|
||||
switch (offset & 0x8f)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
{
|
||||
uint8_t const res = m_ram[port.ram_addr()];
|
||||
|
||||
if (!machine().side_effects_disabled())
|
||||
port.addr_increment();
|
||||
|
||||
return res;
|
||||
}
|
||||
case 0x02: return (port.m_base_addr >> 0) & 0xff;
|
||||
case 0x03: return (port.m_base_addr >> 8) & 0xff;
|
||||
case 0x04: return (port.m_base_addr >> 16) & 0xff;
|
||||
case 0x05: return (port.m_addr_offset >> 0) & 0xff;
|
||||
case 0x06: return (port.m_addr_offset >> 8) & 0xff;
|
||||
case 0x07: return (port.m_addr_inc >> 0) & 0xff;
|
||||
case 0x08: return (port.m_addr_inc >> 8) & 0xff;
|
||||
case 0x09: return port.m_ctrl;
|
||||
default: return 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
void pce_acard_duo_device::peripheral_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if ((offset & 0xe0) == 0xe0)
|
||||
{
|
||||
switch (offset & 0x0f)
|
||||
{
|
||||
case 0: m_shift = (data & 0xff) | (m_shift & 0xffffff00); break;
|
||||
case 1: m_shift = (data << 8) | (m_shift & 0xffff00ff); break;
|
||||
case 2: m_shift = (data << 16) | (m_shift & 0xff00ffff); break;
|
||||
case 3: m_shift = (data << 24) | (m_shift & 0x00ffffff); break;
|
||||
case 4:
|
||||
m_shift_reg = data & 0x0f;
|
||||
|
||||
if (m_shift_reg != 0)
|
||||
{
|
||||
m_shift = (m_shift_reg < 8)
|
||||
? (m_shift << m_shift_reg)
|
||||
: (m_shift >> (16 - m_shift_reg));
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
m_rotate_reg = data & 0x0f;
|
||||
|
||||
if (m_rotate_reg != 0)
|
||||
{
|
||||
m_shift = (m_rotate_reg < 8)
|
||||
? ((m_shift << m_rotate_reg) | (m_shift >> (32 - m_rotate_reg)))
|
||||
: ((m_shift >> (16 - m_rotate_reg)) | (m_shift << (32 - (16 - m_rotate_reg))));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dram_port &port = m_port[(offset & 0x30) >> 4];
|
||||
|
||||
switch (offset & 0x8f)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
m_ram[port.ram_addr()] = data;
|
||||
|
||||
port.addr_increment();
|
||||
break;
|
||||
|
||||
case 0x02: port.m_base_addr = (data & 0xff) | (port.m_base_addr & 0xffff00); break;
|
||||
case 0x03: port.m_base_addr = (data << 8) | (port.m_base_addr & 0xff00ff); break;
|
||||
case 0x04: port.m_base_addr = (data << 16) | (port.m_base_addr & 0x00ffff); break;
|
||||
case 0x05:
|
||||
port.m_addr_offset = (data & 0xff) | (port.m_addr_offset & 0xff00);
|
||||
|
||||
if ((port.m_ctrl & 0x60) == 0x20)
|
||||
port.adjust_addr();
|
||||
break;
|
||||
case 0x06:
|
||||
port.m_addr_offset = (data << 8) | (port.m_addr_offset & 0x00ff);
|
||||
|
||||
if ((port.m_ctrl & 0x60) == 0x40)
|
||||
port.adjust_addr();
|
||||
break;
|
||||
case 0x07: port.m_addr_inc = (data & 0xff) | (port.m_addr_inc & 0xff00); break;
|
||||
case 0x08: port.m_addr_inc = (data << 8) | (port.m_addr_inc & 0x00ff); break;
|
||||
case 0x09: port.m_ctrl = data & 0x7f; break;
|
||||
case 0x0a:
|
||||
if ((port.m_ctrl & 0x60) == 0x60)
|
||||
port.adjust_addr();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
114
src/devices/bus/pce/pce_acard.h
Normal file
114
src/devices/bus/pce/pce_acard.h
Normal file
@ -0,0 +1,114 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Fabio Priuli, Angelo Salese
|
||||
#ifndef MAME_BUS_PCE_PCE_ACARD_H
|
||||
#define MAME_BUS_PCE_PCE_ACARD_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pce_scdsys.h"
|
||||
#include "pce_slot.h"
|
||||
|
||||
|
||||
// ======================> pce_acard_duo_device
|
||||
|
||||
class pce_acard_duo_device : public device_t,
|
||||
public device_pce_cart_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
pce_acard_duo_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// reading and writing
|
||||
virtual void install_memory_handlers(address_space &space) override;
|
||||
|
||||
protected:
|
||||
// construction/destruction
|
||||
pce_acard_duo_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
private:
|
||||
uint8_t ram_r(offs_t offset);
|
||||
void ram_w(offs_t offset, uint8_t data);
|
||||
uint8_t peripheral_r(offs_t offset);
|
||||
void peripheral_w(offs_t offset, uint8_t data);
|
||||
|
||||
/* Arcade Card specific */
|
||||
memory_share_creator<uint8_t> m_ram;
|
||||
|
||||
struct dram_port
|
||||
{
|
||||
uint32_t ram_addr()
|
||||
{
|
||||
if (BIT(m_ctrl, 1))
|
||||
return (m_base_addr + m_addr_offset + (BIT(m_ctrl, 3) ? 0xff0000 : 0)) & 0x1fffff;
|
||||
else
|
||||
return m_base_addr & 0x1fffff;
|
||||
}
|
||||
|
||||
void addr_increment()
|
||||
{
|
||||
if (BIT(m_ctrl, 0))
|
||||
{
|
||||
if (BIT(m_ctrl, 4))
|
||||
{
|
||||
m_base_addr += m_addr_inc;
|
||||
m_base_addr &= 0xffffff;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_addr_offset += m_addr_inc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void adjust_addr()
|
||||
{
|
||||
m_base_addr += m_addr_offset + (BIT(m_ctrl, 3) ? 0xff0000 : 0);
|
||||
m_base_addr &= 0xffffff;
|
||||
}
|
||||
|
||||
uint8_t m_ctrl;
|
||||
uint32_t m_base_addr;
|
||||
uint16_t m_addr_offset;
|
||||
uint16_t m_addr_inc;
|
||||
};
|
||||
|
||||
dram_port m_port[4];
|
||||
uint32_t m_shift;
|
||||
uint8_t m_shift_reg;
|
||||
uint8_t m_rotate_reg;
|
||||
};
|
||||
|
||||
|
||||
// ======================> pce_acard_duo_device
|
||||
|
||||
class pce_acard_pro_device : public pce_acard_duo_device
|
||||
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
pce_acard_pro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// reading and writing
|
||||
virtual void install_memory_handlers(address_space &space) override;
|
||||
|
||||
protected:
|
||||
virtual void device_start() override;
|
||||
|
||||
private:
|
||||
pce_scdsys_shared m_scdsys;
|
||||
|
||||
// reading
|
||||
uint8_t register_r(offs_t offset) { return m_scdsys.register_r(offset); }
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_ACARD_DUO, pce_acard_duo_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_ACARD_PRO, pce_acard_pro_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_PCE_PCE_ACARD_H
|
@ -18,16 +18,15 @@
|
||||
// pce_rom_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_STD, pce_rom_device, "pce_rom", "PCE/TG16 HuCards")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_CDSYS3, pce_cdsys3_device, "pce_cdsys3", "PCE/TG16 CD-System HuCard v3.00")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_POPULOUS, pce_populous_device, "pce_populous", "PCE Populous HuCard")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_SF2, pce_sf2_device, "pce_sf2", "PCE Street Fighter 2 CE HuCard")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_TENNOKOE, pce_tennokoe_device, "pce_tennokoe", "PCE Tennokoe Bank HuCard")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_STD, pce_rom_device, "pce_rom", "PCE/TG16 HuCards")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_POPULOUS, pce_populous_device, "pce_populous", "PCE Populous HuCard")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_SF2, pce_sf2_device, "pce_sf2", "PCE Street Fighter 2 CE HuCard")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_TENNOKOE, pce_tennokoe_device, "pce_tennokoe", "PCE Tennokoe Bank HuCard")
|
||||
|
||||
|
||||
pce_rom_device::pce_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_pce_cart_interface( mconfig, *this )
|
||||
, device_pce_cart_interface(mconfig, *this)
|
||||
{
|
||||
}
|
||||
|
||||
@ -36,24 +35,20 @@ pce_rom_device::pce_rom_device(const machine_config &mconfig, const char *tag, d
|
||||
{
|
||||
}
|
||||
|
||||
pce_cdsys3_device::pce_cdsys3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_rom_device(mconfig, PCE_ROM_CDSYS3, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
pce_populous_device::pce_populous_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_rom_device(mconfig, PCE_ROM_POPULOUS, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
pce_sf2_device::pce_sf2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_rom_device(mconfig, PCE_ROM_SF2, tag, owner, clock), m_bank_base(0)
|
||||
: pce_rom_device(mconfig, PCE_ROM_SF2, tag, owner, clock)
|
||||
, m_rom_bank(*this, "rom_bank")
|
||||
{
|
||||
}
|
||||
|
||||
pce_tennokoe_device::pce_tennokoe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_rom_device(mconfig, PCE_ROM_TENNOKOE, tag, owner, clock),
|
||||
device_nvram_interface(mconfig, *this)
|
||||
: pce_rom_device(mconfig, PCE_ROM_TENNOKOE, tag, owner, clock)
|
||||
, device_nvram_interface(mconfig, *this)
|
||||
{
|
||||
}
|
||||
|
||||
@ -63,14 +58,9 @@ pce_tennokoe_device::pce_tennokoe_device(const machine_config &mconfig, const ch
|
||||
//-------------------------------------------------
|
||||
|
||||
|
||||
void pce_sf2_device::device_start()
|
||||
{
|
||||
save_item(NAME(m_bank_base));
|
||||
}
|
||||
|
||||
void pce_sf2_device::device_reset()
|
||||
{
|
||||
m_bank_base = 0;
|
||||
m_rom_bank->set_entry(0);
|
||||
}
|
||||
|
||||
void pce_tennokoe_device::device_start()
|
||||
@ -128,98 +118,65 @@ bool pce_tennokoe_device::nvram_write(util::write_stream &file)
|
||||
mapper specific handlers
|
||||
-------------------------------------------------*/
|
||||
|
||||
uint8_t pce_rom_device::read_cart(offs_t offset)
|
||||
uint8_t pce_rom_device::rom_r(offs_t offset)
|
||||
{
|
||||
int bank = offset / 0x20000;
|
||||
return m_rom[rom_bank_map[bank] * 0x20000 + (offset & 0x1ffff)];
|
||||
}
|
||||
|
||||
|
||||
uint8_t pce_cdsys3_device::read_cart(offs_t offset)
|
||||
void pce_rom_device::install_memory_handlers(address_space &space)
|
||||
{
|
||||
int bank = offset / 0x20000;
|
||||
if (!m_ram.empty() && offset >= 0xd0000)
|
||||
return m_ram[offset - 0xd0000];
|
||||
|
||||
return m_rom[rom_bank_map[bank] * 0x20000 + (offset & 0x1ffff)];
|
||||
}
|
||||
|
||||
void pce_cdsys3_device::write_cart(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (!m_ram.empty() && offset >= 0xd0000)
|
||||
m_ram[offset - 0xd0000] = data;
|
||||
space.install_read_handler(0x00000, 0xfffff, emu::rw_delegate(*this, FUNC(pce_rom_device::rom_r)));
|
||||
}
|
||||
|
||||
|
||||
uint8_t pce_populous_device::read_cart(offs_t offset)
|
||||
void pce_populous_device::install_memory_handlers(address_space &space)
|
||||
{
|
||||
int bank = offset / 0x20000;
|
||||
if (!m_ram.empty() && offset >= 0x80000 && offset < 0x88000)
|
||||
return m_ram[offset & 0x7fff];
|
||||
|
||||
return m_rom[rom_bank_map[bank] * 0x20000 + (offset & 0x1ffff)];
|
||||
}
|
||||
|
||||
void pce_populous_device::write_cart(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (!m_ram.empty() && offset >= 0x80000 && offset < 0x88000)
|
||||
m_ram[offset & 0x7fff] = data;
|
||||
pce_rom_device::install_memory_handlers(space);
|
||||
space.install_ram(0x80000, 0x87fff, &m_ram[0]);
|
||||
}
|
||||
|
||||
|
||||
uint8_t pce_sf2_device::read_cart(offs_t offset)
|
||||
void pce_sf2_device::bank_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (offset < 0x80000)
|
||||
return m_rom[offset];
|
||||
m_rom_bank->set_entry(offset & 3);
|
||||
}
|
||||
|
||||
|
||||
void pce_sf2_device::install_memory_handlers(address_space &space)
|
||||
{
|
||||
m_rom_bank->configure_entries(0, 4, m_rom + 0x80000, 0x80000);
|
||||
space.install_rom(0x000000, 0x07ffff, m_rom);
|
||||
space.install_read_bank(0x080000, 0x0fffff, m_rom_bank);
|
||||
space.install_write_handler(0x001ff0, 0x001ff3, emu::rw_delegate(*this, FUNC(pce_sf2_device::bank_w)));
|
||||
}
|
||||
|
||||
|
||||
uint8_t pce_tennokoe_device::bram_r(offs_t offset)
|
||||
{
|
||||
if (m_bram_locked)
|
||||
return 0xff;
|
||||
else
|
||||
return m_rom[0x80000 + m_bank_base * 0x80000 + (offset & 0x7ffff)];
|
||||
return m_bram[offset & (m_bram_size-1)];
|
||||
}
|
||||
|
||||
void pce_sf2_device::write_cart(offs_t offset, uint8_t data)
|
||||
void pce_tennokoe_device::bram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (offset >= 0x1ff0 && offset < 0x1ff4)
|
||||
m_bank_base = offset & 3;
|
||||
if (!m_bram_locked)
|
||||
m_bram[offset & (m_bram_size-1)] = data;
|
||||
}
|
||||
|
||||
uint8_t pce_tennokoe_device::read_cart(offs_t offset)
|
||||
void pce_tennokoe_device::bram_lock_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
switch((offset & 0xf0000) >> 16)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
return m_rom[offset];
|
||||
case 8:
|
||||
if (m_bram_locked)
|
||||
return 0xff;
|
||||
else
|
||||
return m_bram[offset & (m_bram_size-1)];
|
||||
}
|
||||
|
||||
logerror("tennokoe: ROM reading at %06x\n",offset);
|
||||
return 0xff;
|
||||
// TODO: lock/unlock mechanism is a complete guess, needs real HW study
|
||||
m_bram_locked = (data == 0);
|
||||
}
|
||||
|
||||
void pce_tennokoe_device::write_cart(offs_t offset, uint8_t data)
|
||||
void pce_tennokoe_device::install_memory_handlers(address_space &space)
|
||||
{
|
||||
switch((offset & 0xf0000) >> 16)
|
||||
{
|
||||
case 8:
|
||||
if(!m_bram_locked)
|
||||
m_bram[offset & (m_bram_size-1)] = data;
|
||||
break;
|
||||
case 0xf:
|
||||
// TODO: lock/unlock mechanism is a complete guess, needs real HW study
|
||||
// (writes to ports $c0000, $d0000, $f0000)
|
||||
m_bram_locked = (data == 0);
|
||||
[[fallthrough]];
|
||||
default:
|
||||
logerror("tennokoe: ROM writing at %06x %02x\n",offset,data);
|
||||
break;
|
||||
}
|
||||
space.install_rom(0x000000, 0x07ffff, m_rom);
|
||||
space.install_readwrite_handler(0x080000, 0x081fff, 0, 0x00e000, 0, emu::rw_delegate(*this, FUNC(pce_tennokoe_device::bram_r)), emu::rw_delegate(*this, FUNC(pce_tennokoe_device::bram_w)));
|
||||
// (writes to ports $c0000, $d0000, $f0000)
|
||||
space.install_write_handler(0x0f0000, 0x0f0000, 0, 0x00ffff, 0, emu::rw_delegate(*this, FUNC(pce_tennokoe_device::bram_lock_w)));
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,7 @@ public:
|
||||
pce_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// reading and writing
|
||||
virtual uint8_t read_cart(offs_t offset) override;
|
||||
virtual void install_memory_handlers(address_space &space) override;
|
||||
|
||||
protected:
|
||||
pce_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
@ -27,24 +27,10 @@ protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override { }
|
||||
virtual void device_reset() override { }
|
||||
|
||||
uint8_t rom_r(offs_t offset);
|
||||
};
|
||||
|
||||
// ======================> pce_cdsys3_device
|
||||
|
||||
class pce_cdsys3_device : public pce_rom_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
pce_cdsys3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// reading and writing
|
||||
virtual uint8_t read_cart(offs_t offset) override;
|
||||
virtual void write_cart(offs_t offset, uint8_t data) override;
|
||||
};
|
||||
|
||||
|
||||
// ======================> pce_populous_device
|
||||
|
||||
class pce_populous_device : public pce_rom_device
|
||||
{
|
||||
public:
|
||||
@ -52,11 +38,9 @@ public:
|
||||
pce_populous_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// reading and writing
|
||||
virtual uint8_t read_cart(offs_t offset) override;
|
||||
virtual void write_cart(offs_t offset, uint8_t data) override;
|
||||
virtual void install_memory_handlers(address_space &space) override;
|
||||
};
|
||||
|
||||
|
||||
// ======================> pce_sf2_device
|
||||
|
||||
class pce_sf2_device : public pce_rom_device
|
||||
@ -66,16 +50,16 @@ public:
|
||||
pce_sf2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// reading and writing
|
||||
virtual uint8_t read_cart(offs_t offset) override;
|
||||
virtual void write_cart(offs_t offset, uint8_t data) override;
|
||||
virtual void install_memory_handlers(address_space &space) override;
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
private:
|
||||
uint8_t m_bank_base;
|
||||
void bank_w(offs_t offset, uint8_t data);
|
||||
|
||||
memory_bank_creator m_rom_bank;
|
||||
};
|
||||
|
||||
// ======================> pce_tennokoe_device
|
||||
@ -88,8 +72,7 @@ public:
|
||||
pce_tennokoe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// reading and writing
|
||||
virtual uint8_t read_cart(offs_t offset) override;
|
||||
virtual void write_cart(offs_t offset, uint8_t data) override;
|
||||
virtual void install_memory_handlers(address_space &space) override;
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
@ -100,6 +83,10 @@ protected:
|
||||
virtual bool nvram_write(util::write_stream &file) override;
|
||||
|
||||
private:
|
||||
uint8_t bram_r(offs_t offset);
|
||||
void bram_w(offs_t offset, uint8_t data);
|
||||
void bram_lock_w(offs_t offset, uint8_t data);
|
||||
|
||||
const uint32_t m_bram_size = 0x800*4;
|
||||
uint8_t m_bram[0x800*4];
|
||||
|
||||
@ -108,11 +95,10 @@ private:
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_STD, pce_rom_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_CDSYS3, pce_cdsys3_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_POPULOUS, pce_populous_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_SF2, pce_sf2_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_TENNOKOE, pce_tennokoe_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_STD, pce_rom_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_POPULOUS, pce_populous_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_SF2, pce_sf2_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_TENNOKOE, pce_tennokoe_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_PCE_PCE_ROM_H
|
||||
|
98
src/devices/bus/pce/pce_scdsys.cpp
Normal file
98
src/devices/bus/pce/pce_scdsys.cpp
Normal file
@ -0,0 +1,98 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Fabio Priuli, Wilbert Pol
|
||||
/***********************************************************************************************************
|
||||
|
||||
|
||||
PC-Engine & Turbografx-16 Super System Card emulation
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "pce_scdsys.h"
|
||||
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// pce_cdsys3_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_CDSYS3J, pce_cdsys3j_device, "pce_cdsys3j", "PCE Super System Card")
|
||||
DEFINE_DEVICE_TYPE(PCE_ROM_CDSYS3U, pce_cdsys3u_device, "pce_cdsys3u", "TG16 Super System Card")
|
||||
|
||||
|
||||
pce_cdsys3_device::pce_cdsys3_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_pce_cart_interface(mconfig, *this)
|
||||
, m_scdsys()
|
||||
{
|
||||
}
|
||||
|
||||
pce_cdsys3j_device::pce_cdsys3j_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_cdsys3_device(mconfig, PCE_ROM_CDSYS3J, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
pce_cdsys3u_device::pce_cdsys3u_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pce_cdsys3_device(mconfig, PCE_ROM_CDSYS3U, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
pce_scdsys_shared::pce_scdsys_shared()
|
||||
: m_ram(nullptr)
|
||||
, m_region(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// mapper specific start/reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void pce_cdsys3_device::device_start()
|
||||
{
|
||||
m_scdsys.init(*this);
|
||||
m_scdsys.set_region(false);
|
||||
}
|
||||
|
||||
void pce_cdsys3u_device::device_start()
|
||||
{
|
||||
pce_cdsys3_device::device_start();
|
||||
m_scdsys.set_region(true);
|
||||
}
|
||||
|
||||
void pce_scdsys_shared::init(device_t &device)
|
||||
{
|
||||
m_ram = make_unique_clear<uint8_t[]>(0x30000);
|
||||
|
||||
device.save_pointer(NAME(m_ram), 0x30000);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
mapper specific handlers
|
||||
-------------------------------------------------*/
|
||||
|
||||
uint8_t pce_scdsys_shared::register_r(offs_t offset)
|
||||
{
|
||||
switch (offset & 0x0f)
|
||||
{
|
||||
// TODO: 0x1 through 0x3 is Super CD-ROM²/PCE Duo stuff?
|
||||
case 0x1: return 0xaa;
|
||||
case 0x2: return 0x55;
|
||||
case 0x3: return 0x00;
|
||||
case 0x5: return (m_region) ? 0x55 : 0xaa;
|
||||
case 0x6: return (m_region) ? 0xaa : 0x55;
|
||||
case 0x7: return 0x03;
|
||||
}
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
|
||||
void pce_cdsys3_device::install_memory_handlers(address_space &space)
|
||||
{
|
||||
// TODO: ROM address mirrored?
|
||||
space.install_rom(0x000000, 0x03ffff, 0x040000, m_rom);
|
||||
space.install_ram(0x0d0000, 0x0fffff, m_scdsys.ram());
|
||||
space.install_read_handler(0x1ff8c0, 0x1ff8c7, 0, 0x330, 0, emu::rw_delegate(*this, FUNC(pce_cdsys3_device::register_r)));
|
||||
}
|
83
src/devices/bus/pce/pce_scdsys.h
Normal file
83
src/devices/bus/pce/pce_scdsys.h
Normal file
@ -0,0 +1,83 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Fabio Priuli, Wilbert Pol
|
||||
#ifndef MAME_BUS_PCE_PCE_SCDSYS_H
|
||||
#define MAME_BUS_PCE_PCE_SCDSYS_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pce_slot.h"
|
||||
|
||||
|
||||
// ======================> pce_scdsys_shared
|
||||
|
||||
class pce_scdsys_shared
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
pce_scdsys_shared();
|
||||
|
||||
// configuration
|
||||
void set_region(bool region) { m_region = region; }
|
||||
|
||||
// reading and writing
|
||||
uint8_t register_r(offs_t offset);
|
||||
|
||||
uint8_t *ram() { return m_ram.get(); }
|
||||
|
||||
void init(device_t &device);
|
||||
|
||||
private:
|
||||
std::unique_ptr<uint8_t[]> m_ram; // internal RAM
|
||||
bool m_region; // Cartridge region
|
||||
};
|
||||
|
||||
// ======================> pce_cdsys3_device
|
||||
|
||||
class pce_cdsys3_device : public device_t,
|
||||
public device_pce_cart_interface
|
||||
{
|
||||
public:
|
||||
// reading and writing
|
||||
virtual void install_memory_handlers(address_space &space) override;
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// construction/destruction
|
||||
pce_cdsys3_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// helper classes
|
||||
pce_scdsys_shared m_scdsys;
|
||||
|
||||
// reading
|
||||
uint8_t register_r(offs_t offset) { return m_scdsys.register_r(offset); }
|
||||
};
|
||||
|
||||
// ======================> pce_cdsys3j_device
|
||||
|
||||
class pce_cdsys3j_device : public pce_cdsys3_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
pce_cdsys3j_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
};
|
||||
|
||||
// ======================> pce_cdsys3u_device
|
||||
|
||||
class pce_cdsys3u_device : public pce_cdsys3_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
pce_cdsys3u_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
virtual void device_start() override;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_CDSYS3J, pce_cdsys3j_device)
|
||||
DECLARE_DEVICE_TYPE(PCE_ROM_CDSYS3U, pce_cdsys3u_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_PCE_PCE_SCDSYS_H
|
@ -139,7 +139,9 @@ pce_cart_slot_device::pce_cart_slot_device(const machine_config &mconfig, const
|
||||
device_cartrom_image_interface(mconfig, *this),
|
||||
device_single_card_slot_interface<device_pce_cart_interface>(mconfig, *this),
|
||||
m_interface("pce_cart"),
|
||||
m_type(PCE_STD), m_cart(nullptr)
|
||||
m_type(PCE_STD),
|
||||
m_cart(nullptr),
|
||||
m_address_space(*this, finder_base::DUMMY_TAG, -1, 8)
|
||||
{
|
||||
}
|
||||
|
||||
@ -181,6 +183,8 @@ static const pce_slot slot_list[] =
|
||||
{ PCE_POPULOUS, "populous" },
|
||||
{ PCE_SF2, "sf2" },
|
||||
{ PCE_TENNOKOE, "tennokoe" },
|
||||
{ PCE_ACARD_DUO, "acard_duo" },
|
||||
{ PCE_ACARD_PRO, "acard_pro" },
|
||||
};
|
||||
|
||||
static int pce_get_pcb_id(const char *slot)
|
||||
@ -260,8 +264,8 @@ std::pair<std::error_condition, std::string> pce_cart_slot_device::call_load()
|
||||
|
||||
if (m_type == PCE_POPULOUS)
|
||||
m_cart->ram_alloc(0x8000);
|
||||
if (m_type == PCE_CDSYS3J || m_type == PCE_CDSYS3U)
|
||||
m_cart->ram_alloc(0x30000);
|
||||
|
||||
m_cart->install_memory_handlers(*m_address_space);
|
||||
}
|
||||
|
||||
return std::make_pair(std::error_condition(), std::string());
|
||||
@ -333,25 +337,3 @@ std::string pce_cart_slot_device::get_default_card_software(get_default_card_sof
|
||||
|
||||
return software_get_default_slot("rom");
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
read
|
||||
-------------------------------------------------*/
|
||||
|
||||
uint8_t pce_cart_slot_device::read_cart(offs_t offset)
|
||||
{
|
||||
if (m_cart)
|
||||
return m_cart->read_cart(offset);
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
write
|
||||
-------------------------------------------------*/
|
||||
|
||||
void pce_cart_slot_device::write_cart(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (m_cart)
|
||||
m_cart->write_cart(offset, data);
|
||||
}
|
||||
|
@ -21,7 +21,9 @@ enum
|
||||
PCE_CDSYS3U,
|
||||
PCE_POPULOUS,
|
||||
PCE_SF2,
|
||||
PCE_TENNOKOE
|
||||
PCE_TENNOKOE,
|
||||
PCE_ACARD_DUO,
|
||||
PCE_ACARD_PRO
|
||||
};
|
||||
|
||||
|
||||
@ -33,9 +35,7 @@ public:
|
||||
// construction/destruction
|
||||
virtual ~device_pce_cart_interface();
|
||||
|
||||
// reading and writing
|
||||
virtual uint8_t read_cart(offs_t offset) { return 0xff; }
|
||||
virtual void write_cart(offs_t offset, uint8_t data) {}
|
||||
virtual void install_memory_handlers(address_space &space) { }
|
||||
|
||||
void rom_alloc(uint32_t size);
|
||||
void ram_alloc(uint32_t size);
|
||||
@ -80,6 +80,9 @@ public:
|
||||
pce_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
virtual ~pce_cart_slot_device();
|
||||
|
||||
// configuration
|
||||
template <typename T> void set_address_space(T &&tag, int no) { m_address_space.set_tag(std::forward<T>(tag), no); }
|
||||
|
||||
// device_image_interface implementation
|
||||
virtual std::pair<std::error_condition, std::string> call_load() override;
|
||||
virtual void call_unload() override;
|
||||
@ -96,10 +99,6 @@ public:
|
||||
|
||||
void set_intf(const char * interface) { m_interface = interface; }
|
||||
|
||||
// reading and writing
|
||||
uint8_t read_cart(offs_t offset);
|
||||
void write_cart(offs_t offset, uint8_t data);
|
||||
|
||||
protected:
|
||||
// device_t implementation
|
||||
virtual void device_start() override;
|
||||
@ -107,6 +106,7 @@ protected:
|
||||
const char *m_interface;
|
||||
int m_type;
|
||||
device_pce_cart_interface *m_cart;
|
||||
required_address_space m_address_space;
|
||||
};
|
||||
|
||||
|
||||
|
@ -55,7 +55,9 @@ Super System Card:
|
||||
#include "emu.h"
|
||||
#include "pce.h"
|
||||
|
||||
#include "bus/pce/pce_acard.h"
|
||||
#include "bus/pce/pce_rom.h"
|
||||
#include "bus/pce/pce_scdsys.h"
|
||||
#include "cpu/h6280/h6280.h"
|
||||
#include "sound/cdda.h"
|
||||
#include "sound/msm5205.h"
|
||||
@ -74,18 +76,12 @@ static INPUT_PORTS_START( pce )
|
||||
//PORT_START("JOY_P.1")
|
||||
// pachinko controller paddle maps here (!?) with this arrangement
|
||||
//PORT_BIT( 0xff, 0x00, IPT_PADDLE ) PORT_MINMAX(0,0x5f) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_CODE_DEC(KEYCODE_N) PORT_CODE_INC(KEYCODE_M)
|
||||
|
||||
PORT_START("A_CARD")
|
||||
PORT_CONFNAME( 0x01, 0x01, "Arcade Card" )
|
||||
PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
|
||||
PORT_CONFSETTING( 0x01, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
|
||||
void pce_state::pce_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x0FFFFF).rw(m_cartslot, FUNC(pce_cart_slot_device::read_cart), FUNC(pce_cart_slot_device::write_cart));
|
||||
map(0x100000, 0x10FFFF).ram().share("cd_ram");
|
||||
map(0x110000, 0x1EDFFF).noprw();
|
||||
map(0x1EE000, 0x1EE7FF).rw(m_cd, FUNC(pce_cd_device::bram_r), FUNC(pce_cd_device::bram_w));
|
||||
@ -104,7 +100,6 @@ void pce_state::pce_io(address_map &map)
|
||||
|
||||
void pce_state::sgx_mem(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x0FFFFF).rw(m_cartslot, FUNC(pce_cart_slot_device::read_cart), FUNC(pce_cart_slot_device::write_cart));
|
||||
map(0x100000, 0x10FFFF).ram().share("cd_ram");
|
||||
map(0x110000, 0x1EDFFF).noprw();
|
||||
map(0x1EE000, 0x1EE7FF).rw(m_cd, FUNC(pce_cd_device::bram_r), FUNC(pce_cd_device::bram_w));
|
||||
@ -134,11 +129,13 @@ uint32_t pce_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c
|
||||
static void pce_cart(device_slot_interface &device)
|
||||
{
|
||||
device.option_add_internal("rom", PCE_ROM_STD);
|
||||
device.option_add_internal("cdsys3u", PCE_ROM_CDSYS3);
|
||||
device.option_add_internal("cdsys3j", PCE_ROM_CDSYS3);
|
||||
device.option_add_internal("cdsys3u", PCE_ROM_CDSYS3U);
|
||||
device.option_add_internal("cdsys3j", PCE_ROM_CDSYS3J);
|
||||
device.option_add_internal("populous", PCE_ROM_POPULOUS);
|
||||
device.option_add_internal("sf2", PCE_ROM_SF2);
|
||||
device.option_add_internal("tennokoe", PCE_ROM_TENNOKOE);
|
||||
device.option_add_internal("acard_duo", PCE_ROM_ACARD_DUO);
|
||||
device.option_add_internal("acard_pro", PCE_ROM_ACARD_PRO);
|
||||
}
|
||||
|
||||
void pce_state::pce_common(machine_config &config)
|
||||
@ -177,6 +174,8 @@ void pce_state::pce_common(machine_config &config)
|
||||
|
||||
// TODO: expansion port not emulated
|
||||
PCE_CD(config, m_cd, 0);
|
||||
m_cd->irq().set_inputline(m_maincpu, 1);
|
||||
m_cd->set_maincpu(m_maincpu);
|
||||
|
||||
SOFTWARE_LIST(config, "cd_list").set_original("pcecd");
|
||||
}
|
||||
@ -186,6 +185,7 @@ void pce_state::pce(machine_config &config)
|
||||
{
|
||||
pce_common(config);
|
||||
PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "pce_cart").set_must_be_loaded(true);
|
||||
m_cartslot->set_address_space(m_maincpu, AS_PROGRAM);
|
||||
SOFTWARE_LIST(config, "cart_list").set_original("pce");
|
||||
|
||||
// bundled pad (in white PC engine) has not support autofire
|
||||
@ -196,6 +196,7 @@ void pce_state::tg16(machine_config &config)
|
||||
{
|
||||
pce_common(config);
|
||||
PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "tg16_cart").set_must_be_loaded(true);
|
||||
m_cartslot->set_address_space(m_maincpu, AS_PROGRAM);
|
||||
SOFTWARE_LIST(config, "cart_list").set_original("tg16");
|
||||
|
||||
// turbo pad bundled
|
||||
@ -257,11 +258,14 @@ void pce_state::sgx(machine_config &config)
|
||||
PCE_CONTROL_PORT(config, m_port_ctrl, pce_control_port_devices, "joypad2_turbo");
|
||||
|
||||
PCE_CART_SLOT(config, m_cartslot, pce_cart, nullptr, "pce_cart").set_must_be_loaded(true);
|
||||
m_cartslot->set_address_space(m_maincpu, AS_PROGRAM);
|
||||
SOFTWARE_LIST(config, "cart_list").set_original("sgx");
|
||||
SOFTWARE_LIST(config, "pce_list").set_compatible("pce");
|
||||
|
||||
// TODO: expansion port not emulated
|
||||
PCE_CD(config, m_cd, 0);
|
||||
m_cd->irq().set_inputline(m_maincpu, 1);
|
||||
m_cd->set_maincpu(m_maincpu);
|
||||
|
||||
SOFTWARE_LIST(config, "cd_list").set_original("pcecd");
|
||||
}
|
||||
|
@ -44,8 +44,7 @@ public:
|
||||
m_huc6260(*this, "huc6260"),
|
||||
m_cartslot(*this, "cartslot"),
|
||||
m_cd(*this, "pce_cd"),
|
||||
m_port_ctrl(*this, "ctrl"),
|
||||
m_a_card(*this, "A_CARD")
|
||||
m_port_ctrl(*this, "ctrl")
|
||||
{ }
|
||||
|
||||
void init_tg16();
|
||||
@ -67,17 +66,12 @@ private:
|
||||
required_device<pce_cart_slot_device> m_cartslot;
|
||||
optional_device<pce_cd_device> m_cd;
|
||||
required_device<pce_control_port_device> m_port_ctrl;
|
||||
required_ioport m_a_card;
|
||||
|
||||
u8 m_io_port_options = 0;
|
||||
u8 m_sys3_card = 0;
|
||||
u8 m_acard = 0;
|
||||
void controller_w(u8 data);
|
||||
u8 controller_r();
|
||||
void cd_intf_w(offs_t offset, u8 data);
|
||||
u8 cd_intf_r(offs_t offset);
|
||||
u8 acard_wram_r(offs_t offset);
|
||||
void acard_wram_w(offs_t offset, u8 data);
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void pce_io(address_map &map);
|
||||
void pce_mem(address_map &map);
|
||||
|
@ -83,7 +83,8 @@ pce_cd_device::pce_cd_device(const machine_config &mconfig, const char *tag, dev
|
||||
: device_t(mconfig, PCE_CD, tag, owner, clock)
|
||||
, device_memory_interface(mconfig, *this)
|
||||
, m_space_config("io", ENDIANNESS_LITTLE, 8, 4, 0, address_map_constructor(FUNC(pce_cd_device::regs_map), this))
|
||||
, m_maincpu(*this, ":maincpu")
|
||||
, m_maincpu(*this, finder_base::DUMMY_TAG)
|
||||
, m_irq_cb(*this)
|
||||
, m_msm(*this, "msm5205")
|
||||
, m_cdda(*this, "cdda")
|
||||
, m_nvram(*this, "bram")
|
||||
@ -116,9 +117,6 @@ void pce_cd_device::device_start()
|
||||
m_command_buffer = make_unique_clear<uint8_t[]>(PCE_CD_COMMAND_BUFFER_SIZE);
|
||||
m_command_buffer_index = 0;
|
||||
|
||||
/* Set up Arcade Card RAM buffer */
|
||||
m_acard_ram = make_unique_clear<uint8_t[]>(PCE_ACARD_RAM_SIZE);
|
||||
|
||||
m_data_buffer = make_unique_clear<uint8_t[]>(8192);
|
||||
m_data_buffer_size = 0;
|
||||
m_data_buffer_index = 0;
|
||||
@ -180,14 +178,6 @@ void pce_cd_device::device_start()
|
||||
save_item(NAME(m_data_buffer_size));
|
||||
save_item(NAME(m_data_buffer_index));
|
||||
save_item(NAME(m_data_transferred));
|
||||
save_pointer(NAME(m_acard_ram), PCE_ACARD_RAM_SIZE);
|
||||
save_item(NAME(m_acard_latch));
|
||||
save_item(NAME(m_acard_ctrl));
|
||||
save_item(NAME(m_acard_base_addr));
|
||||
save_item(NAME(m_acard_addr_offset));
|
||||
save_item(NAME(m_acard_addr_inc));
|
||||
save_item(NAME(m_acard_shift));
|
||||
save_item(NAME(m_acard_shift_reg));
|
||||
save_item(NAME(m_current_frame));
|
||||
save_item(NAME(m_end_frame));
|
||||
save_item(NAME(m_last_frame));
|
||||
@ -1085,11 +1075,11 @@ void pce_cd_device::set_irq_line(int num, int state)
|
||||
, m_irq_mask & 0x7c
|
||||
, m_irq_status & 0x7c
|
||||
);
|
||||
m_maincpu->set_input_line(1, ASSERT_LINE);
|
||||
m_irq_cb(ASSERT_LINE);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_maincpu->set_input_line(1, CLEAR_LINE);
|
||||
m_irq_cb(CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1317,10 +1307,12 @@ uint8_t pce_cd_device::irq_status_r()
|
||||
{
|
||||
uint8_t res = m_irq_status & 0x6e;
|
||||
// a read here locks the BRAM
|
||||
m_bram_locked = 1;
|
||||
if (!machine().side_effects_disabled())
|
||||
m_bram_locked = 1;
|
||||
res |= (m_cd_motor_on ? 0x10 : 0);
|
||||
// TODO: gross hack, needs actual behaviour of CDDA data select
|
||||
m_irq_status ^= 0x02;
|
||||
if (!machine().side_effects_disabled())
|
||||
m_irq_status ^= 0x02;
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -1664,7 +1656,8 @@ uint8_t pce_cd_device::get_adpcm_ram_byte()
|
||||
{
|
||||
if (m_adpcm_read_buf > 0)
|
||||
{
|
||||
m_adpcm_read_buf--;
|
||||
if (!machine().side_effects_disabled())
|
||||
m_adpcm_read_buf--;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
@ -1672,7 +1665,8 @@ uint8_t pce_cd_device::get_adpcm_ram_byte()
|
||||
uint8_t res;
|
||||
|
||||
res = m_adpcm_ram[m_adpcm_read_ptr];
|
||||
m_adpcm_read_ptr = ((m_adpcm_read_ptr + 1) & 0xffff);
|
||||
if (!machine().side_effects_disabled())
|
||||
m_adpcm_read_ptr = ((m_adpcm_read_ptr + 1) & 0xffff);
|
||||
|
||||
return res;
|
||||
}
|
||||
@ -1700,154 +1694,3 @@ void pce_cd_device::intf_w(offs_t offset, uint8_t data)
|
||||
address_space &io_space = this->space(AS_IO);
|
||||
io_space.write_byte(offset & 0xf, data);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* PC Engine Arcade Card emulation
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
uint8_t pce_cd_device::acard_r(offs_t offset)
|
||||
{
|
||||
uint8_t r_num;
|
||||
|
||||
if ((offset & 0x2e0) == 0x2e0)
|
||||
{
|
||||
switch (offset & 0x2ef)
|
||||
{
|
||||
case 0x2e0: return (m_acard_shift >> 0) & 0xff;
|
||||
case 0x2e1: return (m_acard_shift >> 8) & 0xff;
|
||||
case 0x2e2: return (m_acard_shift >> 16) & 0xff;
|
||||
case 0x2e3: return (m_acard_shift >> 24) & 0xff;
|
||||
case 0x2e4: return (m_acard_shift_reg);
|
||||
case 0x2e5: return m_acard_latch;
|
||||
case 0x2ee: return 0x10;
|
||||
case 0x2ef: return 0x51;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
r_num = (offset & 0x30) >> 4;
|
||||
|
||||
switch (offset & 0x0f)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
{
|
||||
uint8_t res;
|
||||
if (m_acard_ctrl[r_num] & 2)
|
||||
res = m_acard_ram[(m_acard_base_addr[r_num] + m_acard_addr_offset[r_num]) & 0x1fffff];
|
||||
else
|
||||
res = m_acard_ram[m_acard_base_addr[r_num] & 0x1fffff];
|
||||
|
||||
if (m_acard_ctrl[r_num] & 0x1)
|
||||
{
|
||||
if (m_acard_ctrl[r_num] & 0x10)
|
||||
{
|
||||
m_acard_base_addr[r_num] += m_acard_addr_inc[r_num];
|
||||
m_acard_base_addr[r_num] &= 0xffffff;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_acard_addr_offset[r_num] += m_acard_addr_inc[r_num];
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
case 0x02: return (m_acard_base_addr[r_num] >> 0) & 0xff;
|
||||
case 0x03: return (m_acard_base_addr[r_num] >> 8) & 0xff;
|
||||
case 0x04: return (m_acard_base_addr[r_num] >> 16) & 0xff;
|
||||
case 0x05: return (m_acard_addr_offset[r_num] >> 0) & 0xff;
|
||||
case 0x06: return (m_acard_addr_offset[r_num] >> 8) & 0xff;
|
||||
case 0x07: return (m_acard_addr_inc[r_num] >> 0) & 0xff;
|
||||
case 0x08: return (m_acard_addr_inc[r_num] >> 8) & 0xff;
|
||||
case 0x09: return m_acard_ctrl[r_num];
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void pce_cd_device::acard_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
uint8_t w_num;
|
||||
|
||||
if ((offset & 0x2e0) == 0x2e0)
|
||||
{
|
||||
switch (offset & 0x0f)
|
||||
{
|
||||
case 0: m_acard_shift = (data & 0xff) | (m_acard_shift & 0xffffff00); break;
|
||||
case 1: m_acard_shift = (data << 8) | (m_acard_shift & 0xffff00ff); break;
|
||||
case 2: m_acard_shift = (data << 16) | (m_acard_shift & 0xff00ffff); break;
|
||||
case 3: m_acard_shift = (data << 24) | (m_acard_shift & 0x00ffffff); break;
|
||||
case 4:
|
||||
{
|
||||
m_acard_shift_reg = data & 0x0f;
|
||||
|
||||
if (m_acard_shift_reg != 0)
|
||||
{
|
||||
m_acard_shift = (m_acard_shift_reg < 8) ?
|
||||
(m_acard_shift << m_acard_shift_reg)
|
||||
: (m_acard_shift >> (16 - m_acard_shift_reg));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 5: m_acard_latch = data; break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
w_num = (offset & 0x30) >> 4;
|
||||
|
||||
switch (offset & 0x0f)
|
||||
{
|
||||
case 0x00:
|
||||
case 0x01:
|
||||
if (m_acard_ctrl[w_num] & 2)
|
||||
m_acard_ram[(m_acard_base_addr[w_num] + m_acard_addr_offset[w_num]) & 0x1fffff] = data;
|
||||
else
|
||||
m_acard_ram[m_acard_base_addr[w_num] & 0x1FFFFF] = data;
|
||||
|
||||
if (m_acard_ctrl[w_num] & 0x1)
|
||||
{
|
||||
if (m_acard_ctrl[w_num] & 0x10)
|
||||
{
|
||||
m_acard_base_addr[w_num] += m_acard_addr_inc[w_num];
|
||||
m_acard_base_addr[w_num] &= 0xffffff;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_acard_addr_offset[w_num] += m_acard_addr_inc[w_num];
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 0x02: m_acard_base_addr[w_num] = (data & 0xff) | (m_acard_base_addr[w_num] & 0xffff00); break;
|
||||
case 0x03: m_acard_base_addr[w_num] = (data << 8) | (m_acard_base_addr[w_num] & 0xff00ff); break;
|
||||
case 0x04: m_acard_base_addr[w_num] = (data << 16) | (m_acard_base_addr[w_num] & 0x00ffff); break;
|
||||
case 0x05: m_acard_addr_offset[w_num] = (data & 0xff) | (m_acard_addr_offset[w_num] & 0xff00); break;
|
||||
case 0x06:
|
||||
m_acard_addr_offset[w_num] = (data << 8) | (m_acard_addr_offset[w_num] & 0x00ff);
|
||||
|
||||
if ((m_acard_ctrl[w_num] & 0x60) == 0x40)
|
||||
{
|
||||
m_acard_base_addr[w_num] += m_acard_addr_offset[w_num] + ((m_acard_ctrl[w_num] & 0x08) ? 0xff0000 : 0);
|
||||
m_acard_base_addr[w_num] &= 0xffffff;
|
||||
}
|
||||
break;
|
||||
case 0x07: m_acard_addr_inc[w_num] = (data & 0xff) | (m_acard_addr_inc[w_num] & 0xff00); break;
|
||||
case 0x08: m_acard_addr_inc[w_num] = (data << 8) | (m_acard_addr_inc[w_num] & 0x00ff); break;
|
||||
case 0x09: m_acard_ctrl[w_num] = data & 0x7f; break;
|
||||
case 0x0a:
|
||||
if ((m_acard_ctrl[w_num] & 0x60) == 0x60)
|
||||
{
|
||||
m_acard_base_addr[w_num] += m_acard_addr_offset[w_num];
|
||||
m_acard_base_addr[w_num] &= 0xffffff;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -47,16 +47,18 @@ public:
|
||||
// construction/destruction
|
||||
pce_cd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// configuration
|
||||
template <typename T> void set_maincpu(T &&tag) { m_maincpu.set_tag(std::forward<T>(tag)); }
|
||||
auto irq() { return m_irq_cb.bind(); }
|
||||
|
||||
void update();
|
||||
|
||||
void late_setup();
|
||||
|
||||
void bram_w(offs_t offset, uint8_t data);
|
||||
void intf_w(offs_t offset, uint8_t data);
|
||||
void acard_w(offs_t offset, uint8_t data);
|
||||
uint8_t bram_r(offs_t offset);
|
||||
uint8_t intf_r(offs_t offset);
|
||||
uint8_t acard_r(offs_t offset);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
@ -135,6 +137,7 @@ private:
|
||||
TIMER_CALLBACK_MEMBER(adpcm_dma_timer_callback);
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
devcb_write_line m_irq_cb;
|
||||
|
||||
std::unique_ptr<uint8_t[]> m_bram;
|
||||
std::unique_ptr<uint8_t[]> m_adpcm_ram;
|
||||
@ -175,16 +178,6 @@ private:
|
||||
int m_data_buffer_index = 0;
|
||||
int m_data_transferred = 0;
|
||||
|
||||
/* Arcade Card specific */
|
||||
std::unique_ptr<uint8_t[]> m_acard_ram;
|
||||
uint8_t m_acard_latch = 0;
|
||||
uint8_t m_acard_ctrl[4];
|
||||
uint32_t m_acard_base_addr[4];
|
||||
uint16_t m_acard_addr_offset[4];
|
||||
uint16_t m_acard_addr_inc[4];
|
||||
uint32_t m_acard_shift = 0;
|
||||
uint8_t m_acard_shift_reg = 0;
|
||||
|
||||
uint32_t m_current_frame = 0;
|
||||
uint32_t m_end_frame = 0;
|
||||
uint32_t m_last_frame = 0;
|
||||
|
@ -29,26 +29,10 @@ void pce_state::machine_start()
|
||||
// saving is only partially supported: it should be fine with cart games
|
||||
// OTOH CD states are saved but not correctly restored!
|
||||
save_item(NAME(m_io_port_options));
|
||||
save_item(NAME(m_acard));
|
||||
}
|
||||
|
||||
void pce_state::machine_reset()
|
||||
{
|
||||
/* Note: Arcade Card BIOS contents are the same as System 3, only internal HW differs.
|
||||
We use a category to select between modes (some games can be run in either S-CD or A-CD modes) */
|
||||
m_acard = m_a_card->read() & 1;
|
||||
|
||||
if (m_cartslot->get_type() == PCE_CDSYS3J)
|
||||
{
|
||||
m_sys3_card = 1;
|
||||
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x080000, 0x087fff, read8sm_delegate(*this, FUNC(pce_state::acard_wram_r)), write8sm_delegate(*this, FUNC(pce_state::acard_wram_w)));
|
||||
}
|
||||
|
||||
if (m_cartslot->get_type() == PCE_CDSYS3U)
|
||||
{
|
||||
m_sys3_card = 3;
|
||||
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x080000, 0x087fff, read8sm_delegate(*this, FUNC(pce_state::acard_wram_r)), write8sm_delegate(*this, FUNC(pce_state::acard_wram_w)));
|
||||
}
|
||||
}
|
||||
|
||||
void pce_state::controller_w(u8 data)
|
||||
@ -72,9 +56,6 @@ void pce_state::cd_intf_w(offs_t offset, u8 data)
|
||||
{
|
||||
m_cd->update();
|
||||
|
||||
if (offset & 0x200 && m_sys3_card && m_acard) // route Arcade Card handling ports
|
||||
return m_cd->acard_w(offset, data);
|
||||
|
||||
m_cd->intf_w(offset, data);
|
||||
|
||||
m_cd->update();
|
||||
@ -84,32 +65,5 @@ u8 pce_state::cd_intf_r(offs_t offset)
|
||||
{
|
||||
m_cd->update();
|
||||
|
||||
if (offset & 0x200 && m_sys3_card && m_acard) // route Arcade Card handling ports
|
||||
return m_cd->acard_r(offset);
|
||||
|
||||
if ((offset & 0xc0) == 0xc0 && m_sys3_card) //System 3 Card header handling
|
||||
{
|
||||
switch (offset & 0xcf)
|
||||
{
|
||||
case 0xc1: return 0xaa;
|
||||
case 0xc2: return 0x55;
|
||||
case 0xc3: return 0x00;
|
||||
case 0xc5: return (m_sys3_card & 2) ? 0x55 : 0xaa;
|
||||
case 0xc6: return (m_sys3_card & 2) ? 0xaa : 0x55;
|
||||
case 0xc7: return 0x03;
|
||||
}
|
||||
}
|
||||
|
||||
return m_cd->intf_r(offset);
|
||||
}
|
||||
|
||||
|
||||
u8 pce_state::acard_wram_r(offs_t offset)
|
||||
{
|
||||
return cd_intf_r(0x200 | (offset & 0x6000) >> 9);
|
||||
}
|
||||
|
||||
void pce_state::acard_wram_w(offs_t offset, u8 data)
|
||||
{
|
||||
cd_intf_w(0x200 | (offset & 0x6000) >> 9, data);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user