mirror of
https://github.com/holub/mame
synced 2025-04-19 15:11:37 +03:00
spg format + [tsconf.xml] added 28 items
This commit is contained in:
parent
acdb9b0a3f
commit
65c8982510
442
hash/tsconf.xml
Normal file
442
hash/tsconf.xml
Normal file
@ -0,0 +1,442 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<!--
|
||||
license:CC0-1.0
|
||||
-->
|
||||
<softwarelist name="tsconf" description="TS-Configuration (All Formats)">
|
||||
|
||||
<software name="alterego">
|
||||
<description>Alter Ego</description>
|
||||
<year>2011</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<info name="developer" value="Shiru"/>
|
||||
<info name="developer" value="brightentayle"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="32256">
|
||||
<rom name="alteregobeta.spg" size="32256" crc="5645820c" sha1="957b66480d513bb8a34187326cb8b1824925bbc3" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="bomberman">
|
||||
<description>Bomberman</description>
|
||||
<year>2012</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Budder"/>
|
||||
<info name="developer" value="Wizart"/>
|
||||
<info name="developer" value="Crash"/>
|
||||
<info name="developer" value="Breeze"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="102400">
|
||||
<rom name="bomber.spg" size="102400" crc="16601e87" sha1="7bc8bf23ffba2e8177485303ba0879bb26ac4453" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="brucelee">
|
||||
<description>Bruce Lee</description>
|
||||
<year>2015</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="71680">
|
||||
<rom name="brucelee.spg" size="71680" crc="a86875e1" sha1="475732defc8d88ad0160b071ad5a6535cb220ff5" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="chase">
|
||||
<description>Chase</description>
|
||||
<year>2012</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<info name="developer" value="Shiru"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="13824">
|
||||
<rom name="chase.spg" size="13824" crc="0b8b82fe" sha1="79a26756345f9178adb1305dbd5c31ea87d9f252" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="copter">
|
||||
<description>Copter v0.1</description>
|
||||
<year>2012</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Wizart"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="655360">
|
||||
<rom name="COPTER.trd" size="655360" crc="43236562" sha1="c4e3a9bcfd2387e954372a633f7415db368dbd4b" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="digger">
|
||||
<description>Digger</description>
|
||||
<year>2016</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<info name="developer" value="Er"/>
|
||||
<info name="developer" value="n1k-o"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="411648">
|
||||
<rom name="Digger.spg" size="411648" crc="f6c1de1b" sha1="d2d85cefd758832dfb89abb24b672e1a05eef009" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="edgegrinder">
|
||||
<description>Edge Grinder v1.01</description>
|
||||
<year>2018</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<info name="developer" value="Trevor Smila Storey"/>
|
||||
<info name="developer" value="Tom+Jerry"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="43520">
|
||||
<rom name="edge_grinder.spg" size="43520" crc="dfbce1ca" sha1="932a8627cd2a69392d7b6eb2995ab52d9ca60288" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="jptst">
|
||||
<description>Jim Power Test</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="60928">
|
||||
<rom name="jptst.spg" size="60928" crc="f12f6921" sha1="4f1b2efc14ae006cb574bfa109e30680a96fbe18" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="lirus">
|
||||
<description>Lirus</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Denis Grachev"/>
|
||||
<info name="developer" value="nodeus"/>
|
||||
<info name="developer" value="Oleg Nikitin"/>
|
||||
<info name="developer" value="Alex Lobov"/>
|
||||
<info name="developer" value="Alex Semenov"/>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="323072">
|
||||
<rom name="Lirus.spg" size="323072" crc="5c081bd8" sha1="abec5973471697b82f36bdfe6cbc71498892a945" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="lost">
|
||||
<description>Touhou Zero. Lost Donation Box Incident</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Nihirash"/>
|
||||
<info name="developer" value="Hina"/>
|
||||
<info name="developer" value="EA"/>
|
||||
<info name="developer" value="Gogin"/>
|
||||
<info name="developer" value="Scalesmann"/>
|
||||
<info name="developer" value="wbc"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="1901568">
|
||||
<rom name="lost-ts.spg" size="1901568" crc="d2322d8b" sha1="8176b473d3be34543be1e35749b1c6e4baa5db61" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="multidude">
|
||||
<description>MultiDude</description>
|
||||
<year>2014</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Denis Grachev"/>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<info name="developer" value="brightentayle"/>
|
||||
<info name="developer" value="MMCM"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="26624">
|
||||
<rom name="MultiDude.spg" size="26624" crc="c3e10b45" sha1="e2046de86f546db2a8d95244d3c703358f5e1655" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="ninjagarden">
|
||||
<description>Ninja Gaiden</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="173056">
|
||||
<rom name="NinjaGaiden.spg" size="173056" crc="10fca9ba" sha1="398eeb975604b1f75c36d750539f248e1aab114d" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="otterandsmoker">
|
||||
<description>Otter & Smoker</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Black Cat"/>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<info name="developer" value="Marie Slip"/>
|
||||
<info name="developer" value="Mike Gamaev"/>
|
||||
<info name="developer" value="Colorizator"/>
|
||||
<info name="developer" value="Joe Vondayl"/>
|
||||
<info name="developer" value="Mister Robin"/>
|
||||
<info name="developer" value="Fatalsnipe"/>
|
||||
<info name="developer" value="Alex Mart"/>
|
||||
<part name="v1_6_neogs" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="1703424">
|
||||
<rom name="Otter&Smocker v1.6 (NEOGS).spg" size="1703424" crc="b069bff4" sha1="b28ac7a9afcb11d7cbfc6392df601e3b6473d9b1" />
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="v1_6_turbosound" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="1703424">
|
||||
<rom name="Otter&Smocker v1.6 (TAY).spg" size="1703424" crc="7539f2ca" sha1="e7c85f002e31b0ef4fe02c6565e8552ef528778b" />
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="v1_6_nofx" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="1703424">
|
||||
<rom name="Otter&Smocker v1.6 (NoFX).spg" size="1703424" crc="a76b1815" sha1="063d1d0922bc1c70f0832c3ba17d35f413bb10b2" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="ottifants">
|
||||
<description>Ottifants</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Dr.Max"/>
|
||||
<info name="developer" value="EA"/>
|
||||
<info name="developer" value="Fatalsnipe"/>
|
||||
<info name="developer" value="Gogin"/>
|
||||
<info name="developer" value="MR287CC"/>
|
||||
<info name="developer" value="n1k-o"/>
|
||||
<info name="developer" value="Quiet"/>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="358912">
|
||||
<rom name="Ottifants.spg" size="358912" crc="103cd3f2" sha1="159a7679873c6293f67740a0aa8c65924cdccac5" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="ouk">
|
||||
<description>Once Upon a Time in a Kingdom</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Marie Slip"/>
|
||||
<info name="developer" value="Colorizator"/>
|
||||
<info name="developer" value="Devstratum, Graf Cherry"/>
|
||||
<info name="developer" value="Mister Robin"/>
|
||||
<info name="developer" value="Fatalsnipe"/>
|
||||
<info name="developer" value="Karbafos"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="655360">
|
||||
<rom name="O.U.K (AY) last-cat.trd" size="655360" crc="5f84d0f7" sha1="c4e061dde0b4cc3244e994b51b1ed02ef8b56fbc" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="pacpack">
|
||||
<description>PacPack</description>
|
||||
<year>2018</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="297472">
|
||||
<rom name="PacPack.spg" size="297472" crc="a3918598" sha1="4d1497a8774c50ea962290078e1a2f2931a44f3b" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="parallax">
|
||||
<description>Cannon Fodder Parallax</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="20480">
|
||||
<rom name="cfparallax.spg" size="20480" crc="4e500604" sha1="8e11d90a0bb72ec408dfc212f9fa01ce5acc7186" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="sirababol">
|
||||
<description>Sir Ababol</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<info name="developer" value="n1k-o"/>
|
||||
<info name="developer" value="na_th_an"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="36864">
|
||||
<rom name="sirababol.spg" size="36864" crc="a8158028" sha1="83997cbc28a16670ab0a1cdb470f2b7624062353" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="socoban">
|
||||
<description>Socoban</description>
|
||||
<year>2015</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="g0blinish"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="24064">
|
||||
<rom name="soco.spg" size="24064" crc="c5b5179c" sha1="3518bbc1145e4941c08703084d52b4ba4ea53272" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="sonicthehedgehog">
|
||||
<description>Sonic the Hedgehog</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="n1k-o"/>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="320512">
|
||||
<rom name="Sonic.spg" size="320512" crc="84abf16d" sha1="8cd8b3083e3143d26262116bb07646f69c462909" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="synchronization">
|
||||
<description>Synchronization</description>
|
||||
<year>201?</year>
|
||||
<publisher>Robus</publisher>
|
||||
<info name="developer" value="Hacker VBI"/>
|
||||
<info name="developer" value="Robus"/>
|
||||
<info name="developer" value="Mellona"/>
|
||||
<info name="developer" value="n1k-o"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="655360">
|
||||
<rom name="SYNCHRO.TRD" size="655360" crc="8b99764d" sha1="022ea81b2f3e2154ee0fdd733dbe6ddc8a020ca6" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="tcircles">
|
||||
<description>T-circles</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Buyan"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="22528">
|
||||
<rom name="Tcircles.spg" size="22528" crc="ac5c5b9b" sha1="13102d62ba48c45d77fbeb9e953c122fc8f6c8b2" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="tetris">
|
||||
<description>Tetris</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="denpopov"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="3584">
|
||||
<rom name="tetris.spg" size="3584" crc="335c998d" sha1="f730ea4eabb1b301bf8b8e2713bbf0ae2d3745fe" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="tsdemo">
|
||||
<description>TS-TechDemo</description>
|
||||
<year>2013</year>
|
||||
<publisher>Wizart/DT</publisher>
|
||||
<info name="developer" value="Wizart"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="655360">
|
||||
<rom name="TSDemo.trd" size="655360" crc="c2e72fe4" sha1="fe99a846c9702c3c424daa8b6509458853bcf5ff" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="tsolitaire">
|
||||
<description>TSolitaire</description>
|
||||
<year>201?</year>
|
||||
<publisher>ERA Creative Group (Multinational)</publisher>
|
||||
<info name="developer" value="Marie Slip"/>
|
||||
<info name="developer" value="n1k-o"/>
|
||||
<info name="developer" value="Black Cat"/>
|
||||
<info name="developer" value="Inside"/>
|
||||
<part name="v2_0_turbosound" interface="floppy_5_25">
|
||||
<dataarea name="flop1" size="655360">
|
||||
<rom name="TS v2.0(TFM)_edited.trd" size="655360" crc="05cf31ef" sha1="6a25e71b805c21410607f8c62a62198333ced2fd" />
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="v2_0" interface="floppy_5_25">
|
||||
<dataarea name="flop1" size="655360">
|
||||
<rom name="TS v2.0_edited.trd" size="655360" crc="e4d026bb" sha1="a8bbb38f301cc588f3af0f8ed01f0822c7b38ab3" />
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="v1_1" interface="floppy_5_25">
|
||||
<dataarea name="flop1" size="655360">
|
||||
<rom name="TSolv1.1.trd" size="655360" crc="0ec1c4da" sha1="5c0a0cb8c8043748b582750d0171d68d9ac4d6c7" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="uwol">
|
||||
<description>Uwol - Quest for Money</description>
|
||||
<year>2012</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<info name="developer" value="Shiru"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="53760">
|
||||
<rom name="uwol_1.0.spg" size="53760" crc="768fc5ca" sha1="78c8c63ce896d03f620c03269d73ff018563f885" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="wonderboy">
|
||||
<description>Wonder Boy</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Blade"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="84992">
|
||||
<rom name="WonderBoy.spg" size="84992" crc="f6fcc4cd" sha1="fd0ba88a6f521a664e70995188102c77e8cd8331" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="xonix">
|
||||
<description>Xonix</description>
|
||||
<year>2012</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Shiru"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="224256">
|
||||
<rom name="xnx.spg" size="224256" crc="b6da5a5d" sha1="a3ec74ce8bb239565fac7425283cd0c4adcc0d13" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="zenloops">
|
||||
<description>Zen Loops</description>
|
||||
<year>201?</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="g0blinish"/>
|
||||
<part name="dump" interface="spectrum_snapshot">
|
||||
<dataarea name="dump" size="18432">
|
||||
<rom name="zenloops.spg" size="18432" crc="50f3a0e4" sha1="6a99fdac432f5467dc16bbb7374a7455eca9df19" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="zxbatlecity">
|
||||
<description>ZX Battle City v1.4 (NoVDAC)</description>
|
||||
<year>2020</year>
|
||||
<publisher><homebrew></publisher>
|
||||
<info name="developer" value="Marie Slip"/>
|
||||
<info name="developer" value="n1k-o"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="655360">
|
||||
<rom name="zxbattlecity_1_4_novdac.trd" size="655360" crc="0a2bfb45" sha1="21747a464db723d934ec2fa8a398b212344f6c1e" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</softwarelist>
|
@ -1,30 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<!--
|
||||
license:CC0-1.0
|
||||
-->
|
||||
<softwarelist name="tsconf_betadisc_flop" description="TS-Configuration Beta Disc / TR-DOS disk images">
|
||||
|
||||
<software name="copter">
|
||||
<description>Copter v0.1</description>
|
||||
<year>2012</year>
|
||||
<publisher>Wizart/DT</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="655360">
|
||||
<rom name="COPTER.trd" size="655360" crc="43236562" sha1="c4e3a9bcfd2387e954372a633f7415db368dbd4b" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="zxbatlecity">
|
||||
<description>ZX Battle City v1.4 (NoVDAC)</description>
|
||||
<year>2020</year>
|
||||
<publisher>Marie Slip / n1k-o</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="655360">
|
||||
<rom name="zxbattlecity_1_4_novdac.trd" size="655360" crc="0a2bfb45" sha1="21747a464db723d934ec2fa8a398b212344f6c1e" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</softwarelist>
|
@ -238,6 +238,13 @@ void spectrum_128_state::spectrum_128_port_7ffd_w(offs_t offset, uint8_t data)
|
||||
m_exp->iorq_w(offset | 1, data);
|
||||
}
|
||||
|
||||
void spectrum_128_state::bank3_set_page(u8 page)
|
||||
{
|
||||
m_port_7ffd_data &= 0xf8;
|
||||
m_port_7ffd_data |= page & 0x07;
|
||||
spectrum_128_update_memory();
|
||||
}
|
||||
|
||||
void spectrum_128_state::spectrum_128_update_memory()
|
||||
{
|
||||
m_bank_rom[0]->set_entry(BIT(m_port_7ffd_data, 4));
|
||||
|
@ -33,6 +33,7 @@ protected:
|
||||
virtual void machine_start() override ATTR_COLD;
|
||||
virtual void machine_reset() override ATTR_COLD;
|
||||
|
||||
virtual void bank3_set_page(u8 page) override;
|
||||
virtual void spectrum_128_update_memory() override;
|
||||
virtual rectangle get_screen_area() override;
|
||||
|
||||
|
@ -206,6 +206,15 @@ SNAPSHOT_LOAD_MEMBER(spectrum_state::snapshot_cb)
|
||||
|
||||
setup_frz(&snapshot_data[0], snapshot_size);
|
||||
}
|
||||
else if (image.is_filetype("spg"))
|
||||
{
|
||||
if (snapshot_data[32] != 'S' || snapshot_data[33] != 'p' || snapshot_data[34] != 'e' || snapshot_data[35] != 'c'
|
||||
|| snapshot_data[36] != 't' || snapshot_data[37] != 'r' || snapshot_data[38] != 'u' || snapshot_data[39] != 'm'
|
||||
|| snapshot_data[40] != 'P' || snapshot_data[41] != 'r' ||snapshot_data[42] != 'o' || snapshot_data[43] != 'g')
|
||||
return std::make_pair(image_error::INVALIDIMAGE, "Invalid .SPG file header.");
|
||||
|
||||
setup_spg(&snapshot_data[0], snapshot_size);
|
||||
}
|
||||
else
|
||||
{
|
||||
setup_z80(&snapshot_data[0], snapshot_size);
|
||||
@ -2396,6 +2405,454 @@ void spectrum_state::setup_z80(const uint8_t *snapdata, uint32_t snapsize)
|
||||
}
|
||||
}
|
||||
|
||||
void spectrum_state::hrust_decompress_block(address_space &space, const u8 *source, u16 dest, u16 size)
|
||||
{
|
||||
class bb_stream
|
||||
{
|
||||
private:
|
||||
const u8 *m_base;
|
||||
const u8 *m_read;
|
||||
int m_offset;
|
||||
int m_length;
|
||||
bool m_eof;
|
||||
u16 m_buffer;
|
||||
|
||||
public:
|
||||
bb_stream(const u8 *src, int src_length)
|
||||
{
|
||||
m_base = m_read = src;
|
||||
|
||||
m_length = src_length;
|
||||
m_offset = 0;
|
||||
m_eof = false;
|
||||
|
||||
m_buffer = get_byte();
|
||||
m_buffer += get_byte() << 8;
|
||||
}
|
||||
|
||||
u8 get_byte()
|
||||
{
|
||||
m_eof |= ((m_read - m_base) == m_length);
|
||||
return m_eof ? 0 : *m_read++;
|
||||
}
|
||||
|
||||
u8 get_bit()
|
||||
{
|
||||
u8 bit = BIT(m_buffer, 15 - m_offset);
|
||||
if (m_offset == 15)
|
||||
{
|
||||
m_buffer = get_byte();
|
||||
m_buffer += get_byte() << 8;
|
||||
}
|
||||
m_offset = (m_offset + 1) & 0xf;
|
||||
|
||||
return bit;
|
||||
}
|
||||
|
||||
u8 get_bits(u8 n)
|
||||
{
|
||||
u8 r = 0;
|
||||
do
|
||||
{
|
||||
r = (r << 1) + get_bit();
|
||||
} while (--n);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
bool overflow() { return m_eof; }
|
||||
};
|
||||
|
||||
constexpr u8 mask[] = { 0, 0, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0 };
|
||||
u8 no_bits = 2;
|
||||
bb_stream bitbuf(source, size);
|
||||
|
||||
space.write_byte(dest++, bitbuf.get_byte());
|
||||
|
||||
while (!bitbuf.overflow())
|
||||
{
|
||||
while (bitbuf.get_bit())
|
||||
{
|
||||
space.write_byte(dest++, bitbuf.get_byte());
|
||||
}
|
||||
|
||||
u16 len = 0;
|
||||
u8 bb;
|
||||
do
|
||||
{
|
||||
bb = bitbuf.get_bits(2);
|
||||
len += bb;
|
||||
|
||||
} while (bb == 0x03 && len != 0x0f);
|
||||
|
||||
short offset = 0;
|
||||
if (len == 0)
|
||||
{
|
||||
offset = 0xfff8 + bitbuf.get_bits(3);
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
continue;
|
||||
}
|
||||
else if (len == 1)
|
||||
{
|
||||
const u8 code = bitbuf.get_bits(2);
|
||||
if (code == 0 || code == 1)
|
||||
{
|
||||
offset = bitbuf.get_byte();
|
||||
offset += (code ? 0xfe : 0xfd) << 8;
|
||||
}
|
||||
else if (code == 2)
|
||||
{
|
||||
u8 b = bitbuf.get_byte();
|
||||
if (b >= 0xe0)
|
||||
{
|
||||
b <<= 1;
|
||||
++b; // rlca
|
||||
b ^= 2; // xor c
|
||||
|
||||
if (b == 0xff)
|
||||
{
|
||||
++no_bits;
|
||||
continue;
|
||||
}
|
||||
|
||||
offset = 0xff00 + b - 0x0f;
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
space.write_byte(dest++, bitbuf.get_byte());
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
continue;
|
||||
}
|
||||
offset = 0xff00 + b;
|
||||
}
|
||||
else if (code == 3)
|
||||
{
|
||||
offset = 0xffe0 + bitbuf.get_bits(5);
|
||||
}
|
||||
|
||||
for (auto i = 0; i < 2; ++i)
|
||||
{
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (len == 3)
|
||||
{
|
||||
if (bitbuf.get_bit())
|
||||
{
|
||||
offset = 0xfff0 + bitbuf.get_bits(4);
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
space.write_byte(dest++, bitbuf.get_byte());
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bitbuf.get_bit())
|
||||
{
|
||||
u8 bytes_no = 6 + bitbuf.get_bits(4);
|
||||
for (u8 i = 0; i < (bytes_no << 1); ++i)
|
||||
space.write_byte(dest++, bitbuf.get_byte());
|
||||
continue;
|
||||
}
|
||||
|
||||
len = bitbuf.get_bits(7);
|
||||
if (len == 0x0f)
|
||||
{
|
||||
break; // EOF
|
||||
}
|
||||
if (len < 0x0f)
|
||||
{
|
||||
len = (len << 8) + bitbuf.get_byte();
|
||||
}
|
||||
}
|
||||
|
||||
if (len == 2)
|
||||
{
|
||||
++len;
|
||||
}
|
||||
|
||||
|
||||
const u8 code = bitbuf.get_bits(2);
|
||||
if (code == 0)
|
||||
{
|
||||
offset = 0xfe00 + bitbuf.get_byte();
|
||||
}
|
||||
else if (code == 1)
|
||||
{
|
||||
u8 b = bitbuf.get_byte();
|
||||
|
||||
if (b >= 0xe0)
|
||||
{
|
||||
if (len > 3)
|
||||
{
|
||||
// logerror
|
||||
break;
|
||||
}
|
||||
|
||||
b <<= 1;
|
||||
++b; // rlca
|
||||
b ^= 3; // xor c
|
||||
|
||||
offset = 0xff00 + b - 0x0f;
|
||||
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
space.write_byte(dest++, bitbuf.get_byte());
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
continue;
|
||||
}
|
||||
offset = 0xff00 + b;
|
||||
}
|
||||
else if (code == 2)
|
||||
{
|
||||
offset = 0xffe0 + bitbuf.get_bits(5);
|
||||
}
|
||||
else if (code == 3)
|
||||
{
|
||||
offset = (mask[no_bits] + bitbuf.get_bits(no_bits)) << 8;
|
||||
offset += bitbuf.get_byte();
|
||||
}
|
||||
|
||||
for (u16 i = 0; i < len; ++i)
|
||||
{
|
||||
space.write_byte(dest, space.read_byte(dest + offset));
|
||||
++dest;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void spectrum_state::mlz_decompress_block(address_space &space, const u8 *source, u16 dest, u16 size)
|
||||
{
|
||||
class de_mlz
|
||||
{
|
||||
private:
|
||||
address_space &m_space;
|
||||
const u8 *m_src;
|
||||
u16 m_to;
|
||||
u8 m_buffer;
|
||||
int m_buffer_size;
|
||||
|
||||
public:
|
||||
de_mlz(address_space &space, const u8 *src, u16 dst) : m_space(space)
|
||||
{
|
||||
m_src = src;
|
||||
m_to = dst;
|
||||
}
|
||||
|
||||
void init_bitstream()
|
||||
{
|
||||
m_buffer = get_byte();
|
||||
m_buffer_size = 8;
|
||||
}
|
||||
|
||||
u8 get_byte()
|
||||
{
|
||||
return *m_src++;
|
||||
}
|
||||
|
||||
void put_byte(u8 val)
|
||||
{
|
||||
m_space.write_byte(m_to++, val);
|
||||
}
|
||||
|
||||
void repeat(u32 disp, int num)
|
||||
{
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
u8 val = m_space.read_byte(m_to - disp);
|
||||
put_byte(val);
|
||||
}
|
||||
}
|
||||
|
||||
// gets specified number of bits from bitstream
|
||||
// returns them LSB-aligned
|
||||
u32 get_bits(int count)
|
||||
{
|
||||
u32 bits = 0;
|
||||
while (count--)
|
||||
{
|
||||
if (m_buffer_size--)
|
||||
{
|
||||
bits <<= 1;
|
||||
bits |= 1 & (m_buffer >> 7);
|
||||
m_buffer <<= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
init_bitstream();
|
||||
count++; // repeat loop once more
|
||||
}
|
||||
}
|
||||
|
||||
return bits;
|
||||
}
|
||||
|
||||
int get_bigdisp()
|
||||
{
|
||||
u32 bits;
|
||||
|
||||
// inter displacement
|
||||
if (get_bits(1))
|
||||
{
|
||||
bits = get_bits(4);
|
||||
return 0x1100 - (bits << 8) - get_byte();
|
||||
}
|
||||
|
||||
// shorter displacement
|
||||
else
|
||||
return 256 - get_byte();
|
||||
}
|
||||
};
|
||||
|
||||
de_mlz s(space, source, dest);
|
||||
u32 done = 0;
|
||||
int i;
|
||||
|
||||
// get first byte of packed file and write to output
|
||||
s.put_byte(s.get_byte());
|
||||
|
||||
// second byte goes to bitstream
|
||||
s.init_bitstream();
|
||||
|
||||
// actual depacking loop!
|
||||
do
|
||||
{
|
||||
// get 1st bit - either OUTBYTE or beginning of LZ code
|
||||
// OUTBYTE
|
||||
if (s.get_bits(1))
|
||||
s.put_byte(s.get_byte());
|
||||
|
||||
// LZ code
|
||||
else
|
||||
{
|
||||
switch (s.get_bits(2))
|
||||
{
|
||||
case 0: // 000
|
||||
s.repeat(8 - s.get_bits(3), 1);
|
||||
break;
|
||||
|
||||
case 1: // 001
|
||||
s.repeat(256 - s.get_byte(), 2);
|
||||
break;
|
||||
|
||||
case 2: // 010
|
||||
s.repeat(s.get_bigdisp(), 3);
|
||||
break;
|
||||
|
||||
case 3: // 011
|
||||
// extract num of length bits
|
||||
for (i = 1; !s.get_bits(1); i++)
|
||||
;
|
||||
|
||||
// check for exit code
|
||||
if (i == 9)
|
||||
{
|
||||
done = 1;
|
||||
}
|
||||
else if (i <= 7)
|
||||
{
|
||||
// get length bits itself
|
||||
int bits = s.get_bits(i);
|
||||
s.repeat(s.get_bigdisp(), 2 + (1 << i) + bits);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (!done);
|
||||
}
|
||||
|
||||
/*
|
||||
Load a .SPG (Spectrum Prog) file.
|
||||
|
||||
v1.1: https://raw.githubusercontent.com/tslabs/zx-evo/master/pentevo/docs/Formats/SPGv1_1.txt
|
||||
v1.0: https://raw.githubusercontent.com/tslabs/zx-evo/master/pentevo/docs/Formats/SPGv1_0.txt
|
||||
v0.2 https://raw.githubusercontent.com/tslabs/zx-evo/master/pentevo/docs/Formats/SPGv0_2.txt
|
||||
*/
|
||||
void spectrum_state::setup_spg(const u8 *snapdata, u32 snapsize)
|
||||
{
|
||||
u16 data;
|
||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||
|
||||
data = snapdata[SPG_OFFSET + 0x2c];
|
||||
if (BIT(data, 4, 4) != 1 || BIT(data, 0, 4) != 0) // just v1.0 for now
|
||||
{
|
||||
logerror("Can't load .SPG file v%d.%d\n", BIT(data, 4, 4), BIT(data, 0, 4));
|
||||
return;
|
||||
}
|
||||
|
||||
m_maincpu->set_state_int(Z80_IY, 0x5c3a);
|
||||
m_maincpu->set_state_int(Z80_HL2, 0x2758);
|
||||
m_maincpu->set_state_int(Z80_I, 0x3f);
|
||||
m_maincpu->set_state_int(Z80_IM, 1);
|
||||
m_port_7ffd_data = 16;
|
||||
|
||||
data = (snapdata[SPG_OFFSET + 0x31] << 8) | snapdata[SPG_OFFSET + 0x30];
|
||||
if (data < 0x4000)
|
||||
{
|
||||
logerror("PC(%04x) < 0x4000 is not allowed\n", data);
|
||||
}
|
||||
m_maincpu->set_state_int(Z80_PC, data);
|
||||
|
||||
data = (snapdata[SPG_OFFSET + 0x33] << 8) | snapdata[SPG_OFFSET + 0x32];
|
||||
m_maincpu->set_state_int(Z80_SP, data);
|
||||
|
||||
const u8 page3 = snapdata[SPG_OFFSET + 0x34];
|
||||
|
||||
data = snapdata[SPG_OFFSET + 0x35];
|
||||
m_maincpu->set_state_int(Z80_IFF1, BIT(data, 2));
|
||||
|
||||
offs_t data_offset = SPG_DATA;
|
||||
for (auto b = 0; b < 0x100; b++)
|
||||
{
|
||||
data = snapdata[SPG_BLOCK_INFO(b) + 0];
|
||||
const u16 offs = BIT(data, 0, 5) * 512;
|
||||
const bool is_last = BIT(data, 7);
|
||||
|
||||
data = snapdata[SPG_BLOCK_INFO(b) + 1];
|
||||
const u16 size = (BIT(data, 0, 5) + 1) * 512;
|
||||
const u8 compression = BIT(data, 6, 2);
|
||||
|
||||
const u8 page = snapdata[SPG_BLOCK_INFO(b) + 2];
|
||||
if (page > 0xdf)
|
||||
{
|
||||
logerror("Page %02x is not allowed\n", page);
|
||||
return;
|
||||
}
|
||||
bank3_set_page(page);
|
||||
|
||||
switch (compression)
|
||||
{
|
||||
case 0x00:
|
||||
for (auto i = 0; i < size; i++)
|
||||
space.write_byte(0xc000 + i, snapdata[data_offset + i]);
|
||||
break;
|
||||
|
||||
case 0x01:
|
||||
mlz_decompress_block(space, &snapdata[data_offset], 0xc000 + offs, size);
|
||||
break;
|
||||
|
||||
case 0x02:
|
||||
hrust_decompress_block(space, &snapdata[data_offset], 0xc000 + offs, size);
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("Unsupported compression: %d\n", compression);
|
||||
return;
|
||||
}
|
||||
|
||||
data_offset += size;
|
||||
if (is_last)
|
||||
break;
|
||||
}
|
||||
|
||||
bank3_set_page(page3);
|
||||
}
|
||||
|
||||
QUICKLOAD_LOAD_MEMBER(spectrum_state::quickload_cb)
|
||||
{
|
||||
size_t quickload_size = image.length();
|
||||
|
@ -119,6 +119,15 @@
|
||||
#define SNX_COMPRESSED 0xff
|
||||
#define SNX_UNCOMPRESSED 0x00
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* .SPG format (used by TS-Conf, BASECONF, Next)
|
||||
*
|
||||
****************************************************************************/
|
||||
#define SPG_OFFSET 0
|
||||
#define SPG_BLOCK_INFO(_n) (SPG_OFFSET + 0x100 + (3 * _n))
|
||||
#define SPG_DATA SPG_BLOCK_INFO(256)
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* .FRZ format (used by CBSpeccy, ZX-Live and ASp)
|
||||
|
@ -835,7 +835,9 @@ void spectrum_state::spectrum_common(machine_config &config)
|
||||
m_exp->fb_r_handler().set(FUNC(spectrum_state::floating_bus_r));
|
||||
|
||||
/* devices */
|
||||
SNAPSHOT(config, "snapshot", "ach,frz,plusd,prg,sem,sit,sna,snp,snx,sp,z80,zx").set_load_callback(FUNC(spectrum_state::snapshot_cb));
|
||||
snapshot_image_device &snapshot(SNAPSHOT(config, "snapshot", "ach,frz,plusd,prg,sem,sit,sna,snp,snx,sp,spg,z80,zx"));
|
||||
snapshot.set_load_callback(FUNC(spectrum_state::snapshot_cb));
|
||||
snapshot.set_interface("spectrum_snapshot");
|
||||
QUICKLOAD(config, "quickload", "raw,scr", attotime::from_seconds(2)).set_load_callback(FUNC(spectrum_state::quickload_cb)); // The delay prevents the screen from being cleared by the RAM test at boot
|
||||
|
||||
CASSETTE(config, m_cassette);
|
||||
|
@ -90,6 +90,7 @@ protected:
|
||||
virtual void video_start() override ATTR_COLD;
|
||||
|
||||
// until machine/spec_snqk.cpp gets somehow disentangled
|
||||
virtual void bank3_set_page(u8 page) { }
|
||||
virtual void plus3_update_memory() { }
|
||||
virtual void spectrum_128_update_memory() { }
|
||||
virtual void ts2068_update_memory() { }
|
||||
@ -207,7 +208,9 @@ protected:
|
||||
void setup_frz(const uint8_t *snapdata, uint32_t snapsize);
|
||||
void z80_decompress_block(address_space &space, const uint8_t *source, uint16_t dest, uint16_t size);
|
||||
void setup_z80(const uint8_t *snapdata, uint32_t snapsize);
|
||||
|
||||
void hrust_decompress_block(address_space &space, const u8 *source, u16 dest, u16 size);
|
||||
void mlz_decompress_block(address_space &space, const u8 *source, u16 dest, u16 size);
|
||||
void setup_spg(const u8 *snapdata, u32 snapsize);
|
||||
// quickload helpers
|
||||
void log_quickload(const char *type, uint32_t start, uint32_t length, uint32_t exec, const char *exec_format);
|
||||
void setup_scr(const uint8_t *quickdata, uint32_t quicksize);
|
||||
|
@ -326,7 +326,7 @@ void tsconf_state::tsconf(machine_config &config)
|
||||
AT_KEYB(config, m_keyboard, pc_keyboard_device::KEYBOARD_TYPE::AT, 3);
|
||||
|
||||
SOFTWARE_LIST(config, "betadisc_list_pent").set_original("spectrum_betadisc_flop");
|
||||
SOFTWARE_LIST(config, "betadisc_list_tsconf").set_original("tsconf_betadisc_flop");
|
||||
SOFTWARE_LIST(config, "tsconf_list").set_original("tsconf");
|
||||
}
|
||||
|
||||
ROM_START(tsconf)
|
||||
|
@ -56,6 +56,8 @@ protected:
|
||||
virtual void machine_reset() override ATTR_COLD;
|
||||
virtual void device_post_load() override ATTR_COLD;
|
||||
|
||||
virtual void bank3_set_page(u8 page) override;
|
||||
|
||||
virtual TIMER_CALLBACK_MEMBER(irq_off) override;
|
||||
TIMER_CALLBACK_MEMBER(irq_frame);
|
||||
TIMER_CALLBACK_MEMBER(irq_scanline);
|
||||
|
@ -477,6 +477,11 @@ u8 tsconf_state::tsconf_port_xx1f_r(offs_t offset) {
|
||||
: 0x00; // TODO kempston read
|
||||
}
|
||||
|
||||
void tsconf_state::bank3_set_page(u8 page)
|
||||
{
|
||||
tsconf_port_xxaf_w(PAGE3 << 8, page);
|
||||
}
|
||||
|
||||
void tsconf_state::tsconf_port_7ffd_w(u8 data)
|
||||
{
|
||||
// LOCK? BIT(data, 5);
|
||||
|
Loading…
Reference in New Issue
Block a user