mirror of
https://github.com/holub/mame
synced 2025-06-10 14:52:42 +03:00
Cleanups and version bump
This commit is contained in:
parent
a4dd32afb6
commit
c93ed344fb
@ -1318,8 +1318,8 @@ the buttons not work in emulators.
|
||||
</software>
|
||||
|
||||
<!--
|
||||
The code has some race conditions for NMIs (related to input readings)
|
||||
and often fails to boot on real systems too. To successfully start the
|
||||
The code has some race conditions for NMIs (related to input readings)
|
||||
and often fails to boot on real systems too. To successfully start the
|
||||
game, you can keep pressed Button 1 during Atari logo (thanks to Mike
|
||||
Saarna for debugging the problem)
|
||||
-->
|
||||
@ -2369,7 +2369,7 @@ almost nothing like the prototype.
|
||||
|
||||
<!-- This version features a lot *LESS* sounds than the newer version:
|
||||
e.g. no sound in bobsled ans ski jump games!
|
||||
Dump is confirmed from multiple carts, and it was probably used in
|
||||
Dump is confirmed from multiple carts, and it was probably used in
|
||||
some erlier production run, until they found out the mistake and
|
||||
replaced it with the complete version -->
|
||||
<software name="wingameso" cloneof="wingames">
|
||||
|
@ -31,9 +31,9 @@
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
|
||||
<!-- A3000 Installation disks -->
|
||||
|
||||
|
||||
<software name="a3kin203">
|
||||
<description>A3000 Install Disk 2.03</description>
|
||||
<year>1991</year>
|
||||
@ -44,11 +44,11 @@
|
||||
<rom name="335603-04_install.adf" size="901120" crc="9a3cc466" sha1="b12a225890a3957bb01dcbfba44c046c19e19c8f" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<!-- Amiga UNIX System V Release 4 -->
|
||||
<!-- TODO: Part numbers -->
|
||||
|
||||
|
||||
<software name="amix11">
|
||||
<description>UNIX System V Release 4 Amiga Version 1.1</description>
|
||||
<year>1990</year>
|
||||
|
@ -12,7 +12,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="370132_a570_utilities.adf" size="901120" crc="30097474" sha1="958b97674e3e99fb9b0e3117009f27d4e7a9220b" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a590">
|
||||
@ -25,7 +25,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317734-01_a590_scsi.adf" size="901120" crc="a560a938" sha1="9c6136c6580779a948cd1c0b50cb229512af415c" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a590_wd" cloneof="a590">
|
||||
@ -40,7 +40,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317734-03_a590_wd.adf" size="901120" crc="a88fda41" sha1="7424f8645e1903e3e4ec8bb824186868319be1f3" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a590_seagate" cloneof="a590">
|
||||
@ -52,7 +52,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317734-04_a590_seagate.adf" size="901120" status="nodump" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a590_ram">
|
||||
@ -64,7 +64,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317830-01_a590_ram_test.adf" size="901120" crc="6583d1d0" sha1="7779b825b8555956d341ff7e909ab71d89e2321c" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a2024">
|
||||
@ -76,7 +76,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317809-01_a2024_jumpstart.adf" size="901120" crc="dad46588" sha1="30c2c1f1d98bd008b2c67f3b23480181935d4b01" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a2091">
|
||||
@ -90,7 +90,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317806-04_a2091_setup.adf" size="901120" crc="122c8f93" sha1="603e106c1a44a209171610af8d48bc35ad31c9bc" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a2058">
|
||||
@ -102,7 +102,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317719-01_a2058_ram_test.adf" size="901120" crc="5dba7fc3" sha1="76fbce4bef7df0f6042c85376d9bdfd4d4911e74" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a2232">
|
||||
@ -114,7 +114,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317769-01_a2232_install.adf" size="901120" crc="3caa21b7" sha1="24f47f6f88712f046303b8812a598043440a5e6d" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a2300">
|
||||
@ -126,7 +126,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317718-02_a2300_genlock_demo.adf" size="901120" crc="464ff0f6" sha1="26b94e8d52d35e2746b74610bb9b65eb2f899297" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="a2320">
|
||||
@ -138,7 +138,7 @@
|
||||
<dataarea name="flop" size="901120">
|
||||
<rom name="317210-01_a2320_test_demo.adf" size="901120" crc="cff98aae" sha1="f46f7de0d908ed68abfd784d84b964cbce7dc503" offset="0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</softwarelist>
|
||||
|
@ -437,7 +437,7 @@
|
||||
|
||||
<software name="choplift">
|
||||
<!-- Choplifter (1984)(Coleco)[a].bin -->
|
||||
<!-- Other available dump has corrupted gfx -->
|
||||
<!-- Other available dump has corrupted gfx -->
|
||||
<description>Choplifter!</description>
|
||||
<year>1984</year>
|
||||
<publisher>Coleco / CBS</publisher>
|
||||
@ -699,7 +699,7 @@
|
||||
<part name="cart" interface="coleco_cart">
|
||||
<dataarea name="rom" size="16384">
|
||||
<rom name="apshai.1" size="8192" crc="aa3ec181" sha1="7f79628c298ad6e410af82eeb33871869ad23de8" offset="0x0000" />
|
||||
<!-- 2nd 8K chunk containes two copies of the same 4K data -->
|
||||
<!-- 2nd 8K chunk containes two copies of the same 4K data -->
|
||||
<rom name="apshai.2" size="8192" crc="0e440f8f" sha1="09ffaeb79cdd8173882b77a8398a4e00ba826de1" offset="0x2000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
@ -2262,7 +2262,7 @@
|
||||
<dataarea name="rom" size="24576">
|
||||
<rom name="subroc.1" size="8192" crc="ff56b769" sha1="612a0abd13c4c7790890cbcb265a7fd786c7ec5c" offset="0x0000" />
|
||||
<rom name="subroc.2" size="8192" crc="e9e60d4c" sha1="bfc94db65985b7a906099465a47d900f7a9a9106" offset="0x2000" />
|
||||
<!-- 3rd 8K chunk containes two copies of the same 4K data -->
|
||||
<!-- 3rd 8K chunk containes two copies of the same 4K data -->
|
||||
<rom name="subroc.3" size="8192" crc="abe18f08" sha1="6ebdc68397c7b20dceba12ff754f88c955d5f98a" offset="0x4000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
@ -2369,9 +2369,9 @@
|
||||
</software>
|
||||
|
||||
<software name="zaxxont" cloneof="zaxxon">
|
||||
<!-- The Taiwan Cooper cart contains a 32K ROM, the last 8K of which was found to
|
||||
contain 0x4000-0x4fff from Super Action Baseball followed by 0x1000-0x1fff
|
||||
from Meteoric Shower! -->
|
||||
<!-- The Taiwan Cooper cart contains a 32K ROM, the last 8K of which was found to
|
||||
contain 0x4000-0x4fff from Super Action Baseball followed by 0x1000-0x1fff
|
||||
from Meteoric Shower! -->
|
||||
<description>Zaxxon (Taiwan Cooper)</description>
|
||||
<year>198?</year>
|
||||
<publisher>Taiwan Cooper</publisher>
|
||||
|
@ -1657,7 +1657,7 @@ Titles, serial #s, publishers and release dates taken from:
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
|
||||
<software name="mdos7_09">
|
||||
<description>M-DOS7 Volume 9</description>
|
||||
<year>19??</year>
|
||||
|
@ -2,8 +2,8 @@
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<softwarelist name="fmtowns" description="FM Towns CD-ROMs">
|
||||
<!-- skeleton test list -->
|
||||
|
||||
<!-- works well on fmtmarty, keyboard seems to interfere with movements on fmtowns -->
|
||||
|
||||
<!-- works well on fmtmarty, keyboard seems to interfere with movements on fmtowns -->
|
||||
<software name="raiden">
|
||||
<description>Raiden Densetsu / Raiden Trad</description>
|
||||
<year>1991</year>
|
||||
|
@ -768,9 +768,9 @@ A few games have been listed as rumored, but they might very well be fake (pleas
|
||||
</software>
|
||||
|
||||
<!-- some disassembling performed by Paul Baker suggests that this version is a prototype
|
||||
e.g. the mapper control register at $fffc gets set to $80, you cannot switch characters
|
||||
on the pause screen, some messages are not displayed ("Sorry boys, no tickets, no show!"
|
||||
to explain why it is not possible to progress beyond a certain point in the game without
|
||||
e.g. the mapper control register at $fffc gets set to $80, you cannot switch characters
|
||||
on the pause screen, some messages are not displayed ("Sorry boys, no tickets, no show!"
|
||||
to explain why it is not possible to progress beyond a certain point in the game without
|
||||
a certain item) -->
|
||||
<software name="beavisp" cloneof="beavis">
|
||||
<description>Beavis and Butt-head (Prototype?)</description>
|
||||
@ -7285,7 +7285,7 @@ a certain item) -->
|
||||
</software>
|
||||
|
||||
<software name="soniclab">
|
||||
<!-- A final pre-release version of this same dump was found on a proto board with 4x128K sockets and no labels -->
|
||||
<!-- A final pre-release version of this same dump was found on a proto board with 4x128K sockets and no labels -->
|
||||
<description>Sonic Labyrinth (World)</description>
|
||||
<year>1995</year>
|
||||
<publisher>Sega</publisher>
|
||||
@ -7594,7 +7594,7 @@ a certain item) -->
|
||||
</software>
|
||||
|
||||
<software name="sonic2d" cloneof="sonic2">
|
||||
<!-- This predates the final release and contains some different tiles & sprites compared to the final game -->
|
||||
<!-- This predates the final release and contains some different tiles & sprites compared to the final game -->
|
||||
<description>Sonic The Hedgehog 2 (Rolling Demo)</description>
|
||||
<year>1992</year>
|
||||
<publisher>Sega</publisher>
|
||||
@ -7609,7 +7609,7 @@ a certain item) -->
|
||||
<feature name="batt" value="" />
|
||||
<feature name="sw" value="ON = 1M / OFF = 256" />
|
||||
<dataarea name="rom" size="262144">
|
||||
<!-- The ROM should be split in two halves -->
|
||||
<!-- The ROM should be split in two halves -->
|
||||
<rom name="sonic_2_auto_demo_prototype_(1991-12-05)_tmr_sega_cb06_ffff.bin" size="262144" crc="15ad37a5" sha1="b780c6f059b48d1bb48ee2ad521552dab1487c88" offset="000000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
@ -8634,7 +8634,7 @@ a certain item) -->
|
||||
</software>
|
||||
|
||||
<software name="tailsadv">
|
||||
<!-- A final pre-release version of this same dump was found on a proto board with 4x128K sockets and no labels -->
|
||||
<!-- A final pre-release version of this same dump was found on a proto board with 4x128K sockets and no labels -->
|
||||
<description>Tails Adventures (World)</description>
|
||||
<year>1995</year>
|
||||
<publisher>Sega</publisher>
|
||||
|
@ -4,7 +4,7 @@
|
||||
<!-- dumps are not yet verified as good, the 3-in-1 internal ROM is not yet dumped -->
|
||||
|
||||
<softwarelist name="gameking" description="TimeTop GameKing cartridges">
|
||||
|
||||
|
||||
<software name="2004">
|
||||
<description>2004</description>
|
||||
<year>200?</year>
|
||||
@ -25,7 +25,7 @@
|
||||
<rom name="adventure legend carlo.bin" size="0x20000" crc="7d61d215" sha1="741684b5379d4be732a98beace5d09f37ff19bbf" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="aries">
|
||||
<description>Aries</description>
|
||||
@ -36,7 +36,7 @@
|
||||
<rom name="aries.bin" size="0x20000" crc="b854f1f2" sha1="1ad7a325aba2cf3593165b53e7ae3973388335f7" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="dinoadv">
|
||||
<description>Dino Adventure Legend</description>
|
||||
@ -47,7 +47,7 @@
|
||||
<rom name="dino adventure legend.bin" size="0x20000" crc="2df0c1e6" sha1="df4b5dc80a758d9e3c9b00384e3099ad8331faad" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="duckman">
|
||||
<description>Duck Man</description>
|
||||
@ -58,7 +58,7 @@
|
||||
<rom name="duck man.bin" size="0x20000" crc="9d12950a" sha1="376606097f66105d1a9e97e9793362f6f1e3b1a7" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="happybal">
|
||||
<description>Happy Ball</description>
|
||||
@ -69,7 +69,7 @@
|
||||
<rom name="happy ball.bin" size="0x20000" crc="79d4e738" sha1="fc14712260ed6e3d6313055046546d37b7c838d2" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="happykil">
|
||||
<description>Happy Killer</description>
|
||||
@ -80,7 +80,7 @@
|
||||
<rom name="happy killer.bin" size="0x20000" crc="9fd7ec65" sha1="705309829ee87689793c15be1f781d52471908d6" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="lanner">
|
||||
<description>Lanneret</description>
|
||||
@ -91,7 +91,7 @@
|
||||
<rom name="lanneret.bin" size="0x20000" crc="249df6a5" sha1="bcf92ab85cc97ffe94d6a363a87b0b5de62c3c66" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="penguin">
|
||||
<description>Penguin</description>
|
||||
@ -102,8 +102,8 @@
|
||||
<rom name="penguin.bin" size="0x20000" crc="8c7b81c9" sha1="2f253b6ab6f6b9fc114ffca120d13df2e1e5f860" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</software>
|
||||
|
||||
<software name="popper">
|
||||
<description>Popper</description>
|
||||
<year>200?</year>
|
||||
@ -113,7 +113,7 @@
|
||||
<rom name="popper.bin" size="0x20000" crc="a704617b" sha1="314931548578303e5e80a2bcb03c92472cb014d9" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="sthero">
|
||||
<description>Street Hero</description>
|
||||
@ -124,8 +124,8 @@
|
||||
<rom name="street hero.bin" size="0x20000" crc="9e0fe489" sha1="2c442126999e4b112a48e42a82dfa9ad9d6efa22" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</software>
|
||||
|
||||
<software name="smotor">
|
||||
<description>Supermotor</description>
|
||||
<year>200?</year>
|
||||
@ -135,7 +135,7 @@
|
||||
<rom name="supermotor.bin" size="0x20000" crc="6290b94b" sha1="0c3011da35170241637907bb23d79355db38f343" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
<software name="trojanl">
|
||||
<description>Trojan Legend</description>
|
||||
@ -146,8 +146,8 @@
|
||||
<rom name="trojan legend.bin" size="0x20000" crc="7ce3975e" sha1="e925e4f28efc85ce69fb504b85a98a60883aa30d" offset="0x00000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</software>
|
||||
|
||||
|
||||
|
||||
|
||||
</softwarelist>
|
||||
|
@ -23639,7 +23639,7 @@ These were produced between 2000 and 2001 by Rocket Games, run by Datel Design
|
||||
* CBA078 Shuma Baolong - Diannao Pian 数码暴龙-电脑篇
|
||||
* CBA079 Yingxiong Tianxia 英雄天下
|
||||
* CBA080 Sanguozhi Wudai 三国志五代
|
||||
* CBA083 Tai Kong Bao Bei 太空宝贝
|
||||
* CBA083 Tai Kong Bao Bei 太空宝贝
|
||||
* CBA085 Shu Ma Bao Bei - Huojian Bingtuan 数码宝贝-火箭兵团
|
||||
* CBA086 Shu Ma Bao Bei - Chao Mengmeng Fanji Zhan 数码宝贝-超梦梦反击战
|
||||
* CBA087 Shu Ma Bao Bei - Hai Zhi Shen 数码宝贝-海之神
|
||||
|
@ -100,7 +100,7 @@
|
||||
<dataarea name="D000" size="0x4000">
|
||||
<rom name="world series major league baseball.d0" size="0x4000" crc="839fa5c7" sha1="1ef12665079d1ce50bd2419b668344a08c9a872f" offset="0x0000"/>
|
||||
</dataarea>
|
||||
<!-- two ROM pages -->
|
||||
<!-- two ROM pages -->
|
||||
<dataarea name="F000" size="0x4000">
|
||||
<rom name="world series major league baseball (page 0).f0" size="0x2000" crc="a0f2fe49" sha1="fab397b49c5a7db53a501caea42fce169da5a31a" offset="0x0000"/>
|
||||
<rom name="world series major league baseball (page 1).f0" size="0x2000" crc="94d6b056" sha1="df2a8c950dd1c398db901a624c04322d2b4f2782" offset="0x2000"/>
|
||||
|
@ -14536,12 +14536,12 @@ kept for now until finding out what those bytes affect...
|
||||
<feature name="mapper" value="NOMAPPER" />
|
||||
<dataarea name="rom" size="131072">
|
||||
<!--
|
||||
20140725:
|
||||
There are 3 versions of this rom floating around:
|
||||
930eae7057af1652abae794072b296a59decd61b - a "dirty" dump; it seems to be a direct memory copy made on an MSX and contains RAM contents at 3000-3FFF and 7000-7FFF
|
||||
a45692849acf29ddb653707a62747985439f6d4f - RAM areas are set to FFs
|
||||
36d47cf70618fdb460f97a8ceb75013ec4529063 - A dump made using an eeprom reader. This dump differs one bit with the dump above (offset 8a49, bit 3)
|
||||
By looking the code it is not yet possible to say which one is 100% correct, so marking it as baddump for the moment.
|
||||
20140725:
|
||||
There are 3 versions of this rom floating around:
|
||||
930eae7057af1652abae794072b296a59decd61b - a "dirty" dump; it seems to be a direct memory copy made on an MSX and contains RAM contents at 3000-3FFF and 7000-7FFF
|
||||
a45692849acf29ddb653707a62747985439f6d4f - RAM areas are set to FFs
|
||||
36d47cf70618fdb460f97a8ceb75013ec4529063 - A dump made using an eeprom reader. This dump differs one bit with the dump above (offset 8a49, bit 3)
|
||||
By looking the code it is not yet possible to say which one is 100% correct, so marking it as baddump for the moment.
|
||||
-->
|
||||
<rom name="msx audio (japan) (fs-ca1) (program).rom" size="131072" crc="78584d2e" sha1="a45692849acf29ddb653707a62747985439f6d4f" status="baddump" offset="0" />
|
||||
</dataarea>
|
||||
@ -17109,8 +17109,8 @@ legacy FM implementations cannot find it.
|
||||
</part>
|
||||
<!-- The package came with a copy of MSX-DOS -->
|
||||
<!--
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
</part>
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
</part>
|
||||
-->
|
||||
</software>
|
||||
|
||||
@ -17126,9 +17126,9 @@ legacy FM implementations cannot find it.
|
||||
</dataarea>
|
||||
</part>
|
||||
<!--
|
||||
The floppy drive was most likely bundled with a copy of MSX-DOS, but we are not 100% sure yet
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
</part>
|
||||
The floppy drive was most likely bundled with a copy of MSX-DOS, but we are not 100% sure yet
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
</part>
|
||||
-->
|
||||
</software>
|
||||
|
||||
|
@ -35601,7 +35601,7 @@
|
||||
<feature name="pcb_model" value="NR8OV2-1" />
|
||||
<feature name="u1" value="U1 PRG" />
|
||||
<feature name="u2" value="U2 CHR" />
|
||||
<feature name="u3" value="CME-01" /> <!-- CIC clone? -->
|
||||
<feature name="u3" value="CME-01" /> <!-- CIC clone? -->
|
||||
<feature name="mirroring" value="vertical" />
|
||||
<dataarea name="prg" size="262144">
|
||||
<rom name="sup.adv.quest.u1" size="262144" crc="6a7bf037" sha1="22b430d7d4167f16751facd3515f7c8e1133a3d9" offset="00000" />
|
||||
|
@ -2,7 +2,7 @@
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<softwarelist name="pencil2" description="Hanimex Pencil II cartridges">
|
||||
|
||||
<!--
|
||||
<!--
|
||||
|
||||
Undumped known carts
|
||||
|
||||
@ -16,7 +16,7 @@ Zaxxon
|
||||
-->
|
||||
|
||||
|
||||
<!--
|
||||
<!--
|
||||
|
||||
BASIC CART PEN-700 11-50332-31 Rev.0
|
||||
SD-BASIC VERSION 2.0 FOR PENCIL II
|
||||
|
22
hash/psx.xml
22
hash/psx.xml
@ -704,9 +704,9 @@ A few comments on these:
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Redump.org sets -->
|
||||
|
||||
<software name="raidendx" supported="yes"> <!-- Hamster re-release) -->
|
||||
<!-- Redump.org sets -->
|
||||
|
||||
<software name="raidendx" supported="yes"> <!-- Hamster re-release) -->
|
||||
<description>Raiden DX (Japan, V1.1)</description>
|
||||
<year>199?</year>
|
||||
<publisher>Seibu / Hamster</publisher>
|
||||
@ -717,8 +717,8 @@ A few comments on these:
|
||||
</diskarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="raidendxo" cloneof="raidendx" supported="yes"> <!-- original release) -->
|
||||
|
||||
<software name="raidendxo" cloneof="raidendx" supported="yes"> <!-- original release) -->
|
||||
<description>Raiden DX (Japan, V1.0)</description>
|
||||
<year>199?</year>
|
||||
<publisher>Seibu</publisher>
|
||||
@ -729,7 +729,7 @@ A few comments on these:
|
||||
</diskarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
|
||||
<software name="raidenpr" supported="yes">
|
||||
<description>Raiden Project (USA)</description>
|
||||
<year>199?</year>
|
||||
@ -740,9 +740,9 @@ A few comments on these:
|
||||
<disk name="raiden project, the (usa)" sha1="cb1e4fae25d42e70fcb3eec5e1c1afcbdc5c2af3"/>
|
||||
</diskarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- this image doesn't boot, some kind of copy protection? could be bad -->
|
||||
</software>
|
||||
|
||||
<!-- this image doesn't boot, some kind of copy protection? could be bad -->
|
||||
<software name="raidenprj" cloneof="raidenpr" supported="no">
|
||||
<description>Raiden Project (Japan)</description>
|
||||
<year>1995</year>
|
||||
@ -753,8 +753,8 @@ A few comments on these:
|
||||
<disk name="raiden project (japan)" sha1="12ec8ee3117df1f95752dc65155a611f43725251"/>
|
||||
</diskarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</software>
|
||||
|
||||
<!-- Images below are 'low-grade' ie not dumped to any specific standard, or verified to be of any specific quality, they could have bad gaps or audio tracks etc. -->
|
||||
<!-- They should be replaced with better quality images once said images are available (and verified to be the same versions) -->
|
||||
|
||||
|
@ -235,7 +235,7 @@
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- TODO: add support for RAM in this cart (0xa000-0xffff) -->
|
||||
<!-- TODO: add support for RAM in this cart (0xa000-0xffff) -->
|
||||
<software name="rwp32" supported="no">
|
||||
<description>rWP32</description>
|
||||
<year>19??</year>
|
||||
|
@ -32,7 +32,7 @@
|
||||
7) When the format completes, type "RUN APPLESOFT BOOT PREP" and press Enter.
|
||||
8) Once it finishes, quit MESS. Remove the diskii(ng) from slot 7 and
|
||||
the system will boot into DOS 3.3 from the Corvus HD.
|
||||
|
||||
|
||||
TODO: but there are no Corvus drivers present after that, only
|
||||
Disk II?
|
||||
|
||||
|
@ -112,7 +112,7 @@ UINT8 a2bus_lang_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
// likely to be interrupt-safe.
|
||||
if (state->m_machinetype == APPLE_II)
|
||||
{
|
||||
switch (offset & 0x03)
|
||||
switch (offset & 0x03)
|
||||
{
|
||||
case 1:
|
||||
case 3:
|
||||
|
@ -3,10 +3,10 @@
|
||||
corvfdc01.c
|
||||
|
||||
Implemention of the Corvus Systems CORVUS01 floppy controller
|
||||
|
||||
|
||||
Boot PROM 0.8 fixes this at: 8", 500 blocks total, 128 bytes/block,
|
||||
26 sectors/track, 77 tracks.
|
||||
|
||||
26 sectors/track, 77 tracks.
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "corvfdc01.h"
|
||||
@ -21,8 +21,8 @@
|
||||
|
||||
const device_type A2BUS_CORVFDC01 = &device_creator<a2bus_corvfdc01_device>;
|
||||
|
||||
#define FDC01_ROM_REGION "fdc01_rom"
|
||||
#define FDC01_FDC_TAG "fdc01_fdc"
|
||||
#define FDC01_ROM_REGION "fdc01_rom"
|
||||
#define FDC01_FDC_TAG "fdc01_fdc"
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( a2bus_corvfdc01_device::corv_floppy_formats )
|
||||
FLOPPY_IMD_FORMAT
|
||||
@ -161,7 +161,7 @@ UINT8 a2bus_corvfdc01_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // local status
|
||||
case 0: // local status
|
||||
if (m_curfloppy)
|
||||
{
|
||||
m_fdc_local_status &= ~LS_DSKCHG_mask;
|
||||
@ -169,7 +169,7 @@ UINT8 a2bus_corvfdc01_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
}
|
||||
return m_fdc_local_status | LS_8IN_mask;
|
||||
|
||||
case 8: // WD1793 at 8-11
|
||||
case 8: // WD1793 at 8-11
|
||||
return m_wdfdc->status_r(space, offset);
|
||||
|
||||
case 9:
|
||||
@ -225,7 +225,7 @@ void a2bus_corvfdc01_device::write_c0nx(address_space &space, UINT8 offset, UINT
|
||||
if (m_curfloppy != NULL)
|
||||
{
|
||||
// side select
|
||||
m_curfloppy->ss_w((data & LC_FLPSD1_mask) != 0);
|
||||
m_curfloppy->ss_w((data & LC_FLPSD1_mask) != 0);
|
||||
|
||||
// motor control (active low)
|
||||
m_curfloppy->mon_w((data & LC_MOTOROF_mask) ? 1 : 0);
|
||||
@ -278,4 +278,3 @@ WRITE_LINE_MEMBER(a2bus_corvfdc01_device::drq_w)
|
||||
else
|
||||
m_fdc_local_status &= ~LS_DRQ_mask;
|
||||
}
|
||||
|
||||
|
@ -4,10 +4,10 @@
|
||||
|
||||
Implemention of the Corvus Systems CORVUS02 floppy controller
|
||||
aka the "Buffered Floppy Controller"
|
||||
|
||||
|
||||
Boot PROM 0.8 says 8" SSDD or 5.25" DSDD; we stick with 5.25" here
|
||||
and let the FDC01 handle 8".
|
||||
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "corvfdc02.h"
|
||||
@ -23,8 +23,8 @@
|
||||
|
||||
const device_type A2BUS_CORVFDC02 = &device_creator<a2bus_corvfdc02_device>;
|
||||
|
||||
#define FDC02_ROM_REGION "fdc02_rom"
|
||||
#define FDC02_FDC_TAG "fdc02_fdc"
|
||||
#define FDC02_ROM_REGION "fdc02_rom"
|
||||
#define FDC02_FDC_TAG "fdc02_fdc"
|
||||
|
||||
FLOPPY_FORMATS_MEMBER( a2bus_corvfdc02_device::corv_floppy_formats )
|
||||
FLOPPY_CONCEPT_525DSDD_FORMAT,
|
||||
@ -86,7 +86,6 @@ a2bus_corvfdc02_device::a2bus_corvfdc02_device(const machine_config &mconfig, de
|
||||
m_con3(*this, FDC02_FDC_TAG":2"),
|
||||
m_con4(*this, FDC02_FDC_TAG":3")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
a2bus_corvfdc02_device::a2bus_corvfdc02_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
@ -143,20 +142,20 @@ UINT8 a2bus_corvfdc02_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0: // 765 FIFO
|
||||
case 0: // 765 FIFO
|
||||
return m_fdc->fifo_r(space, 0);
|
||||
|
||||
case 1: // 765 MSR
|
||||
case 1: // 765 MSR
|
||||
return m_fdc->msr_r(space, 0);
|
||||
|
||||
case 2: // buffer address
|
||||
case 2: // buffer address
|
||||
return (m_bufptr>>1) & 0xff;
|
||||
|
||||
case 3:
|
||||
// printf("Read buffer @ %x = %02x\n", m_bufptr, m_buffer[m_bufptr]);
|
||||
case 3:
|
||||
// printf("Read buffer @ %x = %02x\n", m_bufptr, m_buffer[m_bufptr]);
|
||||
return m_buffer[m_bufptr--];
|
||||
|
||||
case 4: // local status
|
||||
case 4: // local status
|
||||
if (m_curfloppy)
|
||||
{
|
||||
m_fdc_local_status &= ~(1 | 0x40);
|
||||
@ -188,13 +187,13 @@ void a2bus_corvfdc02_device::write_c0nx(address_space &space, UINT8 offset, UINT
|
||||
case 1: // FDC ???
|
||||
break;
|
||||
|
||||
case 2: // buffer address
|
||||
case 2: // buffer address
|
||||
m_bufptr = (data << 1) | (data & 1);
|
||||
// printf("%02x to buffer address yields %x\n", data, m_bufptr);
|
||||
// printf("%02x to buffer address yields %x\n", data, m_bufptr);
|
||||
break;
|
||||
|
||||
case 3: // buffer write
|
||||
// printf("%02x to buffer[%x]\n", data, m_bufptr);
|
||||
case 3: // buffer write
|
||||
// printf("%02x to buffer[%x]\n", data, m_bufptr);
|
||||
m_buffer[m_bufptr--] = data;
|
||||
break;
|
||||
|
||||
@ -233,12 +232,12 @@ void a2bus_corvfdc02_device::write_c0nx(address_space &space, UINT8 offset, UINT
|
||||
{
|
||||
// motor control (active low)
|
||||
m_curfloppy->mon_w((data & 8) ? 1 : 0);
|
||||
// printf("Cur drive %p motor %s\n", m_curfloppy, (data & 8) ? "OFF" : "ON");
|
||||
// printf("Cur drive %p motor %s\n", m_curfloppy, (data & 8) ? "OFF" : "ON");
|
||||
}
|
||||
|
||||
if (data & 0x80)
|
||||
{
|
||||
// printf("Reset NEC765\n");
|
||||
// printf("Reset NEC765\n");
|
||||
m_fdc->reset();
|
||||
}
|
||||
break;
|
||||
@ -266,7 +265,7 @@ WRITE_LINE_MEMBER(a2bus_corvfdc02_device::intrq_w)
|
||||
}
|
||||
else
|
||||
{
|
||||
m_fdc_local_status |= 2; // clear IRQ
|
||||
m_fdc_local_status |= 2; // clear IRQ
|
||||
lower_slot_irq();
|
||||
}
|
||||
}
|
||||
@ -279,7 +278,7 @@ WRITE_LINE_MEMBER(a2bus_corvfdc02_device::drq_w)
|
||||
if (m_fdc_local_command & 0x40)
|
||||
{
|
||||
m_buffer[m_bufptr] = m_fdc->dma_r();
|
||||
// printf("DMA %02x to buffer[%x]\n", m_buffer[m_bufptr], m_bufptr);
|
||||
// printf("DMA %02x to buffer[%x]\n", m_buffer[m_bufptr], m_bufptr);
|
||||
|
||||
if (!m_bufptr)
|
||||
{
|
||||
@ -296,4 +295,3 @@ WRITE_LINE_MEMBER(a2bus_corvfdc02_device::drq_w)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ private:
|
||||
UINT8 *m_rom;
|
||||
UINT8 m_fdc_local_status, m_fdc_local_command;
|
||||
UINT16 m_bufptr;
|
||||
UINT8 m_buffer[2048]; // 1x6116 SRAM
|
||||
UINT8 m_buffer[2048]; // 1x6116 SRAM
|
||||
floppy_image_device *m_curfloppy;
|
||||
bool m_in_drq;
|
||||
emu_timer *m_timer;
|
||||
|
@ -108,7 +108,7 @@ UINT8 a2bus_laser128_device::read_c800(address_space &space, UINT16 offset)
|
||||
{
|
||||
return m_slot7_ram[offset];
|
||||
}
|
||||
return m_rom[(offset & 0x3ff) + 0x6000 + m_slot7_bank];
|
||||
return m_rom[(offset & 0x3ff) + 0x6000 + m_slot7_bank];
|
||||
}
|
||||
|
||||
return 0xff;
|
||||
@ -124,12 +124,12 @@ void a2bus_laser128_device::write_c800(address_space &space, UINT16 offset, UINT
|
||||
// UDCREG
|
||||
if ((m_slot == 7) && (offset == 0x7f8))
|
||||
{
|
||||
// printf("%02x to UDCREG\n", data);
|
||||
// printf("%02x to UDCREG\n", data);
|
||||
|
||||
m_slot7_ram_bank = (data & 0x8) ? 0x400 : 0;
|
||||
m_slot7_bank = (((data >> 4) & 0x7) * 0x400);
|
||||
|
||||
// printf("\tRAM bank %x, ROM bank %x\n", m_slot7_ram_bank, m_slot7_bank);
|
||||
// printf("\tRAM bank %x, ROM bank %x\n", m_slot7_ram_bank, m_slot7_bank);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,18 +3,18 @@
|
||||
mouse.c
|
||||
|
||||
Implemention of the Apple II Mouse Card
|
||||
|
||||
|
||||
Apple II Mouse Interface PCB
|
||||
Apple 1983
|
||||
Apple 1983
|
||||
|
||||
This is a mouse interface for the Apple II
|
||||
This is a mouse interface for the Apple II
|
||||
|
||||
PCB Layout
|
||||
----------
|
||||
apple computer
|
||||
MOUSE INTERFACE
|
||||
670-0030-C (C) 1983
|
||||
Printed on back side - MOUSE INTERFACE 820-0104-B (C) 1983 APPLE COMPUTER
|
||||
PCB Layout
|
||||
----------
|
||||
apple computer
|
||||
MOUSE INTERFACE
|
||||
670-0030-C (C) 1983
|
||||
Printed on back side - MOUSE INTERFACE 820-0104-B (C) 1983 APPLE COMPUTER
|
||||
|-----------------------------------|
|
||||
| PAL16R4 6821 |
|
||||
| |
|
||||
@ -25,40 +25,40 @@
|
||||
|-------------------| |-|
|
||||
|-------------|
|
||||
|
||||
Notes:
|
||||
J1 - 9 pin flat cable with female DB9 connector
|
||||
68705P3 - Motorola MC68705P3 microcontroller (DIP28) labelled '341-0269 (C) APPLE'
|
||||
PCB printed '(C) APPLE 1983 341-0269 or 342-0285'
|
||||
8516 - Fujitsu MB8516 2k x8-bit EPROM (DIP24) labelled '341-0270-C (C) APPLE 1983'
|
||||
PCB printed '(C) APPLE 1983 342-0270'
|
||||
PAL16R4 - MMI PAL16R4ACN (DIP20) marked '341-0268-A'
|
||||
PCB printed '(C) APPLE 1983 342-0268'
|
||||
6821 - AMI 6821 Peripheral Interface Adapter (DIP40)
|
||||
X1/X2 - Jumper pads. X1 is open, X2 is closed.
|
||||
|
||||
|
||||
Notes:
|
||||
J1 - 9 pin flat cable with female DB9 connector
|
||||
68705P3 - Motorola MC68705P3 microcontroller (DIP28) labelled '341-0269 (C) APPLE'
|
||||
PCB printed '(C) APPLE 1983 341-0269 or 342-0285'
|
||||
8516 - Fujitsu MB8516 2k x8-bit EPROM (DIP24) labelled '341-0270-C (C) APPLE 1983'
|
||||
PCB printed '(C) APPLE 1983 342-0270'
|
||||
PAL16R4 - MMI PAL16R4ACN (DIP20) marked '341-0268-A'
|
||||
PCB printed '(C) APPLE 1983 342-0268'
|
||||
6821 - AMI 6821 Peripheral Interface Adapter (DIP40)
|
||||
X1/X2 - Jumper pads. X1 is open, X2 is closed.
|
||||
|
||||
|
||||
Hookup notes:
|
||||
PIA port A connects to 68705 port A in its entirety (bi-directional)
|
||||
PIA PB4-PB7 connects to 68705 PC0-3 (bi-directional)
|
||||
PIA PB0 is 'sync latch'
|
||||
PIA PB1 is A8 on the EPROM
|
||||
PIA PB2 is A9 on the EPROM
|
||||
PIA PB3 is A10 on the EPROM
|
||||
|
||||
68705 PB0 is mouse X1
|
||||
68705 PB1 is mouse X0
|
||||
68705 PB2 is mouse Y0
|
||||
68705 PB3 is mouse Y1
|
||||
68705 PB4 and 5 are N/C
|
||||
68705 PB6 is IRQ for the slot
|
||||
68705 PB7 is the mouse button
|
||||
|
||||
68705 is clocked at 2M
|
||||
PIA is clocked at 1M
|
||||
|
||||
PIA port A connects to 68705 port A in its entirety (bi-directional)
|
||||
PIA PB4-PB7 connects to 68705 PC0-3 (bi-directional)
|
||||
PIA PB0 is 'sync latch'
|
||||
PIA PB1 is A8 on the EPROM
|
||||
PIA PB2 is A9 on the EPROM
|
||||
PIA PB3 is A10 on the EPROM
|
||||
|
||||
68705 PB0 is mouse X1
|
||||
68705 PB1 is mouse X0
|
||||
68705 PB2 is mouse Y0
|
||||
68705 PB3 is mouse Y1
|
||||
68705 PB4 and 5 are N/C
|
||||
68705 PB6 is IRQ for the slot
|
||||
68705 PB7 is the mouse button
|
||||
|
||||
68705 is clocked at 2M
|
||||
PIA is clocked at 1M
|
||||
|
||||
See the schematic at:
|
||||
http://mirrors.apple2.org.za/Apple%20II%20Documentation%20Project/Interface%20Cards/Digitizers/Apple%20Mouse%20Interface%20Card/Schematics/
|
||||
|
||||
http://mirrors.apple2.org.za/Apple%20II%20Documentation%20Project/Interface%20Cards/Digitizers/Apple%20Mouse%20Interface%20Card/Schematics/
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "mouse.h"
|
||||
@ -73,17 +73,17 @@
|
||||
|
||||
const device_type A2BUS_MOUSE = &device_creator<a2bus_mouse_device>;
|
||||
|
||||
#define MOUSE_ROM_REGION "a2mse_rom"
|
||||
#define MOUSE_PIA_TAG "a2mse_pia"
|
||||
#define MOUSE_MCU_TAG "a2mse_mcu"
|
||||
#define MOUSE_MCU_ROM "a2mse_mcurom"
|
||||
#define MOUSE_ROM_REGION "a2mse_rom"
|
||||
#define MOUSE_PIA_TAG "a2mse_pia"
|
||||
#define MOUSE_MCU_TAG "a2mse_mcu"
|
||||
#define MOUSE_MCU_ROM "a2mse_mcurom"
|
||||
|
||||
#define MOUSE_BUTTON_TAG "a2mse_button"
|
||||
#define MOUSE_XAXIS_TAG "a2mse_x"
|
||||
#define MOUSE_YAXIS_TAG "a2mse_y"
|
||||
#define MOUSE_BUTTON_TAG "a2mse_button"
|
||||
#define MOUSE_XAXIS_TAG "a2mse_x"
|
||||
#define MOUSE_YAXIS_TAG "a2mse_y"
|
||||
|
||||
#define TIMER_68705 0
|
||||
#define TIMER_QUADRATURE 1
|
||||
#define TIMER_68705 0
|
||||
#define TIMER_QUADRATURE 1
|
||||
|
||||
static ADDRESS_MAP_START( mcu_mem, AS_PROGRAM, 8, a2bus_mouse_device )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0x7ff)
|
||||
@ -113,14 +113,14 @@ MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( mouse )
|
||||
ROM_REGION(0x800, MOUSE_ROM_REGION, 0)
|
||||
ROM_LOAD( "341-0270-c.4b", 0x000000, 0x000800, CRC(0bcd1e8e) SHA1(3a9d881a8a8d30f55b9719aceebbcf717f829d6f) )
|
||||
ROM_LOAD( "341-0270-c.4b", 0x000000, 0x000800, CRC(0bcd1e8e) SHA1(3a9d881a8a8d30f55b9719aceebbcf717f829d6f) )
|
||||
|
||||
ROM_REGION(0x800, MOUSE_MCU_ROM, 0)
|
||||
ROM_LOAD( "341-0269.2b", 0x000000, 0x000800, CRC(94067f16) SHA1(3a2baa6648efe4456d3ec3721216e57c64f7acfc) )
|
||||
ROM_LOAD( "341-0269.2b", 0x000000, 0x000800, CRC(94067f16) SHA1(3a2baa6648efe4456d3ec3721216e57c64f7acfc) )
|
||||
|
||||
ROM_REGION(0xc00, "pal", 0)
|
||||
ROM_LOAD( "mmi_pal16r4a(jedec).2a", 0x000000, 0x000b04, CRC(1d620ee5) SHA1(5aa9a515c919ff7a18878649cac5d44f0c2abf28) )
|
||||
ROM_LOAD( "mmi_pal16r4a(binary).2a", 0x000000, 0x000100, CRC(1da5c745) SHA1(ba267b69a2fda2a2348b140979ece562411bb37b) )
|
||||
ROM_LOAD( "mmi_pal16r4a(jedec).2a", 0x000000, 0x000b04, CRC(1d620ee5) SHA1(5aa9a515c919ff7a18878649cac5d44f0c2abf28) )
|
||||
ROM_LOAD( "mmi_pal16r4a(binary).2a", 0x000000, 0x000100, CRC(1da5c745) SHA1(ba267b69a2fda2a2348b140979ece562411bb37b) )
|
||||
ROM_END
|
||||
|
||||
static INPUT_PORTS_START( mouse )
|
||||
@ -241,7 +241,7 @@ void a2bus_mouse_device::device_reset()
|
||||
m_rom_bank = 0;
|
||||
last_mx = last_my = count_x = count_y = 0;
|
||||
m_timer_cnt = 0xff;
|
||||
m_timer_ctl = 0x40; // disable interrupt, everything else clear
|
||||
m_timer_ctl = 0x40; // disable interrupt, everything else clear
|
||||
m_port_a_in = 0;
|
||||
m_port_b_in = 0x80;
|
||||
m_port_c_in = 0;
|
||||
@ -261,7 +261,7 @@ void a2bus_mouse_device::device_reset()
|
||||
|
||||
UINT8 a2bus_mouse_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
{
|
||||
return m_pia->read(space, offset & 3);
|
||||
return m_pia->read(space, offset & 3);
|
||||
}
|
||||
|
||||
|
||||
@ -394,10 +394,10 @@ WRITE8_MEMBER(a2bus_mouse_device::mcu_timer_w)
|
||||
m_timer_cnt = data;
|
||||
recalc = true;
|
||||
}
|
||||
// offset 1 = timer control: b7 = IRQ, b6 = IRQ mask (1=suppress),
|
||||
// b5 = input select (0=CPU clk, 1=ext),
|
||||
// b4 = enable external timer input,
|
||||
// b3 = clear, b2-b0 = scaler (1/2/4/8/16/32/64/128)
|
||||
// offset 1 = timer control: b7 = IRQ, b6 = IRQ mask (1=suppress),
|
||||
// b5 = input select (0=CPU clk, 1=ext),
|
||||
// b4 = enable external timer input,
|
||||
// b3 = clear, b2-b0 = scaler (1/2/4/8/16/32/64/128)
|
||||
else
|
||||
{
|
||||
// clearing the interrupt?
|
||||
@ -425,7 +425,7 @@ WRITE8_MEMBER(a2bus_mouse_device::mcu_timer_w)
|
||||
recalc = true;
|
||||
}
|
||||
|
||||
m_timer_ctl = data;
|
||||
m_timer_ctl = data;
|
||||
}
|
||||
|
||||
}
|
||||
@ -445,15 +445,15 @@ WRITE8_MEMBER(a2bus_mouse_device::mcu_timer_w)
|
||||
X1 = gate, must go 0/1 for each pixel moved
|
||||
Y0 = direction, 0 = up, 1 = down
|
||||
Y1 = gate, must go 0/1 for each pixel moved
|
||||
|
||||
|
||||
The direction must stay constant for a given train of gate pulses or the MCU will get confused.
|
||||
*/
|
||||
void a2bus_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
if (id == TIMER_68705) // 68705's built-in timer
|
||||
if (id == TIMER_68705) // 68705's built-in timer
|
||||
{
|
||||
m_timer_ctl |= 0x80; // indicate timer expired
|
||||
if (!(m_timer_ctl & 0x40)) // if interrupt not suppressed, fire!
|
||||
if (!(m_timer_ctl & 0x40)) // if interrupt not suppressed, fire!
|
||||
{
|
||||
m_mcu->set_input_line(M68705_INT_TIMER, ASSERT_LINE);
|
||||
}
|
||||
@ -509,9 +509,9 @@ void a2bus_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int
|
||||
else
|
||||
{
|
||||
count_x--;
|
||||
m_port_b_in |= 0x01; // X1
|
||||
m_port_b_in |= 0x01; // X1
|
||||
}
|
||||
m_port_b_in |= 0x02; // X0
|
||||
m_port_b_in |= 0x02; // X0
|
||||
}
|
||||
else if (count_y)
|
||||
{
|
||||
@ -522,9 +522,9 @@ void a2bus_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int
|
||||
else
|
||||
{
|
||||
count_y--;
|
||||
m_port_b_in |= 0x04; // Y0
|
||||
m_port_b_in |= 0x04; // Y0
|
||||
}
|
||||
m_port_b_in |= 0x08; // Y1
|
||||
m_port_b_in |= 0x08; // Y1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,17 +20,17 @@
|
||||
|____________________________ _|
|
||||
| |
|
||||
|______________________|
|
||||
|
||||
|
||||
|
||||
|
||||
DIPS: 1:SET 2:MODE 3:NMI 4:IRQ
|
||||
1 & 4 are on by default.
|
||||
|
||||
|
||||
J1: 8 pins for X10 home control functions (top to bottom)
|
||||
1: ADJ 2: 5V 3: MODE 4: GND
|
||||
5: A 6: 5V 7: B 8: GND
|
||||
|
||||
|
||||
X10 functions not supported.
|
||||
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "timemasterho.h"
|
||||
@ -45,9 +45,9 @@
|
||||
|
||||
const device_type A2BUS_TIMEMASTERHO = &device_creator<a2bus_timemasterho_device>;
|
||||
|
||||
#define TIMEMASTER_ROM_REGION "timemst_rom"
|
||||
#define TIMEMASTER_PIA_TAG "timemst_pia"
|
||||
#define TIMEMASTER_M5832_TAG "timemst_msm"
|
||||
#define TIMEMASTER_ROM_REGION "timemst_rom"
|
||||
#define TIMEMASTER_PIA_TAG "timemst_pia"
|
||||
#define TIMEMASTER_M5832_TAG "timemst_msm"
|
||||
|
||||
MACHINE_CONFIG_FRAGMENT( timemaster )
|
||||
MCFG_DEVICE_ADD(TIMEMASTER_PIA_TAG, PIA6821, 1021800)
|
||||
@ -61,26 +61,26 @@ MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( timemaster )
|
||||
ROM_REGION(0x1000, TIMEMASTER_ROM_REGION, 0)
|
||||
ROM_LOAD( "ae timemaster ii h.o. rom rev. 5.bin", 0x000000, 0x001000, CRC(ff5bd644) SHA1(ae0173da61581a06188c1bee89e95a0aa536c411) )
|
||||
ROM_LOAD( "ae timemaster ii h.o. rom rev. 5.bin", 0x000000, 0x001000, CRC(ff5bd644) SHA1(ae0173da61581a06188c1bee89e95a0aa536c411) )
|
||||
ROM_END
|
||||
|
||||
static INPUT_PORTS_START( tmho )
|
||||
PORT_START("DSW1")
|
||||
PORT_DIPNAME( 0x01, 0x01, "Set")
|
||||
PORT_DIPSETTING( 0x00, "Apple can't set clock")
|
||||
PORT_DIPSETTING( 0x01, "Apple can set clock")
|
||||
PORT_DIPSETTING( 0x00, "Apple can't set clock")
|
||||
PORT_DIPSETTING( 0x01, "Apple can set clock")
|
||||
|
||||
PORT_DIPNAME( 0x02, 0x00, "Mode")
|
||||
PORT_DIPSETTING( 0x00, "TimeMaster")
|
||||
PORT_DIPSETTING( 0x02, "Mountain AppleClock")
|
||||
PORT_DIPSETTING( 0x00, "TimeMaster")
|
||||
PORT_DIPSETTING( 0x02, "Mountain AppleClock")
|
||||
|
||||
PORT_DIPNAME( 0x04, 0x00, "NMI")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR(Off))
|
||||
PORT_DIPSETTING( 0x04, DEF_STR(On))
|
||||
PORT_DIPSETTING( 0x00, DEF_STR(Off))
|
||||
PORT_DIPSETTING( 0x04, DEF_STR(On))
|
||||
|
||||
PORT_DIPNAME( 0x08, 0x08, "IRQ")
|
||||
PORT_DIPSETTING( 0x00, DEF_STR(Off))
|
||||
PORT_DIPSETTING( 0x08, DEF_STR(On))
|
||||
PORT_DIPSETTING( 0x00, DEF_STR(Off))
|
||||
PORT_DIPSETTING( 0x08, DEF_STR(On))
|
||||
INPUT_PORTS_END
|
||||
|
||||
/***************************************************************************
|
||||
@ -154,7 +154,7 @@ void a2bus_timemasterho_device::device_start()
|
||||
|
||||
void a2bus_timemasterho_device::device_reset()
|
||||
{
|
||||
m_msm5832->cs_w(ASSERT_LINE); // CS is tied to Vcc
|
||||
m_msm5832->cs_w(ASSERT_LINE); // CS is tied to Vcc
|
||||
m_started = true;
|
||||
}
|
||||
|
||||
@ -167,7 +167,7 @@ UINT8 a2bus_timemasterho_device::read_c0nx(address_space &space, UINT8 offset)
|
||||
{
|
||||
if (offset <= 3)
|
||||
{
|
||||
return m_pia->read(space, offset);
|
||||
return m_pia->read(space, offset);
|
||||
}
|
||||
|
||||
return 0xff;
|
||||
@ -194,7 +194,7 @@ UINT8 a2bus_timemasterho_device::read_cnxx(address_space &space, UINT8 offset)
|
||||
{
|
||||
if (m_started)
|
||||
{
|
||||
if (!(m_dsw1->read() & 2)) // TimeMaster native
|
||||
if (!(m_dsw1->read() & 2)) // TimeMaster native
|
||||
{
|
||||
return m_rom[offset+0xc00];
|
||||
}
|
||||
@ -228,7 +228,7 @@ WRITE8_MEMBER(a2bus_timemasterho_device::pia_out_b)
|
||||
{
|
||||
if (m_dsw1->read() & 1)
|
||||
{
|
||||
m_msm5832->write_w((data >> 6) & 1 ? ASSERT_LINE : CLEAR_LINE);
|
||||
m_msm5832->write_w((data >> 6) & 1 ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -277,4 +277,3 @@ WRITE_LINE_MEMBER(a2bus_timemasterho_device::pia_irqb_w)
|
||||
m_irqb = state;
|
||||
update_irqs();
|
||||
}
|
||||
|
||||
|
@ -20,10 +20,10 @@ static SLOT_INTERFACE_START(a7800_cart)
|
||||
SLOT_INTERFACE_INTERNAL("a78_abs", A78_ROM_ABSOLUTE)
|
||||
SLOT_INTERFACE_INTERNAL("a78_act", A78_ROM_ACTIVISION)
|
||||
SLOT_INTERFACE_INTERNAL("a78_hsc", A78_HISCORE)
|
||||
SLOT_INTERFACE_INTERNAL("a78_xboard", A78_XBOARD) // the actual XBoarD expansion (as passthru)
|
||||
SLOT_INTERFACE_INTERNAL("a78_xm", A78_XM) // the actual XM expansion (as passthru)
|
||||
SLOT_INTERFACE_INTERNAL("a78_megacart", A78_ROM_MEGACART)
|
||||
SLOT_INTERFACE_INTERNAL("a78_versa", A78_ROM_VERSABOARD)
|
||||
SLOT_INTERFACE_INTERNAL("a78_xboard", A78_XBOARD) // the actual XBoarD expansion (as passthru)
|
||||
SLOT_INTERFACE_INTERNAL("a78_xm", A78_XM) // the actual XM expansion (as passthru)
|
||||
SLOT_INTERFACE_INTERNAL("a78_megacart", A78_ROM_MEGACART)
|
||||
SLOT_INTERFACE_INTERNAL("a78_versa", A78_ROM_VERSABOARD)
|
||||
// cart variants with a POKEY at 0x0450 (typically a VersaBoard variant, or an homebrew pcb)
|
||||
SLOT_INTERFACE_INTERNAL("a78_p450_t0", A78_ROM_P450)
|
||||
SLOT_INTERFACE_INTERNAL("a78_p450_t1", A78_ROM_P450_POKEY)
|
||||
|
@ -21,7 +21,7 @@
|
||||
- read_40xx/write_40xx for accesses in the $4000 to $ffff range
|
||||
even if not all carts use all of them (in particular no cart type
|
||||
seems to use access to the ranges $0500 to $0fff and $2800 to $2fff)
|
||||
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
@ -70,15 +70,15 @@ void device_a78_cart_interface::rom_alloc(UINT32 size, const char *tag)
|
||||
tempstring.cat(A78SLOT_ROM_REGION_TAG);
|
||||
m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base();
|
||||
m_rom_size = size;
|
||||
|
||||
|
||||
// setup other helpers
|
||||
if ((size / 0x4000) & 1) // compensate for SuperGame carts with 9 x 16K banks (to my knowledge no other cart has m_bank_mask != power of 2)
|
||||
m_bank_mask = (size / 0x4000) - 2;
|
||||
else
|
||||
m_bank_mask = (size / 0x4000) - 1;
|
||||
|
||||
|
||||
// the rom is mapped to the top of the memory area
|
||||
// so we store the starting point of data to simplify
|
||||
// so we store the starting point of data to simplify
|
||||
// the access handling
|
||||
m_base_rom = 0x10000 - size;
|
||||
}
|
||||
@ -272,7 +272,7 @@ int a78_cart_slot_device::validate_header(int head, bool log)
|
||||
}
|
||||
head &= 0xff00;
|
||||
}
|
||||
|
||||
|
||||
if ((head & 0xff00) > 0x300)
|
||||
{
|
||||
if (log)
|
||||
@ -282,7 +282,7 @@ int a78_cart_slot_device::validate_header(int head, bool log)
|
||||
}
|
||||
head &= 0x00ff;
|
||||
}
|
||||
|
||||
|
||||
return head;
|
||||
}
|
||||
|
||||
@ -329,7 +329,7 @@ static int a78_get_pcb_id(const char *slot)
|
||||
if (!core_stricmp(slot_list[i].slot_option, slot))
|
||||
return slot_list[i].pcb_id;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -340,7 +340,7 @@ static const char *a78_get_slot(int type)
|
||||
if (slot_list[i].pcb_id == type)
|
||||
return slot_list[i].slot_option;
|
||||
}
|
||||
|
||||
|
||||
return "a78_rom";
|
||||
}
|
||||
|
||||
@ -349,17 +349,17 @@ bool a78_cart_slot_device::call_load()
|
||||
if (m_cart)
|
||||
{
|
||||
UINT32 len;
|
||||
|
||||
|
||||
if (software_entry() != NULL)
|
||||
{
|
||||
const char *pcb_name;
|
||||
bool has_ram = get_software_region("ram") ? TRUE : FALSE;
|
||||
bool has_nvram = get_software_region("nvram") ? TRUE : FALSE;
|
||||
len = get_software_region_length("rom");
|
||||
|
||||
|
||||
m_cart->rom_alloc(len, tag());
|
||||
memcpy(m_cart->get_rom_base(), get_software_region("rom"), len);
|
||||
|
||||
|
||||
if ((pcb_name = get_feature("slot")) != NULL)
|
||||
m_type = a78_get_pcb_id(pcb_name);
|
||||
else
|
||||
@ -377,19 +377,19 @@ bool a78_cart_slot_device::call_load()
|
||||
{
|
||||
// Load and check the header
|
||||
int mapper;
|
||||
char head[128];
|
||||
char head[128];
|
||||
fread(head, 128);
|
||||
|
||||
|
||||
if (verify_header((char *)head) == IMAGE_VERIFY_FAIL)
|
||||
return IMAGE_INIT_FAIL;
|
||||
|
||||
|
||||
len = (head[49] << 24) | (head[50] << 16) | (head[51] << 8) | head[52];
|
||||
if (len + 128 > length())
|
||||
{
|
||||
logerror("Invalid length in the header. The game might be corrupted.\n");
|
||||
len = length() - 128;
|
||||
}
|
||||
|
||||
|
||||
// let's try to auto-fix some common errors in the header
|
||||
mapper = validate_header((head[53] << 8) | head[54], TRUE);
|
||||
|
||||
@ -415,7 +415,7 @@ bool a78_cart_slot_device::call_load()
|
||||
m_type = A78_VERSABOARD;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// check if cart has a POKEY at $0450 (typically a VersaBoard variant)!
|
||||
if (mapper & 0x40)
|
||||
{
|
||||
@ -425,7 +425,7 @@ bool a78_cart_slot_device::call_load()
|
||||
m_type += A78_POKEY0450;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// check special bits, which override the previous
|
||||
if ((mapper & 0xff00) == 0x0100)
|
||||
m_type = A78_ACTIVISION;
|
||||
@ -452,10 +452,10 @@ bool a78_cart_slot_device::call_load()
|
||||
}
|
||||
|
||||
internal_header_logging((UINT8 *)head, length());
|
||||
|
||||
|
||||
m_cart->rom_alloc(len, tag());
|
||||
fread(m_cart->get_rom_base(), len);
|
||||
|
||||
|
||||
if (m_type == A78_TYPE6)
|
||||
m_cart->ram_alloc(0x4000);
|
||||
if (m_type == A78_MEGACART || (m_type >= A78_VERSABOARD && m_type <= A78_VERSA_POK450))
|
||||
@ -468,7 +468,7 @@ bool a78_cart_slot_device::call_load()
|
||||
battery_load(m_cart->get_nvram_base(), 0x800, 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//printf("Type: %s\n", a78_get_slot(m_type));
|
||||
}
|
||||
return IMAGE_INIT_PASS;
|
||||
@ -476,7 +476,7 @@ bool a78_cart_slot_device::call_load()
|
||||
|
||||
|
||||
void a78_partialhash(hash_collection &dest, const unsigned char *data,
|
||||
unsigned long length, const char *functions)
|
||||
unsigned long length, const char *functions)
|
||||
{
|
||||
if (length <= 128)
|
||||
return;
|
||||
@ -537,13 +537,13 @@ void a78_cart_slot_device::get_default_card_software(astring &result)
|
||||
const char *slot_string = "a78_rom";
|
||||
dynamic_buffer head(128);
|
||||
int type = A78_TYPE0, mapper;
|
||||
|
||||
|
||||
// Load and check the header
|
||||
core_fread(m_file, head, 128);
|
||||
core_fread(m_file, head, 128);
|
||||
|
||||
// let's try to auto-fix some common errors in the header
|
||||
mapper = validate_header((head[53] << 8) | head[54], FALSE);
|
||||
|
||||
|
||||
switch (mapper & 0x2e)
|
||||
{
|
||||
case 0x0000:
|
||||
@ -566,7 +566,7 @@ void a78_cart_slot_device::get_default_card_software(astring &result)
|
||||
type = A78_VERSABOARD;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// check if cart has a POKEY at $0450 (typically a VersaBoard variant)!
|
||||
if (mapper & 0x40)
|
||||
{
|
||||
@ -576,18 +576,18 @@ void a78_cart_slot_device::get_default_card_software(astring &result)
|
||||
type += A78_POKEY0450;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// check special bits, which override the previous
|
||||
if ((mapper & 0xff00) == 0x0100)
|
||||
type = A78_ACTIVISION;
|
||||
else if ((mapper & 0xff00) == 0x0200)
|
||||
type = A78_ABSOLUTE;
|
||||
|
||||
|
||||
logerror("Cart type: %x\n", type);
|
||||
slot_string = a78_get_slot(type);
|
||||
|
||||
|
||||
clear();
|
||||
|
||||
|
||||
result.cpy(slot_string);
|
||||
}
|
||||
else
|
||||
@ -663,9 +663,9 @@ WRITE8_MEMBER(a78_cart_slot_device::write_40xx)
|
||||
|
||||
/*-------------------------------------------------
|
||||
A78 header logging
|
||||
|
||||
|
||||
A78 HEADER FORMAT
|
||||
|
||||
|
||||
Bytes | Content | Length
|
||||
========================================
|
||||
0 | Header version | 1 byte
|
||||
@ -679,7 +679,7 @@ WRITE8_MEMBER(a78_cart_slot_device::write_40xx)
|
||||
53..54 | Cart type [*] | 2 bytes
|
||||
-------|-------------------|------------
|
||||
55 | Controller 1 type | 1 byte
|
||||
| |
|
||||
| |
|
||||
| 0 = None |
|
||||
| 1 = Joystick |
|
||||
| 2 = Light Gun |
|
||||
@ -690,23 +690,23 @@ WRITE8_MEMBER(a78_cart_slot_device::write_40xx)
|
||||
-------|-------------------|------------
|
||||
57 | TV System | 1 byte
|
||||
| |
|
||||
| 0 = NTSC/1 = PAL |
|
||||
| 0 = NTSC/1 = PAL |
|
||||
-------|-------------------|------------
|
||||
58 | Save data | 1 byte
|
||||
| | (only v2)
|
||||
| 0 = None / Unk |
|
||||
| 1 = High Score |
|
||||
| 2 = Savekey |
|
||||
-------|-------------------|-----------
|
||||
-------|-------------------|-----------
|
||||
63 | Expansion module | 1 byte
|
||||
| |
|
||||
| 0 = No expansion |
|
||||
| module |
|
||||
| 1 = Expansion |
|
||||
| required |
|
||||
-------|-------------------|-----------
|
||||
|
||||
|
||||
-------|-------------------|-----------
|
||||
|
||||
|
||||
[*] Cart type:
|
||||
|
||||
bit 0-7 - Hardware "flags"
|
||||
@ -716,13 +716,13 @@ WRITE8_MEMBER(a78_cart_slot_device::write_40xx)
|
||||
bit 3 [0x08] - bank 0 of 144K ROM at $4000
|
||||
bit 4 [0x10] - bank 6 at $4000
|
||||
bit 5 [0x20] - banked RAM at $4000
|
||||
|
||||
|
||||
bit 8-15 - Special values
|
||||
0 = Normal cart
|
||||
1 = Absolute (F18 Hornet)
|
||||
2 = Activision (Double Dragon & Rampage)
|
||||
3 = POKEY at $0450
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
void a78_cart_slot_device::internal_header_logging(UINT8 *header, UINT32 len)
|
||||
@ -788,7 +788,7 @@ void a78_cart_slot_device::internal_header_logging(UINT8 *header, UINT32 len)
|
||||
ctrl1.cpy("Unknown controller");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
switch (head_ctrl2)
|
||||
{
|
||||
case 0x00:
|
||||
@ -804,10 +804,10 @@ void a78_cart_slot_device::internal_header_logging(UINT8 *header, UINT32 len)
|
||||
ctrl2.cpy("Unknown controller");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
logerror( "ROM DETAILS\n" );
|
||||
logerror( "===========\n\n" );
|
||||
logerror( "\tTotal length (with header): 0x%x (%dK + 128b header)\n\n", len, len/0x400);
|
||||
logerror( "\tTotal length (with header): 0x%x (%dK + 128b header)\n\n", len, len/0x400);
|
||||
logerror( "HEADER DETAILS\n" );
|
||||
logerror( "==============\n\n" );
|
||||
logerror( "\tTitle: %.32s\n", head_title);
|
||||
@ -829,5 +829,5 @@ void a78_cart_slot_device::internal_header_logging(UINT8 *header, UINT32 len)
|
||||
logerror( "\n");
|
||||
logerror( "\tController 1: 0x%.2X [%s]\n", head_ctrl1, ctrl1.cstr());
|
||||
logerror( "\tController 2: 0x%.2X [%s]\n", head_ctrl2, ctrl2.cstr());
|
||||
logerror( "\tVideo: %s\n", (head_ispal) ? "PAL" : "NTSC");
|
||||
logerror( "\tVideo: %s\n", (head_ispal) ? "PAL" : "NTSC");
|
||||
}
|
||||
|
@ -12,19 +12,19 @@
|
||||
/* PCB */
|
||||
enum
|
||||
{
|
||||
A78_TYPE0 = 0, // standard 8K/16K/32K games, no bankswitch
|
||||
A78_TYPE1, // as TYPE0 + POKEY chip on the PCB
|
||||
A78_TYPE2, // Atari SuperGame pcb (8x16K banks with bankswitch)
|
||||
A78_TYPE3, // as TYPE1 + POKEY chip on the PCB
|
||||
A78_TYPE6, // as TYPE1 + RAM IC on the PCB
|
||||
A78_TYPEA, // Alien Brigade, Crossbow (9x16K banks with diff bankswitch)
|
||||
A78_ABSOLUTE, // F18 Hornet
|
||||
A78_ACTIVISION, // Double Dragon, Rampage
|
||||
A78_HSC, // Atari HighScore cart
|
||||
A78_XB_BOARD, // A7800 Expansion Board (it shall more or less apply to the Expansion Module too, but this is not officially released yet)
|
||||
A78_XM_BOARD, // A7800 XM Expansion Module (theoretical specs only, since this is not officially released yet)
|
||||
A78_MEGACART, // Homebrew by CPUWIZ, consists of SuperGame bank up to 512K + 32K RAM banked
|
||||
A78_VERSABOARD = 0x10, // Homebrew by CPUWIZ, consists of SuperGame bank up to 256K + 32K RAM banked
|
||||
A78_TYPE0 = 0, // standard 8K/16K/32K games, no bankswitch
|
||||
A78_TYPE1, // as TYPE0 + POKEY chip on the PCB
|
||||
A78_TYPE2, // Atari SuperGame pcb (8x16K banks with bankswitch)
|
||||
A78_TYPE3, // as TYPE1 + POKEY chip on the PCB
|
||||
A78_TYPE6, // as TYPE1 + RAM IC on the PCB
|
||||
A78_TYPEA, // Alien Brigade, Crossbow (9x16K banks with diff bankswitch)
|
||||
A78_ABSOLUTE, // F18 Hornet
|
||||
A78_ACTIVISION, // Double Dragon, Rampage
|
||||
A78_HSC, // Atari HighScore cart
|
||||
A78_XB_BOARD, // A7800 Expansion Board (it shall more or less apply to the Expansion Module too, but this is not officially released yet)
|
||||
A78_XM_BOARD, // A7800 XM Expansion Module (theoretical specs only, since this is not officially released yet)
|
||||
A78_MEGACART, // Homebrew by CPUWIZ, consists of SuperGame bank up to 512K + 32K RAM banked
|
||||
A78_VERSABOARD = 0x10, // Homebrew by CPUWIZ, consists of SuperGame bank up to 256K + 32K RAM banked
|
||||
// VersaBoard variants configured as Type 1/3/A or VersaBoard + POKEY at $0450
|
||||
A78_TYPE0_POK450 = 0x20,
|
||||
A78_TYPE1_POK450 = 0x21,
|
||||
@ -68,7 +68,7 @@ protected:
|
||||
UINT8 *m_rom;
|
||||
UINT32 m_rom_size;
|
||||
dynamic_buffer m_ram;
|
||||
dynamic_buffer m_nvram; // HiScore cart can save scores!
|
||||
dynamic_buffer m_nvram; // HiScore cart can save scores!
|
||||
// helpers
|
||||
UINT32 m_base_rom;
|
||||
int m_bank_mask;
|
||||
@ -101,7 +101,7 @@ public:
|
||||
int get_cart_type() { return m_type; };
|
||||
int identify_cart_type(UINT8 *ROM, UINT32 len);
|
||||
bool has_cart() { return m_cart != NULL; }
|
||||
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
|
||||
virtual bool is_readable() const { return 1; }
|
||||
virtual bool is_writeable() const { return 0; }
|
||||
@ -125,7 +125,7 @@ public:
|
||||
virtual DECLARE_WRITE8_MEMBER(write_10xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_30xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
|
||||
|
||||
private:
|
||||
device_a78_cart_interface* m_cart;
|
||||
int m_type;
|
||||
|
@ -3,26 +3,26 @@
|
||||
/***********************************************************************************************************
|
||||
|
||||
A7800 CPUWIZ's homebrew boards (MegaCart+ and VersaBoard)
|
||||
|
||||
|
||||
Here we emulate the base configurations of these two boards:
|
||||
|
||||
MegaCart+ = up to 512K (31 banks at $8000, 1 at $C000) of ROM and 2 x 16K RAM @ $4000
|
||||
VersaBoard = up to 256K of ROM and 2 x 16K RAM
|
||||
|
||||
Plus, for the moment, a VersaBoard with POKEY mapped at 0x0450 and support for 144K ROM,
|
||||
since a few demo homebrew programs seems to use this to combine compatibility with
|
||||
|
||||
Plus, for the moment, a VersaBoard with POKEY mapped at 0x0450 and support for 144K ROM,
|
||||
since a few demo homebrew programs seems to use this to combine compatibility with
|
||||
XBoarD & XM expansions
|
||||
|
||||
Note that the VersaBoard can be configured to work with different banking hardware
|
||||
e.g. with SG 9bank games or with SG + RAM (so to allow reproduction of games which
|
||||
could have worked on old carts without sacrifying original carts), but games running
|
||||
could have worked on old carts without sacrifying original carts), but games running
|
||||
on those "standard" variants can be emulated with the standard code from rom.c ;-)
|
||||
|
||||
|
||||
|
||||
|
||||
TO DO:
|
||||
- investigate whether the POKEY detection routines in homebrew do fail due to emulation
|
||||
issues or not
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
|
||||
@ -86,7 +86,7 @@ READ8_MEMBER(a78_versaboard_device::read_40xx)
|
||||
else if (offset < 0x8000)
|
||||
return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)];
|
||||
else
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(a78_versaboard_device::write_40xx)
|
||||
@ -130,5 +130,3 @@ machine_config_constructor a78_rom_p450_vb_device::device_mconfig_additions() co
|
||||
{
|
||||
return MACHINE_CONFIG_NAME( a78_pokeyvb );
|
||||
}
|
||||
|
||||
|
||||
|
@ -15,15 +15,15 @@ public:
|
||||
// construction/destruction
|
||||
a78_versaboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a78_versaboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_ram_bank;
|
||||
};
|
||||
@ -36,7 +36,7 @@ class a78_megacart_device : public a78_versaboard_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_megacart_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
};
|
||||
@ -51,14 +51,14 @@ class a78_rom_p450_vb_device : public a78_versaboard_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_p450_vb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx) { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx) { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
|
||||
|
||||
|
||||
protected:
|
||||
required_device<pokey_device> m_pokey450;
|
||||
};
|
||||
|
@ -3,7 +3,7 @@
|
||||
/***********************************************************************************************************
|
||||
|
||||
A7800 HighScore passthrough cart emulation
|
||||
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
@ -75,4 +75,3 @@ WRITE8_MEMBER(a78_hiscore_device::write_40xx)
|
||||
{
|
||||
m_hscslot->write_40xx(space, offset, data);
|
||||
}
|
||||
|
||||
|
@ -14,10 +14,10 @@ class a78_hiscore_device : public a78_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_hiscore_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx);
|
||||
|
@ -10,7 +10,7 @@
|
||||
- 9 banks or not
|
||||
etc...
|
||||
But we might merge many of these if they become too many
|
||||
|
||||
|
||||
TODO:
|
||||
- Are POKEY regs readable somewhere in SG 144K + POKEY homebrew? How do they detect
|
||||
the POKEY otherwise?!?
|
||||
@ -232,11 +232,11 @@ READ8_MEMBER(a78_rom_device::read_40xx)
|
||||
/*-------------------------------------------------
|
||||
|
||||
Carts with no bankswitch + POKEY chip
|
||||
The Pokey chips is accessed by writing at
|
||||
The Pokey chips is accessed by writing at
|
||||
0x4000-0x7fff.
|
||||
|
||||
|
||||
GAMES: Ballblazer, Beef Drop (homebrew)
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_rom_pokey_device::read_40xx)
|
||||
@ -274,19 +274,19 @@ machine_config_constructor a78_rom_pokey_device::device_mconfig_additions() cons
|
||||
some test is run)
|
||||
Note that the code is written so that also
|
||||
homebrew games with larger ROMs work!
|
||||
|
||||
|
||||
GAMES: Crack'd, Fatal Run, Ikari Warriors...
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_rom_sg_device::read_40xx)
|
||||
{
|
||||
if (offset < 0x4000)
|
||||
return m_rom[(offset & 0x3fff) + ((m_bank_mask - 1) * 0x4000)]; // second to last bank (is this always ok?!?)
|
||||
return m_rom[(offset & 0x3fff) + ((m_bank_mask - 1) * 0x4000)]; // second to last bank (is this always ok?!?)
|
||||
else if (offset < 0x8000)
|
||||
return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)];
|
||||
else
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(a78_rom_sg_device::write_40xx)
|
||||
@ -300,9 +300,9 @@ WRITE8_MEMBER(a78_rom_sg_device::write_40xx)
|
||||
|
||||
Carts with SuperGame bankswitch + POKEY chip
|
||||
As above + Pokey chip access
|
||||
|
||||
|
||||
GAMES: Commando
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_rom_sg_pokey_device::read_40xx)
|
||||
@ -312,7 +312,7 @@ READ8_MEMBER(a78_rom_sg_pokey_device::read_40xx)
|
||||
else if (offset < 0x8000)
|
||||
return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)];
|
||||
else
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(a78_rom_sg_pokey_device::write_40xx)
|
||||
@ -332,12 +332,12 @@ machine_config_constructor a78_rom_sg_pokey_device::device_mconfig_additions() c
|
||||
/*-------------------------------------------------
|
||||
|
||||
Carts with SuperGame bankswitch + 16K RAM
|
||||
FIXME: Some games contained only 8K of RAM, but
|
||||
FIXME: Some games contained only 8K of RAM, but
|
||||
for the moment we treat all as 16K of RAM even if
|
||||
from softlist we shall differentiate between them.
|
||||
|
||||
|
||||
GAMES: Impossible Mission, Jinks and some protos
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_rom_sg_ram_device::read_40xx)
|
||||
@ -347,7 +347,7 @@ READ8_MEMBER(a78_rom_sg_ram_device::read_40xx)
|
||||
else if (offset < 0x8000)
|
||||
return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)];
|
||||
else
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(a78_rom_sg_ram_device::write_40xx)
|
||||
@ -364,11 +364,11 @@ WRITE8_MEMBER(a78_rom_sg_ram_device::write_40xx)
|
||||
Carts with SuperGame bankswitch 9banks:
|
||||
9 x 16K banks mappable in 0x8000-0xbfff
|
||||
bank 7 is always mapped in 0xc000-0xffff
|
||||
|
||||
GAMES: Alien Brigade & Crossbow + some homebrew
|
||||
like Donkey Kong XM demo, Bentley Bear's Crystal
|
||||
|
||||
GAMES: Alien Brigade & Crossbow + some homebrew
|
||||
like Donkey Kong XM demo, Bentley Bear's Crystal
|
||||
Quest
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_rom_sg9_device::read_40xx)
|
||||
@ -378,7 +378,7 @@ READ8_MEMBER(a78_rom_sg9_device::read_40xx)
|
||||
else if (offset < 0x8000)
|
||||
return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)];
|
||||
else
|
||||
return m_rom[(offset & 0x3fff) + ((m_bank_mask + 1) * 0x4000)]; // last bank
|
||||
return m_rom[(offset & 0x3fff) + ((m_bank_mask + 1) * 0x4000)]; // last bank
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(a78_rom_sg9_device::write_40xx)
|
||||
@ -388,14 +388,14 @@ WRITE8_MEMBER(a78_rom_sg9_device::write_40xx)
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Carts with Absolute bankswitch:
|
||||
64K games. Lower 32K are 2 banks of 16K to be mapped
|
||||
in 0x4000-0x7fff, depending on the value written
|
||||
at 0x8000. Higher 32K are fixed in 0x8000-0xffff
|
||||
|
||||
|
||||
GAMES: F-18 Hornet
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_rom_abs_device::read_40xx)
|
||||
@ -431,9 +431,9 @@ WRITE8_MEMBER(a78_rom_abs_device::write_40xx)
|
||||
0x6000-0x7fff first 8kb of bank 6
|
||||
0x8000-0x9fff second 8kb of bank 7
|
||||
0xe000-0xffff first 8kb of bank 7
|
||||
|
||||
|
||||
GAMES: Double Dragon, Rampage.
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_rom_act_device::read_40xx)
|
||||
@ -495,4 +495,3 @@ machine_config_constructor a78_rom_p450_sg9_device::device_mconfig_additions() c
|
||||
{
|
||||
return MACHINE_CONFIG_NAME( a78_pokey450 );
|
||||
}
|
||||
|
||||
|
@ -34,14 +34,14 @@ public:
|
||||
// construction/destruction
|
||||
a78_rom_pokey_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a78_rom_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
|
||||
|
||||
protected:
|
||||
required_device<pokey_device> m_pokey;
|
||||
};
|
||||
@ -55,11 +55,11 @@ public:
|
||||
// construction/destruction
|
||||
a78_rom_sg_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a78_rom_sg_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
@ -76,14 +76,14 @@ class a78_rom_sg_pokey_device : public a78_rom_sg_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_sg_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
|
||||
|
||||
protected:
|
||||
required_device<pokey_device> m_pokey;
|
||||
};
|
||||
@ -97,7 +97,7 @@ public:
|
||||
// construction/destruction
|
||||
a78_rom_sg_ram_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a78_rom_sg_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
@ -112,7 +112,7 @@ public:
|
||||
// construction/destruction
|
||||
a78_rom_sg9_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a78_rom_sg9_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
@ -126,15 +126,15 @@ class a78_rom_abs_device : public a78_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_abs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -147,15 +147,15 @@ class a78_rom_act_device : public a78_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_act_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_40xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_40xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -170,13 +170,13 @@ class a78_rom_p450_device : public a78_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_p450_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx) { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx) { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
|
||||
|
||||
|
||||
protected:
|
||||
required_device<pokey_device> m_pokey450;
|
||||
};
|
||||
@ -189,13 +189,13 @@ class a78_rom_p450_pokey_device : public a78_rom_pokey_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_p450_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx) { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx) { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
|
||||
|
||||
|
||||
protected:
|
||||
required_device<pokey_device> m_pokey450;
|
||||
};
|
||||
@ -208,13 +208,13 @@ class a78_rom_p450_sg_ram_device : public a78_rom_sg_ram_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_p450_sg_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx) { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx) { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
|
||||
|
||||
|
||||
protected:
|
||||
required_device<pokey_device> m_pokey450;
|
||||
};
|
||||
@ -227,13 +227,13 @@ class a78_rom_p450_sg9_device : public a78_rom_sg9_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_rom_p450_sg9_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx) { if (offset >= 0x50 && offset < 0x60) return m_pokey450->read(space, offset & 0x0f); else return 0xff; }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx) { if (offset >= 0x50 && offset < 0x60) m_pokey450->write(space, offset & 0x0f, data); }
|
||||
|
||||
|
||||
protected:
|
||||
required_device<pokey_device> m_pokey450;
|
||||
};
|
||||
|
@ -3,7 +3,7 @@
|
||||
/***********************************************************************************************************
|
||||
|
||||
A7800 XBoarD & XM expansions emulation
|
||||
|
||||
|
||||
The XBoarD should be socketed in the A7800 pcb in place of the Maria chip.
|
||||
It adds to the system additional 128K of RAM and an onboard pokey.
|
||||
The XM seems to work the same as XBoarD, but it also features HighScore savings
|
||||
@ -12,31 +12,31 @@
|
||||
|
||||
Currently, we emulate both of these as a passthru cart, even if not 100% accurate for the XBoarD
|
||||
|
||||
|
||||
|
||||
Memory map:
|
||||
|
||||
POKEY1 $0450 $045F 16 bytes
|
||||
POKEY2* $0460 $046F 16 bytes
|
||||
XCTRL $0470 $047F 1 byte
|
||||
RAM $4000 $7FFF 16384 bytes
|
||||
|
||||
|
||||
XCTRL Bit Description
|
||||
|
||||
|
||||
+-------------------------------+
|
||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
||||
+-------------------------------+
|
||||
| | | | | | | |
|
||||
| | | | | | | +-- Bank select bit 0 \
|
||||
| | | | | | +------ Bank select bit 1 | Totally 128 KByte in 16 KByte banks
|
||||
| | | | | +---------- Bank select bit 2 /
|
||||
| | | | | +---------- Bank select bit 2 /
|
||||
| | | | +-------------- Enable memory bit (1 = Memory enabled, 0 after power on)
|
||||
| | | +------------------ Enable POKEY bit** (1 = POKEY enabled, 0 after power on)
|
||||
| | |
|
||||
NA NA NA = Not Available or Not Used
|
||||
|
||||
|
||||
* = Can be mounted piggy back on the first POKEY. Description how to do this will come when i have tried it out.
|
||||
** This bit controls both POKEY chip select signals.
|
||||
|
||||
|
||||
TODO:
|
||||
- verify what happens when 2 POKEYs are present
|
||||
|
||||
@ -142,9 +142,9 @@ machine_config_constructor a78_xm_device::device_mconfig_additions() const
|
||||
-------------------------------------------------*/
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
XBoarD: passthru + 128K RAM + POKEY
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_xboard_device::read_40xx)
|
||||
@ -168,7 +168,7 @@ READ8_MEMBER(a78_xboard_device::read_04xx)
|
||||
if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
|
||||
return m_pokey->read(space, offset & 0x0f);
|
||||
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
|
||||
return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY
|
||||
return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
@ -178,7 +178,7 @@ WRITE8_MEMBER(a78_xboard_device::write_04xx)
|
||||
if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60)
|
||||
m_pokey->write(space, offset & 0x0f, data);
|
||||
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
|
||||
m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY
|
||||
m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY
|
||||
else if (offset >= 0x70 && offset < 0x80)
|
||||
{
|
||||
m_reg = data;
|
||||
@ -188,9 +188,9 @@ WRITE8_MEMBER(a78_xboard_device::write_04xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
XM: Same as above but also featuring High Score savings
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a78_xm_device::read_10xx)
|
||||
@ -215,7 +215,7 @@ READ8_MEMBER(a78_xm_device::read_04xx)
|
||||
else if (m_ym_enabled && offset >= 0x60 && offset <= 0x61)
|
||||
return m_ym->read(space, offset & 1);
|
||||
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
|
||||
return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY
|
||||
return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
@ -227,7 +227,7 @@ WRITE8_MEMBER(a78_xm_device::write_04xx)
|
||||
else if (m_ym_enabled && offset >= 0x60 && offset <= 0x61)
|
||||
m_ym->write(space, offset & 1, data);
|
||||
else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70)
|
||||
m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY
|
||||
m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY
|
||||
else if (offset >= 0x70 && offset < 0x80)
|
||||
{
|
||||
//printf("regs 0x%X\n", data);
|
||||
|
@ -17,12 +17,12 @@ public:
|
||||
// construction/destruction
|
||||
a78_xboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
a78_xboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx);
|
||||
@ -43,19 +43,19 @@ class a78_xm_device : public a78_xboard_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a78_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_04xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_04xx);
|
||||
virtual DECLARE_READ8_MEMBER(read_10xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_10xx);
|
||||
virtual DECLARE_READ8_MEMBER(read_30xx);
|
||||
|
||||
|
||||
protected:
|
||||
required_device<ym2151_device> m_ym;
|
||||
int m_ym_enabled;
|
||||
|
@ -14,7 +14,7 @@ static SLOT_INTERFACE_START(a800_left)
|
||||
SLOT_INTERFACE_INTERNAL("a800_8k", A800_ROM)
|
||||
SLOT_INTERFACE_INTERNAL("a800_8k_right", A800_ROM)
|
||||
SLOT_INTERFACE_INTERNAL("a800_16k", A800_ROM)
|
||||
SLOT_INTERFACE_INTERNAL("a800_phoenix", A800_ROM) // not really emulated at this stage
|
||||
SLOT_INTERFACE_INTERNAL("a800_phoenix", A800_ROM) // not really emulated at this stage
|
||||
SLOT_INTERFACE_INTERNAL("a800_bbsb", A800_ROM_BBSB)
|
||||
SLOT_INTERFACE_INTERNAL("a800_oss8k", A800_ROM_OSS8K)
|
||||
SLOT_INTERFACE_INTERNAL("a800_oss034m", A800_ROM_OSS34)
|
||||
@ -23,13 +23,13 @@ static SLOT_INTERFACE_START(a800_left)
|
||||
SLOT_INTERFACE_INTERNAL("a800_williams", A800_ROM_WILLIAMS)
|
||||
SLOT_INTERFACE_INTERNAL("a800_diamond", A800_ROM_EXPRESS)
|
||||
SLOT_INTERFACE_INTERNAL("a800_express", A800_ROM_EXPRESS)
|
||||
SLOT_INTERFACE_INTERNAL("a800_sparta", A800_ROM_SPARTADOS) // this is a passthru cart with unemulated (atm) subslot
|
||||
SLOT_INTERFACE_INTERNAL("a800_sparta", A800_ROM_SPARTADOS) // this is a passthru cart with unemulated (atm) subslot
|
||||
SLOT_INTERFACE_INTERNAL("a800_blizzard", A800_ROM)
|
||||
SLOT_INTERFACE_INTERNAL("a800_turbo64", A800_ROM_TURBO)
|
||||
SLOT_INTERFACE_INTERNAL("a800_turbo128", A800_ROM_TURBO)
|
||||
SLOT_INTERFACE_INTERNAL("a800_tlink2", A800_ROM_TELELINK2)
|
||||
SLOT_INTERFACE_INTERNAL("a800_sitsa", A800_ROM_MICROCALC)
|
||||
SLOT_INTERFACE_INTERNAL("a800_corina", A800_ROM) // NOT SUPPORTED YET!
|
||||
SLOT_INTERFACE_INTERNAL("a800_corina", A800_ROM) // NOT SUPPORTED YET!
|
||||
SLOT_INTERFACE_INTERNAL("xegs", XEGS_ROM)
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
|
@ -6,12 +6,12 @@
|
||||
Atari 8 bit cart emulation
|
||||
(through slot devices)
|
||||
|
||||
Emulation of the cartslot(s) for Atari 8bit series of home computers
|
||||
|
||||
Emulation of the cartslot(s) for Atari 8bit series of home computers
|
||||
|
||||
Accessors to ROM are typically given in the area 0xa000-0xbfff, but some
|
||||
carts (and the right slot in A800) maps ROM to 0x8000-0x9fff too
|
||||
Bankswitch typically happens by accessing addresses in 0xd500-0xd5ff
|
||||
|
||||
|
||||
Accordingly, this device offers the following handlers
|
||||
- read_80xx/write_80xx
|
||||
- read_d5xx/write_d5xx
|
||||
@ -67,9 +67,9 @@ void device_a800_cart_interface::rom_alloc(UINT32 size, const char *tag)
|
||||
tempstring.cat(A800SLOT_ROM_REGION_TAG);
|
||||
m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base();
|
||||
m_rom_size = size;
|
||||
|
||||
|
||||
// setup other helpers
|
||||
m_bank_mask = (size / 0x2000) - 1; // code for XEGS carts makes use of this to simplify banking
|
||||
m_bank_mask = (size / 0x2000) - 1; // code for XEGS carts makes use of this to simplify banking
|
||||
}
|
||||
}
|
||||
|
||||
@ -243,15 +243,15 @@ bool a800_cart_slot_device::call_load()
|
||||
if (m_cart)
|
||||
{
|
||||
UINT32 len;
|
||||
|
||||
|
||||
if (software_entry() != NULL)
|
||||
{
|
||||
const char *pcb_name;
|
||||
len = get_software_region_length("rom");
|
||||
|
||||
|
||||
m_cart->rom_alloc(len, tag());
|
||||
memcpy(m_cart->get_rom_base(), get_software_region("rom"), len);
|
||||
|
||||
|
||||
if ((pcb_name = get_feature("slot")) != NULL)
|
||||
m_type = a800_get_pcb_id(pcb_name);
|
||||
else
|
||||
@ -267,9 +267,9 @@ bool a800_cart_slot_device::call_load()
|
||||
UINT8 header[16];
|
||||
fread(header, 0x10);
|
||||
m_type = identify_cart_type(header);
|
||||
len -= 0x10; // in identify_cart_type the first 0x10 bytes are read, so we need to adjust here
|
||||
len -= 0x10; // in identify_cart_type the first 0x10 bytes are read, so we need to adjust here
|
||||
}
|
||||
else // otherwise try to guess based on size
|
||||
else // otherwise try to guess based on size
|
||||
{
|
||||
if (len == 0x8000)
|
||||
m_type = A5200_32K;
|
||||
@ -323,7 +323,7 @@ int a800_cart_slot_device::identify_cart_type(UINT8 *header)
|
||||
// check CART format
|
||||
if (strncmp((const char *)header, "CART", 4))
|
||||
fatalerror("Invalid header detected!\n");
|
||||
|
||||
|
||||
switch ((header[4] << 24) + (header[5] << 16) + (header[6] << 8) + (header[7] << 0))
|
||||
{
|
||||
case 1:
|
||||
@ -400,7 +400,7 @@ int a800_cart_slot_device::identify_cart_type(UINT8 *header)
|
||||
osd_printf_info("Cart type \"%d\" is currently unsupported.\n", (header[4] << 24) + (header[5] << 16) + (header[6] << 8) + (header[7] << 0));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
@ -420,10 +420,10 @@ void a800_cart_slot_device::get_default_card_software(astring &result)
|
||||
// check whether there is an header, to identify the cart type
|
||||
if ((len % 0x1000) == 0x10)
|
||||
{
|
||||
core_fread(m_file, head, 0x10);
|
||||
core_fread(m_file, head, 0x10);
|
||||
type = identify_cart_type(head);
|
||||
}
|
||||
else // otherwise try to guess based on size
|
||||
else // otherwise try to guess based on size
|
||||
{
|
||||
if (len == 0x4000)
|
||||
type = A800_16K;
|
||||
@ -435,9 +435,9 @@ void a800_cart_slot_device::get_default_card_software(astring &result)
|
||||
osd_printf_info("This game is not designed for A800. You might want to run it in A5200.\n");
|
||||
|
||||
slot_string = a800_get_slot(type);
|
||||
|
||||
|
||||
clear();
|
||||
|
||||
|
||||
result.cpy(slot_string);
|
||||
}
|
||||
else
|
||||
@ -453,11 +453,11 @@ void a5200_cart_slot_device::get_default_card_software(astring &result)
|
||||
dynamic_buffer head(0x10);
|
||||
UINT32 len = core_fsize(m_file);
|
||||
int type = A5200_8K;
|
||||
|
||||
|
||||
// check whether there is an header, to identify the cart type
|
||||
if ((len % 0x1000) == 0x10)
|
||||
{
|
||||
core_fread(m_file, head, 0x10);
|
||||
core_fread(m_file, head, 0x10);
|
||||
type = identify_cart_type(head);
|
||||
|
||||
astring info;
|
||||
@ -466,11 +466,11 @@ void a5200_cart_slot_device::get_default_card_software(astring &result)
|
||||
}
|
||||
if (type < A5200_4K)
|
||||
osd_printf_info("This game is not designed for A5200. You might want to run it in A800 or A800XL.\n");
|
||||
|
||||
|
||||
slot_string = a800_get_slot(type);
|
||||
|
||||
|
||||
clear();
|
||||
|
||||
|
||||
result.cpy(slot_string);
|
||||
}
|
||||
else
|
||||
@ -486,11 +486,11 @@ void xegs_cart_slot_device::get_default_card_software(astring &result)
|
||||
dynamic_buffer head(0x10);
|
||||
UINT32 len = core_fsize(m_file);
|
||||
int type = A800_8K;
|
||||
|
||||
|
||||
// check whether there is an header, to identify the cart type
|
||||
if ((len % 0x1000) == 0x10)
|
||||
{
|
||||
core_fread(m_file, head, 0x10);
|
||||
core_fread(m_file, head, 0x10);
|
||||
type = identify_cart_type(head);
|
||||
}
|
||||
if (type != A800_XEGS)
|
||||
@ -501,11 +501,11 @@ void xegs_cart_slot_device::get_default_card_software(astring &result)
|
||||
else
|
||||
osd_printf_info("You might want to run it in A800 or A800XL.\n");
|
||||
}
|
||||
|
||||
|
||||
slot_string = a800_get_slot(type);
|
||||
|
||||
|
||||
clear();
|
||||
|
||||
|
||||
result.cpy(slot_string);
|
||||
}
|
||||
else
|
||||
@ -549,4 +549,3 @@ WRITE8_MEMBER(a800_cart_slot_device::write_d5xx)
|
||||
if (m_cart)
|
||||
m_cart->write_d5xx(space, offset, data, mem_mask);
|
||||
}
|
||||
|
||||
|
@ -20,11 +20,11 @@ enum
|
||||
A800_OSSM091,
|
||||
A800_OSS8K,
|
||||
A800_PHOENIX,
|
||||
A800_XEGS,
|
||||
A800_BBSB,
|
||||
A800_XEGS,
|
||||
A800_BBSB,
|
||||
A800_DIAMOND,
|
||||
A800_WILLIAMS,
|
||||
A800_EXPRESS,
|
||||
A800_EXPRESS,
|
||||
A800_SPARTADOS,
|
||||
A800_BLIZZARD,
|
||||
A800_TURBO64,
|
||||
@ -71,7 +71,7 @@ protected:
|
||||
UINT8 *m_rom;
|
||||
UINT32 m_rom_size;
|
||||
dynamic_buffer m_ram;
|
||||
dynamic_buffer m_nvram; // HiScore cart can save scores!
|
||||
dynamic_buffer m_nvram; // HiScore cart can save scores!
|
||||
// helpers
|
||||
int m_bank_mask;
|
||||
};
|
||||
@ -101,7 +101,7 @@ public:
|
||||
int get_cart_type() { return m_type; };
|
||||
int identify_cart_type(UINT8 *header);
|
||||
bool has_cart() { return m_cart != NULL; }
|
||||
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
|
||||
virtual bool is_readable() const { return 1; }
|
||||
virtual bool is_writeable() const { return 0; }
|
||||
@ -120,7 +120,7 @@ public:
|
||||
virtual DECLARE_READ8_MEMBER(read_d5xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
private:
|
||||
device_a800_cart_interface* m_cart;
|
||||
int m_type;
|
||||
@ -138,9 +138,9 @@ public:
|
||||
// construction/destruction
|
||||
a5200_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
virtual ~a5200_cart_slot_device();
|
||||
|
||||
|
||||
virtual const char *file_extensions() const { return "bin,rom,car,a52"; }
|
||||
|
||||
|
||||
// slot interface overrides
|
||||
virtual void get_default_card_software(astring &result);
|
||||
};
|
||||
@ -155,7 +155,7 @@ public:
|
||||
virtual ~xegs_cart_slot_device();
|
||||
|
||||
virtual const char *file_extensions() const { return "bin,rom,car"; }
|
||||
|
||||
|
||||
// slot interface overrides
|
||||
virtual void get_default_card_software(astring &result);
|
||||
};
|
||||
|
@ -95,11 +95,11 @@ void a800_rom_oss91_device::device_reset()
|
||||
-------------------------------------------------*/
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
OSS 8K
|
||||
|
||||
|
||||
This is used by The Writer's Tool only.
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_oss8k_device::read_80xx)
|
||||
@ -128,12 +128,12 @@ WRITE8_MEMBER(a800_rom_oss8k_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
OSS 034M
|
||||
|
||||
|
||||
This apparently comes from a dump with the wrong bank order...
|
||||
investigate whether we should remove it!
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_oss34_device::read_80xx)
|
||||
@ -156,7 +156,7 @@ WRITE8_MEMBER(a800_rom_oss34_device::write_d5xx)
|
||||
break;
|
||||
case 2:
|
||||
case 6:
|
||||
m_bank = 3; // in this case the ROM gets disabled and 0xff is returned in 0xa000-0xafff
|
||||
m_bank = 3; // in this case the ROM gets disabled and 0xff is returned in 0xa000-0xafff
|
||||
break;
|
||||
case 3:
|
||||
case 7:
|
||||
@ -173,11 +173,11 @@ WRITE8_MEMBER(a800_rom_oss34_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
OSS 043M
|
||||
|
||||
|
||||
Same as above but with correct bank order
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_oss43_device::read_80xx)
|
||||
@ -200,7 +200,7 @@ WRITE8_MEMBER(a800_rom_oss43_device::write_d5xx)
|
||||
break;
|
||||
case 2:
|
||||
case 6:
|
||||
m_bank = 3; // in this case the ROM gets disabled and 0xff is returned in 0xa000-0xafff
|
||||
m_bank = 3; // in this case the ROM gets disabled and 0xff is returned in 0xa000-0xafff
|
||||
break;
|
||||
case 3:
|
||||
case 7:
|
||||
@ -217,12 +217,12 @@ WRITE8_MEMBER(a800_rom_oss43_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
OSS M091
|
||||
|
||||
Simplified banking system which only uses two
|
||||
|
||||
Simplified banking system which only uses two
|
||||
address lines (A0 & A3)
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_oss91_device::read_80xx)
|
||||
@ -250,4 +250,3 @@ WRITE8_MEMBER(a800_rom_oss91_device::write_d5xx)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,14 +13,14 @@ class a800_rom_oss8k_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_oss8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -53,14 +53,14 @@ class a800_rom_oss43_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_oss43_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -73,14 +73,14 @@ class a800_rom_oss91_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_oss91_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
|
@ -3,7 +3,7 @@
|
||||
/***********************************************************************************************************
|
||||
|
||||
A800/A5200/XEGS ROM cart emulation
|
||||
|
||||
|
||||
Basic carts work the same (in addition of being mostly compatible) for all these systems
|
||||
and thus we deal with them in a single file
|
||||
|
||||
@ -196,7 +196,7 @@ void a5200_rom_bbsb_device::device_reset()
|
||||
/*-------------------------------------------------
|
||||
|
||||
Carts with no bankswitch (8K, 16K)
|
||||
|
||||
|
||||
The cart accessors are mapped in the correct
|
||||
range at driver start
|
||||
|
||||
@ -210,14 +210,14 @@ READ8_MEMBER(a800_rom_device::read_80xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Bounty Bob Strikes Back! cart (40K)
|
||||
|
||||
|
||||
Area 0xa000-0xbfff always point to last 8K bank
|
||||
Areas 0x8000-0x8fff and 0x9000-0x9fff are
|
||||
Areas 0x8000-0x8fff and 0x9000-0x9fff are
|
||||
separate banks of 4K mapped either in the first
|
||||
16K chunk or in the second 16K chunk
|
||||
Bankswitch is controlled by data written in
|
||||
Bankswitch is controlled by data written in
|
||||
0x8000-0x8fff and 0x9000-0x9fff respectively
|
||||
|
||||
-------------------------------------------------*/
|
||||
@ -240,12 +240,12 @@ WRITE8_MEMBER(a800_rom_bbsb_device::write_80xx)
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
XEGS carts (32K, 64K or 128K)
|
||||
|
||||
Bankswitch is controlled by data written in
|
||||
|
||||
Bankswitch is controlled by data written in
|
||||
0xd500-0xd5ff
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(xegs_rom_device::read_80xx)
|
||||
@ -253,8 +253,8 @@ READ8_MEMBER(xegs_rom_device::read_80xx)
|
||||
if (offset < 0x2000)
|
||||
return m_rom[(offset & 0x1fff) + (m_bank * 0x2000)];
|
||||
else
|
||||
return m_rom[(offset & 0x1fff) + (m_bank_mask * 0x2000)]; // always last 8K bank
|
||||
|
||||
return m_rom[(offset & 0x1fff) + (m_bank_mask * 0x2000)]; // always last 8K bank
|
||||
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(xegs_rom_device::write_d5xx)
|
||||
@ -264,16 +264,16 @@ WRITE8_MEMBER(xegs_rom_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Williams 64K
|
||||
|
||||
|
||||
The rom is accessed in 8K chunks at 0xa000-0xbfff
|
||||
Bankswitch is controlled by writing to 7 diff
|
||||
offsets (their location varies with the cart type):
|
||||
offs 0 points to bank 0, offs 1 points to bank 1,
|
||||
and so on... the rom can be disabled by writing to
|
||||
offsets (their location varies with the cart type):
|
||||
offs 0 points to bank 0, offs 1 points to bank 1,
|
||||
and so on... the rom can be disabled by writing to
|
||||
the offsets 0x8-0xf of the same range as the bankswitch
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_williams_device::read_80xx)
|
||||
@ -287,16 +287,16 @@ WRITE8_MEMBER(a800_rom_williams_device::write_d5xx)
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Express 64K / Diamond 64K carts
|
||||
|
||||
|
||||
The rom is accessed in 8K chunks at 0xa000-0xbfff
|
||||
Bankswitch is the same as above, but writes trigger
|
||||
banks in reverse order: offs 7 points to bank 0, offs 6
|
||||
Bankswitch is the same as above, but writes trigger
|
||||
banks in reverse order: offs 7 points to bank 0, offs 6
|
||||
points to bank 1, and so on... the rom can be disabled
|
||||
by writing to the offsets 0x8-0xf of the same range
|
||||
as the bankswitch
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_express_device::read_80xx)
|
||||
@ -311,10 +311,10 @@ WRITE8_MEMBER(a800_rom_express_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Turbosoft 64K / 128K
|
||||
|
||||
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_turbo_device::read_80xx)
|
||||
@ -329,10 +329,10 @@ WRITE8_MEMBER(a800_rom_turbo_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Telelink II
|
||||
|
||||
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_telelink2_device::read_80xx)
|
||||
@ -347,7 +347,7 @@ READ8_MEMBER(a800_rom_telelink2_device::read_80xx)
|
||||
|
||||
WRITE8_MEMBER(a800_rom_telelink2_device::write_80xx)
|
||||
{
|
||||
m_nvram[offset & 0xff] = data | 0xf0; // low 4bits only
|
||||
m_nvram[offset & 0xff] = data | 0xf0; // low 4bits only
|
||||
}
|
||||
|
||||
READ8_MEMBER(a800_rom_telelink2_device::read_d5xx)
|
||||
@ -364,10 +364,10 @@ WRITE8_MEMBER(a800_rom_telelink2_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
SITSA Microcalc
|
||||
|
||||
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_microcalc_device::read_80xx)
|
||||
@ -386,21 +386,21 @@ WRITE8_MEMBER(a800_rom_microcalc_device::write_d5xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Carts with no bankswitch (4K, 8K, 16K, 32K)
|
||||
|
||||
|
||||
Same as base carts above
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Carts with 2x8K (16K) with A13 line not connected
|
||||
|
||||
|
||||
Range 0x4000-0x7fff contains two copies of the low
|
||||
8K, range 0x8000-0xbfff contains two copies of the
|
||||
high 8K
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a5200_rom_2chips_device::read_80xx)
|
||||
@ -413,18 +413,18 @@ READ8_MEMBER(a5200_rom_2chips_device::read_80xx)
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
Bounty Bob Strikes Back! cart (40K)
|
||||
|
||||
|
||||
Similar to the A800 version, but:
|
||||
Area 0x8000-0xbfff always point to last 8K bank
|
||||
(repeated twice)
|
||||
Areas 0x4000-0x4fff and 0x5000-0x5fff are
|
||||
Areas 0x4000-0x4fff and 0x5000-0x5fff are
|
||||
separate banks of 4K mapped either in the first
|
||||
16K chunk or in the second 16K chunk
|
||||
Bankswitch is controlled by data written in
|
||||
Bankswitch is controlled by data written in
|
||||
0x4000-0x4fff and 0x5000-0x5fff respectively
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a5200_rom_bbsb_device::read_80xx)
|
||||
@ -445,4 +445,3 @@ WRITE8_MEMBER(a5200_rom_bbsb_device::write_80xx)
|
||||
if (addr >= 0xff6 && addr <= 0xff9)
|
||||
m_banks[BIT(offset, 12)] = (addr - 0xff6);
|
||||
}
|
||||
|
||||
|
@ -31,14 +31,14 @@ class a800_rom_bbsb_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_bbsb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_80xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_banks[2];
|
||||
};
|
||||
@ -51,14 +51,14 @@ class a800_rom_williams_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_williams_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -71,14 +71,14 @@ class a800_rom_express_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_express_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -91,11 +91,11 @@ class a800_rom_blizzard_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_blizzard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
};
|
||||
|
||||
@ -107,14 +107,14 @@ class a800_rom_turbo_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_turbo_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -127,7 +127,7 @@ class a800_rom_telelink2_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_telelink2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_80xx);
|
||||
virtual DECLARE_READ8_MEMBER(read_d5xx);
|
||||
@ -142,14 +142,14 @@ class a800_rom_microcalc_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_microcalc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -162,14 +162,14 @@ class xegs_rom_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
xegs_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank;
|
||||
};
|
||||
@ -182,7 +182,7 @@ class a5200_rom_2chips_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a5200_rom_2chips_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
};
|
||||
|
||||
@ -194,14 +194,14 @@ class a5200_rom_bbsb_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a5200_rom_bbsb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_80xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_banks[2];
|
||||
};
|
||||
|
@ -43,14 +43,14 @@ void a800_rom_spartados_device::device_reset()
|
||||
-------------------------------------------------*/
|
||||
|
||||
/*-------------------------------------------------
|
||||
|
||||
|
||||
SpartaDOS 64K carts
|
||||
|
||||
Similar to Express / Diamond carts, because
|
||||
bankswitch is controlled by writing to 7 diff
|
||||
offsets in reverse order, but writes to offsets
|
||||
|
||||
Similar to Express / Diamond carts, because
|
||||
bankswitch is controlled by writing to 7 diff
|
||||
offsets in reverse order, but writes to offsets
|
||||
0x8-0xf also enable/disable subslot
|
||||
|
||||
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ8_MEMBER(a800_rom_spartados_device::read_80xx)
|
||||
@ -58,7 +58,7 @@ READ8_MEMBER(a800_rom_spartados_device::read_80xx)
|
||||
if (!m_subslot_enabled)
|
||||
return m_rom[(offset & 0x1fff) + (m_bank * 0x2000)];
|
||||
else
|
||||
return 0xff; // subslot, currently not implemented
|
||||
return 0xff; // subslot, currently not implemented
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(a800_rom_spartados_device::write_d5xx)
|
||||
@ -69,4 +69,3 @@ WRITE8_MEMBER(a800_rom_spartados_device::write_d5xx)
|
||||
m_bank = (offset ^ 0x07) & 0x0f;
|
||||
|
||||
}
|
||||
|
||||
|
@ -13,14 +13,14 @@ class a800_rom_spartados_device : public a800_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
a800_rom_spartados_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
virtual DECLARE_READ8_MEMBER(read_80xx);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_d5xx);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank, m_subslot_enabled;
|
||||
};
|
||||
|
@ -43,7 +43,7 @@ class apf_spacedst_device : public apf_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
apf_spacedst_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_ram);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram);
|
||||
|
@ -169,9 +169,9 @@ bool apf_cart_slot_device::call_load()
|
||||
seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an APF cart");
|
||||
return IMAGE_INIT_FAIL;
|
||||
}
|
||||
|
||||
|
||||
m_cart->rom_alloc(size, tag());
|
||||
|
||||
|
||||
if (software_entry() == NULL)
|
||||
fread(m_cart->get_rom_base(), size);
|
||||
else
|
||||
@ -294,5 +294,3 @@ WRITE8_MEMBER(apf_cart_slot_device::write_ram)
|
||||
if (m_cart)
|
||||
m_cart->write_ram(space, offset, data);
|
||||
}
|
||||
|
||||
|
||||
|
@ -39,7 +39,7 @@ public:
|
||||
UINT32 get_rom_size() { return m_rom_size; }
|
||||
UINT32 get_ram_size() { return m_ram.count(); }
|
||||
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
|
||||
protected:
|
||||
// internal state
|
||||
@ -71,7 +71,7 @@ public:
|
||||
|
||||
int get_type() { return m_type; }
|
||||
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
|
||||
virtual bool is_readable() const { return 1; }
|
||||
@ -112,6 +112,5 @@ extern const device_type APF_CART_SLOT;
|
||||
|
||||
#define MCFG_APF_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, APF_CART_SLOT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
|
||||
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||
#endif
|
||||
|
@ -155,7 +155,7 @@ bool arcadia_cart_slot_device::call_load()
|
||||
UINT32 len = (software_entry() == NULL) ? length() : get_software_region_length("rom");
|
||||
|
||||
m_cart->rom_alloc(len, tag());
|
||||
|
||||
|
||||
if (software_entry() == NULL)
|
||||
fread(m_cart->get_rom_base(), len);
|
||||
else
|
||||
@ -260,4 +260,3 @@ READ8_MEMBER(arcadia_cart_slot_device::extra_rom)
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
@ -99,6 +99,5 @@ extern const device_type EA2001_CART_SLOT;
|
||||
|
||||
#define MCFG_ARCADIA_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, EA2001_CART_SLOT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
|
||||
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||
#endif
|
||||
|
@ -73,7 +73,7 @@ c64_dela_ep256_cartridge_device::c64_dela_ep256_cartridge_device(const machine_c
|
||||
char str[6];
|
||||
sprintf(str, "rom%i", i + 1);
|
||||
m_eproms[i] = subdevice<generic_slot_device>(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -49,7 +49,7 @@ protected:
|
||||
|
||||
private:
|
||||
generic_slot_device *m_eproms[8];
|
||||
|
||||
|
||||
UINT8 m_bank, m_socket;
|
||||
int m_reset;
|
||||
};
|
||||
|
@ -1,11 +1,11 @@
|
||||
/*
|
||||
* digiblst.h
|
||||
*
|
||||
* Digiblaster - a DIY printer port DAC for the Amstrad CPC
|
||||
* Printed in the German magazine CPC Amstrad International issue 8-9/1991
|
||||
* Uses Strobe (inverted on the CPC) for the 8th bit (CPCs only have 7-bit printer ports)
|
||||
* Digiblaster - a DIY printer port DAC for the Amstrad CPC
|
||||
* Printed in the German magazine CPC Amstrad International issue 8-9/1991
|
||||
* Uses Strobe (inverted on the CPC) for the 8th bit (CPCs only have 7-bit printer ports)
|
||||
*
|
||||
* Code borrows from the Covox Speech Thing device.
|
||||
* Code borrows from the Covox Speech Thing device.
|
||||
*
|
||||
* Created on: 23/08/2014
|
||||
*/
|
||||
|
@ -164,7 +164,7 @@ UINT8 chanf_rom_device::common_read_2102(UINT32 offset)
|
||||
m_data0 = m_ram[m_addr] & 1;
|
||||
return (m_latch[0] & 0x7f) | (m_data0 << 7);
|
||||
}
|
||||
|
||||
|
||||
return m_latch[0];
|
||||
}
|
||||
else
|
||||
@ -176,10 +176,10 @@ void chanf_rom_device::common_write_2102(UINT32 offset, UINT8 data)
|
||||
if (offset == 0)
|
||||
{
|
||||
m_latch[0] = data;
|
||||
|
||||
|
||||
m_read_write = BIT(data, 0);
|
||||
|
||||
m_addr_latch = (m_addr_latch & 0x3f3) | (BIT(data, 2) << 2) | (BIT(data, 1) << 3); // bits 2,3 come from this write!
|
||||
m_addr_latch = (m_addr_latch & 0x3f3) | (BIT(data, 2) << 2) | (BIT(data, 1) << 3); // bits 2,3 come from this write!
|
||||
m_addr = m_addr_latch;
|
||||
|
||||
m_data0 = BIT(data, 3);
|
||||
@ -199,7 +199,7 @@ void chanf_rom_device::common_write_2102(UINT32 offset, UINT8 data)
|
||||
|
||||
// These are shared among Schach & Multigame cart types (not directly used by base chanf_rom_device)
|
||||
UINT8 chanf_rom_device::common_read_3853(UINT32 offset)
|
||||
{
|
||||
{
|
||||
if (offset < m_ram.count())
|
||||
return m_ram[offset];
|
||||
else
|
||||
@ -207,7 +207,7 @@ UINT8 chanf_rom_device::common_read_3853(UINT32 offset)
|
||||
}
|
||||
|
||||
void chanf_rom_device::common_write_3853(UINT32 offset, UINT8 data)
|
||||
{
|
||||
{
|
||||
if (offset < m_ram.count())
|
||||
m_ram[offset] = data;
|
||||
}
|
||||
@ -240,4 +240,3 @@ WRITE8_MEMBER(chanf_multi_final_device::write_bank)
|
||||
m_base_bank = data & 0x1f;
|
||||
m_half_bank = BIT(data, 5);
|
||||
}
|
||||
|
||||
|
@ -24,14 +24,14 @@ public:
|
||||
UINT8 common_read_3853(UINT32 offset);
|
||||
void common_write_2102(UINT32 offset, UINT8 data);
|
||||
void common_write_3853(UINT32 offset, UINT8 data);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom);
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
// used for RAM chip in Hangman & Maze
|
||||
UINT8 m_latch[2]; // PORT A & PORT B
|
||||
UINT8 m_latch[2]; // PORT A & PORT B
|
||||
UINT16 m_addr_latch, m_addr;
|
||||
int m_read_write, m_data0;
|
||||
};
|
||||
@ -43,11 +43,11 @@ class chanf_maze_device : public chanf_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
chanf_maze_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_ram) { return common_read_2102(offset); }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram) { common_write_2102(offset, data); }
|
||||
@ -61,11 +61,11 @@ class chanf_hangman_device : public chanf_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
chanf_hangman_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_ram) { return common_read_2102(offset); }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram) { common_write_2102(offset, data); }
|
||||
@ -79,7 +79,7 @@ class chanf_chess_device : public chanf_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
chanf_chess_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_ram) { return common_read_3853(offset); }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram) { common_write_3853(offset, data); }
|
||||
@ -93,11 +93,11 @@ class chanf_multi_old_device : public chanf_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
chanf_multi_old_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom);
|
||||
virtual DECLARE_READ8_MEMBER(read_ram) { return common_read_3853(offset); }
|
||||
@ -116,17 +116,17 @@ class chanf_multi_final_device : public chanf_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
chanf_multi_final_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom);
|
||||
virtual DECLARE_READ8_MEMBER(read_ram) { return common_read_3853(offset); }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram) { common_write_3853(offset, data); }
|
||||
virtual DECLARE_WRITE8_MEMBER(write_bank);
|
||||
|
||||
|
||||
private:
|
||||
int m_base_bank, m_half_bank;
|
||||
};
|
||||
|
@ -178,9 +178,9 @@ bool channelf_cart_slot_device::call_load()
|
||||
// we default to "chess" slot because some homebrew programs have been written to run
|
||||
// on PCBs with RAM at $2000-$2800 as Saba Schach!
|
||||
if (len == 0x40000)
|
||||
m_type = CF_MULTI; // TODO1: differentiate multicart final and earlier from fullpath
|
||||
m_type = CF_MULTI; // TODO1: differentiate multicart final and earlier from fullpath
|
||||
else
|
||||
m_type = CF_CHESS; // TODO2: is there any way to detect Maze and Hangman from fullpath?
|
||||
m_type = CF_CHESS; // TODO2: is there any way to detect Maze and Hangman from fullpath?
|
||||
|
||||
m_cart->ram_alloc(0x800);
|
||||
}
|
||||
@ -226,17 +226,17 @@ void channelf_cart_slot_device::get_default_card_software(astring &result)
|
||||
const char *slot_string = "chess";
|
||||
UINT32 len = core_fsize(m_file);
|
||||
int type;
|
||||
|
||||
|
||||
if (len == 0x40000)
|
||||
type = CF_MULTI;
|
||||
else
|
||||
type = CF_CHESS; // is there any way to detect the other carts from fullpath?
|
||||
|
||||
type = CF_CHESS; // is there any way to detect the other carts from fullpath?
|
||||
|
||||
slot_string = chanf_get_slot(type);
|
||||
|
||||
|
||||
//printf("type: %s\n", slot_string);
|
||||
clear();
|
||||
|
||||
|
||||
result.cpy(slot_string);
|
||||
return;
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
UINT32 get_rom_size() { return m_rom_size; }
|
||||
UINT32 get_ram_size() { return m_ram.count(); }
|
||||
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
|
||||
protected:
|
||||
// internal state
|
||||
@ -74,7 +74,7 @@ public:
|
||||
|
||||
int get_type() { return m_type; }
|
||||
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
|
||||
virtual bool is_readable() const { return 1; }
|
||||
@ -115,6 +115,5 @@ extern const device_type CHANF_CART_SLOT;
|
||||
|
||||
#define MCFG_CHANNELF_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, CHANF_CART_SLOT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
|
||||
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||
#endif
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include "sound/dac.h"
|
||||
|
||||
class cpc_amdrum_device : public device_t,
|
||||
public device_cpc_expansion_card_interface
|
||||
public device_cpc_expansion_card_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
|
@ -47,11 +47,11 @@ static INPUT_PORTS_START(cpc_symbiface2)
|
||||
PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("PS/2 Mouse forward button") PORT_CODE(MOUSECODE_BUTTON5) PORT_CHANGED_MEMBER(DEVICE_SELF,cpc_symbiface2_device,mouse_change_x,NULL)
|
||||
|
||||
// TODO: mouse scroll wheel support
|
||||
// PORT_START("sf2_mouse_scroll")
|
||||
// PORT_BIT(0x1f , 0, IPT_TRACKBALL_Y)
|
||||
// PORT_SENSITIVITY(100)
|
||||
// PORT_KEYDELTA(10)
|
||||
// PORT_PLAYER(1)
|
||||
// PORT_START("sf2_mouse_scroll")
|
||||
// PORT_BIT(0x1f , 0, IPT_TRACKBALL_Y)
|
||||
// PORT_SENSITIVITY(100)
|
||||
// PORT_KEYDELTA(10)
|
||||
// PORT_PLAYER(1)
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -189,26 +189,26 @@ WRITE8_MEMBER(cpc_symbiface2_device::rtc_w)
|
||||
// PS/2 Mouse connector
|
||||
// #FD10 (read only) read mouse status
|
||||
/*
|
||||
Status byte
|
||||
Bit 76543210
|
||||
Use mmDDDDDD
|
||||
Status byte
|
||||
Bit 76543210
|
||||
Use mmDDDDDD
|
||||
|
||||
m: Mode
|
||||
D: Use-Data
|
||||
m: Mode
|
||||
D: Use-Data
|
||||
|
||||
If read and...
|
||||
If read and...
|
||||
|
||||
m = 00 -> no more data available, you can stop reading the status for a while
|
||||
m = 01 -> D = X offset (signed); you will receive positive values, if the user
|
||||
is moving the mouse to the right
|
||||
m = 10 -> D = Y offset (signed); you will receive positive values, if the user
|
||||
is moving the mouse upwards
|
||||
m = 11 -> D[bit5] = 0 -> D[bit0] = left button
|
||||
D[bit1] = right button
|
||||
D[bit2] = middle button
|
||||
D[bit3] = forward button
|
||||
D[bit4] = backward button
|
||||
D[bit5] = 1 -> D[bit0-4] = scroll wheel offset (signed)
|
||||
m = 00 -> no more data available, you can stop reading the status for a while
|
||||
m = 01 -> D = X offset (signed); you will receive positive values, if the user
|
||||
is moving the mouse to the right
|
||||
m = 10 -> D = Y offset (signed); you will receive positive values, if the user
|
||||
is moving the mouse upwards
|
||||
m = 11 -> D[bit5] = 0 -> D[bit0] = left button
|
||||
D[bit1] = right button
|
||||
D[bit2] = middle button
|
||||
D[bit3] = forward button
|
||||
D[bit4] = backward button
|
||||
D[bit5] = 1 -> D[bit0-4] = scroll wheel offset (signed)
|
||||
*/
|
||||
READ8_MEMBER(cpc_symbiface2_device::mouse_r)
|
||||
{
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include "cpcexp.h"
|
||||
|
||||
class cpc_symbiface2_device : public device_t,
|
||||
public device_cpc_expansion_card_interface
|
||||
public device_cpc_expansion_card_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
|
@ -88,7 +88,7 @@ READ8_MEMBER(crvision_rom6k_device::read_rom80)
|
||||
offset &= 0x1fff;
|
||||
if (offset < 0x1000)
|
||||
return m_rom[0x1000 + (offset & 0x7ff)];
|
||||
|
||||
|
||||
return m_rom[offset & 0xfff];
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,7 @@ class crvision_rom8k_device : public crvision_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
crvision_rom8k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom80);
|
||||
};
|
||||
@ -55,7 +55,7 @@ class crvision_rom10k_device : public crvision_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
crvision_rom10k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom40);
|
||||
virtual DECLARE_READ8_MEMBER(read_rom80);
|
||||
@ -68,7 +68,7 @@ class crvision_rom12k_device : public crvision_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
crvision_rom12k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom40);
|
||||
virtual DECLARE_READ8_MEMBER(read_rom80);
|
||||
@ -81,7 +81,7 @@ class crvision_rom16k_device : public crvision_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
crvision_rom16k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom80);
|
||||
};
|
||||
@ -93,7 +93,7 @@ class crvision_rom18k_device : public crvision_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
crvision_rom18k_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom40);
|
||||
virtual DECLARE_READ8_MEMBER(read_rom80);
|
||||
|
@ -163,9 +163,9 @@ bool crvision_cart_slot_device::call_load()
|
||||
seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an APF cart");
|
||||
return IMAGE_INIT_FAIL;
|
||||
}
|
||||
|
||||
|
||||
m_cart->rom_alloc(size, tag());
|
||||
|
||||
|
||||
if (software_entry() == NULL)
|
||||
fread(m_cart->get_rom_base(), size);
|
||||
else
|
||||
@ -295,4 +295,3 @@ READ8_MEMBER(crvision_cart_slot_device::read_rom80)
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
@ -104,6 +104,5 @@ extern const device_type CRVISION_CART_SLOT;
|
||||
|
||||
#define MCFG_CRVISION_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, CRVISION_CART_SLOT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
|
||||
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||
#endif
|
||||
|
@ -71,8 +71,8 @@ public:
|
||||
void set_has_battery(bool val) { has_battery = val; }
|
||||
bool get_has_battery() { return has_battery; }
|
||||
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
|
||||
// internal state
|
||||
UINT8 *m_rom;
|
||||
UINT32 m_rom_size;
|
||||
@ -122,8 +122,8 @@ public:
|
||||
|
||||
void setup_ram(UINT8 banks);
|
||||
void internal_header_logging(UINT8 *ROM, UINT32 len);
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
|
||||
virtual bool is_readable() const { return 1; }
|
||||
virtual bool is_writeable() const { return 0; }
|
||||
|
@ -183,11 +183,11 @@ class gb_rom_188in1_device : public gb_rom_mbc1_device
|
||||
public:
|
||||
// construction/destruction
|
||||
gb_rom_188in1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() { shared_start(); save_item(NAME(m_game_base)); };
|
||||
virtual void device_reset() { shared_reset(); m_game_base = 0; };
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_bank);
|
||||
|
@ -42,7 +42,7 @@ public:
|
||||
UINT32 get_nvram_size() { return m_nvram.bytes(); }
|
||||
void set_rom_size(UINT32 val) { m_rom_size = val; }
|
||||
|
||||
void save_nvram() { device().save_item(NAME(m_nvram)); }
|
||||
void save_nvram() { device().save_item(NAME(m_nvram)); }
|
||||
|
||||
// internal state
|
||||
UINT32 *m_rom; // this points to the cart rom region
|
||||
@ -77,7 +77,7 @@ public:
|
||||
void setup_ram(UINT8 banks);
|
||||
void internal_header_logging(UINT8 *ROM, UINT32 len);
|
||||
|
||||
void save_nvram() { if (m_cart && m_cart->get_nvram_size()) m_cart->save_nvram(); }
|
||||
void save_nvram() { if (m_cart && m_cart->get_nvram_size()) m_cart->save_nvram(); }
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
|
||||
virtual bool is_readable() const { return 1; }
|
||||
@ -175,7 +175,7 @@ static const gba_chip_fix_conflict_item gba_chip_fix_conflict_list[] =
|
||||
{ "BR4J", GBA_CHIP_FLASH }, // 1586 - Rockman EXE 4.5 - Real Operation (JPN)
|
||||
{ "BG8J", GBA_CHIP_EEPROM_64K }, // 1853 - Ganbare! Dodge Fighters (JPN)
|
||||
{ "AROP", GBA_CHIP_EEPROM_4K }, // 1862 - Rocky (EUR)
|
||||
// "A2YE" - 1906 - Top Gun - Combat Zones (USA) - multiple NVRAM chips detected, but none present (protection against emu?)
|
||||
// "A2YE" - 1906 - Top Gun - Combat Zones (USA) - multiple NVRAM chips detected, but none present (protection against emu?)
|
||||
{ "BKMJ", GBA_CHIP_EEPROM_4K }, // 2039 - Kim Possible (JPN)
|
||||
{ "BKEJ", GBA_CHIP_EEPROM_64K }, // 2047 - Konjiki no Gashbell - The Card Battle for GBA (JPN)
|
||||
{ "BKMP", GBA_CHIP_EEPROM_4K }, // 2297 - Kim Possible 2 - Drakken's Demise (EUR)
|
||||
|
@ -1,9 +1,9 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:etabeta
|
||||
/**********************************************************************
|
||||
|
||||
|
||||
Generic ROM / RAM socket slots
|
||||
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
|
@ -1,21 +1,21 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:etabeta
|
||||
/***********************************************************************************************************
|
||||
|
||||
|
||||
|
||||
|
||||
Generic RAM socket emulation
|
||||
|
||||
|
||||
This offers generic access to RAM
|
||||
|
||||
|
||||
generic_ram_plain : returns 0xff when the system reads beyond the end of the RAM
|
||||
generic_ram_linear : maps linearly the RAM in the accessed area (i.e., read/write offset is masked with
|
||||
generic_ram_linear : maps linearly the RAM in the accessed area (i.e., read/write offset is masked with
|
||||
(RAM size - 1) )
|
||||
|
||||
|
||||
TODO:
|
||||
- support variable RAM size
|
||||
- possibly support linear mapping when non-power of 2 RAMs are mapped
|
||||
- add support for 16bit & 32bit RAM access
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
|
||||
@ -121,4 +121,3 @@ WRITE8_MEMBER(generic_ram_linear_device::write_ram)
|
||||
{
|
||||
m_ram[offset % m_ram.bytes()] = data;
|
||||
}
|
||||
|
||||
|
@ -14,14 +14,14 @@ class generic_ram_plain_device : public device_t,
|
||||
public:
|
||||
// construction/destruction
|
||||
generic_ram_plain_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 size, const char *shortname, const char *source);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_ram);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram);
|
||||
|
||||
|
||||
private:
|
||||
UINT32 m_size;
|
||||
};
|
||||
@ -35,14 +35,14 @@ class generic_ram_linear_device : public device_t,
|
||||
public:
|
||||
// construction/destruction
|
||||
generic_ram_linear_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 size, const char *shortname, const char *source);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_ram);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram);
|
||||
|
||||
|
||||
private:
|
||||
UINT32 m_size;
|
||||
};
|
||||
|
@ -4,18 +4,18 @@
|
||||
|
||||
|
||||
Generic ROM emulation (for carts and ROM sockets)
|
||||
|
||||
|
||||
This offers generic access to a ROM
|
||||
|
||||
|
||||
generic_rom_plain : returns 0xff when the system reads beyond the end of the ROM
|
||||
generic_rom_linear : maps linearly the ROM in the accessed area (i.e., read offset is masked with (ROM size - 1) )
|
||||
|
||||
generic_romram_plain : allows support for carts always containing ROM + RAM (e.g. X07)
|
||||
|
||||
|
||||
|
||||
TODO:
|
||||
- possibly support linear mapping when non-power of 2 ROMs are mapped
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
|
||||
@ -120,4 +120,3 @@ WRITE8_MEMBER(generic_romram_plain_device::write_ram)
|
||||
if (offset < m_ram.bytes())
|
||||
m_ram[offset] = data;
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,7 @@ class generic_rom_device : public device_t,
|
||||
public:
|
||||
// construction/destruction
|
||||
generic_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() {}
|
||||
};
|
||||
@ -28,7 +28,7 @@ public:
|
||||
// construction/destruction
|
||||
generic_rom_plain_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
generic_rom_plain_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom);
|
||||
virtual DECLARE_READ16_MEMBER(read16_rom);
|
||||
@ -43,7 +43,7 @@ class generic_romram_plain_device : public generic_rom_plain_device
|
||||
public:
|
||||
// construction/destruction
|
||||
generic_romram_plain_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_ram);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ram);
|
||||
@ -57,7 +57,7 @@ class generic_rom_linear_device : public generic_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
generic_rom_linear_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom);
|
||||
virtual DECLARE_READ16_MEMBER(read16_rom);
|
||||
|
@ -3,7 +3,7 @@
|
||||
/***********************************************************************************************************
|
||||
|
||||
Generic ROM / RAM Socket and Cartslot device
|
||||
|
||||
|
||||
This device offers basic RAM / ROM allocation and access
|
||||
|
||||
The available handlers are suited for any situation where a system opens a
|
||||
@ -12,12 +12,12 @@
|
||||
This device is not suited whenever the system exposes additional lines to
|
||||
the socket/slot: e.g. whenever input/output lines are present, whenever
|
||||
there are lines controlling bankswitch / paging, and whenever different
|
||||
cart configurations have to be supported (like some PCBs containing ROM
|
||||
cart configurations have to be supported (like some PCBs containing ROM
|
||||
only, and other containing both ROM and RAM)
|
||||
In the latter situations, per-system slot devices have to be created (see
|
||||
e.g. APF cart slot device for an example of a simple device with multiple
|
||||
pcbs supported)
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
|
||||
@ -136,15 +136,15 @@ void generic_slot_device::device_config_complete()
|
||||
bool generic_slot_device::call_load()
|
||||
{
|
||||
if (m_cart)
|
||||
{
|
||||
{
|
||||
if (!m_device_image_load.isnull())
|
||||
return m_device_image_load(*this);
|
||||
else
|
||||
{
|
||||
UINT32 len = common_get_size("rom");
|
||||
|
||||
|
||||
rom_alloc(len, m_width, m_endianness);
|
||||
common_load_rom(get_rom_base(), len, "rom");
|
||||
common_load_rom(get_rom_base(), len, "rom");
|
||||
|
||||
return IMAGE_INIT_PASS;
|
||||
}
|
||||
@ -189,13 +189,13 @@ void generic_slot_device::get_default_card_software(astring &result)
|
||||
|
||||
/**************************************************
|
||||
|
||||
Implementation
|
||||
|
||||
Implementation
|
||||
|
||||
**************************************************/
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
common_get_size - it gets image file size both
|
||||
common_get_size - it gets image file size both
|
||||
for fullpath and for softlist
|
||||
-------------------------------------------------*/
|
||||
|
||||
@ -208,7 +208,7 @@ UINT32 generic_slot_device::common_get_size(const char *region)
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
common_load_rom - it loads from image file both
|
||||
common_load_rom - it loads from image file both
|
||||
for fullpath and for softlist
|
||||
-------------------------------------------------*/
|
||||
|
||||
@ -283,4 +283,3 @@ WRITE8_MEMBER(generic_slot_device::write_ram)
|
||||
if (m_cart)
|
||||
m_cart->write_ram(space, offset, data);
|
||||
}
|
||||
|
||||
|
@ -93,14 +93,14 @@ public:
|
||||
|
||||
static void static_set_device_load(device_t &device, device_image_load_delegate callback) { downcast<generic_slot_device &>(device).m_device_image_load = callback; }
|
||||
static void static_set_device_unload(device_t &device, device_image_func_delegate callback) { downcast<generic_slot_device &>(device).m_device_image_unload = callback; }
|
||||
|
||||
|
||||
void set_interface(const char * interface) { m_interface = interface; }
|
||||
void set_default_card(const char * def) { m_default_card = def; }
|
||||
void set_extensions(const char * exts) { m_extensions = exts; }
|
||||
void set_must_be_loaded(bool mandatory) { m_must_be_loaded = mandatory; }
|
||||
void set_width(int width) { m_width = width; }
|
||||
void set_endian(endianness_t end) { m_endianness = end; }
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_config_complete();
|
||||
@ -168,11 +168,9 @@ extern const device_type GENERIC_SOCKET;
|
||||
#define MCFG_GENERIC_CARTSLOT_ADD(_tag, _slot_intf, _dev_intf) \
|
||||
MCFG_DEVICE_ADD(_tag, GENERIC_SOCKET, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, NULL, false) \
|
||||
MCFG_GENERIC_INTERFACE(_dev_intf) \
|
||||
|
||||
MCFG_GENERIC_INTERFACE(_dev_intf)
|
||||
#define MCFG_GENERIC_SOCKET_ADD(_tag, _slot_intf, _dev_intf) \
|
||||
MCFG_DEVICE_ADD(_tag, GENERIC_SOCKET, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, NULL, false) \
|
||||
MCFG_GENERIC_INTERFACE(_dev_intf) \
|
||||
|
||||
MCFG_GENERIC_INTERFACE(_dev_intf)
|
||||
#endif
|
||||
|
@ -4,10 +4,10 @@
|
||||
Mattel Intellivision Entertainment Computer System expansion emulation
|
||||
|
||||
TODO:
|
||||
- Make paged rom emulation more accurate (according to
|
||||
- Make paged rom emulation more accurate (according to
|
||||
http://spatula-city.org/~im14u2c/intv/tech/ecs.html
|
||||
writes to $xa5y should be available for every x and every y, i.e. we shall
|
||||
have writes to every 4K chunk of the memory map, and there shall be 16 pages
|
||||
writes to $xa5y should be available for every x and every y, i.e. we shall
|
||||
have writes to every 4K chunk of the memory map, and there shall be 16 pages
|
||||
for each)
|
||||
Current emulation is instead tailored around the minimal usage necessary to
|
||||
make the main expansion and World Series Major League Baseball happy
|
||||
@ -67,12 +67,12 @@ void intv_ecs_device::device_start()
|
||||
}
|
||||
|
||||
void intv_ecs_device::device_reset()
|
||||
{
|
||||
{
|
||||
memset(m_bank_base, 0, sizeof(m_bank_base));
|
||||
}
|
||||
|
||||
void intv_ecs_device::late_subslot_setup()
|
||||
{
|
||||
{
|
||||
switch (m_subslot->get_type())
|
||||
{
|
||||
case INTV_RAM:
|
||||
@ -107,13 +107,13 @@ UINT8 intv_ecs_device::intv_control_r(int hand)
|
||||
0xFF, 0x3F, 0x9F, 0x5F, 0xD7, 0xB7, 0x77, 0xDB,
|
||||
0xBB, 0x7B, 0xDD, 0xBD, 0x7D, 0xDE, 0xBE, 0x7E
|
||||
};
|
||||
|
||||
|
||||
static const UINT8 disc_table[] =
|
||||
{
|
||||
0xF3, 0xE3, 0xE7, 0xF7, 0xF6, 0xE6, 0xEE, 0xFE,
|
||||
0xFC, 0xEC, 0xED, 0xFD, 0xF9, 0xE9, 0xEB, 0xFB
|
||||
};
|
||||
|
||||
|
||||
static const UINT8 discyx_table[5][5] =
|
||||
{
|
||||
{ 0xE3, 0xF3, 0xFB, 0xEB, 0xE9 },
|
||||
@ -122,10 +122,10 @@ UINT8 intv_ecs_device::intv_control_r(int hand)
|
||||
{ 0xF6, 0xE6, 0xFE, 0xEC, 0xED },
|
||||
{ 0xE6, 0xEE, 0xFE, 0xFC, 0xEC }
|
||||
};
|
||||
|
||||
|
||||
int x, y;
|
||||
UINT8 val = 0xff;
|
||||
|
||||
|
||||
/* keypad */
|
||||
x = m_keypad[hand]->read();
|
||||
for (y = 0; y < 16; y++)
|
||||
@ -135,12 +135,12 @@ UINT8 intv_ecs_device::intv_control_r(int hand)
|
||||
val &= keypad_table[y];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
switch ((m_options->read() >> hand) & 4)
|
||||
{
|
||||
case 0: /* disc == digital */
|
||||
default:
|
||||
|
||||
|
||||
x = m_disc[hand]->read();
|
||||
for (y = 0; y < 16; y++)
|
||||
{
|
||||
@ -150,14 +150,14 @@ UINT8 intv_ecs_device::intv_control_r(int hand)
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 1: /* disc == _fake_ analog */
|
||||
|
||||
|
||||
x = m_discx[hand]->read();
|
||||
y = m_discy[hand]->read();
|
||||
val &= discyx_table[y / 32][x / 32];
|
||||
}
|
||||
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
@ -252,7 +252,7 @@ static INPUT_PORTS_START( intv_ecs_kbd )
|
||||
Bit 4 D E 2 3 W S Z X
|
||||
Bit 5 A CTL (right) 1 Q (up) (down) (space)
|
||||
Bit 6 SHIFT NC NC NC NC NC NC NC
|
||||
|
||||
|
||||
Shifted keys that differ from pc:
|
||||
Key : 1 2 5 6 7 (left) (right) (up) (down)
|
||||
Shift + key: = " + - / % ' ^ ?
|
||||
@ -530,32 +530,32 @@ ioport_constructor intv_ecs_device::device_input_ports() const
|
||||
Paged ROM handling
|
||||
-------------------------------------------------*/
|
||||
|
||||
READ16_MEMBER(intv_ecs_device::read_rom20)
|
||||
{
|
||||
READ16_MEMBER(intv_ecs_device::read_rom20)
|
||||
{
|
||||
if (m_bank_base[2])
|
||||
return INTV_ROM16_READ(offset + 0x2000);
|
||||
return INTV_ROM16_READ(offset + 0x2000);
|
||||
else
|
||||
return 0xffff;
|
||||
}
|
||||
|
||||
READ16_MEMBER(intv_ecs_device::read_rom70)
|
||||
{
|
||||
READ16_MEMBER(intv_ecs_device::read_rom70)
|
||||
{
|
||||
if (m_bank_base[7])
|
||||
return 0xffff;
|
||||
else
|
||||
return INTV_ROM16_READ(offset + 0x7000);
|
||||
return INTV_ROM16_READ(offset + 0x7000);
|
||||
}
|
||||
|
||||
READ16_MEMBER(intv_ecs_device::read_rome0)
|
||||
{
|
||||
READ16_MEMBER(intv_ecs_device::read_rome0)
|
||||
{
|
||||
if (m_bank_base[14])
|
||||
return INTV_ROM16_READ(offset + 0xe000);
|
||||
else // if WSMLB is loaded, it shall go here, otherwise 0xffff
|
||||
return INTV_ROM16_READ(offset + 0xe000);
|
||||
else // if WSMLB is loaded, it shall go here, otherwise 0xffff
|
||||
return m_subslot->read_rome0(space, offset, mem_mask);
|
||||
}
|
||||
|
||||
READ16_MEMBER(intv_ecs_device::read_romf0)
|
||||
{
|
||||
READ16_MEMBER(intv_ecs_device::read_romf0)
|
||||
{
|
||||
// only WSMLB should come here with bank_base = 1
|
||||
if (m_bank_base[15])
|
||||
return m_subslot->read_romf0(space, offset + 0x1000, mem_mask);
|
||||
@ -585,4 +585,3 @@ WRITE16_MEMBER(intv_ecs_device::write_ay)
|
||||
if (ACCESSING_BITS_0_7)
|
||||
return m_snd->write(space, offset, data, mem_mask);
|
||||
}
|
||||
|
||||
|
@ -14,14 +14,14 @@ class intv_ecs_device : public intv_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
intv_ecs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
virtual ioport_constructor device_input_ports() const;
|
||||
virtual const rom_entry *device_rom_region() const;
|
||||
|
||||
|
||||
// reading and writing
|
||||
|
||||
// actual ECS accesses
|
||||
@ -32,14 +32,14 @@ public:
|
||||
virtual DECLARE_READ16_MEMBER(read_romf0);
|
||||
// RAM
|
||||
virtual DECLARE_READ16_MEMBER(read_ram) { return (int)m_ram[offset & (m_ram.count() - 1)]; }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ram) { m_ram[offset & (m_ram.count() - 1)] = data & 0xff; }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ram) { m_ram[offset & (m_ram.count() - 1)] = data & 0xff; }
|
||||
// AY8914
|
||||
virtual DECLARE_READ16_MEMBER(read_ay);
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ay);
|
||||
DECLARE_READ8_MEMBER(ay_porta_r);
|
||||
DECLARE_READ8_MEMBER(ay_portb_r);
|
||||
DECLARE_WRITE8_MEMBER(ay_porta_w);
|
||||
|
||||
|
||||
// passthru accesses
|
||||
virtual DECLARE_READ16_MEMBER(read_rom04) { return m_subslot->read_rom04(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rom40) { return m_subslot->read_rom40(space, offset, mem_mask); }
|
||||
@ -47,27 +47,27 @@ public:
|
||||
virtual DECLARE_READ16_MEMBER(read_rom50) { return m_subslot->read_rom50(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rom60) { return m_subslot->read_rom60(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rom80)
|
||||
{
|
||||
{
|
||||
if (m_ram88_enabled && offset >= 0x800)
|
||||
return m_subslot->read_ram(space, offset & 0x7ff, mem_mask);
|
||||
return m_subslot->read_ram(space, offset & 0x7ff, mem_mask);
|
||||
else
|
||||
return m_subslot->read_rom80(space, offset, mem_mask);
|
||||
return m_subslot->read_rom80(space, offset, mem_mask);
|
||||
}
|
||||
virtual DECLARE_READ16_MEMBER(read_rom90) { return m_subslot->read_rom90(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_roma0) { return m_subslot->read_roma0(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romb0) { return m_subslot->read_romb0(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romc0) { return m_subslot->read_romc0(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romd0)
|
||||
{
|
||||
virtual DECLARE_READ16_MEMBER(read_romd0)
|
||||
{
|
||||
if (m_ramd0_enabled && offset < 0x800)
|
||||
return m_subslot->read_ram(space, offset, mem_mask);
|
||||
return m_subslot->read_ram(space, offset, mem_mask);
|
||||
else
|
||||
return m_subslot->read_romd0(space, offset, mem_mask);
|
||||
return m_subslot->read_romd0(space, offset, mem_mask);
|
||||
}
|
||||
|
||||
// paged ROM banking
|
||||
virtual DECLARE_WRITE16_MEMBER(write_rom20)
|
||||
{
|
||||
virtual DECLARE_WRITE16_MEMBER(write_rom20)
|
||||
{
|
||||
if (offset == 0xfff)
|
||||
{
|
||||
if (data == 0x2a50)
|
||||
@ -76,8 +76,8 @@ public:
|
||||
m_bank_base[2] = 1;
|
||||
}
|
||||
}
|
||||
virtual DECLARE_WRITE16_MEMBER(write_rom70)
|
||||
{
|
||||
virtual DECLARE_WRITE16_MEMBER(write_rom70)
|
||||
{
|
||||
if (offset == 0xfff)
|
||||
{
|
||||
if (data == 0x7a50)
|
||||
@ -86,8 +86,8 @@ public:
|
||||
m_bank_base[7] = 1;
|
||||
}
|
||||
}
|
||||
virtual DECLARE_WRITE16_MEMBER(write_rome0)
|
||||
{
|
||||
virtual DECLARE_WRITE16_MEMBER(write_rome0)
|
||||
{
|
||||
if (offset == 0xfff)
|
||||
{
|
||||
if (data == 0xea50)
|
||||
@ -96,8 +96,8 @@ public:
|
||||
m_bank_base[14] = 1;
|
||||
}
|
||||
}
|
||||
virtual DECLARE_WRITE16_MEMBER(write_romf0)
|
||||
{
|
||||
virtual DECLARE_WRITE16_MEMBER(write_romf0)
|
||||
{
|
||||
if (offset == 0xfff)
|
||||
{
|
||||
if (data == 0xfa50)
|
||||
@ -112,11 +112,11 @@ public:
|
||||
// IntelliVoice passthru
|
||||
virtual DECLARE_READ16_MEMBER(read_speech) { if (m_voice_enabled) return m_subslot->read_speech(space, offset, mem_mask); else return 0xffff; }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_speech) { if (m_voice_enabled) m_subslot->write_speech(space, offset, data, mem_mask); }
|
||||
|
||||
|
||||
virtual void late_subslot_setup();
|
||||
|
||||
UINT8 intv_control_r(int hand);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
required_device<ay8914_device> m_snd;
|
||||
|
@ -47,4 +47,3 @@ intv_wsmlb_device::intv_wsmlb_device(const machine_config &mconfig, const char *
|
||||
: intv_rom_device(mconfig, INTV_ROM_WSMLB, "Intellivision World Series Baseball Cart", tag, owner, clock, "intv_wsmlb", __FILE__)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@ public:
|
||||
// construction/destruction
|
||||
intv_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
intv_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ16_MEMBER(read_rom04) { return INTV_ROM16_READ(offset + 0x0400); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rom20) { return INTV_ROM16_READ(offset + 0x2000); }
|
||||
@ -30,7 +30,7 @@ public:
|
||||
virtual DECLARE_READ16_MEMBER(read_romd0) { return INTV_ROM16_READ(offset + 0xd000); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rome0) { return INTV_ROM16_READ(offset + 0xe000); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romf0) { return INTV_ROM16_READ(offset + 0xf000); }
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() {}
|
||||
virtual void device_reset() {}
|
||||
@ -43,7 +43,7 @@ class intv_ram_device : public intv_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
intv_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ16_MEMBER(read_ram) { return (int)m_ram[offset & (m_ram.count() - 1)]; }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ram) { m_ram[offset & (m_ram.count() - 1)] = data & 0xff; }
|
||||
@ -56,7 +56,7 @@ class intv_gfact_device : public intv_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
intv_gfact_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ16_MEMBER(read_ram) { return (int)m_ram[offset & (m_ram.count() - 1)]; }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ram) { m_ram[offset & (m_ram.count() - 1)] = data & 0xff; }
|
||||
|
@ -3,18 +3,18 @@
|
||||
Mattel Intellivision cart emulation
|
||||
(through slot devices)
|
||||
|
||||
|
||||
|
||||
This is a strange beast, because INTV carts had potentially access to
|
||||
a *LOT* of memory ranges!
|
||||
Quoting Joe Zbiciak's documentation for his emu (jzIntv):
|
||||
|
||||
|
||||
|
||||
|
||||
The Intellivision leaves many addresses available to cartridges. However,
|
||||
several address ranges come with caveats, such as interactions with other
|
||||
devices in the system, or incompatibilities with various peripherals.
|
||||
|
||||
devices in the system, or incompatibilities with various peripherals.
|
||||
|
||||
Below is a summary.
|
||||
|
||||
|
||||
ADDRESSES NOTES
|
||||
-------------- --------------------------------------------------------------
|
||||
$0400 - $04FF RAM/ROM ok on all but Intellivision 2.
|
||||
@ -26,7 +26,7 @@
|
||||
$4800 ROM ok. RAM ok only if boot ROM at $7000.
|
||||
$4801 - $4FFF RAM/ROM ok.
|
||||
$5000 - $5014 ROM ok. RAM ok only if boot ROM at $7000 or $4800.
|
||||
$5015 - $6FFF RAM/ROM ok.
|
||||
$5015 - $6FFF RAM/ROM ok.
|
||||
$7000 ROM ok if no ECS. RAM at $7000 confuses EXEC boot sequence.
|
||||
$7001 - $77FF RAM/ROM ok if no ECS.
|
||||
$7800 - $7FFF ROM ok if no ECS. Do not map RAM here due to GRAM alias.
|
||||
@ -38,8 +38,8 @@
|
||||
$E000 - $EFFF RAM/ROM ok if no ECS.
|
||||
$F000 - $F7FF RAM/ROM ok.
|
||||
$F800 - $FFFF ROM ok. Do not map RAM here due to GRAM alias.
|
||||
|
||||
|
||||
|
||||
|
||||
We handle this, by always creating a 0x10000 wide ROM region to load the
|
||||
cart image and exposing the following (long list of) read handlers:
|
||||
read_rom04
|
||||
@ -58,7 +58,7 @@
|
||||
read_rome0
|
||||
read_romf0
|
||||
Each pcb types will then use the correct ones for its wiring setup.
|
||||
|
||||
|
||||
The BIN+CFG format introduced by INTVPC emulator includes metadata about where to
|
||||
load ROM into memory in the CFG file, but we don't support it (because we don't parse
|
||||
the CFG at all) and we rely instead on the intv.hsi metadata for fullpath loading of
|
||||
@ -69,7 +69,7 @@
|
||||
TODO:
|
||||
- Convert also the keyboard component to be a passthru slot device
|
||||
- Merge some of the ROM accessor above, once it is clear which ones can be merged
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
|
||||
@ -239,16 +239,16 @@ int intv_cart_slot_device::load_fullpath()
|
||||
UINT8 num_segments;
|
||||
UINT8 start_seg;
|
||||
UINT8 end_seg;
|
||||
|
||||
|
||||
UINT32 current_address;
|
||||
UINT32 end_address;
|
||||
|
||||
|
||||
UINT8 high_byte;
|
||||
UINT8 low_byte;
|
||||
|
||||
|
||||
UINT8 *ROM;
|
||||
const char *file_type = filetype();
|
||||
|
||||
|
||||
/* if it is in .rom format, we enter here */
|
||||
if (!core_stricmp (file_type, "rom"))
|
||||
{
|
||||
@ -256,9 +256,9 @@ int intv_cart_slot_device::load_fullpath()
|
||||
fread(&temp, 1);
|
||||
if (temp != 0xa8)
|
||||
return IMAGE_INIT_FAIL;
|
||||
|
||||
|
||||
fread(&num_segments, 1);
|
||||
|
||||
|
||||
fread(&temp, 1);
|
||||
if (temp != (num_segments ^ 0xff))
|
||||
return IMAGE_INIT_FAIL;
|
||||
@ -270,10 +270,10 @@ int intv_cart_slot_device::load_fullpath()
|
||||
{
|
||||
fread(&start_seg, 1);
|
||||
current_address = start_seg * 0x100;
|
||||
|
||||
|
||||
fread(&end_seg, 1);
|
||||
end_address = end_seg * 0x100 + 0xff;
|
||||
|
||||
|
||||
while (current_address <= end_address)
|
||||
{
|
||||
fread(&low_byte, 1);
|
||||
@ -282,12 +282,12 @@ int intv_cart_slot_device::load_fullpath()
|
||||
ROM[current_address << 1] = high_byte;
|
||||
current_address++;
|
||||
}
|
||||
|
||||
|
||||
// Here we should calculate and compare the CRC16...
|
||||
fread(&temp, 1);
|
||||
fread(&temp, 1);
|
||||
}
|
||||
|
||||
|
||||
// Access tables and fine address restriction tables are not supported ATM
|
||||
for (int i = 0; i < (16 + 32 + 2); i++)
|
||||
{
|
||||
@ -300,7 +300,7 @@ int intv_cart_slot_device::load_fullpath()
|
||||
{
|
||||
// This code is a blatant hack, due to impossibility to load a separate .cfg file in MESS.
|
||||
// It shall be eventually replaced by the .xml loading
|
||||
|
||||
|
||||
// extrainfo format
|
||||
// 1. mapper number (to deal with bankswitch). no bankswitch is mapper 0 (most games).
|
||||
// 2.->5. current images have at most 4 chunks of data. we store here block size and location to load
|
||||
@ -314,7 +314,7 @@ int intv_cart_slot_device::load_fullpath()
|
||||
|
||||
m_cart->rom_alloc(0x20000, tag());
|
||||
ROM = (UINT8 *)m_cart->get_rom_base();
|
||||
|
||||
|
||||
if (!hashfile_extrainfo(*this, extrainfo))
|
||||
{
|
||||
// If no extrainfo, we assume a single 0x2000 chunk at 0x5000
|
||||
@ -329,12 +329,12 @@ int intv_cart_slot_device::load_fullpath()
|
||||
else
|
||||
{
|
||||
sscanf(extrainfo.cstr() ,"%d %d %d %d %d %d %d", &mapper, &rom[0], &rom[1], &rom[2],
|
||||
&rom[3], &ram, &extra);
|
||||
&rom[3], &ram, &extra);
|
||||
//printf("extrainfo: %d %d %d %d %d %d %d \n", mapper, rom[0], rom[1], rom[2], rom[3], ram, extra);
|
||||
|
||||
|
||||
if (mapper)
|
||||
logerror("Bankswitch not yet implemented!\n");
|
||||
|
||||
|
||||
if (ram)
|
||||
{
|
||||
start = ((ram & 0xf0) >> 4) * 0x1000;
|
||||
@ -355,25 +355,25 @@ int intv_cart_slot_device::load_fullpath()
|
||||
}
|
||||
if (extra & INTELLIVOICE_MASK)
|
||||
{
|
||||
printf("WARNING: This game requires emulation of the IntelliVoice module.\n");
|
||||
printf("WARNING: This game requires emulation of the IntelliVoice module.\n");
|
||||
}
|
||||
|
||||
|
||||
if (extra & ECS_MASK)
|
||||
{
|
||||
printf("WARNING: This game requires emulation of the ECS module.\n");
|
||||
}
|
||||
|
||||
|
||||
for (int j = 0; j < 4; j++)
|
||||
{
|
||||
start = ((rom[j] & 0xf0) >> 4) * 0x1000;
|
||||
size = (rom[j] & 0x0f) * 0x800;
|
||||
|
||||
// some cart has to be loaded to 0x4800, but none of the available ones goes to 0x4000.
|
||||
// some cart has to be loaded to 0x4800, but none of the available ones goes to 0x4000.
|
||||
// Hence, we use 0x04 << 4 in extrainfo (to reduce the stored values) and fix the value here.
|
||||
if (start == 0x4000) start += 0x800;
|
||||
|
||||
|
||||
// logerror("step %d: %d %d \n", j, start / 0x1000, size / 0x1000);
|
||||
|
||||
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
fread(&low_byte, 1);
|
||||
@ -383,7 +383,7 @@ int intv_cart_slot_device::load_fullpath()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return IMAGE_INIT_PASS;
|
||||
}
|
||||
}
|
||||
@ -408,7 +408,7 @@ bool intv_cart_slot_device::call_load()
|
||||
// so if we are loading one of these, we allocate additional 0x2000 bytes for the paged bank
|
||||
if (m_type == INTV_WSMLB)
|
||||
extra_bank = true;
|
||||
|
||||
|
||||
UINT32 size = 0;
|
||||
UINT16 address = 0;
|
||||
UINT8 *ROM, *region;
|
||||
@ -423,7 +423,7 @@ bool intv_cart_slot_device::call_load()
|
||||
if (size)
|
||||
{
|
||||
region = get_software_region(region_name[i]);
|
||||
|
||||
|
||||
for (int j = 0; j < size / 2; j++)
|
||||
{
|
||||
ROM[((address + j) << 1) + 1] = region[2 * j];
|
||||
@ -467,7 +467,7 @@ void intv_cart_slot_device::get_default_card_software(astring &result)
|
||||
UINT32 len = core_fsize(m_file);
|
||||
dynamic_buffer rom(len);
|
||||
int type = INTV_STD;
|
||||
|
||||
|
||||
core_fread(m_file, rom, len);
|
||||
|
||||
if (rom[0] == 0xa8 && (rom[1] == (rom[2] ^ 0xff)))
|
||||
@ -480,12 +480,12 @@ void intv_cart_slot_device::get_default_card_software(astring &result)
|
||||
int start;
|
||||
int mapper, rom[5], ram, extra;
|
||||
astring extrainfo;
|
||||
|
||||
|
||||
if (hashfile_extrainfo(*this, extrainfo))
|
||||
{
|
||||
sscanf(extrainfo.cstr() ,"%d %d %d %d %d %d %d", &mapper, &rom[0], &rom[1], &rom[2],
|
||||
&rom[3], &ram, &extra);
|
||||
|
||||
&rom[3], &ram, &extra);
|
||||
|
||||
if (ram)
|
||||
{
|
||||
start = ((ram & 0xf0) >> 4) * 0x1000;
|
||||
@ -495,7 +495,7 @@ void intv_cart_slot_device::get_default_card_software(astring &result)
|
||||
type = INTV_GFACT;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
slot_string = intv_get_slot(type);
|
||||
@ -567,6 +567,5 @@ SLOT_INTERFACE_START(intv_cart)
|
||||
SLOT_INTERFACE_INTERNAL("intv_wsmlb", INTV_ROM_WSMLB)
|
||||
SLOT_INTERFACE_INTERNAL("intv_voice", INTV_ROM_VOICE)
|
||||
SLOT_INTERFACE_INTERNAL("intv_ecs", INTV_ROM_ECS)
|
||||
// SLOT_INTERFACE_INTERNAL("intv_keycomp", INTV_ROM_KEYCOMP)
|
||||
// SLOT_INTERFACE_INTERNAL("intv_keycomp", INTV_ROM_KEYCOMP)
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
|
@ -11,7 +11,7 @@ enum
|
||||
{
|
||||
INTV_STD = 0,
|
||||
INTV_RAM,
|
||||
INTV_GFACT, // has RAM too but at diff offset
|
||||
INTV_GFACT, // has RAM too but at diff offset
|
||||
INTV_WSMLB,
|
||||
INTV_VOICE,
|
||||
INTV_ECS,
|
||||
@ -51,7 +51,7 @@ public:
|
||||
|
||||
virtual DECLARE_READ16_MEMBER(read_ram) { return 0xffff; }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ram) {}
|
||||
|
||||
|
||||
// Used by IntelliVoice & ECS
|
||||
virtual DECLARE_READ16_MEMBER(read_ay) { return 0xffff; }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ay) {}
|
||||
@ -71,7 +71,7 @@ public:
|
||||
UINT32 get_rom_size() { return m_rom_size; }
|
||||
UINT32 get_ram_size() { return m_ram.count(); }
|
||||
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
void save_ram() { device().save_item(NAME(m_ram)); }
|
||||
virtual void late_subslot_setup() {}
|
||||
|
||||
protected:
|
||||
@ -105,7 +105,7 @@ public:
|
||||
int get_type() { return m_type; }
|
||||
int load_fullpath();
|
||||
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); }
|
||||
|
||||
virtual iodevice_t image_type() const { return IO_CARTSLOT; }
|
||||
virtual bool is_readable() const { return 1; }
|
||||
@ -136,7 +136,7 @@ public:
|
||||
virtual DECLARE_READ16_MEMBER(read_romd0) { if (m_cart) return m_cart->read_romd0(space, offset, mem_mask); else return 0xffff; }
|
||||
virtual DECLARE_READ16_MEMBER(read_rome0) { if (m_cart) return m_cart->read_rome0(space, offset, mem_mask); else return 0xffff; }
|
||||
virtual DECLARE_READ16_MEMBER(read_romf0) { if (m_cart) return m_cart->read_romf0(space, offset, mem_mask); else return 0xffff; }
|
||||
|
||||
|
||||
virtual DECLARE_READ16_MEMBER(read_ay);
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ay);
|
||||
virtual DECLARE_READ16_MEMBER(read_speech);
|
||||
@ -176,8 +176,7 @@ extern const device_type INTV_CART_SLOT;
|
||||
|
||||
#define MCFG_INTV_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, INTV_CART_SLOT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
|
||||
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||
|
||||
SLOT_INTERFACE_EXTERN(intv_cart);
|
||||
|
||||
|
@ -13,7 +13,7 @@ class intv_voice_device : public intv_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
intv_voice_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
@ -23,7 +23,7 @@ public:
|
||||
// actual IntelliVoice access
|
||||
virtual DECLARE_READ16_MEMBER(read_speech);
|
||||
virtual DECLARE_WRITE16_MEMBER(write_speech);
|
||||
|
||||
|
||||
// passthru access
|
||||
virtual DECLARE_READ16_MEMBER(read_rom04) { return m_subslot->read_rom04(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rom20) { return m_subslot->read_rom20(space, offset, mem_mask); }
|
||||
@ -33,34 +33,34 @@ public:
|
||||
virtual DECLARE_READ16_MEMBER(read_rom60) { return m_subslot->read_rom60(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rom70) { return m_subslot->read_rom70(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_rom80)
|
||||
{
|
||||
{
|
||||
if (m_ram88_enabled && offset >= 0x800)
|
||||
return m_subslot->read_ram(space, offset & 0x7ff, mem_mask);
|
||||
return m_subslot->read_ram(space, offset & 0x7ff, mem_mask);
|
||||
else
|
||||
return m_subslot->read_rom80(space, offset, mem_mask);
|
||||
return m_subslot->read_rom80(space, offset, mem_mask);
|
||||
}
|
||||
virtual DECLARE_READ16_MEMBER(read_rom90) { return m_subslot->read_rom90(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_roma0) { return m_subslot->read_roma0(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romb0) { return m_subslot->read_romb0(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romc0) { return m_subslot->read_romc0(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romd0)
|
||||
{
|
||||
virtual DECLARE_READ16_MEMBER(read_romd0)
|
||||
{
|
||||
if (m_ramd0_enabled && offset < 0x800)
|
||||
return m_subslot->read_ram(space, offset, mem_mask);
|
||||
return m_subslot->read_ram(space, offset, mem_mask);
|
||||
else
|
||||
return m_subslot->read_romd0(space, offset, mem_mask);
|
||||
return m_subslot->read_romd0(space, offset, mem_mask);
|
||||
}
|
||||
virtual DECLARE_READ16_MEMBER(read_rome0) { return m_subslot->read_rome0(space, offset, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_romf0) { return m_subslot->read_romf0(space, offset, mem_mask); }
|
||||
|
||||
|
||||
// RAM passthru write
|
||||
virtual DECLARE_WRITE16_MEMBER(write_88) { if (m_ram88_enabled) m_subslot->write_ram(space, offset, data, mem_mask); }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_d0) { if (m_ramd0_enabled) m_subslot->write_ram(space, offset, data, mem_mask); }
|
||||
virtual DECLARE_READ16_MEMBER(read_ram) { return m_subslot->read_ram(space, offset, mem_mask); }
|
||||
virtual DECLARE_WRITE16_MEMBER(write_ram) { m_subslot->write_ram(space, offset, data, mem_mask); }
|
||||
|
||||
|
||||
virtual void late_subslot_setup();
|
||||
|
||||
|
||||
private:
|
||||
required_device<sp0256_device> m_speech;
|
||||
required_device<intv_cart_slot_device> m_subslot;
|
||||
|
@ -370,12 +370,12 @@ ROM_END
|
||||
|
||||
static ADDRESS_MAP_START(sb16_io, AS_IO, 8, sb16_lle_device)
|
||||
AM_RANGE(0x0000, 0x0000) AM_MIRROR(0xff00) AM_READWRITE(dsp_data_r, dsp_data_w)
|
||||
// AM_RANGE(0x0001, 0x0001) // MIDI related?
|
||||
// AM_RANGE(0x0002, 0x0002)
|
||||
// AM_RANGE(0x0001, 0x0001) // MIDI related?
|
||||
// AM_RANGE(0x0002, 0x0002)
|
||||
AM_RANGE(0x0004, 0x0004) AM_MIRROR(0xff00) AM_READWRITE(mode_r, mode_w)
|
||||
AM_RANGE(0x0005, 0x0005) AM_MIRROR(0xff00) AM_READWRITE(dac_ctrl_r, dac_ctrl_w)
|
||||
AM_RANGE(0x0006, 0x0006) AM_MIRROR(0xff00) AM_READ(dma_stat_r)
|
||||
// AM_RANGE(0x0007, 0x0007) // unknown
|
||||
// AM_RANGE(0x0007, 0x0007) // unknown
|
||||
AM_RANGE(0x0008, 0x0008) AM_MIRROR(0xff00) AM_READWRITE(ctrl8_r, ctrl8_w)
|
||||
AM_RANGE(0x0009, 0x0009) AM_MIRROR(0xff00) AM_WRITE(rate_w)
|
||||
AM_RANGE(0x000A, 0x000A) AM_MIRROR(0xff00) AM_READ(dma8_cnt_lo_r)
|
||||
@ -393,9 +393,9 @@ static ADDRESS_MAP_START(sb16_io, AS_IO, 8, sb16_lle_device)
|
||||
AM_RANGE(0x001B, 0x001B) AM_MIRROR(0xff00) AM_READ(adc_data_r)
|
||||
AM_RANGE(0x001D, 0x001D) AM_MIRROR(0xff00) AM_WRITE(dma8_w)
|
||||
AM_RANGE(0x001F, 0x001F) AM_MIRROR(0xff00) AM_READ(dma8_r)
|
||||
// AM_RANGE(0x0080, 0x0080) // ASP comms
|
||||
// AM_RANGE(0x0081, 0x0081)
|
||||
// AM_RANGE(0x0082, 0x0082)
|
||||
// AM_RANGE(0x0080, 0x0080) // ASP comms
|
||||
// AM_RANGE(0x0081, 0x0081)
|
||||
// AM_RANGE(0x0082, 0x0082)
|
||||
AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READWRITE(p1_r, p1_w)
|
||||
AM_RANGE(MCS51_PORT_P2, MCS51_PORT_P2) AM_READWRITE(p2_r, p2_w)
|
||||
ADDRESS_MAP_END
|
||||
|
@ -87,10 +87,10 @@ void isa8_svga_tgui9680_device::device_start()
|
||||
m_isa->install_memory(0xa0000, 0xbffff, 0, 0, read8_delegate(FUNC(trident_vga_device::mem_r),m_vga), write8_delegate(FUNC(trident_vga_device::mem_w),m_vga));
|
||||
|
||||
// uncomment to test Windows 3.1 TGUI9440AGi driver
|
||||
// m_isa->install_memory(0x4400000, 0x45fffff, 0, 0, read8_delegate(FUNC(trident_vga_device::vram_r),m_vga), write8_delegate(FUNC(trident_vga_device::vram_w),m_vga));
|
||||
// m_isa->install_memory(0x4400000, 0x45fffff, 0, 0, read8_delegate(FUNC(trident_vga_device::vram_r),m_vga), write8_delegate(FUNC(trident_vga_device::vram_w),m_vga));
|
||||
|
||||
// win95 drivers
|
||||
// m_isa->install_memory(0x4000000, 0x41fffff, 0, 0, read8_delegate(FUNC(trident_vga_device::vram_r),m_vga), write8_delegate(FUNC(trident_vga_device::vram_w),m_vga));
|
||||
// m_isa->install_memory(0x4000000, 0x41fffff, 0, 0, read8_delegate(FUNC(trident_vga_device::vram_r),m_vga), write8_delegate(FUNC(trident_vga_device::vram_w),m_vga));
|
||||
|
||||
// acceleration ports
|
||||
m_isa->install_device(0x2120, 0x21ff, 0, 0, read8_delegate(FUNC(trident_vga_device::accel_r),m_vga), write8_delegate(FUNC(trident_vga_device::accel_w),m_vga));
|
||||
|
@ -45,21 +45,21 @@ UINT8 trident_vga_device::READPIXEL8(INT16 x, INT16 y)
|
||||
UINT16 trident_vga_device::READPIXEL15(INT16 x, INT16 y)
|
||||
{
|
||||
return (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] |
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] << 8));
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] << 8));
|
||||
}
|
||||
|
||||
UINT16 trident_vga_device::READPIXEL16(INT16 x, INT16 y)
|
||||
{
|
||||
return (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] |
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] << 8));
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] << 8));
|
||||
}
|
||||
|
||||
UINT32 trident_vga_device::READPIXEL32(INT16 x, INT16 y)
|
||||
{
|
||||
return (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*4) % vga.svga_intf.vram_size] |
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+1) % vga.svga_intf.vram_size] << 8) |
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+2) % vga.svga_intf.vram_size] << 16) |
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+3) % vga.svga_intf.vram_size] << 24));
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+1) % vga.svga_intf.vram_size] << 8) |
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+2) % vga.svga_intf.vram_size] << 16) |
|
||||
(vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+3) % vga.svga_intf.vram_size] << 24));
|
||||
}
|
||||
|
||||
void trident_vga_device::WRITEPIXEL8(INT16 x, INT16 y, UINT8 data)
|
||||
@ -249,9 +249,9 @@ UINT32 trident_vga_device::screen_update(screen_device &screen, bitmap_rgb32 &bi
|
||||
for(x=0;x<cursor_size;x++)
|
||||
{
|
||||
UINT32 bitb = (vga.memory[(src+3) % vga.svga_intf.vram_size]
|
||||
| ((vga.memory[(src+2) % vga.svga_intf.vram_size]) << 8)
|
||||
| ((vga.memory[(src+1) % vga.svga_intf.vram_size]) << 16)
|
||||
| ((vga.memory[(src+0) % vga.svga_intf.vram_size]) << 24));
|
||||
| ((vga.memory[(src+2) % vga.svga_intf.vram_size]) << 8)
|
||||
| ((vga.memory[(src+1) % vga.svga_intf.vram_size]) << 16)
|
||||
| ((vga.memory[(src+0) % vga.svga_intf.vram_size]) << 24));
|
||||
UINT32 bita = (vga.memory[(src+7) % vga.svga_intf.vram_size]
|
||||
| ((vga.memory[(src+6) % vga.svga_intf.vram_size]) << 8)
|
||||
| ((vga.memory[(src+5) % vga.svga_intf.vram_size]) << 16)
|
||||
@ -1131,60 +1131,60 @@ UINT8 trident_vga_device::old_mmio_r(address_space& space, UINT32 offset)
|
||||
/*
|
||||
Graphics Engine for 9440/9660/9680
|
||||
|
||||
#define GER_STATUS 0x2120
|
||||
#define GE_BUSY 0x80
|
||||
#define GER_OPERMODE 0x2122 Byte for 9440, Word for 96xx
|
||||
#define DST_ENABLE 0x200 // Destination Transparency
|
||||
#define GER_COMMAND 0x2124
|
||||
#define GE_NOP 0x00 // No Operation
|
||||
#define GE_BLT 0x01 // BitBLT ROP3 only
|
||||
#define GE_BLT_ROP4 0x02 // BitBLT ROP4 (96xx only)
|
||||
#define GE_SCANLINE 0x03 // Scan Line
|
||||
#define GE_BRESLINE 0x04 // Bresenham Line
|
||||
#define GE_SHVECTOR 0x05 // Short Vector
|
||||
#define GE_FASTLINE 0x06 // Fast Line (96xx only)
|
||||
#define GE_TRAPEZ 0x07 // Trapezoidal fill (96xx only)
|
||||
#define GE_ELLIPSE 0x08 // Ellipse (96xx only) (RES)
|
||||
#define GE_ELLIP_FILL 0x09 // Ellipse Fill (96xx only) (RES)
|
||||
#define GER_FMIX 0x2127
|
||||
#define GER_DRAWFLAG 0x2128 // long
|
||||
#define FASTMODE 1<<28
|
||||
#define STENCIL 0x8000
|
||||
#define SOLIDFILL 0x4000
|
||||
#define TRANS_ENABLE 0x1000
|
||||
#define TRANS_REVERSE 0x2000
|
||||
#define YMAJ 0x0400
|
||||
#define XNEG 0x0200
|
||||
#define YNEG 0x0100
|
||||
#define SRCMONO 0x0040
|
||||
#define PATMONO 0x0020
|
||||
#define SCR2SCR 0x0004
|
||||
#define PAT2SCR 0x0002
|
||||
#define GER_FCOLOUR 0x212C // Word for 9440, long for 96xx
|
||||
#define GER_BCOLOUR 0x2130 // Word for 9440, long for 96xx
|
||||
#define GER_PATLOC 0x2134 // Word
|
||||
#define GER_DEST_XY 0x2138
|
||||
#define GER_DEST_X 0x2138 // Word
|
||||
#define GER_DEST_Y 0x213A // Word
|
||||
#define GER_SRC_XY 0x213C
|
||||
#define GER_SRC_X 0x213C // Word
|
||||
#define GER_SRC_Y 0x213E // Word
|
||||
#define GER_DIM_XY 0x2140
|
||||
#define GER_DIM_X 0x2140 // Word
|
||||
#define GER_DIM_Y 0x2142 // Word
|
||||
#define GER_STYLE 0x2144 // Long
|
||||
#define GER_CKEY 0x2168 // Long
|
||||
#define GER_FPATCOL 0x2178
|
||||
#define GER_BPATCOL 0x217C
|
||||
#define GER_PATTERN 0x2180 // from 0x2180 to 0x21FF
|
||||
#define GER_STATUS 0x2120
|
||||
#define GE_BUSY 0x80
|
||||
#define GER_OPERMODE 0x2122 Byte for 9440, Word for 96xx
|
||||
#define DST_ENABLE 0x200 // Destination Transparency
|
||||
#define GER_COMMAND 0x2124
|
||||
#define GE_NOP 0x00 // No Operation
|
||||
#define GE_BLT 0x01 // BitBLT ROP3 only
|
||||
#define GE_BLT_ROP4 0x02 // BitBLT ROP4 (96xx only)
|
||||
#define GE_SCANLINE 0x03 // Scan Line
|
||||
#define GE_BRESLINE 0x04 // Bresenham Line
|
||||
#define GE_SHVECTOR 0x05 // Short Vector
|
||||
#define GE_FASTLINE 0x06 // Fast Line (96xx only)
|
||||
#define GE_TRAPEZ 0x07 // Trapezoidal fill (96xx only)
|
||||
#define GE_ELLIPSE 0x08 // Ellipse (96xx only) (RES)
|
||||
#define GE_ELLIP_FILL 0x09 // Ellipse Fill (96xx only) (RES)
|
||||
#define GER_FMIX 0x2127
|
||||
#define GER_DRAWFLAG 0x2128 // long
|
||||
#define FASTMODE 1<<28
|
||||
#define STENCIL 0x8000
|
||||
#define SOLIDFILL 0x4000
|
||||
#define TRANS_ENABLE 0x1000
|
||||
#define TRANS_REVERSE 0x2000
|
||||
#define YMAJ 0x0400
|
||||
#define XNEG 0x0200
|
||||
#define YNEG 0x0100
|
||||
#define SRCMONO 0x0040
|
||||
#define PATMONO 0x0020
|
||||
#define SCR2SCR 0x0004
|
||||
#define PAT2SCR 0x0002
|
||||
#define GER_FCOLOUR 0x212C // Word for 9440, long for 96xx
|
||||
#define GER_BCOLOUR 0x2130 // Word for 9440, long for 96xx
|
||||
#define GER_PATLOC 0x2134 // Word
|
||||
#define GER_DEST_XY 0x2138
|
||||
#define GER_DEST_X 0x2138 // Word
|
||||
#define GER_DEST_Y 0x213A // Word
|
||||
#define GER_SRC_XY 0x213C
|
||||
#define GER_SRC_X 0x213C // Word
|
||||
#define GER_SRC_Y 0x213E // Word
|
||||
#define GER_DIM_XY 0x2140
|
||||
#define GER_DIM_X 0x2140 // Word
|
||||
#define GER_DIM_Y 0x2142 // Word
|
||||
#define GER_STYLE 0x2144 // Long
|
||||
#define GER_CKEY 0x2168 // Long
|
||||
#define GER_FPATCOL 0x2178
|
||||
#define GER_BPATCOL 0x217C
|
||||
#define GER_PATTERN 0x2180 // from 0x2180 to 0x21FF
|
||||
|
||||
Additional - Graphics Engine for 96xx
|
||||
#define GER_SRCCLIP_XY 0x2148
|
||||
#define GER_SRCCLIP_X 0x2148 // Word
|
||||
#define GER_SRCCLIP_Y 0x214A // Word
|
||||
#define GER_DSTCLIP_XY 0x214C
|
||||
#define GER_DSTCLIP_X 0x214C // Word
|
||||
#define GER_DSTCLIP_Y 0x214E // Word
|
||||
#define GER_SRCCLIP_XY 0x2148
|
||||
#define GER_SRCCLIP_X 0x2148 // Word
|
||||
#define GER_SRCCLIP_Y 0x214A // Word
|
||||
#define GER_DSTCLIP_XY 0x214C
|
||||
#define GER_DSTCLIP_X 0x214C // Word
|
||||
#define GER_DSTCLIP_Y 0x214E // Word
|
||||
*/
|
||||
|
||||
READ8_MEMBER(trident_vga_device::accel_r)
|
||||
|
@ -5,17 +5,17 @@
|
||||
|
||||
|
||||
based on Charles MacDonald's docs: http://cgfm2.emuviews.com/txt/genie.txt
|
||||
|
||||
|
||||
|
||||
There is an interesting difference between Rev.0 and Rev.A
|
||||
After the codes has been entered, the former just performs
|
||||
a last write to the MODE register (m_gg_regs[0]) which both
|
||||
sets the enable bits for the 6 available cheats (in the low
|
||||
8 bits) and locks the GG so that later reads goes to the
|
||||
After the codes has been entered, the former just performs
|
||||
a last write to the MODE register (m_gg_regs[0]) which both
|
||||
sets the enable bits for the 6 available cheats (in the low
|
||||
8 bits) and locks the GG so that later reads goes to the
|
||||
piggyback cart. The latter revision, instead, performs the
|
||||
same operations in two subsequent 8bit writes, accessing
|
||||
same operations in two subsequent 8bit writes, accessing
|
||||
separately the low and high bits of the register.
|
||||
|
||||
|
||||
***********************************************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
@ -86,7 +86,7 @@ READ16_MEMBER(md_rom_ggenie_device::read)
|
||||
return m_gg_data[5];
|
||||
else
|
||||
return m_exp->m_cart->read(space, offset);
|
||||
}
|
||||
}
|
||||
else
|
||||
return 0xffff;
|
||||
}
|
||||
@ -114,7 +114,7 @@ WRITE16_MEMBER(md_rom_ggenie_device::write)
|
||||
else
|
||||
{
|
||||
m_gg_bypass = 0;
|
||||
|
||||
|
||||
// bit9 set = read goes to ASIC registers
|
||||
if (data & 0x200)
|
||||
m_reg_enable = 1;
|
||||
@ -122,7 +122,7 @@ WRITE16_MEMBER(md_rom_ggenie_device::write)
|
||||
else
|
||||
m_reg_enable = 0;
|
||||
}
|
||||
|
||||
|
||||
// LOCK bit
|
||||
if (data & 0x100)
|
||||
{
|
||||
@ -133,7 +133,7 @@ WRITE16_MEMBER(md_rom_ggenie_device::write)
|
||||
m_gg_addr[3] = ((m_gg_regs[11] & 0x3f) << 16) | m_gg_regs[12];
|
||||
m_gg_addr[4] = ((m_gg_regs[14] & 0x3f) << 16) | m_gg_regs[15];
|
||||
m_gg_addr[5] = ((m_gg_regs[17] & 0x3f) << 16) | m_gg_regs[18];
|
||||
|
||||
|
||||
// data
|
||||
m_gg_data[0] = m_gg_regs[4];
|
||||
m_gg_data[1] = m_gg_regs[7];
|
||||
@ -144,9 +144,9 @@ WRITE16_MEMBER(md_rom_ggenie_device::write)
|
||||
|
||||
//printf("mode %X\n", data);
|
||||
//for (int i = 0; i < 6; i++)
|
||||
// printf("addr %d = 0x%X - data 0x%X\n", i, m_gg_addr[i], m_gg_data[i]);
|
||||
// printf("addr %d = 0x%X - data 0x%X\n", i, m_gg_addr[i], m_gg_data[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (offset == 1)
|
||||
{
|
||||
// RESET
|
||||
|
@ -164,7 +164,7 @@ msx_cart_fsfd1::msx_cart_fsfd1(const machine_config &mconfig, const char *tag, d
|
||||
|
||||
|
||||
msx_cart_fscf351::msx_cart_fscf351(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: msx_cart_disk_type2(mconfig, MSX_CART_FSCF351, "MSX Cartridge - FS-CF351", tag, owner, clock, "msx_cart_fscf351")
|
||||
: msx_cart_disk_type2(mconfig, MSX_CART_FSCF351, "MSX Cartridge - FS-CF351", tag, owner, clock, "msx_cart_fscf351")
|
||||
{
|
||||
}
|
||||
|
||||
@ -624,4 +624,3 @@ WRITE8_MEMBER(msx_cart_fsfd1a::write_cart)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -677,7 +677,7 @@ void msx_slot_disk6_device::post_load()
|
||||
|
||||
void msx_slot_disk6_device::select_drive()
|
||||
{
|
||||
if (m_drive_select1)
|
||||
if (m_drive_select1)
|
||||
{
|
||||
m_floppy = m_floppy1 ? m_floppy1->get_device() : NULL;
|
||||
if (!m_floppy)
|
||||
@ -809,4 +809,3 @@ WRITE8_MEMBER(msx_slot_disk6_device::write)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
Famicom Disk System.
|
||||
|
||||
Based on info from NESDev wiki ( http://wiki.nesdev.com/w/index.php/Family_Computer_Disk_System )
|
||||
|
||||
|
||||
TODO:
|
||||
- convert floppy drive + fds format to modern code!
|
||||
- add sound bits
|
||||
@ -124,14 +124,14 @@ void nes_disksys_device::device_start()
|
||||
|
||||
irq_timer = timer_alloc(TIMER_IRQ);
|
||||
irq_timer->adjust(attotime::zero, 0, machine().device<cpu_device>("maincpu")->cycles_to_attotime(1));
|
||||
|
||||
|
||||
save_item(NAME(m_fds_motor_on));
|
||||
save_item(NAME(m_fds_door_closed));
|
||||
save_item(NAME(m_fds_current_side));
|
||||
save_item(NAME(m_fds_head_position));
|
||||
save_item(NAME(m_fds_status0));
|
||||
save_item(NAME(m_read_mode));
|
||||
save_item(NAME(m_drive_ready));
|
||||
save_item(NAME(m_drive_ready));
|
||||
save_item(NAME(m_irq_enable));
|
||||
save_item(NAME(m_irq_transfer));
|
||||
save_item(NAME(m_irq_count));
|
||||
@ -173,8 +173,8 @@ void nes_disksys_device::pcb_reset()
|
||||
|
||||
RAM is in 0x6000-0xdfff (32K)
|
||||
ROM is in 0xe000-0xffff (8K)
|
||||
|
||||
registers + disk drive are accessed in
|
||||
|
||||
registers + disk drive are accessed in
|
||||
0x4020-0x403f (read_ex/write_ex below)
|
||||
|
||||
-------------------------------------------------*/
|
||||
@ -210,7 +210,7 @@ READ8_MEMBER(nes_disksys_device::read_m)
|
||||
}
|
||||
|
||||
void nes_disksys_device::hblank_irq(int scanline, int vblank, int blanked)
|
||||
{
|
||||
{
|
||||
if (m_irq_transfer)
|
||||
m_maincpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE);
|
||||
}
|
||||
@ -218,7 +218,7 @@ void nes_disksys_device::hblank_irq(int scanline, int vblank, int blanked)
|
||||
WRITE8_MEMBER(nes_disksys_device::write_ex)
|
||||
{
|
||||
LOG_MMC(("Famicom Disk System write_ex, offset: %04x, data: %02x\n", offset, data));
|
||||
|
||||
|
||||
if (offset >= 0x20 && offset < 0x60)
|
||||
{
|
||||
// wavetable
|
||||
@ -255,34 +255,34 @@ WRITE8_MEMBER(nes_disksys_device::write_ex)
|
||||
// bit4 - CRC control (set during CRC calculation of transfer)
|
||||
// bit5 - Always set to '1'
|
||||
// bit6 - Read/Write Start (Set to 1 when the drive becomes ready for read/write)
|
||||
// bit7 - Interrupt Transfer (0: Transfer without using IRQ; 1: Enable IRQ when
|
||||
// bit7 - Interrupt Transfer (0: Transfer without using IRQ; 1: Enable IRQ when
|
||||
// the drive becomes ready)
|
||||
m_fds_motor_on = BIT(data, 0);
|
||||
|
||||
|
||||
if (BIT(data, 1))
|
||||
m_fds_head_position = 0;
|
||||
|
||||
|
||||
if (!(data & 0x40) && m_drive_ready && m_fds_head_position > 2)
|
||||
m_fds_head_position -= 2; // ??? is this some sort of compensation??
|
||||
|
||||
|
||||
m_read_mode = BIT(data, 2);
|
||||
set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
|
||||
set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
|
||||
m_drive_ready = data & 0x40;
|
||||
m_irq_transfer = BIT(data, 7);
|
||||
break;
|
||||
case 0x06:
|
||||
// external connector
|
||||
break;
|
||||
case 0x60: // $4080 - Volume envelope - read through $4090
|
||||
case 0x62: // $4082 - Frequency low
|
||||
case 0x63: // $4083 - Frequency high
|
||||
case 0x64: // $4084 - Mod envelope - read through $4092
|
||||
case 0x65: // $4085 - Mod counter
|
||||
case 0x66: // $4086 - Mod frequency low
|
||||
case 0x67: // $4087 - Mod frequency high
|
||||
case 0x68: // $4088 - Mod table write
|
||||
case 0x69: // $4089 - Wave write / master volume
|
||||
case 0x6a: // $408a - Envelope speed
|
||||
case 0x60: // $4080 - Volume envelope - read through $4090
|
||||
case 0x62: // $4082 - Frequency low
|
||||
case 0x63: // $4083 - Frequency high
|
||||
case 0x64: // $4084 - Mod envelope - read through $4092
|
||||
case 0x65: // $4085 - Mod counter
|
||||
case 0x66: // $4086 - Mod frequency low
|
||||
case 0x67: // $4087 - Mod frequency high
|
||||
case 0x68: // $4088 - Mod table write
|
||||
case 0x69: // $4089 - Wave write / master volume
|
||||
case 0x6a: // $408a - Envelope speed
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -299,11 +299,11 @@ READ8_MEMBER(nes_disksys_device::read_ex)
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x10:
|
||||
case 0x10:
|
||||
// $4030 - disk status 0
|
||||
// bit0 - Timer Interrupt (1: an IRQ occurred)
|
||||
// bit1 - Byte transfer flag (Set to 1 every time 8 bits have been transfered between
|
||||
// the RAM adaptor & disk drive through $4024/$4031; Reset to 0 when $4024,
|
||||
// bit1 - Byte transfer flag (Set to 1 every time 8 bits have been transfered between
|
||||
// the RAM adaptor & disk drive through $4024/$4031; Reset to 0 when $4024,
|
||||
// $4031, or $4030 has been serviced)
|
||||
// bit4 - CRC control (0: CRC passed; 1: CRC error)
|
||||
// bit6 - End of Head (1 when disk head is on the most inner track)
|
||||
@ -312,7 +312,7 @@ READ8_MEMBER(nes_disksys_device::read_ex)
|
||||
// clear the disk IRQ detect flag
|
||||
m_fds_status0 &= ~0x01;
|
||||
break;
|
||||
case 0x11:
|
||||
case 0x11:
|
||||
// $4031 - data latch
|
||||
// don't read data if disk is unloaded
|
||||
if (!m_fds_data)
|
||||
@ -330,8 +330,8 @@ READ8_MEMBER(nes_disksys_device::read_ex)
|
||||
else
|
||||
ret = 0;
|
||||
break;
|
||||
case 0x12:
|
||||
// $4032 - disk status 1:
|
||||
case 0x12:
|
||||
// $4032 - disk status 1:
|
||||
// bit0 - Disk flag (0: Disk inserted; 1: Disk not inserted)
|
||||
// bit1 - Ready flag (0: Disk ready; 1: Disk not ready)
|
||||
// bit2 - Protect flag (0: Not write protected; 1: Write protected or disk ejected)
|
||||
@ -351,17 +351,17 @@ READ8_MEMBER(nes_disksys_device::read_ex)
|
||||
else
|
||||
ret = (m_fds_current_side == 0) ? 1 : 0; // 0 if a disk is inserted
|
||||
break;
|
||||
case 0x13:
|
||||
case 0x13:
|
||||
// $4033 - external connector (bits 0-6) + battery status (bit 7)
|
||||
ret = 0x80;
|
||||
break;
|
||||
case 0x70: // $4090 - Volume gain - write through $4080
|
||||
case 0x72: // $4092 - Mod gain - read through $4084
|
||||
case 0x70: // $4090 - Volume gain - write through $4080
|
||||
case 0x72: // $4092 - Mod gain - read through $4084
|
||||
default:
|
||||
ret = 0x00;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -372,7 +372,7 @@ READ8_MEMBER(nes_disksys_device::read_ex)
|
||||
void nes_disksys_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
if (id == TIMER_IRQ)
|
||||
{
|
||||
{
|
||||
if (m_irq_enable && m_irq_count)
|
||||
{
|
||||
m_irq_count--;
|
||||
@ -381,7 +381,7 @@ void nes_disksys_device::device_timer(emu_timer &timer, device_timer_id id, int
|
||||
m_maincpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE);
|
||||
m_irq_enable = 0;
|
||||
m_fds_status0 |= 0x01;
|
||||
m_irq_count_latch = 0; // used in Kaettekita Mario Bros
|
||||
m_irq_count_latch = 0; // used in Kaettekita Mario Bros
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -399,7 +399,7 @@ void nes_disksys_device::disk_flip_side()
|
||||
if (m_fds_current_side == 0)
|
||||
popmessage("No disk inserted.");
|
||||
else
|
||||
popmessage("Disk set to side %d", m_fds_current_side);
|
||||
popmessage("Disk set to side %d", m_fds_current_side);
|
||||
}
|
||||
|
||||
|
||||
@ -410,15 +410,15 @@ void nes_disksys_device::load_disk(device_image_interface &image)
|
||||
{
|
||||
int header = 0;
|
||||
m_fds_sides = 0;
|
||||
|
||||
|
||||
if (image.length() % 65500)
|
||||
header = 0x10;
|
||||
|
||||
|
||||
m_fds_sides = (image.length() - header) / 65500;
|
||||
|
||||
|
||||
if (!m_fds_data)
|
||||
m_fds_data = auto_alloc_array(machine(), UINT8, m_fds_sides * 65500);
|
||||
|
||||
|
||||
// if there is an header, skip it
|
||||
image.fseek(header, SEEK_SET);
|
||||
image.fread(m_fds_data, 65500 * m_fds_sides);
|
||||
@ -430,4 +430,3 @@ void nes_disksys_device::unload_disk(device_image_interface &image)
|
||||
/* TODO: should write out changes here as well */
|
||||
m_fds_sides = 0;
|
||||
}
|
||||
|
||||
|
@ -161,9 +161,9 @@ void device_nes_cart_interface::prg_alloc(size_t size, const char *tag)
|
||||
printf("Warning! The loaded PRG has size not a multiple of 8KB (0x%X)\n", (UINT32)size);
|
||||
m_prg_chunks--;
|
||||
}
|
||||
|
||||
|
||||
m_prg_mask = ((m_prg_chunks << 1) - 1);
|
||||
|
||||
|
||||
// printf("first mask %x!\n", m_prg_mask);
|
||||
if ((m_prg_chunks << 1) & m_prg_mask)
|
||||
{
|
||||
@ -172,7 +172,7 @@ void device_nes_cart_interface::prg_alloc(size_t size, const char *tag)
|
||||
// only half a dozen of NES carts have PRG which is not a power of 2
|
||||
// so we use this bank_map only as an exception
|
||||
// printf("uneven rom!\n");
|
||||
|
||||
|
||||
// 1. redefine mask as (next power of 2)-1
|
||||
for (; temp; )
|
||||
{
|
||||
@ -182,15 +182,15 @@ void device_nes_cart_interface::prg_alloc(size_t size, const char *tag)
|
||||
m_prg_mask = (1 << mask_bits) - 1;
|
||||
// printf("new mask %x!\n", m_prg_mask);
|
||||
mapsize = (1 << mask_bits)/2;
|
||||
|
||||
|
||||
// 2. create a bank_map for banks in the range mask/2 -> mask
|
||||
m_prg_bank_map.resize(mapsize);
|
||||
|
||||
|
||||
// 3. fill the bank_map accounting for mirrors
|
||||
int j;
|
||||
for (j = mapsize; j < (m_prg_chunks << 1); j++)
|
||||
m_prg_bank_map[j - mapsize] = j;
|
||||
|
||||
|
||||
while (j % mapsize)
|
||||
{
|
||||
int k = 0, repeat_banks;
|
||||
@ -201,7 +201,7 @@ void device_nes_cart_interface::prg_alloc(size_t size, const char *tag)
|
||||
m_prg_bank_map[(j - mapsize) + l] = m_prg_bank_map[(j - mapsize) + l - repeat_banks];
|
||||
j += repeat_banks;
|
||||
}
|
||||
|
||||
|
||||
// check bank map!
|
||||
// for (int i = 0; i < mapsize; i++)
|
||||
// {
|
||||
@ -674,7 +674,7 @@ void device_nes_cart_interface::pcb_start(running_machine &machine, UINT8 *ciram
|
||||
// main NES CPU here, even if it does not belong to this device.
|
||||
m_maincpu = machine.device<cpu_device>("maincpu");
|
||||
|
||||
if (cart_mounted) // disksys expansion can arrive here without the memory banks!
|
||||
if (cart_mounted) // disksys expansion can arrive here without the memory banks!
|
||||
{
|
||||
// Setup PRG
|
||||
m_prg_bank_mem[0] = machine.root_device().membank("prg0");
|
||||
@ -691,11 +691,11 @@ void device_nes_cart_interface::pcb_start(running_machine &machine, UINT8 *ciram
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Setup CHR (VRAM can be present also without PRG rom)
|
||||
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
|
||||
chr8(0, m_chr_source);
|
||||
|
||||
|
||||
// Setup NT
|
||||
m_ciram = ciram_ptr;
|
||||
|
||||
|
@ -376,10 +376,10 @@ public:
|
||||
virtual DECLARE_WRITE8_MEMBER(write_m);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_h);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_ex);
|
||||
|
||||
|
||||
// hack until disk system is made modern!
|
||||
virtual void disk_flip_side() { if (m_cart) m_cart->disk_flip_side(); }
|
||||
|
||||
|
||||
int get_pcb_id() { return m_pcb_id; };
|
||||
|
||||
void pcb_start(UINT8 *ciram_ptr);
|
||||
|
@ -12,10 +12,9 @@
|
||||
|
||||
class o2_chess_device : public o2_rom_device
|
||||
{
|
||||
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
// virtual const rom_entry *device_rom_region() const;
|
||||
|
||||
// virtual const rom_entry *device_rom_region() const;
|
||||
|
||||
public:
|
||||
// construction/destruction
|
||||
o2_chess_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
@ -50,12 +50,12 @@ o2_rom16_device::o2_rom16_device(const machine_config &mconfig, const char *tag,
|
||||
//-------------------------------------------------
|
||||
|
||||
void o2_rom_device::device_start()
|
||||
{
|
||||
{
|
||||
save_item(NAME(m_bank_base));
|
||||
}
|
||||
|
||||
void o2_rom_device::device_reset()
|
||||
{
|
||||
{
|
||||
m_bank_base = 0;
|
||||
}
|
||||
|
||||
@ -94,4 +94,3 @@ READ8_MEMBER(o2_rom16_device::read_rom0c)
|
||||
{
|
||||
return m_rom[offset + 0xc00 + (m_bank_base & 0x03) * 0x1000];
|
||||
}
|
||||
|
||||
|
@ -15,17 +15,17 @@ public:
|
||||
// construction/destruction
|
||||
o2_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||
o2_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom04);
|
||||
virtual DECLARE_READ8_MEMBER(read_rom0c);
|
||||
|
||||
|
||||
virtual void write_bank(int bank);
|
||||
|
||||
|
||||
protected:
|
||||
int m_bank_base;
|
||||
};
|
||||
@ -37,7 +37,7 @@ class o2_rom12_device : public o2_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
o2_rom12_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom04);
|
||||
virtual DECLARE_READ8_MEMBER(read_rom0c);
|
||||
@ -50,7 +50,7 @@ class o2_rom16_device : public o2_rom_device
|
||||
public:
|
||||
// construction/destruction
|
||||
o2_rom16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_rom04);
|
||||
virtual DECLARE_READ8_MEMBER(read_rom0c);
|
||||
|
@ -166,7 +166,7 @@ bool o2_cart_slot_device::call_load()
|
||||
{
|
||||
UINT32 size = (software_entry() == NULL) ? length() : get_software_region_length("rom");
|
||||
m_cart->rom_alloc(size, tag());
|
||||
|
||||
|
||||
if (software_entry() == NULL)
|
||||
fread(m_cart->get_rom_base(), size);
|
||||
else
|
||||
@ -223,7 +223,7 @@ void o2_cart_slot_device::get_default_card_software(astring &result)
|
||||
type = O2_ROM12;
|
||||
if (size == 16384)
|
||||
type = O2_ROM16;
|
||||
|
||||
|
||||
slot_string = o2_get_slot(type);
|
||||
|
||||
//printf("type: %s\n", slot_string);
|
||||
@ -278,4 +278,3 @@ SLOT_INTERFACE_START(o2_cart)
|
||||
SLOT_INTERFACE_INTERNAL("o2_chess", O2_ROM_CHESS)
|
||||
SLOT_INTERFACE_INTERNAL("o2_voice", O2_ROM_VOICE)
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
|
@ -92,7 +92,7 @@ public:
|
||||
virtual DECLARE_WRITE8_MEMBER(io_write);
|
||||
virtual DECLARE_READ8_MEMBER(t0_read) { if (m_cart) return m_cart->t0_read(space, offset); else return 0; }
|
||||
|
||||
virtual void write_bank(int bank) { if (m_cart) m_cart->write_bank(bank); }
|
||||
virtual void write_bank(int bank) { if (m_cart) m_cart->write_bank(bank); }
|
||||
|
||||
protected:
|
||||
|
||||
@ -114,8 +114,7 @@ extern const device_type O2_CART_SLOT;
|
||||
|
||||
#define MCFG_O2_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, O2_CART_SLOT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
|
||||
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||
|
||||
SLOT_INTERFACE_EXTERN(o2_cart);
|
||||
|
||||
|
@ -33,7 +33,7 @@ o2_voice_device::o2_voice_device(const machine_config &mconfig, const char *tag,
|
||||
|
||||
|
||||
void o2_voice_device::device_start()
|
||||
{
|
||||
{
|
||||
save_item(NAME(m_lrq_state));
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ public:
|
||||
virtual DECLARE_READ8_MEMBER(read_rom04) { if (m_subslot->exists()) return m_subslot->read_rom04(space, offset); else return 0xff; }
|
||||
virtual DECLARE_READ8_MEMBER(read_rom0c) { if (m_subslot->exists()) return m_subslot->read_rom0c(space, offset); else return 0xff; }
|
||||
|
||||
virtual void write_bank(int bank) { if (m_subslot->exists()) m_subslot->write_bank(bank); }
|
||||
virtual void write_bank(int bank) { if (m_subslot->exists()) m_subslot->write_bank(bank); }
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(lrq_callback);
|
||||
DECLARE_WRITE8_MEMBER(io_write);
|
||||
|
@ -65,4 +65,3 @@ DECLARE_WRITE_LINE_MEMBER( pet_userport_cb2_sound_device::input_m )
|
||||
{
|
||||
m_dac->write_unsigned8(state ? 0xff : 0x00);
|
||||
}
|
||||
|
||||
|
@ -93,7 +93,7 @@ void jvc_xvd701_device::send_response()
|
||||
{
|
||||
if (m_response_index < sizeof(m_response) && is_transmit_register_empty())
|
||||
{
|
||||
// printf("sending %02x\n", m_response[m_response_index]);
|
||||
// printf("sending %02x\n", m_response[m_response_index]);
|
||||
transmit_register_setup(m_response[m_response_index++]);
|
||||
}
|
||||
}
|
||||
@ -115,7 +115,7 @@ void jvc_xvd701_device::rcv_complete()
|
||||
// printf("xvd701");
|
||||
|
||||
//for (int i = 0; i < sizeof(m_command); i++)
|
||||
// printf(" %02x", m_command[i]);
|
||||
// printf(" %02x", m_command[i]);
|
||||
|
||||
//printf("\n");
|
||||
|
||||
|
@ -156,15 +156,15 @@ bool sat_cart_slot_device::call_load()
|
||||
// from fullpath, only ROM carts
|
||||
UINT32 len = (software_entry() != NULL) ? get_software_region_length("rom") : length();
|
||||
UINT32 *ROM;
|
||||
|
||||
|
||||
m_cart->rom_alloc(len, tag());
|
||||
ROM = m_cart->get_rom_base();
|
||||
|
||||
|
||||
if (software_entry() != NULL)
|
||||
memcpy(ROM, get_software_region("rom"), len);
|
||||
else
|
||||
fread(ROM, len);
|
||||
|
||||
|
||||
// fix endianness....
|
||||
for (int i = 0; i < len/4; i ++)
|
||||
ROM[i] = BITSWAP32(ROM[i],7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24);
|
||||
|
@ -79,11 +79,11 @@ class scv_rom64_device : public scv_rom8_device
|
||||
public:
|
||||
// construction/destruction
|
||||
scv_rom64_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_cart);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_bank);
|
||||
@ -100,15 +100,15 @@ class scv_rom128_device : public scv_rom8_device
|
||||
public:
|
||||
// construction/destruction
|
||||
scv_rom128_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_cart);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_bank);
|
||||
|
||||
|
||||
private:
|
||||
UINT8 m_bank_base;
|
||||
};
|
||||
@ -121,16 +121,16 @@ class scv_rom128ram4_device : public scv_rom8_device
|
||||
public:
|
||||
// construction/destruction
|
||||
scv_rom128ram4_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
|
||||
|
||||
// reading and writing
|
||||
virtual DECLARE_READ8_MEMBER(read_cart);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_cart);
|
||||
virtual DECLARE_WRITE8_MEMBER(write_bank);
|
||||
|
||||
|
||||
private:
|
||||
UINT8 m_bank_base, m_ram_enabled;
|
||||
};
|
||||
|
@ -175,11 +175,11 @@ bool scv_cart_slot_device::call_load()
|
||||
seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
|
||||
return IMAGE_INIT_FAIL;
|
||||
}
|
||||
|
||||
|
||||
m_cart->rom_alloc(len, tag());
|
||||
if (has_ram)
|
||||
m_cart->ram_alloc(get_software_region_length("ram"));
|
||||
|
||||
|
||||
ROM = m_cart->get_rom_base();
|
||||
|
||||
if (software_entry() == NULL)
|
||||
@ -317,4 +317,3 @@ WRITE8_MEMBER(scv_cart_slot_device::write_bank)
|
||||
if (m_cart)
|
||||
m_cart->write_bank(space, offset, data);
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user