Atari Lynx emulation updates (#8931)

* Atari Lynx emulation updates
- Use memory_view for address mapping
- Support variable framerate, Fix screen overscan (102 visible + 3 blank lines)
- Fix collision handling (possibly copy-paste error?)
- Reduce unnecessary shared pointers, Some duplications
- Use inlines values for bit flags
- Add support for variable page size for cartridge, AUDIN pin for bankswitch
- Add hardware notes, Initialize values
- Fix namings, Fix spacings, Use shorter/correct type values
- Move lynx sound functions into device/sound/lynx.*, Fix sound pitch (input clock related)
This commit is contained in:
cam900 2021-12-15 00:31:51 +09:00 committed by GitHub
parent 53f28f0934
commit 00f45b9df1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 922 additions and 695 deletions

View File

@ -37,6 +37,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2042" /> <info name="serial" value="PA2042" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="a.p.b. - all points bulletin (euro, usa).bin" size="262144" crc="f6fb48fb" sha1="c2bf00de769895cbed03c056eb9c8fa1a7ea59ef" /> <rom name="a.p.b. - all points bulletin (euro, usa).bin" size="262144" crc="f6fb48fb" sha1="c2bf00de769895cbed03c056eb9c8fa1a7ea59ef" />
</dataarea> </dataarea>
@ -48,6 +49,7 @@ Known undumped prototypes:
<year>199?</year> <year>199?</year>
<publisher>Atari</publisher> <publisher>Atari</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="alien vs predator (usa) (prototype).bin" size="262144" crc="540e9bb7" sha1="27427ed186d034d71e100cbff5d0072a717af9e0" /> <rom name="alien vs predator (usa) (prototype).bin" size="262144" crc="540e9bb7" sha1="27427ed186d034d71e100cbff5d0072a717af9e0" />
</dataarea> </dataarea>
@ -60,6 +62,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2049" /> <info name="serial" value="PA2049" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="awesome golf (euro, usa).bin" size="262144" crc="0483cd2a" sha1="74441b96ce5bf2be68945fbe93bda259f97816b7" /> <rom name="awesome golf (euro, usa).bin" size="262144" crc="0483cd2a" sha1="74441b96ce5bf2be68945fbe93bda259f97816b7" />
</dataarea> </dataarea>
@ -72,6 +75,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2050" /> <info name="serial" value="PA2050" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="baseball heroes (euro, usa).bin" size="262144" crc="3943c116" sha1="b30a1fe12dc3e69e1a179a5e4d1799d93996fc24" /> <rom name="baseball heroes (euro, usa).bin" size="262144" crc="3943c116" sha1="b30a1fe12dc3e69e1a179a5e4d1799d93996fc24" />
</dataarea> </dataarea>
@ -84,6 +88,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2034" /> <info name="serial" value="PA2034" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="basketbrawl (euro, usa).bin" size="131072" crc="4161bb4a" sha1="46ae8e1504e2944525d535280a3ed32e0873788a" /> <rom name="basketbrawl (euro, usa).bin" size="131072" crc="4161bb4a" sha1="46ae8e1504e2944525d535280a3ed32e0873788a" />
</dataarea> </dataarea>
@ -96,6 +101,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2101" /> <info name="serial" value="PA2101" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="batman returns (euro, usa).bin" size="262144" crc="277f82c2" sha1="2e25b17a221d4d9598811fbf84ab0da3016f26e4" /> <rom name="batman returns (euro, usa).bin" size="262144" crc="277f82c2" sha1="2e25b17a221d4d9598811fbf84ab0da3016f26e4" />
</dataarea> </dataarea>
@ -108,6 +114,7 @@ Known undumped prototypes:
<publisher>Beyond Games</publisher> <publisher>Beyond Games</publisher>
<info name="serial" value="PT5006" /> <info name="serial" value="PT5006" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="battle wheels (euro, usa).bin" size="131072" crc="779faece" sha1="4577550d20a22cb685d51b411396d5085a852be6" /> <rom name="battle wheels (euro, usa).bin" size="131072" crc="779faece" sha1="4577550d20a22cb685d51b411396d5085a852be6" />
</dataarea> </dataarea>
@ -120,6 +127,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2088" /> <info name="serial" value="PA2088" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="battlezone 2000 (euro, usa).bin" size="262144" crc="30fee726" sha1="fb50ddee638aa316c7eae6d50961e3b69b112c4f" /> <rom name="battlezone 2000 (euro, usa).bin" size="262144" crc="30fee726" sha1="fb50ddee638aa316c7eae6d50961e3b69b112c4f" />
</dataarea> </dataarea>
@ -132,6 +140,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2068" /> <info name="serial" value="PA2068" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="bill &amp; ted's excellent adventure (euro, usa).bin" size="262144" crc="143a313e" sha1="f09ce08d93a479feaceceb79eb48b337aff49fae" /> <rom name="bill &amp; ted's excellent adventure (euro, usa).bin" size="262144" crc="143a313e" sha1="f09ce08d93a479feaceceb79eb48b337aff49fae" />
</dataarea> </dataarea>
@ -144,6 +153,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2056" /> <info name="serial" value="PA2056" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="block out (euro, usa).bin" size="131072" crc="3cd75df3" sha1="ae177cf76953b7e0a56b03096bb5c9c9c9051177" /> <rom name="block out (euro, usa).bin" size="131072" crc="3cd75df3" sha1="ae177cf76953b7e0a56b03096bb5c9c9c9051177" />
</dataarea> </dataarea>
@ -156,6 +166,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2054" /> <info name="serial" value="PA2054" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="blue lightning (usa) (demo).bin" size="131072" crc="bfe36525" sha1="57ece74ac94d65d86a960a44d9896e17b816bbde" /> <rom name="blue lightning (usa) (demo).bin" size="131072" crc="bfe36525" sha1="57ece74ac94d65d86a960a44d9896e17b816bbde" />
</dataarea> </dataarea>
@ -168,6 +179,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2020" /> <info name="serial" value="PA2020" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="blue lightning (euro, usa).bin" size="131072" crc="daf587b1" sha1="be08076586f76db368db1769380dcbb6de2a6513" /> <rom name="blue lightning (euro, usa).bin" size="131072" crc="daf587b1" sha1="be08076586f76db368db1769380dcbb6de2a6513" />
</dataarea> </dataarea>
@ -180,6 +192,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="LX216" /> <info name="serial" value="LX216" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="bubble trouble (euro, usa).bin" size="262144" crc="333daece" sha1="cb9f78ffb02216979a03abb66301e4d3a8f01bfe" /> <rom name="bubble trouble (euro, usa).bin" size="262144" crc="333daece" sha1="cb9f78ffb02216979a03abb66301e4d3a8f01bfe" />
</dataarea> </dataarea>
@ -192,6 +205,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2025" /> <info name="serial" value="PA2025" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="california games (euro, usa).bin" size="131072" crc="a08f0b59" sha1="f13e010102ca527a9c393acb52bb949a1ba93e3e" /> <rom name="california games (euro, usa).bin" size="131072" crc="a08f0b59" sha1="f13e010102ca527a9c393acb52bb949a1ba93e3e" />
</dataarea> </dataarea>
@ -204,6 +218,7 @@ Known undumped prototypes:
<publisher>Shadowsoft</publisher> <publisher>Shadowsoft</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="rotation" value="LEFT" /> <feature name="rotation" value="LEFT" />
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="centipede (usa) (prototype).bin" size="131072" crc="97501709" sha1="59a5185203e3550b1cad7b28489915bc8de80851" /> <rom name="centipede (usa) (prototype).bin" size="131072" crc="97501709" sha1="59a5185203e3550b1cad7b28489915bc8de80851" />
</dataarea> </dataarea>
@ -216,6 +231,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2053" /> <info name="serial" value="PA2053" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="checkered flag (euro, usa).bin" size="262144" crc="19c5a7a5" sha1="f115bb5f98992d98c8d11b1daa68bb1961b59660" /> <rom name="checkered flag (euro, usa).bin" size="262144" crc="19c5a7a5" sha1="f115bb5f98992d98c8d11b1daa68bb1961b59660" />
</dataarea> </dataarea>
@ -228,6 +244,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2028" /> <info name="serial" value="PA2028" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="chip's challenge (euro, usa).bin" size="131072" crc="6a5f53ed" sha1="6a90e6627086e13d99bacbcaafea7ab2f6aba8a0" /> <rom name="chip's challenge (euro, usa).bin" size="131072" crc="6a5f53ed" sha1="6a90e6627086e13d99bacbcaafea7ab2f6aba8a0" />
</dataarea> </dataarea>
@ -240,6 +257,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2105" /> <info name="serial" value="PA2105" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="crystal mines ii (euro, usa).bin" size="131072" crc="aec474c8" sha1="3364bde38508c5c4fed5575295cc80c6f72edebe" /> <rom name="crystal mines ii (euro, usa).bin" size="131072" crc="aec474c8" sha1="3364bde38508c5c4fed5575295cc80c6f72edebe" />
</dataarea> </dataarea>
@ -252,6 +270,7 @@ Known undumped prototypes:
<publisher>Songbird Productions</publisher> <publisher>Songbird Productions</publisher>
<info name="serial" value="CF2008" /> <info name="serial" value="CF2008" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="crystal mines ii - buried treasure.bin" size="262144" crc="122ec861" sha1="c0977ce9f22b0182b332af96290a36f0e7b8fbe6" /> <rom name="crystal mines ii - buried treasure.bin" size="262144" crc="122ec861" sha1="c0977ce9f22b0182b332af96290a36f0e7b8fbe6" />
</dataarea> </dataarea>
@ -263,6 +282,7 @@ Known undumped prototypes:
<year>199?</year> <year>199?</year>
<publisher>Atari</publisher> <publisher>Atari</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="daemonsgate (usa) (prototype).bin" size="262144" crc="99729395" sha1="5a3a21eb5de37367d294e057f70a1f325bf23c4a" /> <rom name="daemonsgate (usa) (prototype).bin" size="262144" crc="99729395" sha1="5a3a21eb5de37367d294e057f70a1f325bf23c4a" />
</dataarea> </dataarea>
@ -275,6 +295,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="L071" /> <info name="serial" value="L071" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="desert strike - return to the gulf (euro, usa).bin" size="262144" crc="b9ac1fe5" sha1="3149d8ba5661fd61dc94d518a0cb6d7b3a8f319f" /> <rom name="desert strike - return to the gulf (euro, usa).bin" size="262144" crc="b9ac1fe5" sha1="3149d8ba5661fd61dc94d518a0cb6d7b3a8f319f" />
</dataarea> </dataarea>
@ -287,6 +308,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2089" /> <info name="serial" value="PA2089" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="dinolympics (euro, usa).bin" size="262144" crc="50386cfa" sha1="0dad2286934c6a317407db066f00233c27f54bbe" /> <rom name="dinolympics (euro, usa).bin" size="262144" crc="50386cfa" sha1="0dad2286934c6a317407db066f00233c27f54bbe" />
</dataarea> </dataarea>
@ -299,6 +321,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2077" /> <info name="serial" value="PA2077" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="dirty larry - renegade cop (euro, usa).bin" size="262144" crc="d565fbb7" sha1="ca856dc880663d7f105ae5aa2ff160b9fc209f92" /> <rom name="dirty larry - renegade cop (euro, usa).bin" size="262144" crc="d565fbb7" sha1="ca856dc880663d7f105ae5aa2ff160b9fc209f92" />
</dataarea> </dataarea>
@ -311,6 +334,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="L070" /> <info name="serial" value="L070" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="double dragon (euro, usa).bin" size="262144" crc="fbfc0f05" sha1="7fc3663bec878b138cfc51f14154823f9701c9e7" /> <rom name="double dragon (euro, usa).bin" size="262144" crc="fbfc0f05" sha1="7fc3663bec878b138cfc51f14154823f9701c9e7" />
</dataarea> </dataarea>
@ -323,6 +347,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2087" /> <info name="serial" value="PA2087" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="dracula the undead (euro, usa).bin" size="262144" crc="33bb74c7" sha1="8f393f0fa8ce832e6298db72f539ce4b961700e2" /> <rom name="dracula the undead (euro, usa).bin" size="262144" crc="33bb74c7" sha1="8f393f0fa8ce832e6298db72f539ce4b961700e2" />
</dataarea> </dataarea>
@ -335,6 +360,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2021" /> <info name="serial" value="PA2021" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="electrocop (euro, usa).bin" size="131072" crc="bd97116b" sha1="5bd6614bc98a882ec2f465278fe4f1ed6a4e972b" /> <rom name="electrocop (euro, usa).bin" size="131072" crc="bd97116b" sha1="5bd6614bc98a882ec2f465278fe4f1ed6a4e972b" />
</dataarea> </dataarea>
@ -347,6 +373,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="LX106" /> <info name="serial" value="LX106" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="european soccer challenge (euro, usa).bin" size="131072" crc="f83397f9" sha1="f1d0390a36055ef2b7cb5f7ce44f622a63d82e80" /> <rom name="european soccer challenge (euro, usa).bin" size="131072" crc="f83397f9" sha1="f1d0390a36055ef2b7cb5f7ce44f622a63d82e80" />
</dataarea> </dataarea>
@ -358,6 +385,7 @@ Known undumped prototypes:
<year>199?</year> <year>199?</year>
<publisher>NuFX</publisher> <publisher>NuFX</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="eye of the beholder (usa) (prototype).bin" size="131072" crc="6bceaa9c" sha1="65c0517a59e0e93bad91245ee8085b3483428707" /> <rom name="eye of the beholder (usa) (prototype).bin" size="131072" crc="6bceaa9c" sha1="65c0517a59e0e93bad91245ee8085b3483428707" />
</dataarea> </dataarea>
@ -369,6 +397,7 @@ Known undumped prototypes:
<year>199?</year> <year>199?</year>
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="fat bobby (euro, usa).bin" size="262144" crc="9034ee27" sha1="766ed1a28528535338e176559a145afaffacf3ef" /> <rom name="fat bobby (euro, usa).bin" size="262144" crc="9034ee27" sha1="766ed1a28528535338e176559a145afaffacf3ef" />
</dataarea> </dataarea>
@ -381,6 +410,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="LX101" /> <info name="serial" value="LX101" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="fidelity ultimate chess challenge, the (euro, usa).bin" size="131072" crc="7e4b5945" sha1="f6afa50f161fffe5975cf5688a9314b8039d940f" /> <rom name="fidelity ultimate chess challenge, the (euro, usa).bin" size="131072" crc="7e4b5945" sha1="f6afa50f161fffe5975cf5688a9314b8039d940f" />
</dataarea> </dataarea>
@ -393,6 +423,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2023" /> <info name="serial" value="PA2023" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="gates of zendocon, the (euro, usa).bin" size="131072" crc="494cc568" sha1="4eb4d3eb29231b2e36d8ef6ede64a568f469c5fe" /> <rom name="gates of zendocon, the (euro, usa).bin" size="131072" crc="494cc568" sha1="4eb4d3eb29231b2e36d8ef6ede64a568f469c5fe" />
</dataarea> </dataarea>
@ -406,6 +437,7 @@ Known undumped prototypes:
<info name="serial" value="PA2024" /> <info name="serial" value="PA2024" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="rotation" value="RIGHT" /> <feature name="rotation" value="RIGHT" />
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="gauntlet - the third encounter (euro, usa).bin" size="131072" crc="7f0ec7ad" sha1="41d27f0717a93d05a9d3d1110f571f791d330f55" /> <rom name="gauntlet - the third encounter (euro, usa).bin" size="131072" crc="7f0ec7ad" sha1="41d27f0717a93d05a9d3d1110f571f791d330f55" />
</dataarea> </dataarea>
@ -418,6 +450,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2106" /> <info name="serial" value="PA2106" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="gordo 106 - the mutated lab monkey (euro, usa).bin" size="262144" crc="d20a85fc" sha1="298163cf4355d0e8aaba264cd7dcd828b1fc6bec" /> <rom name="gordo 106 - the mutated lab monkey (euro, usa).bin" size="262144" crc="d20a85fc" sha1="298163cf4355d0e8aaba264cd7dcd828b1fc6bec" />
</dataarea> </dataarea>
@ -430,6 +463,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2044" /> <info name="serial" value="PA2044" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="hard drivin' (euro, usa).bin" size="131072" crc="6df63834" sha1="6d33abd50d46f900e8762d6e64b51e647ea98b07" /> <rom name="hard drivin' (euro, usa).bin" size="131072" crc="6df63834" sha1="6d33abd50d46f900e8762d6e64b51e647ea98b07" />
</dataarea> </dataarea>
@ -442,6 +476,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2052" /> <info name="serial" value="PA2052" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="hockey (euro, usa).bin" size="262144" crc="e8b45707" sha1="707af2b63c75b777ec519b63f0b8e86565356357" /> <rom name="hockey (euro, usa).bin" size="262144" crc="e8b45707" sha1="707af2b63c75b777ec519b63f0b8e86565356357" />
</dataarea> </dataarea>
@ -454,6 +489,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2073" /> <info name="serial" value="PA2073" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="hydra (euro, usa).bin" size="262144" crc="e3041c6c" sha1="fc0c7cabf3a2ee821f7441b71d19d52205f97721" /> <rom name="hydra (euro, usa).bin" size="262144" crc="e3041c6c" sha1="fc0c7cabf3a2ee821f7441b71d19d52205f97721" />
</dataarea> </dataarea>
@ -466,6 +502,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2065" /> <info name="serial" value="PA2065" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="ishido - the way of stones (euro, usa).bin" size="131072" crc="5cf8bbf0" sha1="78c295af3a57b5bd7d7e1d13ab13ad67885c4e89" /> <rom name="ishido - the way of stones (euro, usa).bin" size="131072" crc="5cf8bbf0" sha1="78c295af3a57b5bd7d7e1d13ab13ad67885c4e89" />
</dataarea> </dataarea>
@ -478,6 +515,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2085" /> <info name="serial" value="PA2085" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="2048"/>
<dataarea name="rom" size="524288"> <dataarea name="rom" size="524288">
<rom name="jimmy connors' tennis (euro, usa).bin" size="524288" crc="2455b6cf" sha1="d9c4220653b2dfbd6b26c0a0c81c40cb3108ee85" /> <rom name="jimmy connors' tennis (euro, usa).bin" size="524288" crc="2455b6cf" sha1="d9c4220653b2dfbd6b26c0a0c81c40cb3108ee85" />
</dataarea> </dataarea>
@ -490,6 +528,7 @@ Known undumped prototypes:
<publisher>Williams Entertainment</publisher> <publisher>Williams Entertainment</publisher>
<info name="serial" value="PT5005" /> <info name="serial" value="PT5005" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="joust (euro, usa).bin" size="131072" crc="5dba792a" sha1="ead01f532bcaf535065dfd66b26d04b484d0066e" /> <rom name="joust (euro, usa).bin" size="131072" crc="5dba792a" sha1="ead01f532bcaf535065dfd66b26d04b484d0066e" />
</dataarea> </dataarea>
@ -503,6 +542,7 @@ Known undumped prototypes:
<info name="serial" value="PA2031" /> <info name="serial" value="PA2031" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="rotation" value="RIGHT" /> <feature name="rotation" value="RIGHT" />
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="klax (euro, usa).bin" size="262144" crc="a53649f1" sha1="a1d2dc0771f4a30e539ab3261a21cc71adc71550" /> <rom name="klax (euro, usa).bin" size="262144" crc="a53649f1" sha1="a1d2dc0771f4a30e539ab3261a21cc71adc71550" />
</dataarea> </dataarea>
@ -515,6 +555,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="L204" /> <info name="serial" value="L204" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="krazy ace - miniature golf (euro, usa).bin" size="262144" crc="bed5ba2b" sha1="20e9011c922f06d9c8823f15c71e005ac2268295" /> <rom name="krazy ace - miniature golf (euro, usa).bin" size="262144" crc="bed5ba2b" sha1="20e9011c922f06d9c8823f15c71e005ac2268295" />
</dataarea> </dataarea>
@ -527,6 +568,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2076" /> <info name="serial" value="PA2076" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="kung food (euro, usa).bin" size="262144" crc="cd1bd405" sha1="ae1bd18b30dd9ae67472c4c532f4d65d23324555" /> <rom name="kung food (euro, usa).bin" size="262144" crc="cd1bd405" sha1="ae1bd18b30dd9ae67472c4c532f4d65d23324555" />
</dataarea> </dataarea>
@ -539,6 +581,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2080" /> <info name="serial" value="PA2080" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="lemmings (euro, usa).bin" size="262144" crc="39b9b8cc" sha1="4d430b1aacf207a631f81b2089688b82267d0394" /> <rom name="lemmings (euro, usa).bin" size="262144" crc="39b9b8cc" sha1="4d430b1aacf207a631f81b2089688b82267d0394" />
</dataarea> </dataarea>
@ -552,6 +595,7 @@ Known undumped prototypes:
<info name="serial" value="CF2003" /> <info name="serial" value="CF2003" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="rotation" value="LEFT" /> <feature name="rotation" value="LEFT" />
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="lexis (euro, usa).bin" size="262144" crc="0271b6e9" sha1="b973cee4a58dbae5ab2d540b38db90aae78ba323" /> <rom name="lexis (euro, usa).bin" size="262144" crc="0271b6e9" sha1="b973cee4a58dbae5ab2d540b38db90aae78ba323" />
</dataarea> </dataarea>
@ -564,6 +608,7 @@ Known undumped prototypes:
<publisher>Songbird Productions</publisher> <publisher>Songbird Productions</publisher>
<info name="serial" value="CF2009" /> <info name="serial" value="CF2009" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="loopz (usa) (prototype).bin" size="262144" crc="b1c25ef1" sha1="b43b0841a5d315d8e515ceaece29875ba6f9afbb" /> <rom name="loopz (usa) (prototype).bin" size="262144" crc="b1c25ef1" sha1="b43b0841a5d315d8e515ceaece29875ba6f9afbb" />
</dataarea> </dataarea>
@ -576,6 +621,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2061" /> <info name="serial" value="PA2061" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="lynx casino (euro, usa).bin" size="262144" crc="1091a268" sha1="4b82a9bc02330c9213c2bbd74d547d520c4e6fa3" /> <rom name="lynx casino (euro, usa).bin" size="262144" crc="1091a268" sha1="4b82a9bc02330c9213c2bbd74d547d520c4e6fa3" />
</dataarea> </dataarea>
@ -588,6 +634,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2086" /> <info name="serial" value="PA2086" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="malibu bikini volleyball (euro, usa).bin" size="262144" crc="aba6da3d" sha1="9c3d8037d347c0ff23d941eff8b575a4f2f051da" /> <rom name="malibu bikini volleyball (euro, usa).bin" size="262144" crc="aba6da3d" sha1="9c3d8037d347c0ff23d941eff8b575a4f2f051da" />
</dataarea> </dataarea>
@ -599,6 +646,7 @@ Known undumped prototypes:
<year>1993</year> <year>1993</year>
<publisher>Digital Image</publisher> <publisher>Digital Image</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="marlboro go (euro) (prototype).bin" size="262144" crc="c3fa0d4d" sha1="26b18b706359b093d0b1bbca4dba9cd2d73e0372" /> <rom name="marlboro go (euro) (prototype).bin" size="262144" crc="c3fa0d4d" sha1="26b18b706359b093d0b1bbca4dba9cd2d73e0372" />
</dataarea> </dataarea>
@ -611,6 +659,7 @@ Known undumped prototypes:
<publisher>Songbird Productions</publisher> <publisher>Songbird Productions</publisher>
<info name="serial" value="CF2010" /> <info name="serial" value="CF2010" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="Mega Pak 1.bin" size="262144" crc="ca7cf30b" sha1="c961b618021e37cf71104f4f7a04f5ea3e0ccb06" /> <rom name="Mega Pak 1.bin" size="262144" crc="ca7cf30b" sha1="c961b618021e37cf71104f4f7a04f5ea3e0ccb06" />
</dataarea> </dataarea>
@ -623,6 +672,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2057" /> <info name="serial" value="PA2057" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="ms. pac-man (euro, usa).bin" size="131072" crc="7de3783a" sha1="ff644034cd840f8c13b643c44ec2c685290e0326" /> <rom name="ms. pac-man (euro, usa).bin" size="131072" crc="7de3783a" sha1="ff644034cd840f8c13b643c44ec2c685290e0326" />
</dataarea> </dataarea>
@ -636,6 +686,7 @@ Known undumped prototypes:
<info name="serial" value="PA2045" /> <info name="serial" value="PA2045" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="rotation" value="LEFT" /> <feature name="rotation" value="LEFT" />
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="nfl football (euro, usa).bin" size="262144" crc="006fd398" sha1="caea445bddcf75bcbe13920718279220d1acb869" /> <rom name="nfl football (euro, usa).bin" size="262144" crc="006fd398" sha1="caea445bddcf75bcbe13920718279220d1acb869" />
</dataarea> </dataarea>
@ -648,6 +699,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2039" /> <info name="serial" value="PA2039" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="ninja gaiden (euro, usa).bin" size="262144" crc="22d47d51" sha1="a40b5dabff9c2f6114fdbc587c72312704d7fabb" /> <rom name="ninja gaiden (euro, usa).bin" size="262144" crc="22d47d51" sha1="a40b5dabff9c2f6114fdbc587c72312704d7fabb" />
</dataarea> </dataarea>
@ -660,6 +712,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2092" /> <info name="serial" value="PA2092" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="2048"/>
<dataarea name="rom" size="524288"> <dataarea name="rom" size="524288">
<rom name="ninja gaiden iii - the ancient ship of doom (euro, usa).bin" size="524288" crc="f3e3f811" sha1="37861cc3025d9addbace8d07c8f65961cba29eaa" /> <rom name="ninja gaiden iii - the ancient ship of doom (euro, usa).bin" size="524288" crc="f3e3f811" sha1="37861cc3025d9addbace8d07c8f65961cba29eaa" />
</dataarea> </dataarea>
@ -672,6 +725,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2059" /> <info name="serial" value="PA2059" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="pac-land (euro, usa).bin" size="131072" crc="aa50dd22" sha1="58b57835703e3145a54e1c0ada38c9218bf4cd3d" /> <rom name="pac-land (euro, usa).bin" size="131072" crc="aa50dd22" sha1="58b57835703e3145a54e1c0ada38c9218bf4cd3d" />
</dataarea> </dataarea>
@ -684,6 +738,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2041" /> <info name="serial" value="PA2041" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="paperboy (euro, usa).bin" size="131072" crc="4cdfbd57" sha1="537bae2c336dc9925f10505d4040965ca7434f5d" /> <rom name="paperboy (euro, usa).bin" size="131072" crc="4cdfbd57" sha1="537bae2c336dc9925f10505d4040965ca7434f5d" />
</dataarea> </dataarea>
@ -696,6 +751,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2055" /> <info name="serial" value="PA2055" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="pinball jam (euro, usa).bin" size="262144" crc="14d38ca7" sha1="d9f911dc35a6b70ba38569d47c96da25ffc7f40e" /> <rom name="pinball jam (euro, usa).bin" size="262144" crc="14d38ca7" sha1="d9f911dc35a6b70ba38569d47c96da25ffc7f40e" />
</dataarea> </dataarea>
@ -708,6 +764,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2070" /> <info name="serial" value="PA2070" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="2048"/>
<dataarea name="rom" size="524288"> <dataarea name="rom" size="524288">
<rom name="pit fighter - the ultimate competition (euro, usa).bin" size="524288" crc="2393135f" sha1="30f8c7acf41a988578768b251e88b636462752cb" /> <rom name="pit fighter - the ultimate competition (euro, usa).bin" size="524288" crc="2393135f" sha1="30f8c7acf41a988578768b251e88b636462752cb" />
</dataarea> </dataarea>
@ -720,6 +777,7 @@ Known undumped prototypes:
<publisher>Songbird Productions</publisher> <publisher>Songbird Productions</publisher>
<info name="serial" value="CF2002" /> <info name="serial" value="CF2002" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="ponx.bin" size="262144" crc="341c88e2" sha1="3254f5c3d347d444dc1bf4cdb07523cc0241d979" /> <rom name="ponx.bin" size="262144" crc="341c88e2" sha1="3254f5c3d347d444dc1bf4cdb07523cc0241d979" />
</dataarea> </dataarea>
@ -732,6 +790,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2109" /> <info name="serial" value="PA2109" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="power factor (euro, usa).bin" size="262144" crc="99c42034" sha1="1ad5386f43f60d848a40ee1237e5bd153faea23f" /> <rom name="power factor (euro, usa).bin" size="262144" crc="99c42034" sha1="1ad5386f43f60d848a40ee1237e5bd153faea23f" />
</dataarea> </dataarea>
@ -744,6 +803,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="LX102" /> <info name="serial" value="LX102" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="qix (euro, usa).bin" size="131072" crc="b9881423" sha1="30b8369ea396347d4847990691d880c313aacae7" /> <rom name="qix (euro, usa).bin" size="131072" crc="b9881423" sha1="30b8369ea396347d4847990691d880c313aacae7" />
</dataarea> </dataarea>
@ -756,6 +816,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="rotation" value="LEFT" /> <feature name="rotation" value="LEFT" />
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="raiden (usa) (v3.0).bin" size="262144" crc="bcd10c3a" sha1="df48f69a7257a40844812e5b0bda9efdf093b7f6" /> <rom name="raiden (usa) (v3.0).bin" size="262144" crc="bcd10c3a" sha1="df48f69a7257a40844812e5b0bda9efdf093b7f6" />
</dataarea> </dataarea>
@ -768,6 +829,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2022" /> <info name="serial" value="PA2022" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="rampage (euro, usa).bin" size="262144" crc="b10b7c8e" sha1="771dbf246386da37670324d34066671f3f43ac0e" /> <rom name="rampage (euro, usa).bin" size="262144" crc="b10b7c8e" sha1="771dbf246386da37670324d34066671f3f43ac0e" />
</dataarea> </dataarea>
@ -780,6 +842,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2102" /> <info name="serial" value="PA2102" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="rampart (euro, usa).bin" size="262144" crc="139f301d" sha1="3c3a0729bb4ddecf5e5fd2d9ced4671d2e0e702e" /> <rom name="rampart (euro, usa).bin" size="262144" crc="139f301d" sha1="3c3a0729bb4ddecf5e5fd2d9ced4671d2e0e702e" />
</dataarea> </dataarea>
@ -791,6 +854,7 @@ Known undumped prototypes:
<year>199?</year> <year>199?</year>
<publisher>Atari</publisher> <publisher>Atari</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="road riot 4wd (usa) (prototype).bin" size="262144" crc="69959a3b" sha1="63978dfd86782acc101266d7bab8677e32d7ea8f" /> <rom name="road riot 4wd (usa) (prototype).bin" size="262144" crc="69959a3b" sha1="63978dfd86782acc101266d7bab8677e32d7ea8f" />
</dataarea> </dataarea>
@ -803,6 +867,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2036" /> <info name="serial" value="PA2036" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="roadblasters (euro, usa).bin" size="262144" crc="6867e80c" sha1="20233381f12a48bc61b2c4b7a8f602a2c8ebc8ba" /> <rom name="roadblasters (euro, usa).bin" size="262144" crc="6867e80c" sha1="20233381f12a48bc61b2c4b7a8f602a2c8ebc8ba" />
</dataarea> </dataarea>
@ -815,6 +880,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2035" /> <info name="serial" value="PA2035" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="robo-squash (euro, usa).bin" size="131072" crc="d1dff2b2" sha1="144e4aa67babc8f3e24c5547f8664c3c6cff8601" /> <rom name="robo-squash (euro, usa).bin" size="131072" crc="d1dff2b2" sha1="144e4aa67babc8f3e24c5547f8664c3c6cff8601" />
</dataarea> </dataarea>
@ -827,6 +893,7 @@ Known undumped prototypes:
<publisher>Williams Entertainment</publisher> <publisher>Williams Entertainment</publisher>
<info name="serial" value="PT5003" /> <info name="serial" value="PT5003" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="robotron 2084 (euro, usa).bin" size="131072" crc="7a6049b5" sha1="04048aa47c0ff99647608d4d1ccf48ba881a0f89" /> <rom name="robotron 2084 (euro, usa).bin" size="131072" crc="7a6049b5" sha1="04048aa47c0ff99647608d4d1ccf48ba881a0f89" />
</dataarea> </dataarea>
@ -839,6 +906,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2043" /> <info name="serial" value="PA2043" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="rygar - legendary warrior (euro, usa).bin" size="262144" crc="67e5bdba" sha1="8743769af583af681fd1d96aadb533d26b1b510d" /> <rom name="rygar - legendary warrior (euro, usa).bin" size="262144" crc="67e5bdba" sha1="8743769af583af681fd1d96aadb533d26b1b510d" />
</dataarea> </dataarea>
@ -851,6 +919,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2060" /> <info name="serial" value="PA2060" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="s.t.u.n. runner (euro, usa).bin" size="262144" crc="8595c40b" sha1="aa570dbbf4682da3297286fc69617c3c9aca2f18" /> <rom name="s.t.u.n. runner (euro, usa).bin" size="262144" crc="8595c40b" sha1="aa570dbbf4682da3297286fc69617c3c9aca2f18" />
</dataarea> </dataarea>
@ -863,6 +932,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2048" /> <info name="serial" value="PA2048" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="scrapyard dog (euro, usa).bin" size="262144" crc="be166f3b" sha1="df57cd7f119fa6af8f9b24942f0f12314b301075" /> <rom name="scrapyard dog (euro, usa).bin" size="262144" crc="be166f3b" sha1="df57cd7f119fa6af8f9b24942f0f12314b301075" />
</dataarea> </dataarea>
@ -875,6 +945,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2081" /> <info name="serial" value="PA2081" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="shadow of the beast (euro, usa).bin" size="262144" crc="eb78baa3" sha1="8b891b5dafba71740294c8dc818717d3b00be3a5" /> <rom name="shadow of the beast (euro, usa).bin" size="262144" crc="eb78baa3" sha1="8b891b5dafba71740294c8dc818717d3b00be3a5" />
</dataarea> </dataarea>
@ -887,6 +958,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2063" /> <info name="serial" value="PA2063" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="shanghai (euro, usa).bin" size="131072" crc="192bcd04" sha1="9e67e05545934a7d375597b0e8c469468c5748a4" /> <rom name="shanghai (euro, usa).bin" size="131072" crc="192bcd04" sha1="9e67e05545934a7d375597b0e8c469468c5748a4" />
</dataarea> </dataarea>
@ -899,6 +971,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2104" /> <info name="serial" value="PA2104" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="steel talons (euro, usa).bin" size="262144" crc="5b2308ed" sha1="773946365ecf3c862cfa21167750140e4b1adad2" /> <rom name="steel talons (euro, usa).bin" size="262144" crc="5b2308ed" sha1="773946365ecf3c862cfa21167750140e4b1adad2" />
</dataarea> </dataarea>
@ -911,6 +984,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2093" /> <info name="serial" value="PA2093" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="super asteroids, missile command (euro, usa).bin" size="131072" crc="2da7e2a8" sha1="d15c7382346cae6296e83ef494a8aec3adaf949c" /> <rom name="super asteroids, missile command (euro, usa).bin" size="131072" crc="2da7e2a8" sha1="d15c7382346cae6296e83ef494a8aec3adaf949c" />
</dataarea> </dataarea>
@ -923,6 +997,7 @@ Known undumped prototypes:
<publisher>Telegames</publisher> <publisher>Telegames</publisher>
<info name="serial" value="LX105" /> <info name="serial" value="LX105" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="super off-road (euro, usa).bin" size="262144" crc="690caeb0" sha1="9bf10edfedde85467f159afb48d02f1ca43be8f4" /> <rom name="super off-road (euro, usa).bin" size="262144" crc="690caeb0" sha1="9bf10edfedde85467f159afb48d02f1ca43be8f4" />
</dataarea> </dataarea>
@ -935,6 +1010,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2100" /> <info name="serial" value="PA2100" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="super skweek (euro, usa).bin" size="262144" crc="dfa61571" sha1="d6c18bf5e625cbac7434ef0d600ad0da667f24cd" /> <rom name="super skweek (euro, usa).bin" size="262144" crc="dfa61571" sha1="d6c18bf5e625cbac7434ef0d600ad0da667f24cd" />
</dataarea> </dataarea>
@ -947,6 +1023,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2094" /> <info name="serial" value="PA2094" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="switchblade ii (euro, usa).bin" size="262144" crc="13657705" sha1="256d55e8e9478c53e340321c858df6710a9f69a6" /> <rom name="switchblade ii (euro, usa).bin" size="262144" crc="13657705" sha1="256d55e8e9478c53e340321c858df6710a9f69a6" />
</dataarea> </dataarea>
@ -959,6 +1036,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2029" /> <info name="serial" value="PA2029" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="todd's adventures in slime world (euro, usa).bin" size="131072" crc="ae267e29" sha1="2b9c665456d17726ea57fd06ce2754a14382dc99" /> <rom name="todd's adventures in slime world (euro, usa).bin" size="131072" crc="ae267e29" sha1="2b9c665456d17726ea57fd06ce2754a14382dc99" />
</dataarea> </dataarea>
@ -971,6 +1049,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2066" /> <info name="serial" value="PA2066" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="toki (euro, usa).bin" size="262144" crc="156a4a4c" sha1="242fee76ea2ae263511df5d8bd3f7b0ddc81757d" /> <rom name="toki (euro, usa).bin" size="262144" crc="156a4a4c" sha1="242fee76ea2ae263511df5d8bd3f7b0ddc81757d" />
</dataarea> </dataarea>
@ -983,6 +1062,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2038" /> <info name="serial" value="PA2038" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="tournament cyberball 2072 (euro, usa).bin" size="262144" crc="0590a9e3" sha1="e63cc54e34840a4e3c1aa5bbce4e406895e44534" /> <rom name="tournament cyberball 2072 (euro, usa).bin" size="262144" crc="0590a9e3" sha1="e63cc54e34840a4e3c1aa5bbce4e406895e44534" />
</dataarea> </dataarea>
@ -995,6 +1075,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2047" /> <info name="serial" value="PA2047" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="turbo sub (euro, usa).bin" size="131072" crc="a4b924d6" sha1="1186b3216830c5bbeac6b39aab1039eef27f0785" /> <rom name="turbo sub (euro, usa).bin" size="131072" crc="a4b924d6" sha1="1186b3216830c5bbeac6b39aab1039eef27f0785" />
</dataarea> </dataarea>
@ -1007,6 +1088,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2064" /> <info name="serial" value="PA2064" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="viking child (euro, usa).bin" size="262144" crc="8d56828b" sha1="47c32e4d816dde797b6bba2019f2e296bdad02dd" /> <rom name="viking child (euro, usa).bin" size="262144" crc="8d56828b" sha1="47c32e4d816dde797b6bba2019f2e296bdad02dd" />
</dataarea> </dataarea>
@ -1019,6 +1101,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2032" /> <info name="serial" value="PA2032" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="warbirds (euro, usa).bin" size="131072" crc="b946ba49" sha1="2c376581ac20fb5de8538b51820e1f007cca8260" /> <rom name="warbirds (euro, usa).bin" size="131072" crc="b946ba49" sha1="2c376581ac20fb5de8538b51820e1f007cca8260" />
</dataarea> </dataarea>
@ -1031,6 +1114,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2037" /> <info name="serial" value="PA2037" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="world class soccer (euro, usa).bin" size="262144" crc="91233794" sha1="40100a0db681b4efca4a491c88bf76a19105336f" /> <rom name="world class soccer (euro, usa).bin" size="262144" crc="91233794" sha1="40100a0db681b4efca4a491c88bf76a19105336f" />
</dataarea> </dataarea>
@ -1043,6 +1127,7 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2026" /> <info name="serial" value="PA2026" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="xenophobe (euro, usa).bin" size="131072" crc="9bed736d" sha1="a1b4f7a4697310cafea1271bd4b41eeafae60ffa" /> <rom name="xenophobe (euro, usa).bin" size="131072" crc="9bed736d" sha1="a1b4f7a4697310cafea1271bd4b41eeafae60ffa" />
</dataarea> </dataarea>
@ -1055,13 +1140,14 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2062" /> <info name="serial" value="PA2062" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="xybots (euro, usa).bin" size="262144" crc="89e2a595" sha1="5ff3c39a6919db6d2270bb22e80e7680550c47ba" /> <rom name="xybots (euro, usa).bin" size="262144" crc="89e2a595" sha1="5ff3c39a6919db6d2270bb22e80e7680550c47ba" />
</dataarea> </dataarea>
</part> </part>
</software> </software>
<software name="yastuna1"> <software name="yastuna1" supported="no"> <!-- Stops with a 'INSERT GAME' screen -->
<description>Yastuna Vol.1 - The Alchemy of Cubes</description> <description>Yastuna Vol.1 - The Alchemy of Cubes</description>
<year>2008</year> <year>2008</year>
<publisher>Fadest</publisher> <publisher>Fadest</publisher>
@ -1072,7 +1158,7 @@ Known undumped prototypes:
</part> </part>
</software> </software>
<software name="yastuna2"> <software name="yastuna2" supported="no"> <!-- Stops with a 'INSERT GAME' screen -->
<description>Yastuna Vol.2 - The Space Incident</description> <description>Yastuna Vol.2 - The Space Incident</description>
<year>2008</year> <year>2008</year>
<publisher>Fadest</publisher> <publisher>Fadest</publisher>
@ -1089,18 +1175,21 @@ Known undumped prototypes:
<publisher>Atari</publisher> <publisher>Atari</publisher>
<info name="serial" value="PA2030" /> <info name="serial" value="PA2030" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="512"/>
<dataarea name="rom" size="131072"> <dataarea name="rom" size="131072">
<rom name="zarlor mercenary (euro, usa).bin" size="131072" crc="cb27199d" sha1="7005cdfa0a2e4a9611266ce50493cbb32351e069" /> <rom name="zarlor mercenary (euro, usa).bin" size="131072" crc="cb27199d" sha1="7005cdfa0a2e4a9611266ce50493cbb32351e069" />
</dataarea> </dataarea>
</part> </part>
</software> </software>
<software name="alpineg" supported="no"> <!-- Needs granularity set as 0x400 instead as 0x800 like the driver expects for 512k cartridges. Also will need eeprom support --> <software name="alpineg" supported="no"> <!-- Need eeprom support -->
<description>Alpine Games</description> <description>Alpine Games</description>
<year>2004</year> <year>2004</year>
<publisher>&lt;homebrew&gt;</publisher> <publisher>&lt;homebrew&gt;</publisher>
<info name="developer" value="R. &amp; J. Graf" /> <info name="developer" value="R. &amp; J. Graf" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<feature name="audin_offset" value="262144"/> <!-- A18 pin is connected to AUDIN -->
<dataarea name="rom" size="524288"> <dataarea name="rom" size="524288">
<rom name="AlpineGames.bin" size="524288" crc="95a1ea09" sha1="fb71ad96f0730f88acd7d51eaa761e475a015d6c" /> <rom name="AlpineGames.bin" size="524288" crc="95a1ea09" sha1="fb71ad96f0730f88acd7d51eaa761e475a015d6c" />
</dataarea> </dataarea>
@ -1114,6 +1203,7 @@ Known undumped prototypes:
<publisher>&lt;homebrew&gt;</publisher> <publisher>&lt;homebrew&gt;</publisher>
<info name="developer" value="Harry Dodgson" /> <info name="developer" value="Harry Dodgson" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="conquest of zow (1996).bin" size="262144" crc="b02821fa" sha1="87b683653dfe76af02a1920582b6362ee11a3715" /> <rom name="conquest of zow (1996).bin" size="262144" crc="b02821fa" sha1="87b683653dfe76af02a1920582b6362ee11a3715" />
</dataarea> </dataarea>
@ -1125,6 +1215,7 @@ Known undumped prototypes:
<year>1995</year> <year>1995</year>
<publisher>&lt;unknown&gt;</publisher> <publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="dragnet (1995).bin" size="262144" crc="5598a4c9" sha1="fc802b8b6a62312e6f68065881d0e4f23a967451" /> <rom name="dragnet (1995).bin" size="262144" crc="5598a4c9" sha1="fc802b8b6a62312e6f68065881d0e4f23a967451" />
</dataarea> </dataarea>
@ -1136,6 +1227,7 @@ Known undumped prototypes:
<year>19??</year> <year>19??</year>
<publisher>&lt;unknown&gt;</publisher> <publisher>&lt;unknown&gt;</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="262144"> <dataarea name="rom" size="262144">
<rom name="lynx ii production test program v0.02 (usa) (prototype).bin" size="262144" crc="28ada019" sha1="c0d35fcfac44437cf3d6d56e6f8cea0dcb12a296" /> <rom name="lynx ii production test program v0.02 (usa) (prototype).bin" size="262144" crc="28ada019" sha1="c0d35fcfac44437cf3d6d56e6f8cea0dcb12a296" />
</dataarea> </dataarea>
@ -1148,6 +1240,7 @@ Known undumped prototypes:
<publisher>&lt;homebrew&gt;</publisher> <publisher>&lt;homebrew&gt;</publisher>
<info name="developer" value="Harry Dodgson" /> <info name="developer" value="Harry Dodgson" />
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="2048"/>
<dataarea name="rom" size="524288"> <dataarea name="rom" size="524288">
<rom name="othello.bin" size="524288" crc="d659adf8" sha1="5470950f9348c8edcab4f5063cf20d3252443ac0" /> <rom name="othello.bin" size="524288" crc="d659adf8" sha1="5470950f9348c8edcab4f5063cf20d3252443ac0" />
</dataarea> </dataarea>
@ -1159,6 +1252,7 @@ Known undumped prototypes:
<year>2016</year> <year>2016</year>
<publisher>Luchs Soft</publisher> <publisher>Luchs Soft</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="2048"/>
<dataarea name="rom" size="524288"> <dataarea name="rom" size="524288">
<rom name="weltenschlacht.lyx" size="524288" crc="a0c59271" sha1="dbba003684efe249b6f17a070b3b008b09c67d3f" /> <rom name="weltenschlacht.lyx" size="524288" crc="a0c59271" sha1="dbba003684efe249b6f17a070b3b008b09c67d3f" />
</dataarea> </dataarea>
@ -1170,6 +1264,7 @@ Known undumped prototypes:
<year>2009</year> <year>2009</year>
<publisher>Super Fighter Team / Penguinet</publisher> <publisher>Super Fighter Team / Penguinet</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="2048"/>
<dataarea name="rom" size="0x80000"> <dataarea name="rom" size="0x80000">
<rom name="Zaku.bin" size="0x80000" crc="4ea845da" sha1="2723c29b4e00dd76402e9fc4dc50cb59b673b507" /> <rom name="Zaku.bin" size="0x80000" crc="4ea845da" sha1="2723c29b4e00dd76402e9fc4dc50cb59b673b507" />
</dataarea> </dataarea>
@ -1181,6 +1276,7 @@ Known undumped prototypes:
<year>2009</year> <year>2009</year>
<publisher>Penguinet</publisher> <publisher>Penguinet</publisher>
<part name="cart" interface="lynx_cart"> <part name="cart" interface="lynx_cart">
<feature name="granularity" value="1024"/>
<dataarea name="rom" size="0x40000"> <dataarea name="rom" size="0x40000">
<rom name="zakudemo.bin" size="0x40000" crc="b3747c71" sha1="530ea8c0a820746425017cbcc9f766531f5c6333" /> <rom name="zakudemo.bin" size="0x40000" crc="b3747c71" sha1="530ea8c0a820746425017cbcc9f766531f5c6333" />
</dataarea> </dataarea>

View File

@ -1565,3 +1565,15 @@ if (SOUNDS["UDA1344"]~=null) then
MAME_DIR .. "src/devices/sound/uda1344.h", MAME_DIR .. "src/devices/sound/uda1344.h",
} }
end end
---------------------------------------------------
--
--@src/devices/sound/lynx.h,SOUNDS["LYNX"] = true
---------------------------------------------------
if (SOUNDS["LYNX"]~=null) then
files {
MAME_DIR .. "src/devices/sound/lynx.cpp",
MAME_DIR .. "src/devices/sound/lynx.h",
}
end

View File

@ -298,6 +298,7 @@ SOUNDS["TT5665"] = true
--SOUNDS["UDA1344"] = true --SOUNDS["UDA1344"] = true
SOUNDS["SWP30"] = true SOUNDS["SWP30"] = true
SOUNDS["XT446"] = true SOUNDS["XT446"] = true
--SOUNDS["LYNX"] = true
-------------------------------------------------- --------------------------------------------------
-- specify available video cores -- specify available video cores

View File

@ -325,6 +325,7 @@ SOUNDS["ROLANDPCM"] = true
--SOUNDS["TT5665"] = true --SOUNDS["TT5665"] = true
SOUNDS["RP2C33_SOUND"] = true SOUNDS["RP2C33_SOUND"] = true
SOUNDS["UDA1344"] = true SOUNDS["UDA1344"] = true
SOUNDS["LYNX"] = true
-------------------------------------------------- --------------------------------------------------
-- specify available video cores -- specify available video cores
@ -1913,8 +1914,6 @@ files {
MAME_DIR .. "src/mame/video/atarist.h", MAME_DIR .. "src/mame/video/atarist.h",
MAME_DIR .. "src/mame/drivers/lynx.cpp", MAME_DIR .. "src/mame/drivers/lynx.cpp",
MAME_DIR .. "src/mame/includes/lynx.h", MAME_DIR .. "src/mame/includes/lynx.h",
MAME_DIR .. "src/mame/audio/lynx.cpp",
MAME_DIR .. "src/mame/audio/lynx.h",
MAME_DIR .. "src/mame/machine/lynx.cpp", MAME_DIR .. "src/mame/machine/lynx.cpp",
MAME_DIR .. "src/mame/drivers/pofo.cpp", MAME_DIR .. "src/mame/drivers/pofo.cpp",
MAME_DIR .. "src/mame/machine/pofo_kbd.cpp", MAME_DIR .. "src/mame/machine/pofo_kbd.cpp",

View File

@ -1,11 +1,15 @@
// license:GPL-2.0+ // license:GPL-2.0+
// copyright-holders:Peter Trauner // copyright-holders:Peter Trauner
/****************************************************************************** /******************************************************************************
Atari Lynx sound hardware, Part of Mikey (Hayato in Lynx II)
PeT mess@utanet.at 2000,2001 PeT mess@utanet.at 2000,2001
******************************************************************************/ ******************************************************************************/
#include "emu.h" #include "emu.h"
#include "audio/lynx.h" #include "lynx.h"
#include <algorithm>
/* accordingly to atari's reference manual /* accordingly to atari's reference manual
@ -85,8 +89,8 @@ AUD_A_RIGHT EQU %00000001
// device type definition // device type definition
DEFINE_DEVICE_TYPE(LYNX_SND, lynx_sound_device, "lynx_sound", "Mikey") DEFINE_DEVICE_TYPE(LYNX_SND, lynx_sound_device, "lynx_sound", "Atari Mikey (Sound)")
DEFINE_DEVICE_TYPE(LYNX2_SND, lynx2_sound_device, "lynx2_sound", "Mikey (Lynx II)") DEFINE_DEVICE_TYPE(LYNX2_SND, lynx2_sound_device, "lynx2_sound", "Atari Hayato (Sound)")
//************************************************************************** //**************************************************************************
// LIVE DEVICE // LIVE DEVICE
@ -172,8 +176,7 @@ void lynx_sound_device::init()
void lynx_sound_device::device_start() void lynx_sound_device::device_start()
{ {
m_mixer_channel = stream_alloc(0, 1, machine().sample_rate()); m_mixer_channel = stream_alloc(0, 1, clock() / 16);
m_usec_per_sample = 1000000 / machine().sample_rate();
m_timer_delegate.resolve(); m_timer_delegate.resolve();
init(); init();
register_save(); register_save();
@ -182,8 +185,7 @@ void lynx_sound_device::device_start()
void lynx2_sound_device::device_start() void lynx2_sound_device::device_start()
{ {
m_mixer_channel = stream_alloc(0, 2, machine().sample_rate()); m_mixer_channel = stream_alloc(0, 2, clock() / 16);
m_usec_per_sample = 1000000 / machine().sample_rate();
m_timer_delegate.resolve(); m_timer_delegate.resolve();
init(); init();
register_save(); register_save();
@ -201,6 +203,15 @@ void lynx_sound_device::device_reset()
} }
} }
//-------------------------------------------------
// device_clock_changed - called if the clock
// changes
//-------------------------------------------------
void lynx_sound_device::device_clock_changed()
{
m_mixer_channel->set_sample_rate(clock() / 16);
}
void lynx_sound_device::reset_channel(LYNX_AUDIO *channel) void lynx_sound_device::reset_channel(LYNX_AUDIO *channel)
{ {
@ -223,7 +234,7 @@ void lynx_sound_device::reset_channel(LYNX_AUDIO *channel)
void lynx_sound_device::count_down(int nr) void lynx_sound_device::count_down(int nr)
{ {
LYNX_AUDIO *channel = &m_audio[nr]; LYNX_AUDIO *channel = &m_audio[nr];
if (channel->reg.control1 & 8 && (channel->reg.control1 & 7) != 7) if ((channel->reg.count_en()) && (!(channel->reg.linked())))
return; return;
if (nr == 0) if (nr == 0)
m_mixer_channel->update(); m_mixer_channel->update();
@ -233,25 +244,25 @@ void lynx_sound_device::count_down(int nr)
void lynx_sound_device::shift(int chan_nr) void lynx_sound_device::shift(int chan_nr)
{ {
int16_t out_temp; s16 out_temp;
LYNX_AUDIO *channel; LYNX_AUDIO *channel;
assert(chan_nr < 4); assert(chan_nr < 4);
channel = &m_audio[chan_nr]; channel = &m_audio[chan_nr];
//channel->shifter = ((channel->shifter<<1)&0xffe) | (m_shift_xor[ channel->shifter & channel->mask ]&1); //channel->shifter = ((channel->shifter << 1) & 0xffe) | (m_shift_xor[channel->shifter & channel->mask] & 1);
// alternative method (functionally the same as above) // alternative method (functionally the same as above)
uint8_t xor_out = 0; u8 xor_out = 1; // output of xor is inverted
for (int bit = 0; bit < 12; bit++) for (int bit = 0; bit < 12; bit++)
{ {
if ((channel->mask >> bit) & 1) if (BIT(channel->mask, bit))
xor_out ^= (channel->shifter >> bit) & 1; xor_out ^= BIT(channel->shifter, bit);
} }
channel->shifter = ((channel->shifter << 1) & 0xffe) | (xor_out ^ 1); // output of xor is inverted channel->shifter = ((channel->shifter << 1) & 0xffe) | xor_out;
if (channel->reg.control1 & 0x20) // integrate mode enabled if (channel->reg.integrate_mode()) // integrate mode enabled
{ {
if (channel->shifter & 1) if (channel->shifter & 1)
out_temp = channel->reg.output + channel->reg.volume; out_temp = channel->reg.output + channel->reg.volume;
@ -259,9 +270,7 @@ void lynx_sound_device::shift(int chan_nr)
out_temp = channel->reg.output - channel->reg.volume; out_temp = channel->reg.output - channel->reg.volume;
// clipping // clipping
if (out_temp > 127) out_temp = 127; channel->reg.output = std::clamp<s16>(out_temp, -128, 127);
if (out_temp < -128) out_temp = -128;
channel->reg.output = (int16_t)out_temp;
} }
switch (chan_nr) switch (chan_nr)
@ -284,22 +293,22 @@ void lynx_sound_device::execute(int chan_nr)
channel = &m_audio[chan_nr]; channel = &m_audio[chan_nr];
if (channel->reg.control1 & 8) // count enable if (channel->reg.count_en()) // count enable
{ {
channel->ticks += m_usec_per_sample; channel->ticks++;
if ((channel->reg.control1 & 7) == 7) // link if (channel->reg.linked()) // link
{ {
if (channel->count < 0) // counter finished if (channel->count < 0) // counter finished
{ {
//channel->count+=channel->reg.counter; // reload (wrong?) //channel->count+=channel->reg.counter; // reload (wrong?)
if (channel->reg.control1 & 0x10) if (channel->reg.reload_en())
channel->count = channel->reg.bakup; channel->count = channel->reg.bakup;
shift(chan_nr); shift(chan_nr);
} }
} }
else else
{ {
int t = 1 << (channel->reg.control1 & 7); // microseconds per count const int t = 1 << (channel->reg.timer_clock()); // microseconds per count
for (;;) for (;;)
{ {
for (; (channel->ticks >= t) && (channel->count >= 0); channel->ticks -= t) // at least one sampled worth of time left, timer not expired for (; (channel->ticks >= t) && (channel->count >= 0); channel->ticks -= t) // at least one sampled worth of time left, timer not expired
@ -311,7 +320,7 @@ void lynx_sound_device::execute(int chan_nr)
if (channel->count < 0) if (channel->count < 0)
{ {
shift(chan_nr); shift(chan_nr);
if (channel->reg.control1 & 0x10) if (channel->reg.reload_en())
channel->count = channel->reg.bakup; channel->count = channel->reg.bakup;
else else
break; break;
@ -319,10 +328,9 @@ void lynx_sound_device::execute(int chan_nr)
} }
} }
if (!(channel->reg.control1 & 0x20)) // normal mode if (!(channel->reg.integrate_mode())) // normal mode
{ channel->reg.output = BIT(channel->shifter, 0) ? channel->reg.volume : -channel->reg.volume;
channel->reg.output = (channel->shifter & 1) ? channel->reg.volume : -channel->reg.volume;
}
} }
else else
{ {
@ -331,9 +339,9 @@ void lynx_sound_device::execute(int chan_nr)
} }
} }
uint8_t lynx_sound_device::read(offs_t offset) u8 lynx_sound_device::read(offs_t offset)
{ {
uint8_t value = 0; u8 value = 0;
LYNX_AUDIO *channel = &m_audio[(offset >> 3) & 3]; LYNX_AUDIO *channel = &m_audio[(offset >> 3) & 3];
m_mixer_channel->update(); m_mixer_channel->update();
@ -363,7 +371,7 @@ uint8_t lynx_sound_device::read(offs_t offset)
break; break;
case 6: case 6:
//current timer value //current timer value
if (channel->count >=0) if (channel->count >= 0)
value = channel->count; value = channel->count;
else else
value = 0; value = 0;
@ -394,7 +402,7 @@ uint8_t lynx_sound_device::read(offs_t offset)
return value; return value;
} }
void lynx_sound_device::write(offs_t offset, uint8_t data) void lynx_sound_device::write(offs_t offset, u8 data)
{ {
//logerror("audio write %.2x %.2x\n", offset, data); //logerror("audio write %.2x %.2x\n", offset, data);
LYNX_AUDIO *channel = &m_audio[(offset >> 3) & 3]; LYNX_AUDIO *channel = &m_audio[(offset >> 3) & 3];
@ -414,7 +422,7 @@ void lynx_sound_device::write(offs_t offset, uint8_t data)
case 1: case 1:
channel->reg.feedback = data; channel->reg.feedback = data;
channel->mask &= 0x80; channel->mask &= 0x80;
channel->mask |= (data & 0x3f) | ((data & 0xc0)<<4); channel->mask |= (data & 0x3f) | ((data & 0xc0) << 4);
break; break;
// Output value // Output value
case 2: case 2:
@ -433,17 +441,17 @@ void lynx_sound_device::write(offs_t offset, uint8_t data)
// Audio control bits // Audio control bits
case 5: case 5:
channel->mask &= ~0x80; channel->mask &= ~0x80;
channel->mask |= (data&0x80); channel->mask |= (data & 0x80);
channel->reg.control1 = data; channel->reg.control1 = data;
break; break;
// Current count // Current count
case 6: case 6:
channel->count=data; channel->count = data;
break; break;
// Upper 4 bits of shift register and audio status bits // Upper 4 bits of shift register and audio status bits
case 7: case 7:
channel->shifter&=0xff; channel->shifter &= 0xff;
channel->shifter|=(data&0xf0)<<4; channel->shifter |= (data & 0xf0) << 4;
channel->reg.control2 = data; channel->reg.control2 = data;
break; break;
} }
@ -453,7 +461,7 @@ void lynx_sound_device::write(offs_t offset, uint8_t data)
switch (offset) // Stereo Registers switch (offset) // Stereo Registers
{ {
case 0x40: case 0x41: case 0x42: case 0x43: case 0x40: case 0x41: case 0x42: case 0x43:
m_audio[offset&3].attenuation = data; m_audio[offset & 3].attenuation = data;
break; break;
case 0x44: case 0x44:
m_attenuation_enable = data; m_attenuation_enable = data;
@ -472,7 +480,6 @@ void lynx_sound_device::write(offs_t offset, uint8_t data)
void lynx_sound_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) void lynx_sound_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs)
{ {
int v;
auto &buffer = outputs[0]; auto &buffer = outputs[0];
for (int i = 0; i < buffer.samples(); i++) for (int i = 0; i < buffer.samples(); i++)
@ -481,8 +488,7 @@ void lynx_sound_device::sound_stream_update(sound_stream &stream, std::vector<re
for (int channel = 0; channel < LYNX_AUDIO_CHANNELS; channel++) for (int channel = 0; channel < LYNX_AUDIO_CHANNELS; channel++)
{ {
execute(channel); execute(channel);
v = m_audio[channel].reg.output; result += m_audio[channel].reg.output * 15; // where does the *15 come from?
result += v * 15; // where does the *15 come from?
} }
buffer.put_int(i, result, 32768); buffer.put_int(i, result, 32768);
} }
@ -494,9 +500,8 @@ void lynx_sound_device::sound_stream_update(sound_stream &stream, std::vector<re
void lynx2_sound_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) void lynx2_sound_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs)
{ {
auto &left=outputs[0]; auto &left = outputs[0];
auto &right=outputs[1]; auto &right = outputs[1];
int v;
for (int i = 0; i < left.samples(); i++) for (int i = 0; i < left.samples(); i++)
{ {
@ -505,7 +510,7 @@ void lynx2_sound_device::sound_stream_update(sound_stream &stream, std::vector<r
for (int channel = 0; channel < LYNX_AUDIO_CHANNELS; channel++) for (int channel = 0; channel < LYNX_AUDIO_CHANNELS; channel++)
{ {
execute(channel); execute(channel);
v = m_audio[channel].reg.output; int v = m_audio[channel].reg.output;
if (!(m_master_enable & (0x10 << channel))) if (!(m_master_enable & (0x10 << channel)))
{ {
if (m_attenuation_enable & (0x10 << channel)) if (m_attenuation_enable & (0x10 << channel))

View File

@ -1,7 +1,7 @@
// license:GPL-2.0+ // license:GPL-2.0+
// copyright-holders:Peter Trauner // copyright-holders:Peter Trauner
#ifndef MAME_AUDIO_LYNX_H #ifndef MAME_SOUND_LYNX_H
#define MAME_AUDIO_LYNX_H #define MAME_SOUND_LYNX_H
#pragma once #pragma once
@ -13,36 +13,47 @@ public:
lynx_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); lynx_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
uint8_t read(offs_t offset); u8 read(offs_t offset);
void write(offs_t offset, uint8_t data); void write(offs_t offset, u8 data);
void count_down(int nr); void count_down(int nr);
template <typename... T> void set_timer_delegate(T &&... args) { m_timer_delegate.set(std::forward<T>(args)...); } template <typename... T> void set_timer_delegate(T &&... args) { m_timer_delegate.set(std::forward<T>(args)...); }
protected: protected:
struct LYNX_AUDIO { struct LYNX_AUDIO {
struct { struct {
int8_t volume; //bool reset_done() const { return BIT(control1, 6); } // Reset timer done flag (not implemented)
uint8_t feedback; bool integrate_mode() const { return BIT(control1, 5); } // Integrate mode
int8_t output; bool reload_en() const { return BIT(control1, 4); } // Reload enable
uint8_t shifter; bool count_en() const { return BIT(control1, 3); } // Count enable
uint8_t bakup; u8 timer_clock() const { return BIT(control1, 0, 3); } // Timer clock
uint8_t control1; bool linked() const { return timer_clock() == 0b111; } // Linked timer?
uint8_t counter;
uint8_t control2; //bool last_clock() const { return BIT(control2, 2); } // Last clock (not implemented)
//bool borrow_in() const { return BIT(control2, 1); } // Borrow in (not implemented)
//bool borrow_out() const { return BIT(control2, 0); } // Borrow out (not implemented)
s8 volume = 0;
u8 feedback = 0;
s8 output = 0;
u8 shifter = 0;
u8 bakup = 0;
u8 control1 = 0;
u8 counter = 0;
u8 control2 = 0;
} reg; } reg;
uint8_t attenuation; u8 attenuation = 0;
uint16_t mask; // 12-bit u16 mask = 0; // 12-bit
uint16_t shifter; // 12-bit u16 shifter = 0; // 12-bit
float ticks; s16 ticks = 0;
int count; s16 count = 0;
}; };
lynx_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); lynx_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides // device-level overrides
virtual void device_start() override; virtual void device_start() override;
virtual void device_reset() override; virtual void device_reset() override;
virtual void device_clock_changed() override;
// sound stream update overrides // sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
@ -54,13 +65,12 @@ protected:
void register_save(); void register_save();
sound_stream *m_mixer_channel; sound_stream *m_mixer_channel;
timer_delegate m_timer_delegate; // this calls lynx_timer_count_down from the driver state timer_delegate m_timer_delegate; // this calls lynx_timer_count_down from the driver state
float m_usec_per_sample;
std::unique_ptr<int[]> m_shift_mask; std::unique_ptr<int[]> m_shift_mask;
std::unique_ptr<int[]> m_shift_xor; std::unique_ptr<int[]> m_shift_xor;
uint8_t m_attenuation_enable; u8 m_attenuation_enable = 0;
uint8_t m_master_enable; u8 m_master_enable = 0;
LYNX_AUDIO m_audio[4]; LYNX_AUDIO m_audio[4];
}; };
@ -82,4 +92,4 @@ protected:
DECLARE_DEVICE_TYPE(LYNX_SND, lynx_sound_device) DECLARE_DEVICE_TYPE(LYNX_SND, lynx_sound_device)
DECLARE_DEVICE_TYPE(LYNX2_SND, lynx2_sound_device) DECLARE_DEVICE_TYPE(LYNX2_SND, lynx2_sound_device)
#endif // MAME_AUDIO_LYNX_H #endif // MAME_SOUND_LYNX_H

View File

@ -1,16 +1,23 @@
// license:GPL-2.0+ // license:GPL-2.0+
// copyright-holders:Peter Trauner // copyright-holders:Peter Trauner
/****************************************************************************** /******************************************************************************
Atari Lynx
PeT peter.trauner@utanet.at 2000,2001 PeT peter.trauner@utanet.at 2000,2001
info found in bastian schick's bll info found in bastian schick's bll
and in cc65 for lynx and in cc65 for lynx
TODO:
- ComLynx emulation is missing/imperfect
- Verify timings from real hardware
- EEPROM Support in some homebrew cartridges?
- Lynx II support, needs internal ROM dump
******************************************************************************/ ******************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/lynx.h" #include "includes/lynx.h"
#include "audio/lynx.h"
#include "cpu/m6502/m65sc02.h" #include "cpu/m6502/m65sc02.h"
#include "softlist.h" #include "softlist.h"
@ -18,27 +25,19 @@
#include "lynx.lh" #include "lynx.lh"
void lynx_state::lynx_mem(address_map &map) void lynx_state::cpu_map(address_map &map)
{ {
map(0x0000, 0xfbff).ram().share("mem_0000"); map(0x0000, 0xffff).ram().share(m_dram);
map(0xfc00, 0xfcff).m(m_bank_fc00, FUNC(address_map_bank_device::amap8)); map(0xfc00, 0xfcff).view(m_suzy_view);
map(0xfd00, 0xfdff).m(m_bank_fd00, FUNC(address_map_bank_device::amap8)); m_suzy_view[0](0xfc00, 0xfcff).rw(FUNC(lynx_state::suzy_read), FUNC(lynx_state::suzy_write));
map(0xfe00, 0xfff7).bankr("bank_fe00").writeonly().share("mem_fe00"); map(0xfd00, 0xfdff).view(m_mikey_view);
map(0xfff8, 0xfff8).ram(); m_mikey_view[0](0xfd00, 0xfdff).rw(FUNC(lynx_state::mikey_read), FUNC(lynx_state::mikey_write));
map(0xfff9, 0xfff9).rw(FUNC(lynx_state::lynx_memory_config_r), FUNC(lynx_state::lynx_memory_config_w)); map(0xfe00, 0xffff).view(m_rom_view);
map(0xfffa, 0xffff).bankr("bank_fffa").writeonly().share("mem_fffa"); m_rom_view[0](0xfe00, 0xfff7).rom().region("maincpu", 0x0000);
} map(0xfff8, 0xfff8).ram(); // Reserved for future hardware (RAM)
map(0xfff9, 0xfff9).rw(FUNC(lynx_state::memory_config_r), FUNC(lynx_state::memory_config_w));
void lynx_state::lynx_fc00_mem(address_map &map) map(0xfff8, 0xffff).view(m_vector_view);
{ m_vector_view[0](0xfffa, 0xffff).rom().region("maincpu", 0x01fa);
map(0x000, 0x0ff).rw(FUNC(lynx_state::suzy_read), FUNC(lynx_state::suzy_write));
map(0x100, 0x1ff).ram().share("mem_fc00");
}
void lynx_state::lynx_fd00_mem(address_map &map)
{
map(0x000, 0x0ff).rw(FUNC(lynx_state::mikey_read), FUNC(lynx_state::mikey_write));
map(0x100, 0x1ff).ram().share("mem_fd00");
} }
static INPUT_PORTS_START( lynx ) static INPUT_PORTS_START( lynx )
@ -54,6 +53,8 @@ static INPUT_PORTS_START( lynx )
PORT_START("PAUSE") PORT_START("PAUSE")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME(DEF_STR(Pause)) PORT_CODE(KEYCODE_3) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME(DEF_STR(Pause)) PORT_CODE(KEYCODE_3)
//PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) CART0 Strobe
//PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) CART1 Strobe
// power on and power off buttons // power on and power off buttons
INPUT_PORTS_END INPUT_PORTS_END
@ -62,34 +63,31 @@ void lynx_state::video_start()
m_screen->register_screen_bitmap(m_bitmap); m_screen->register_screen_bitmap(m_bitmap);
} }
uint32_t lynx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) u32 lynx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
return 0; return 0;
} }
// callback for Mikey call of shift(3) which shall act on the lynx_timer_count_down // callback for Mikey call of shift(3) which shall act on the timer_count_down
void lynx_state::sound_cb() void lynx_state::sound_cb()
{ {
lynx_timer_count_down(1); timer_count_down(1);
} }
void lynx_state::lynx(machine_config &config) void lynx_state::lynx(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
M65SC02(config, m_maincpu, 4000000); /* vti core, integrated in vlsi, stz, but not bbr bbs */ M65SC02(config, m_maincpu, XTAL(16'000'000) / 4); /* vti core, integrated in vlsi, stz, but not bbr bbs */
m_maincpu->set_addrmap(AS_PROGRAM, &lynx_state::lynx_mem); m_maincpu->set_addrmap(AS_PROGRAM, &lynx_state::cpu_map);
config.set_maximum_quantum(attotime::from_hz(60)); config.set_maximum_quantum(attotime::from_hz(60));
ADDRESS_MAP_BANK(config, "bank_fc00").set_map(&lynx_state::lynx_fc00_mem).set_options(ENDIANNESS_LITTLE, 8, 9, 0x100);
ADDRESS_MAP_BANK(config, "bank_fd00").set_map(&lynx_state::lynx_fd00_mem).set_options(ENDIANNESS_LITTLE, 8, 9, 0x100);
/* video hardware */ /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_LCD); SCREEN(config, m_screen, SCREEN_TYPE_LCD);
m_screen->set_refresh_hz(30); m_screen->set_refresh_hz(XTAL(16'000'000) / 16 / (158 + 1) / (104 + 1)); // default config from machine_reset(), actually variable
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
m_screen->set_screen_update(FUNC(lynx_state::screen_update)); m_screen->set_screen_update(FUNC(lynx_state::screen_update));
m_screen->set_size(160, 102); m_screen->set_size(160, 105); // 102 visible scanline + 3 blank scanline, horizontal unknown/unverified, variable?
m_screen->set_visarea(0, 160-1, 0, 102-1); m_screen->set_visarea(0, 160-1, 0, 102-1);
config.set_default_layout(layout_lynx); config.set_default_layout(layout_lynx);
@ -97,7 +95,7 @@ void lynx_state::lynx(machine_config &config)
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
LYNX_SND(config, m_sound, 0); LYNX_SND(config, m_sound, XTAL(16'000'000));
m_sound->set_timer_delegate(FUNC(lynx_state::sound_cb)); m_sound->set_timer_delegate(FUNC(lynx_state::sound_cb));
m_sound->add_route(ALL_OUTPUTS, "mono", 0.50); m_sound->add_route(ALL_OUTPUTS, "mono", 0.50);
@ -112,6 +110,7 @@ void lynx_state::lynx(machine_config &config)
SOFTWARE_LIST(config, "cart_list").set_original("lynx"); SOFTWARE_LIST(config, "cart_list").set_original("lynx");
} }
// Lynx II has Hayato replaces Mikey, Compatible but supports stereo
#if 0 #if 0
void lynx_state::lynx2(machine_config &config) void lynx_state::lynx2(machine_config &config)
{ {
@ -121,8 +120,7 @@ void lynx_state::lynx2(machine_config &config)
config.device_remove("mono"); config.device_remove("mono");
SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right(); SPEAKER(config, "rspeaker").front_right();
config.device_remove("lynx"); LYNX2_SND(config.replace(), m_sound, XTAL(16'000'000));
LYNX2_SND(config.replace(), m_sound, 0);
m_sound->set_timer_delegate(FUNC(lynx_state::sound_cb)); m_sound->set_timer_delegate(FUNC(lynx_state::sound_cb));
m_sound->add_route(0, "lspeaker", 0.50); m_sound->add_route(0, "lspeaker", 0.50);
m_sound->add_route(1, "rspeaker", 0.50); m_sound->add_route(1, "rspeaker", 0.50);
@ -141,16 +139,12 @@ ROM_START(lynx)
ROMX_LOAD("lynx.bin", 0x00000, 0x200, BAD_DUMP CRC(e1ffecb6) SHA1(de60f2263851bbe10e5801ef8f6c357a4bc077e6), ROM_BIOS(0)) ROMX_LOAD("lynx.bin", 0x00000, 0x200, BAD_DUMP CRC(e1ffecb6) SHA1(de60f2263851bbe10e5801ef8f6c357a4bc077e6), ROM_BIOS(0))
ROM_SYSTEM_BIOS( 1, "a", "alternate rom save" ) ROM_SYSTEM_BIOS( 1, "a", "alternate rom save" )
ROMX_LOAD("lynxa.bin", 0x00000, 0x200, BAD_DUMP CRC(0d973c9d) SHA1(e4ed47fae31693e016b081c6bda48da5b70d7ccb), ROM_BIOS(1)) ROMX_LOAD("lynxa.bin", 0x00000, 0x200, BAD_DUMP CRC(0d973c9d) SHA1(e4ed47fae31693e016b081c6bda48da5b70d7ccb), ROM_BIOS(1))
ROM_REGION(0x100,"gfx1", ROMREGION_ERASE00)
ROM_END ROM_END
#if 0 #if 0
ROM_START(lynx2) ROM_START(lynx2)
ROM_REGION(0x200,"maincpu", 0) ROM_REGION(0x200,"maincpu", 0)
ROM_LOAD("lynx2.bin", 0, 0x200, NO_DUMP) ROM_LOAD("lynx2.bin", 0, 0x200, NO_DUMP)
ROM_REGION(0x100,"gfx1", ROMREGION_ERASE00)
ROM_END ROM_END
#endif #endif
@ -158,9 +152,9 @@ ROM_END
QUICKLOAD_LOAD_MEMBER(lynx_state::quickload_cb) QUICKLOAD_LOAD_MEMBER(lynx_state::quickload_cb)
{ {
address_space &space = m_maincpu->space(AS_PROGRAM); address_space &space = m_maincpu->space(AS_PROGRAM);
std::vector<uint8_t> data; std::vector<u8> data;
uint8_t *rom = memregion("maincpu")->base(); u8 *rom = memregion("maincpu")->base();
uint8_t header[10]; // 80 08 dw Start dw Len B S 9 3 u8 header[10]; // 80 08 dw Start dw Len B S 9 3
uint16_t start, length; uint16_t start, length;
int i; int i;
@ -168,7 +162,7 @@ QUICKLOAD_LOAD_MEMBER(lynx_state::quickload_cb)
return image_init_result::FAIL; return image_init_result::FAIL;
/* Check the image */ /* Check the image */
if (lynx_verify_cart((char*)header, LYNX_QUICKLOAD) != image_verify_result::PASS) if (verify_cart((char*)header, LYNX_QUICKLOAD) != image_verify_result::PASS)
{ {
image.seterror(image_error::INVALIDIMAGE, "Not a valid Lynx file"); image.seterror(image_error::INVALIDIMAGE, "Not a valid Lynx file");
return image_init_result::FAIL; return image_init_result::FAIL;

View File

@ -1,10 +1,10 @@
// license:GPL-2.0+ // license:GPL-2.0+
// copyright-holders:Peter Trauner // copyright-holders:Peter Trauner
/***************************************************************************** /*****************************************************************************
*
* includes/lynx.h Atari Lynx
*
****************************************************************************/ ******************************************************************************/
#ifndef MAME_INCLUDES_LYNX_H #ifndef MAME_INCLUDES_LYNX_H
#define MAME_INCLUDES_LYNX_H #define MAME_INCLUDES_LYNX_H
@ -12,9 +12,8 @@
#include "emupal.h" #include "emupal.h"
#include "screen.h" #include "screen.h"
#include "audio/lynx.h" #include "sound/lynx.h"
#include "imagedev/snapquik.h" #include "imagedev/snapquik.h"
#include "machine/bankdev.h"
#include "bus/generic/slot.h" #include "bus/generic/slot.h"
#include "bus/generic/carts.h" #include "bus/generic/carts.h"
@ -29,98 +28,188 @@ class lynx_state : public driver_device
public: public:
lynx_state(const machine_config &mconfig, device_type type, const char *tag) : lynx_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag), driver_device(mconfig, type, tag),
m_mem_0000(*this, "mem_0000"), m_dram(*this, "dram"),
m_mem_fc00(*this, "mem_fc00"),
m_mem_fd00(*this, "mem_fd00"),
m_mem_fe00(*this, "mem_fe00"),
m_mem_fffa(*this, "mem_fffa"),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_sound(*this, "custom"), m_sound(*this, "custom"),
m_cart(*this, "cartslot"), m_cart(*this, "cartslot"),
m_palette(*this, "palette"), m_palette(*this, "palette"),
m_screen(*this, "screen"), m_screen(*this, "screen"),
m_bank_fc00(*this, "bank_fc00"), m_suzy_view(*this, "suzy_view"),
m_bank_fd00(*this, "bank_fd00"), m_mikey_view(*this, "mikey_view"),
m_bank_fe00(*this, "bank_fe00"), m_rom_view(*this, "rom_view"),
m_bank_fffa(*this, "bank_fffa") m_vector_view(*this, "vector_view"),
m_joy_io(*this, "JOY"),
m_pause_io(*this, "PAUSE")
{ } { }
void lynx(machine_config &config); void lynx(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
virtual void device_post_load() override;
private: private:
struct BLITTER struct BLITTER
{ {
// 0xfc80 SPRCTL0 Sprite control bits 0
u8 BPP() const { return BIT(spr_ctl0, 6, 2); } // Bit per pixel - 1
bool HFLIP() const { return BIT(spr_ctl0, 5); } // Horizontal flip
bool VFLIP() const { return BIT(spr_ctl0, 4); } // Vertical flip
u8 SPRITE_TYPE() const { return BIT(spr_ctl0, 0, 3); } // Sprite type
// 0xfc81 SPRCTL1 Sprite control bits 1
bool RLE() const { return BIT(spr_ctl1, 7); } // Normal(1) or RLE(0) sprite
//bool ALGO3() const { return BIT(spr_ctl1, 6); } // Size algorithm, Adder(0, Algo4), Shifter(1, algo3) (not implemented)
u8 RELOAD_SCALE() const { return BIT(spr_ctl1, 4, 2); } // Reload scale factors
bool REUSE_PALETTE() const { return BIT(spr_ctl1, 3); } // Reload(0) or Reuse(1) palette
bool SKIP_SPRITE() const { return BIT(spr_ctl1, 2); } // Skip this sprite
u8 DRAW_ORIGIN() const { return BIT(spr_ctl1, 0, 2); } // Start draw origin
//bool DRAW_UP() const { return BIT(spr_ctl1, 1); } // Start drawing up(1) or down(0)
//bool DRAW_LEFT() const { return BIT(spr_ctl1, 0); } // Start drawing left(1) or right(0)
// 0xfc82 SPRCOLL Sprite collision number
bool SPRITE_COLLEN() const { return BIT(spr_coll, 5); } // Sprite collide(0) or Don't collide(1) flag
u8 SPRITE_COLNUM() const { return BIT(spr_coll, 0, 4); } // Sprite collision number
bool SPRITE_COLLIDE() const { return sprite_collide && (!(no_collide)); } // collision enabled?
// global // global
uint16_t screen; u16 screen = 0;
uint16_t colbuf; u16 colbuf = 0;
uint16_t colpos; // byte where value of collision is written u16 colpos = 0; // byte where value of collision is written
int16_t xoff, yoff; s16 xoff = 0;
s16 yoff = 0;
// in command // in command
int mode; u8 mode = 0;
uint8_t spr_coll; u8 spr_coll = 0;
uint8_t spritenr; u8 spritenr = 0;
int16_t x_pos,y_pos; s16 x_pos = 0;
uint16_t width, height; // uint16 important for blue lightning s16 y_pos = 0;
int16_t tilt_accumulator; u16 width = 0;
uint16_t height_accumulator, width_accumulator; u16 height = 0; // uint16 important for blue lightning
uint16_t width_offset, height_offset; s16 tilt_accumulator = 0;
int16_t stretch, tilt; u16 height_accumulator = 0;
uint8_t color[16]; // or stored u16 width_accumulator = 0;
uint16_t bitmap; u16 width_offset = 0;
int use_rle; u16 height_offset = 0;
int line_color; s16 stretch = 0;
s16 tilt = 0;
u8 color[16] = {0}; // or stored
u16 bitmap = 0;
bool use_rle = false;
u8 line_color = 0;
uint8_t spr_ctl0; u8 spr_ctl0 = 0;
uint8_t spr_ctl1; u8 spr_ctl1 = 0;
uint16_t scb; u16 scb = 0;
uint16_t scb_next; u16 scb_next = 0;
uint8_t sprite_collide; bool sprite_collide = false;
int everon; bool everon = false;
uint8_t fred; u8 fred = 0;
int memory_accesses; u32 memory_accesses = 0;
attotime time; //attotime time;
int no_collide; bool no_collide = false;
int vstretch; bool vstretch = false;
int lefthanded; bool lefthanded = false;
int busy; bool busy = false;
}; };
struct UART struct UART
{ {
uint8_t serctl; // 0xfd8c SERCTL Serial control register (Write)
uint8_t data_received, data_to_send, buffer; bool TXINTEN() const { return BIT(serctl, 7); } // Transmit interrupt enable
int received; bool RXINTEN() const { return BIT(serctl, 6); } // Receive interrupt enable
int sending; //bool PAREN() const { return BIT(serctl, 4); } // Xmit parity bit enable (not implemented)
int buffer_loaded; //bool RESETERR() const { return BIT(serctl, 3); } // Reset all errors (not implemented)
//bool TXOPEN() const { return BIT(serctl, 2); } // Open collector driver(1) or TTL driver(0) (not implemented)
//bool TXBRK() const { return BIT(serctl, 1); } // Send a break (not implemented)
//bool PAREVEN() const { return BIT(serctl, 0); } // Send/Recevie even parity (not implemented)
u8 serctl = 0;
u8 data_received = 0;
u8 data_to_send = 0;
u8 buffer = 0;
bool received = false;
bool sending = false;
bool buffer_loaded = false;
}; };
struct SUZY struct SUZY
{ {
uint8_t data[0x100]; // 0xfc91 SPRGO Sprite process start bit
uint8_t high; bool EVER_ON() const { return BIT(data[0x91], 2); } // Everon detector enable
int low; bool SPRITE_GO() const { return BIT(data[0x91], 0); } // Sprite process enable
int signed_math;
int accumulate; u8 data[0x100] = {0};
int accumulate_overflow; bool signed_math = false;
bool accumulate = false;
bool accumulate_overflow = false;
}; };
struct MIKEY struct MIKEY
{ {
uint8_t data[0x100]; // 0xfd8a IODIR
uint16_t disp_addr; u8 IODIR() const { return data[0x8a]; } // Parallel I/O direction
uint8_t vb_rest;
// 0xfd8b IODAT
u8 IODAT() const { return data[0x8b]; } // Parallel I/O data
// 0xfd92 DISPCTL Video bus request enable
//bool COLOR() const { return BIT(data[0x92], 3); } // Color(1) or Monochrome(0) display (not implemented)
//bool FOURBIT() const { return BIT(data[0x92], 2); } // 4bpp(1) or 2bpp(0) color (not implemented)
bool FLIP_SCREEN() const { return BIT(data[0x92], 1); } // Flipped screen
//bool VIDEO_DMA() const { return BIT(data[0x92], 0); } // Video DMA enabled (not implemented)
u8 data[0x100] = {0};
u16 disp_addr = 0;
bool vb_rest = false;
u8 interrupt = 0;
}; };
struct LYNX_TIMER struct LYNX_TIMER
{ {
uint8_t bakup; bool int_en() const { return BIT(cntrl1, 7); } // Interrupt enable
uint8_t cntrl1; //bool reset_done() const { return BIT(cntrl1, 6); } // Reset timer done flag
uint8_t cntrl2; bool reload_en() const { return BIT(cntrl1, 4); } // Reload enable
uint8_t counter; bool count_en() const { return BIT(cntrl1, 3); } // Count enable
emu_timer *timer; u8 timer_clock() const { return BIT(cntrl1, 0, 3); } // Timer clock
int timer_active; bool linked() const { return timer_clock() == 0b111; } // Linked timer?
bool timer_done() const { return BIT(cntrl2, 3); } // Timer done flag
//bool last_clock() const { return BIT(cntrl2, 2); } // Last clock (not implemented)
//bool borrow_in() const { return BIT(cntrl2, 1); } // Borrow in (not implemented)
bool borrow_out() const { return BIT(cntrl2, 0); } // Borrow out
// set timer done flag
void set_timer_done(bool set)
{
if (set) // set
cntrl2 |= 8;
else // clear
cntrl2 &= ~8;
}
// set borrow out flag
void set_borrow_out(bool set)
{
if (set) // set
cntrl2 |= 1;
else // clear
cntrl2 &= ~1;
}
u8 bakup = 0;
u8 cntrl1 = 0;
u8 cntrl2 = 0;
u8 counter = 0;
emu_timer *timer = nullptr;
bool timer_active = false;
}; };
enum enum
@ -131,30 +220,40 @@ private:
TIMER_UART TIMER_UART
}; };
virtual void machine_start() override; // devices
virtual void machine_reset() override; required_shared_ptr<u8> m_dram; // 2 64Kx4 bit DRAMs connected to CPU
virtual void video_start() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
required_shared_ptr<uint8_t> m_mem_0000;
required_shared_ptr<uint8_t> m_mem_fc00;
required_shared_ptr<uint8_t> m_mem_fd00;
required_shared_ptr<uint8_t> m_mem_fe00;
required_shared_ptr<uint8_t> m_mem_fffa;
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<lynx_sound_device> m_sound; required_device<lynx_sound_device> m_sound;
required_device<generic_slot_device> m_cart; required_device<generic_slot_device> m_cart;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
required_device<screen_device> m_screen; required_device<screen_device> m_screen;
required_device<address_map_bank_device> m_bank_fc00;
required_device<address_map_bank_device> m_bank_fd00; // memory views
required_memory_bank m_bank_fe00; memory_view m_suzy_view;
required_memory_bank m_bank_fffa; memory_view m_mikey_view;
uint16_t m_granularity; memory_view m_rom_view;
int m_sign_AB; memory_view m_vector_view;
int m_sign_CD;
int m_rotate; // io ports
uint8_t m_memory_config; required_ioport m_joy_io;
required_ioport m_pause_io;
// connected to cartridge slot
inline u32 get_cart_addr() { return (BIT(m_mikey.IODAT(), 4) * m_audin_offset) + (m_cart_addr_block * m_granularity) + m_cart_addr_counter; }
u8 m_cart_addr_block = 0; // Address block (74HC164 at schematics, connected to cartridge slot A12...A19)
u16 m_cart_addr_counter = 0; // Address counter (4040 at schematics, connected to cartridge slot A0...A10)
u16 m_granularity = 0; // Address counter granularity
u32 m_audin_offset = 0; // Some cartridge uses AUDIN pin for bankswitch
// AUDIN pin, can be input or output
// internal states
int m_sign_AB = 1;
int m_sign_CD = 1;
int m_rotate = 0;
u8 m_memory_config;
u32 m_pixclock = ~0;
u8 m_hcount = ~0;
u8 m_vcount = ~0;
BLITTER m_blitter; BLITTER m_blitter;
SUZY m_suzy; SUZY m_suzy;
@ -165,52 +264,56 @@ private:
bitmap_rgb32 m_bitmap; bitmap_rgb32 m_bitmap;
bitmap_rgb32 m_bitmap_temp; bitmap_rgb32 m_bitmap_temp;
void lynx_mem(address_map &map); void cpu_map(address_map &map);
void lynx_fc00_mem(address_map &map);
void lynx_fd00_mem(address_map &map);
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint8_t suzy_read(offs_t offset); u8 suzy_read(offs_t offset);
void suzy_write(offs_t offset, uint8_t data); void suzy_write(offs_t offset, u8 data);
void lynx_uart_w(offs_t offset, uint8_t data); void uart_w(offs_t offset, u8 data);
uint8_t lynx_uart_r(offs_t offset); u8 uart_r(offs_t offset);
uint8_t mikey_read(offs_t offset); u8 mikey_read(offs_t offset);
void mikey_write(offs_t offset, uint8_t data); void mikey_write(offs_t offset, u8 data);
uint8_t lynx_memory_config_r(); u8 memory_config_r();
void lynx_memory_config_w(uint8_t data); void memory_config_w(u8 data);
void lynx_divide(); void suzy_divide();
void lynx_multiply(); void suzy_multiply();
uint8_t lynx_timer_read(int which, int offset); u8 timer_read(int which, int offset);
void lynx_timer_write(int which, int offset, uint8_t data); void timer_write(int which, int offset, u8 data);
void update_screen_timing();
void sound_cb(); void sound_cb();
TIMER_CALLBACK_MEMBER(lynx_blitter_timer); TIMER_CALLBACK_MEMBER(blitter_timer);
TIMER_CALLBACK_MEMBER(lynx_timer_shot); TIMER_CALLBACK_MEMBER(timer_shot);
TIMER_CALLBACK_MEMBER(lynx_uart_loopback_timer); TIMER_CALLBACK_MEMBER(uart_loopback_timer);
TIMER_CALLBACK_MEMBER(lynx_uart_timer); TIMER_CALLBACK_MEMBER(uart_timer);
void lynx_postload();
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
uint8_t lynx_read_ram(uint16_t address);
void lynx_write_ram(uint16_t address, uint8_t data); // DRAM accessor, 0xfff8-0xfff9 Reserved?
inline void lynx_plot_pixel(const int mode, const int16_t x, const int y, const int color); inline u8 dram_byte_r(u16 addr) { return ((addr & 0xfffe) != 0xfff8) ? m_dram[addr] : 0; }
void lynx_blit_do_work(const int y, const int xdir, const int bits_per_pixel, const int mask ); inline void dram_byte_w(u16 addr, u8 data, u8 mem_mask = ~0) { if ((addr & 0xfffe) != 0xfff8) { COMBINE_DATA(&m_dram[addr]); } }
void lynx_blit_rle_do_work( const int16_t y, const int xdir, const int bits_per_pixel, const int mask ); inline u16 dram_word_r(u16 addr) { return dram_byte_r(addr) | (u16(dram_byte_r((addr + 1) & 0xffff)) << 8); }
void lynx_blit_lines();
void lynx_blitter(); inline void plot_pixel(const s16 x, const s16 y, const u8 color);
void lynx_draw_line(); void blit_do_work(const s16 y, const int xdir, const int bits_per_pixel, const u8 mask);
void lynx_timer_init(int which); void blit_rle_do_work(const s16 y, const int xdir, const int bits_per_pixel, const u8 mask);
void lynx_timer_signal_irq(int which); void blit_lines();
void lynx_timer_count_down(int which); void blitter();
uint32_t lynx_time_factor(int val); void draw_line();
void lynx_uart_reset(); void timer_init(int which);
image_verify_result lynx_verify_cart(char *header, int kind); void timer_signal_irq(int which);
void timer_count_down(int which);
u32 time_factor(int val);
void uart_reset();
void interrupt_set(u8 line);
void interrupt_update();
image_verify_result verify_cart(char *header, int kind);
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb); DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
}; };
/*---------- suzy registers ------------- */ /*---------- suzy registers ------------- */
#define TMPADRL 0x00 // Temporary address (not sure what this is used for) #define TMPADRL 0x00 // Temporary address (not sure what this is used for)
#define TMPADRH 0x01 #define TMPADRH 0x01
#define TILTACUML 0x02 // Tilt accumulator (signed fixed-point, eight bits to the left of decimal) #define TILTACUML 0x02 // Tilt accumulator (signed fixed-point, eight bits to the left of decimal)
#define TILTACUMH 0x03 #define TILTACUMH 0x03
#define HOFFL 0x04 // X offset to edge of visible window #define HOFFL 0x04 // X offset to edge of visible window
@ -227,8 +330,8 @@ private:
#define COLLADRH 0x0F #define COLLADRH 0x0F
#define SCBNEXTL 0x10 // Address of next SCB #define SCBNEXTL 0x10 // Address of next SCB
#define SCBNEXTH 0x11 #define SCBNEXTH 0x11
#define SPRDLINEL 0x12 // Sprite data start address #define SPRDLINEL 0x12 // Sprite data start address
#define SPRDLINEH 0x13 #define SPRDLINEH 0x13
#define HPOSSTRTL 0x14 // Starting Hpos #define HPOSSTRTL 0x14 // Starting Hpos
#define HPOSSTRTH 0x15 #define HPOSSTRTH 0x15
#define VPOSSTRTL 0x16 // Starting Vpos #define VPOSSTRTL 0x16 // Starting Vpos
@ -253,8 +356,8 @@ private:
#define HSIZOFFH 0x29 #define HSIZOFFH 0x29
#define VSIZOFFL 0x2A // Vertical Size Offset #define VSIZOFFL 0x2A // Vertical Size Offset
#define VSIZOFFH 0x2B #define VSIZOFFH 0x2B
#define SCBADRL 0x2C // Address of Current SCB #define SCBADRL 0x2C // Address of Current SCB
#define SCBADRH 0x2D #define SCBADRH 0x2D
#define PROCADRL 0x2E // Current Spr Data Proc Address #define PROCADRL 0x2E // Current Spr Data Proc Address
#define MATH_D 0x52 #define MATH_D 0x52
@ -273,10 +376,10 @@ private:
#define MATH_K 0x6e #define MATH_K 0x6e
#define MATH_J 0x6f #define MATH_J 0x6f
#define SPRCTL0 0x80 // Sprite Control Bits 0 (W)(U) #define SPRCTL0 0x80 // Sprite Control Bits 0 (W)(U)
#define SPRCTL1 0x81 // Sprite Control Bits 1 (W)(U) #define SPRCTL1 0x81 // Sprite Control Bits 1 (W)(U)
#define SPRCOLL 0x82 // Sprite Collision Number (W) #define SPRCOLL 0x82 // Sprite Collision Number (W)
#define SPRINIT 0x83 // Sprite Initialization Bits (W)(U) #define SPRINIT 0x83 // Sprite Initialization Bits (W)(U)
#define SUZYHREV 0x88 // Suzy Hardware Revision (R) = '01' #define SUZYHREV 0x88 // Suzy Hardware Revision (R) = '01'
@ -305,10 +408,10 @@ private:
#define SCB_SCBNEXT 0x03 // L,H Address of Next SCB #define SCB_SCBNEXT 0x03 // L,H Address of Next SCB
#define SCB_SPRDLINE 0x05 // L,H Start of Sprite Data Line Address #define SCB_SPRDLINE 0x05 // L,H Start of Sprite Data Line Address
#define SCB_HPOSSTRT 0x07 // L,H Starting Hpos #define SCB_HPOSSTRT 0x07 // L,H Starting Hpos
#define SCB_VPOSSTRT 0x09 // L,H Starting Vpos #define SCB_VPOSSTRT 0x09 // L,H Starting Vpos
#define SCB_SPRHSIZ 0x0B // L,H H Size #define SCB_SPRHSIZ 0x0B // L,H H Size
#define SCB_SPRVSIZ 0x0D // L,H V Size #define SCB_SPRVSIZ 0x0D // L,H V Size
#define SCB_STRETCH 0x0F // L H H/V Size Adder #define SCB_STRETCH 0x0F // L H H/V Size Adder
#define SCB_TILT 0x11 // L,H H Position Adder #define SCB_TILT 0x11 // L,H H Position Adder
#endif // MAME_INCLUDES_LYNX_H #endif // MAME_INCLUDES_LYNX_H

File diff suppressed because it is too large Load Diff