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

View File

@ -1565,3 +1565,15 @@ if (SOUNDS["UDA1344"]~=null) then
MAME_DIR .. "src/devices/sound/uda1344.h",
}
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["SWP30"] = true
SOUNDS["XT446"] = true
--SOUNDS["LYNX"] = true
--------------------------------------------------
-- specify available video cores

View File

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

View File

@ -1,11 +1,15 @@
// license:GPL-2.0+
// copyright-holders:Peter Trauner
/******************************************************************************
Atari Lynx sound hardware, Part of Mikey (Hayato in Lynx II)
PeT mess@utanet.at 2000,2001
******************************************************************************/
#include "emu.h"
#include "audio/lynx.h"
#include "lynx.h"
#include <algorithm>
/* accordingly to atari's reference manual
@ -85,8 +89,8 @@ AUD_A_RIGHT EQU %00000001
// device type definition
DEFINE_DEVICE_TYPE(LYNX_SND, lynx_sound_device, "lynx_sound", "Mikey")
DEFINE_DEVICE_TYPE(LYNX2_SND, lynx2_sound_device, "lynx2_sound", "Mikey (Lynx II)")
DEFINE_DEVICE_TYPE(LYNX_SND, lynx_sound_device, "lynx_sound", "Atari Mikey (Sound)")
DEFINE_DEVICE_TYPE(LYNX2_SND, lynx2_sound_device, "lynx2_sound", "Atari Hayato (Sound)")
//**************************************************************************
// LIVE DEVICE
@ -172,8 +176,7 @@ void lynx_sound_device::init()
void lynx_sound_device::device_start()
{
m_mixer_channel = stream_alloc(0, 1, machine().sample_rate());
m_usec_per_sample = 1000000 / machine().sample_rate();
m_mixer_channel = stream_alloc(0, 1, clock() / 16);
m_timer_delegate.resolve();
init();
register_save();
@ -182,8 +185,7 @@ void lynx_sound_device::device_start()
void lynx2_sound_device::device_start()
{
m_mixer_channel = stream_alloc(0, 2, machine().sample_rate());
m_usec_per_sample = 1000000 / machine().sample_rate();
m_mixer_channel = stream_alloc(0, 2, clock() / 16);
m_timer_delegate.resolve();
init();
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)
{
@ -223,7 +234,7 @@ void lynx_sound_device::reset_channel(LYNX_AUDIO *channel)
void lynx_sound_device::count_down(int 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;
if (nr == 0)
m_mixer_channel->update();
@ -233,25 +244,25 @@ void lynx_sound_device::count_down(int nr)
void lynx_sound_device::shift(int chan_nr)
{
int16_t out_temp;
s16 out_temp;
LYNX_AUDIO *channel;
assert(chan_nr < 4);
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)
uint8_t xor_out = 0;
u8 xor_out = 1; // output of xor is inverted
for (int bit = 0; bit < 12; bit++)
{
if ((channel->mask >> bit) & 1)
xor_out ^= (channel->shifter >> bit) & 1;
if (BIT(channel->mask, bit))
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)
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;
// clipping
if (out_temp > 127) out_temp = 127;
if (out_temp < -128) out_temp = -128;
channel->reg.output = (int16_t)out_temp;
channel->reg.output = std::clamp<s16>(out_temp, -128, 127);
}
switch (chan_nr)
@ -284,22 +293,22 @@ void lynx_sound_device::execute(int 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;
if ((channel->reg.control1 & 7) == 7) // link
channel->ticks++;
if (channel->reg.linked()) // link
{
if (channel->count < 0) // counter finished
{
//channel->count+=channel->reg.counter; // reload (wrong?)
if (channel->reg.control1 & 0x10)
if (channel->reg.reload_en())
channel->count = channel->reg.bakup;
shift(chan_nr);
}
}
else
{
int t = 1 << (channel->reg.control1 & 7); // microseconds per count
const int t = 1 << (channel->reg.timer_clock()); // microseconds per count
for (;;)
{
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)
{
shift(chan_nr);
if (channel->reg.control1 & 0x10)
if (channel->reg.reload_en())
channel->count = channel->reg.bakup;
else
break;
@ -319,10 +328,9 @@ void lynx_sound_device::execute(int chan_nr)
}
}
if (!(channel->reg.control1 & 0x20)) // normal mode
{
channel->reg.output = (channel->shifter & 1) ? channel->reg.volume : -channel->reg.volume;
}
if (!(channel->reg.integrate_mode())) // normal mode
channel->reg.output = BIT(channel->shifter, 0) ? channel->reg.volume : -channel->reg.volume;
}
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];
m_mixer_channel->update();
@ -363,7 +371,7 @@ uint8_t lynx_sound_device::read(offs_t offset)
break;
case 6:
//current timer value
if (channel->count >=0)
if (channel->count >= 0)
value = channel->count;
else
value = 0;
@ -394,7 +402,7 @@ uint8_t lynx_sound_device::read(offs_t offset)
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);
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:
channel->reg.feedback = data;
channel->mask &= 0x80;
channel->mask |= (data & 0x3f) | ((data & 0xc0)<<4);
channel->mask |= (data & 0x3f) | ((data & 0xc0) << 4);
break;
// Output value
case 2:
@ -433,17 +441,17 @@ void lynx_sound_device::write(offs_t offset, uint8_t data)
// Audio control bits
case 5:
channel->mask &= ~0x80;
channel->mask |= (data&0x80);
channel->mask |= (data & 0x80);
channel->reg.control1 = data;
break;
// Current count
case 6:
channel->count=data;
channel->count = data;
break;
// Upper 4 bits of shift register and audio status bits
case 7:
channel->shifter&=0xff;
channel->shifter|=(data&0xf0)<<4;
channel->shifter &= 0xff;
channel->shifter |= (data & 0xf0) << 4;
channel->reg.control2 = data;
break;
}
@ -453,7 +461,7 @@ void lynx_sound_device::write(offs_t offset, uint8_t data)
switch (offset) // Stereo Registers
{
case 0x40: case 0x41: case 0x42: case 0x43:
m_audio[offset&3].attenuation = data;
m_audio[offset & 3].attenuation = data;
break;
case 0x44:
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)
{
int v;
auto &buffer = outputs[0];
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++)
{
execute(channel);
v = m_audio[channel].reg.output;
result += v * 15; // where does the *15 come from?
result += m_audio[channel].reg.output * 15; // where does the *15 come from?
}
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)
{
auto &left=outputs[0];
auto &right=outputs[1];
int v;
auto &left = outputs[0];
auto &right = outputs[1];
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++)
{
execute(channel);
v = m_audio[channel].reg.output;
int v = m_audio[channel].reg.output;
if (!(m_master_enable & (0x10 << channel)))
{
if (m_attenuation_enable & (0x10 << channel))

View File

@ -1,7 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Peter Trauner
#ifndef MAME_AUDIO_LYNX_H
#define MAME_AUDIO_LYNX_H
#ifndef MAME_SOUND_LYNX_H
#define MAME_SOUND_LYNX_H
#pragma once
@ -13,36 +13,47 @@ public:
lynx_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
uint8_t read(offs_t offset);
void write(offs_t offset, uint8_t data);
u8 read(offs_t offset);
void write(offs_t offset, u8 data);
void count_down(int nr);
template <typename... T> void set_timer_delegate(T &&... args) { m_timer_delegate.set(std::forward<T>(args)...); }
protected:
struct LYNX_AUDIO {
struct {
int8_t volume;
uint8_t feedback;
int8_t output;
uint8_t shifter;
uint8_t bakup;
uint8_t control1;
uint8_t counter;
uint8_t control2;
//bool reset_done() const { return BIT(control1, 6); } // Reset timer done flag (not implemented)
bool integrate_mode() const { return BIT(control1, 5); } // Integrate mode
bool reload_en() const { return BIT(control1, 4); } // Reload enable
bool count_en() const { return BIT(control1, 3); } // Count enable
u8 timer_clock() const { return BIT(control1, 0, 3); } // Timer clock
bool linked() const { return timer_clock() == 0b111; } // Linked timer?
//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;
uint8_t attenuation;
uint16_t mask; // 12-bit
uint16_t shifter; // 12-bit
float ticks;
int count;
u8 attenuation = 0;
u16 mask = 0; // 12-bit
u16 shifter = 0; // 12-bit
s16 ticks = 0;
s16 count = 0;
};
lynx_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_clock_changed() override;
// 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;
@ -56,11 +67,10 @@ protected:
sound_stream *m_mixer_channel;
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_xor;
uint8_t m_attenuation_enable;
uint8_t m_master_enable;
u8 m_attenuation_enable = 0;
u8 m_master_enable = 0;
LYNX_AUDIO m_audio[4];
};
@ -82,4 +92,4 @@ protected:
DECLARE_DEVICE_TYPE(LYNX_SND, lynx_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+
// copyright-holders:Peter Trauner
/******************************************************************************
Atari Lynx
PeT peter.trauner@utanet.at 2000,2001
info found in bastian schick's bll
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 "includes/lynx.h"
#include "audio/lynx.h"
#include "cpu/m6502/m65sc02.h"
#include "softlist.h"
@ -18,27 +25,19 @@
#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(0xfc00, 0xfcff).m(m_bank_fc00, FUNC(address_map_bank_device::amap8));
map(0xfd00, 0xfdff).m(m_bank_fd00, FUNC(address_map_bank_device::amap8));
map(0xfe00, 0xfff7).bankr("bank_fe00").writeonly().share("mem_fe00");
map(0xfff8, 0xfff8).ram();
map(0xfff9, 0xfff9).rw(FUNC(lynx_state::lynx_memory_config_r), FUNC(lynx_state::lynx_memory_config_w));
map(0xfffa, 0xffff).bankr("bank_fffa").writeonly().share("mem_fffa");
}
void lynx_state::lynx_fc00_mem(address_map &map)
{
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");
map(0x0000, 0xffff).ram().share(m_dram);
map(0xfc00, 0xfcff).view(m_suzy_view);
m_suzy_view[0](0xfc00, 0xfcff).rw(FUNC(lynx_state::suzy_read), FUNC(lynx_state::suzy_write));
map(0xfd00, 0xfdff).view(m_mikey_view);
m_mikey_view[0](0xfd00, 0xfdff).rw(FUNC(lynx_state::mikey_read), FUNC(lynx_state::mikey_write));
map(0xfe00, 0xffff).view(m_rom_view);
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));
map(0xfff8, 0xffff).view(m_vector_view);
m_vector_view[0](0xfffa, 0xffff).rom().region("maincpu", 0x01fa);
}
static INPUT_PORTS_START( lynx )
@ -54,6 +53,8 @@ static INPUT_PORTS_START( lynx )
PORT_START("PAUSE")
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
INPUT_PORTS_END
@ -62,34 +63,31 @@ void lynx_state::video_start()
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);
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()
{
lynx_timer_count_down(1);
timer_count_down(1);
}
void lynx_state::lynx(machine_config &config)
{
/* basic machine hardware */
M65SC02(config, m_maincpu, 4000000); /* vti core, integrated in vlsi, stz, but not bbr bbs */
m_maincpu->set_addrmap(AS_PROGRAM, &lynx_state::lynx_mem);
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::cpu_map);
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 */
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_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);
config.set_default_layout(layout_lynx);
@ -97,7 +95,7 @@ void lynx_state::lynx(machine_config &config)
/* sound hardware */
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->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");
}
// Lynx II has Hayato replaces Mikey, Compatible but supports stereo
#if 0
void lynx_state::lynx2(machine_config &config)
{
@ -121,8 +120,7 @@ void lynx_state::lynx2(machine_config &config)
config.device_remove("mono");
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
config.device_remove("lynx");
LYNX2_SND(config.replace(), m_sound, 0);
LYNX2_SND(config.replace(), m_sound, XTAL(16'000'000));
m_sound->set_timer_delegate(FUNC(lynx_state::sound_cb));
m_sound->add_route(0, "lspeaker", 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))
ROM_SYSTEM_BIOS( 1, "a", "alternate rom save" )
ROMX_LOAD("lynxa.bin", 0x00000, 0x200, BAD_DUMP CRC(0d973c9d) SHA1(e4ed47fae31693e016b081c6bda48da5b70d7ccb), ROM_BIOS(1))
ROM_REGION(0x100,"gfx1", ROMREGION_ERASE00)
ROM_END
#if 0
ROM_START(lynx2)
ROM_REGION(0x200,"maincpu", 0)
ROM_LOAD("lynx2.bin", 0, 0x200, NO_DUMP)
ROM_REGION(0x100,"gfx1", ROMREGION_ERASE00)
ROM_END
#endif
@ -158,9 +152,9 @@ ROM_END
QUICKLOAD_LOAD_MEMBER(lynx_state::quickload_cb)
{
address_space &space = m_maincpu->space(AS_PROGRAM);
std::vector<uint8_t> data;
uint8_t *rom = memregion("maincpu")->base();
uint8_t header[10]; // 80 08 dw Start dw Len B S 9 3
std::vector<u8> data;
u8 *rom = memregion("maincpu")->base();
u8 header[10]; // 80 08 dw Start dw Len B S 9 3
uint16_t start, length;
int i;
@ -168,7 +162,7 @@ QUICKLOAD_LOAD_MEMBER(lynx_state::quickload_cb)
return image_init_result::FAIL;
/* 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");
return image_init_result::FAIL;

View File

@ -1,10 +1,10 @@
// license:GPL-2.0+
// copyright-holders:Peter Trauner
/*****************************************************************************
*
* includes/lynx.h
*
****************************************************************************/
Atari Lynx
******************************************************************************/
#ifndef MAME_INCLUDES_LYNX_H
#define MAME_INCLUDES_LYNX_H
@ -12,9 +12,8 @@
#include "emupal.h"
#include "screen.h"
#include "audio/lynx.h"
#include "sound/lynx.h"
#include "imagedev/snapquik.h"
#include "machine/bankdev.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
@ -29,98 +28,188 @@ class lynx_state : public driver_device
public:
lynx_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_mem_0000(*this, "mem_0000"),
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_dram(*this, "dram"),
m_maincpu(*this, "maincpu"),
m_sound(*this, "custom"),
m_cart(*this, "cartslot"),
m_palette(*this, "palette"),
m_screen(*this, "screen"),
m_bank_fc00(*this, "bank_fc00"),
m_bank_fd00(*this, "bank_fd00"),
m_bank_fe00(*this, "bank_fe00"),
m_bank_fffa(*this, "bank_fffa")
m_suzy_view(*this, "suzy_view"),
m_mikey_view(*this, "mikey_view"),
m_rom_view(*this, "rom_view"),
m_vector_view(*this, "vector_view"),
m_joy_io(*this, "JOY"),
m_pause_io(*this, "PAUSE")
{ }
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:
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
uint16_t screen;
uint16_t colbuf;
uint16_t colpos; // byte where value of collision is written
int16_t xoff, yoff;
u16 screen = 0;
u16 colbuf = 0;
u16 colpos = 0; // byte where value of collision is written
s16 xoff = 0;
s16 yoff = 0;
// in command
int mode;
uint8_t spr_coll;
uint8_t spritenr;
int16_t x_pos,y_pos;
uint16_t width, height; // uint16 important for blue lightning
int16_t tilt_accumulator;
uint16_t height_accumulator, width_accumulator;
uint16_t width_offset, height_offset;
int16_t stretch, tilt;
uint8_t color[16]; // or stored
uint16_t bitmap;
int use_rle;
int line_color;
u8 mode = 0;
u8 spr_coll = 0;
u8 spritenr = 0;
s16 x_pos = 0;
s16 y_pos = 0;
u16 width = 0;
u16 height = 0; // uint16 important for blue lightning
s16 tilt_accumulator = 0;
u16 height_accumulator = 0;
u16 width_accumulator = 0;
u16 width_offset = 0;
u16 height_offset = 0;
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;
uint8_t spr_ctl1;
uint16_t scb;
uint16_t scb_next;
uint8_t sprite_collide;
u8 spr_ctl0 = 0;
u8 spr_ctl1 = 0;
u16 scb = 0;
u16 scb_next = 0;
bool sprite_collide = false;
int everon;
uint8_t fred;
int memory_accesses;
attotime time;
bool everon = false;
u8 fred = 0;
u32 memory_accesses = 0;
//attotime time;
int no_collide;
int vstretch;
int lefthanded;
int busy;
bool no_collide = false;
bool vstretch = false;
bool lefthanded = false;
bool busy = false;
};
struct UART
{
uint8_t serctl;
uint8_t data_received, data_to_send, buffer;
int received;
int sending;
int buffer_loaded;
// 0xfd8c SERCTL Serial control register (Write)
bool TXINTEN() const { return BIT(serctl, 7); } // Transmit interrupt enable
bool RXINTEN() const { return BIT(serctl, 6); } // Receive interrupt enable
//bool PAREN() const { return BIT(serctl, 4); } // Xmit parity bit enable (not implemented)
//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
{
uint8_t data[0x100];
uint8_t high;
int low;
int signed_math;
int accumulate;
int accumulate_overflow;
// 0xfc91 SPRGO Sprite process start bit
bool EVER_ON() const { return BIT(data[0x91], 2); } // Everon detector enable
bool SPRITE_GO() const { return BIT(data[0x91], 0); } // Sprite process enable
u8 data[0x100] = {0};
bool signed_math = false;
bool accumulate = false;
bool accumulate_overflow = false;
};
struct MIKEY
{
uint8_t data[0x100];
uint16_t disp_addr;
uint8_t vb_rest;
// 0xfd8a IODIR
u8 IODIR() const { return data[0x8a]; } // Parallel I/O direction
// 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
{
uint8_t bakup;
uint8_t cntrl1;
uint8_t cntrl2;
uint8_t counter;
emu_timer *timer;
int timer_active;
bool int_en() const { return BIT(cntrl1, 7); } // Interrupt enable
//bool reset_done() const { return BIT(cntrl1, 6); } // Reset timer done flag
bool reload_en() const { return BIT(cntrl1, 4); } // Reload enable
bool count_en() const { return BIT(cntrl1, 3); } // Count enable
u8 timer_clock() const { return BIT(cntrl1, 0, 3); } // Timer clock
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
@ -131,30 +220,40 @@ private:
TIMER_UART
};
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;
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;
// devices
required_shared_ptr<u8> m_dram; // 2 64Kx4 bit DRAMs connected to CPU
required_device<cpu_device> m_maincpu;
required_device<lynx_sound_device> m_sound;
required_device<generic_slot_device> m_cart;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
required_device<address_map_bank_device> m_bank_fc00;
required_device<address_map_bank_device> m_bank_fd00;
required_memory_bank m_bank_fe00;
required_memory_bank m_bank_fffa;
uint16_t m_granularity;
int m_sign_AB;
int m_sign_CD;
int m_rotate;
uint8_t m_memory_config;
// memory views
memory_view m_suzy_view;
memory_view m_mikey_view;
memory_view m_rom_view;
memory_view m_vector_view;
// io ports
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;
SUZY m_suzy;
@ -165,45 +264,49 @@ private:
bitmap_rgb32 m_bitmap;
bitmap_rgb32 m_bitmap_temp;
void lynx_mem(address_map &map);
void lynx_fc00_mem(address_map &map);
void lynx_fd00_mem(address_map &map);
void cpu_map(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);
void suzy_write(offs_t offset, uint8_t data);
void lynx_uart_w(offs_t offset, uint8_t data);
uint8_t lynx_uart_r(offs_t offset);
uint8_t mikey_read(offs_t offset);
void mikey_write(offs_t offset, uint8_t data);
uint8_t lynx_memory_config_r();
void lynx_memory_config_w(uint8_t data);
void lynx_divide();
void lynx_multiply();
uint8_t lynx_timer_read(int which, int offset);
void lynx_timer_write(int which, int offset, uint8_t data);
u8 suzy_read(offs_t offset);
void suzy_write(offs_t offset, u8 data);
void uart_w(offs_t offset, u8 data);
u8 uart_r(offs_t offset);
u8 mikey_read(offs_t offset);
void mikey_write(offs_t offset, u8 data);
u8 memory_config_r();
void memory_config_w(u8 data);
void suzy_divide();
void suzy_multiply();
u8 timer_read(int which, int offset);
void timer_write(int which, int offset, u8 data);
void update_screen_timing();
void sound_cb();
TIMER_CALLBACK_MEMBER(lynx_blitter_timer);
TIMER_CALLBACK_MEMBER(lynx_timer_shot);
TIMER_CALLBACK_MEMBER(lynx_uart_loopback_timer);
TIMER_CALLBACK_MEMBER(lynx_uart_timer);
void lynx_postload();
TIMER_CALLBACK_MEMBER(blitter_timer);
TIMER_CALLBACK_MEMBER(timer_shot);
TIMER_CALLBACK_MEMBER(uart_loopback_timer);
TIMER_CALLBACK_MEMBER(uart_timer);
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);
inline void lynx_plot_pixel(const int mode, const int16_t x, const int y, const int color);
void lynx_blit_do_work(const int y, const int xdir, const int bits_per_pixel, const int mask );
void lynx_blit_rle_do_work( const int16_t y, const int xdir, const int bits_per_pixel, const int mask );
void lynx_blit_lines();
void lynx_blitter();
void lynx_draw_line();
void lynx_timer_init(int which);
void lynx_timer_signal_irq(int which);
void lynx_timer_count_down(int which);
uint32_t lynx_time_factor(int val);
void lynx_uart_reset();
image_verify_result lynx_verify_cart(char *header, int kind);
// DRAM accessor, 0xfff8-0xfff9 Reserved?
inline u8 dram_byte_r(u16 addr) { return ((addr & 0xfffe) != 0xfff8) ? m_dram[addr] : 0; }
inline void dram_byte_w(u16 addr, u8 data, u8 mem_mask = ~0) { if ((addr & 0xfffe) != 0xfff8) { COMBINE_DATA(&m_dram[addr]); } }
inline u16 dram_word_r(u16 addr) { return dram_byte_r(addr) | (u16(dram_byte_r((addr + 1) & 0xffff)) << 8); }
inline void plot_pixel(const s16 x, const s16 y, const u8 color);
void blit_do_work(const s16 y, const int xdir, const int bits_per_pixel, const u8 mask);
void blit_rle_do_work(const s16 y, const int xdir, const int bits_per_pixel, const u8 mask);
void blit_lines();
void blitter();
void draw_line();
void timer_init(int which);
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);
};

File diff suppressed because it is too large Load Diff