mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
Merge branch 'master' of https://github.com/mamedev/mame
This commit is contained in:
commit
c47b2e3eb7
@ -552,30 +552,6 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="drseussp" cloneof="drseuss">
|
||||
<description>Dr. Seuss's Fix-Up the Mix-Up Puzzle (prototype, rev r)</description>
|
||||
<year>1984</year>
|
||||
<publisher>Coleco / CBS</publisher>
|
||||
<part name="cart" interface="coleco_cart">
|
||||
<dataarea name="rom" size="0x4000">
|
||||
<rom name="jigsaw 10 6-7 1 5274 e052.1" size="0x2000" crc="e63951b3" sha1="528b441c516211c884925a7e11c30b6cb5f85ecb" offset="0x0000" />
|
||||
<rom name="jigsaw 10 6-7 2 8dde e052.2" size="0x2000" crc="b0ecd4a4" sha1="c77cb81424d585acc41dd1120e81ca7adc0e555b" offset="0x2000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- The label says the checksum is 90B3 but the dump's checksum is 90A3. Possible bit rot or just an error on the label? -->
|
||||
<software name="drseussp1" cloneof="drseuss">
|
||||
<description>Dr. Seuss's Fix-Up the Mix-Up Puzzle Graphics Demo</description>
|
||||
<year>1984</year>
|
||||
<publisher>Coleco / CBS</publisher>
|
||||
<part name="cart" interface="coleco_cart">
|
||||
<dataarea name="rom" size="0x2000">
|
||||
<rom name="link seuss 4-6 1 puzzler 90b3.1" size="0x2000" crc="6485a603" sha1="96652d5e5592de62474c094b507f43924ffa06d1" /> <!-- original label: LINK: Seuss 4/6 1 Puzzler 90B3 -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="evolutio">
|
||||
<!-- Evolution (1983)(Coleco).bin -->
|
||||
<description>Evolution</description>
|
||||
@ -2684,6 +2660,30 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="drseussp" cloneof="drseuss">
|
||||
<description>Dr. Seuss's Fix-Up the Mix-Up Puzzle (prototype, rev r)</description>
|
||||
<year>1984</year>
|
||||
<publisher>Coleco / CBS</publisher>
|
||||
<part name="cart" interface="coleco_cart">
|
||||
<dataarea name="rom" size="0x4000">
|
||||
<rom name="jigsaw 10 6-7 1 5274 e052.1" size="0x2000" crc="e63951b3" sha1="528b441c516211c884925a7e11c30b6cb5f85ecb" offset="0x0000" />
|
||||
<rom name="jigsaw 10 6-7 2 8dde e052.2" size="0x2000" crc="b0ecd4a4" sha1="c77cb81424d585acc41dd1120e81ca7adc0e555b" offset="0x2000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- The label says the checksum is 90B3 but the dump's checksum is 90A3. Possible bit rot or just an error on the label? -->
|
||||
<software name="drseussp1" cloneof="drseuss">
|
||||
<description>Dr. Seuss's Fix-Up the Mix-Up Puzzle Graphics Demo</description>
|
||||
<year>1984</year>
|
||||
<publisher>Coleco / CBS</publisher>
|
||||
<part name="cart" interface="coleco_cart">
|
||||
<dataarea name="rom" size="0x2000">
|
||||
<rom name="link seuss 4-6 1 puzzler 90b3.1" size="0x2000" crc="6485a603" sha1="96652d5e5592de62474c094b507f43924ffa06d1" /> <!-- original label: LINK: Seuss 4/6 1 Puzzler 90B3 -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="dlair" supported="no">
|
||||
<description>Dragon's Lair (prototype, 0416)</description>
|
||||
<year>1984</year>
|
||||
@ -2724,6 +2724,18 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="frogger2p" cloneof="frogger2">
|
||||
<description>Frogger II: Threedeep! (prototype, 19840615)</description>
|
||||
<year>1984</year>
|
||||
<publisher>Parker Brothers</publisher>
|
||||
<part name="cart" interface="coleco_cart">
|
||||
<dataarea name="rom" size="0x4000">
|
||||
<rom name="frogger ii - threeedeep (jun 15, 1984 prototype).1" size="0x2000" crc="29ae3ab6" sha1="6e77709b74cae4c8d080ad4a8aa8eaef274e7a81" offset="0x0000" />
|
||||
<rom name="frogger ii - threeedeep (jun 15, 1984 prototype).2" size="0x2000" crc="c63c4408" sha1="d2682cd8166882935179de590c4f26d90b96ff23" offset="0x2000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="joust">
|
||||
<!-- Joust (1983)(Atari)(proto).bin -->
|
||||
<description>Joust (prototype)</description>
|
||||
@ -2871,6 +2883,19 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="starwarsp" cloneof="starwars">
|
||||
<description>Star Wars: The Arcade Game (prototype, 19840412)</description>
|
||||
<year>1984</year>
|
||||
<publisher>Parker Brothers</publisher>
|
||||
<info name="developer" value="Atari" />
|
||||
<part name="cart" interface="coleco_cart">
|
||||
<dataarea name="rom" size="0x4000">
|
||||
<rom name="star wars - the arcade game (apr 12, 1984 prototype).1" size="0x2000" crc="21174d6a" sha1="ea45736701e2cc55fec1f4f8c3839824be46be4b" offset="0x0000" />
|
||||
<rom name="star wars - the arcade game (apr 12, 1984 prototype).2" size="0x2000" crc="93940cce" sha1="cef3d0f085a148ab5760afbe93384f8f12773770" offset="0x2000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="steam">
|
||||
<!-- Steamroller (1984)(Activision)(proto).bin -->
|
||||
<description>Steamroller (prototype)</description>
|
||||
|
51
hash/mk14_quik.xml
Normal file
51
hash/mk14_quik.xml
Normal file
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<!--
|
||||
license:CC0
|
||||
-->
|
||||
|
||||
<softwarelist name="mk14_quik" description="MK-14 quickloads">
|
||||
|
||||
<software name="fallman">
|
||||
<description>Falling Man</description>
|
||||
<year>1979</year>
|
||||
<publisher>Practical Electronics</publisher>
|
||||
<sharedfeat name="compatibility" value="VDU"/>
|
||||
<part name="quik" interface="mk14_quik">
|
||||
<feature name="load" value="0xf20"/>
|
||||
<feature name="exec" value="0xf20"/>
|
||||
<dataarea name="rom" size="140">
|
||||
<rom name="fallman.bin" size="140" crc="1fc5a224" sha1="36b8fcc5491f336dd45b0863f654553920ce07cd" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="invaders">
|
||||
<description>Invaders</description>
|
||||
<year>2022</year>
|
||||
<publisher>Realtime</publisher>
|
||||
<sharedfeat name="compatibility" value="VDU"/>
|
||||
<part name="quik" interface="mk14_quik">
|
||||
<feature name="load" value="0x400"/>
|
||||
<feature name="exec" value="0x400"/>
|
||||
<dataarea name="rom" size="1020">
|
||||
<rom name="invaders.bin" size="1020" crc="cdea9e08" sha1="5a7ab0822b3d703cd8fb964e26297c05cc9dcfde" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="pong">
|
||||
<description>Pong</description>
|
||||
<year>2022</year>
|
||||
<publisher>Milan Humpolik</publisher>
|
||||
<sharedfeat name="compatibility" value="VDU"/>
|
||||
<part name="quik" interface="mk14_quik">
|
||||
<feature name="load" value="0x400"/>
|
||||
<feature name="exec" value="0x400"/>
|
||||
<dataarea name="rom" size="570">
|
||||
<rom name="pong.bin" size="570" crc="1df23d1e" sha1="c3ccf8891b4d317d694e1b5089c729592e54a9b0" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
</softwarelist>
|
205
hash/nes.xml
205
hash/nes.xml
@ -7571,6 +7571,23 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="crazyland" cloneof="trollscl">
|
||||
<description>Crazy Land (USA, prototype)</description>
|
||||
<year>1991</year>
|
||||
<publisher>Vap</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="txrom" />
|
||||
<feature name="pcb_model" value="NES-TKEPROM-01" />
|
||||
<feature name="mmc3_type" value="MMC3B" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="crazy land prg 5-27 3bdb.u1" size="0x20000" crc="96ddee6e" sha1="dd19c0437fb9efd0a27c4277c7b1b7d32c59a643" /> <!-- original label: CRAZY LAND PRG 5/27 3BDB -->
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x20000">
|
||||
<rom name="crazy land chr 5-27 6017.u5" size="0x20000" crc="cc045b61" sha1="c474fcb5af3440caec27870a705b19339e004ff2" /> <!-- original label: CRAZY LAND CHR 5/27 6017 -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="crisisf">
|
||||
<description>Crisis Force (Japan)</description>
|
||||
<year>1991</year>
|
||||
@ -13927,6 +13944,23 @@ license:CC0
|
||||
<description>Galaxy 5000 - Racing in the 51st Century (USA, prototype)</description>
|
||||
<year>1991</year>
|
||||
<publisher>Activision</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="txrom" />
|
||||
<feature name="pcb_model" value="NES-TKEPROM-01" />
|
||||
<feature name="mmc3_type" value="MMC3A" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="p.u1" size="0x20000" crc="6a28dab9" sha1="cee41dfc69e3a3a296a993ebf30a6da0311ace64" />
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x20000">
|
||||
<rom name="c.u5" size="0x20000" crc="18da922d" sha1="31af2992ffefef7bfe6b9c945c74e2d0a51d096a" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="galaxy5kup1" cloneof="galaxy5k">
|
||||
<description>Galaxy 5000 - Racing in the 51st Century (USA, prototype, earlier)</description>
|
||||
<year>1991</year>
|
||||
<publisher>Activision</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="txrom" />
|
||||
<feature name="pcb" value="NES-TLROM" />
|
||||
@ -17296,6 +17330,23 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="hoopsup" cloneof="hoops">
|
||||
<description>Hoops (USA, prototype)</description>
|
||||
<year>1989</year>
|
||||
<publisher>Jaleco</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="sxrom" />
|
||||
<feature name="pcb_model" value="NES-SKEPROM-01" />
|
||||
<feature name="mmc1_type" value="MMC1A" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="hoops p.ic1" size="0x20000" crc="514b8c43" sha1="ea87587491a18fdb3b4a2f91b7aa733ea17ff11c" />
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x20000">
|
||||
<rom name="hoops c.ic3" size="0x20000" crc="0ea4d276" sha1="13866ec46255892f01d2c14a7b0e576c0a601331" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="kirbyj" cloneof="kirby">
|
||||
<description>Hoshi no Kirby - Yume no Izumi no Monogatari (Japan)</description>
|
||||
<year>1993</year>
|
||||
@ -18476,6 +18527,23 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="irontankup" cloneof="irontank">
|
||||
<description>Iron Tank - The Invasion of Normandy (USA, prototype)</description>
|
||||
<year>1988</year>
|
||||
<publisher>SNK</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="sxrom" />
|
||||
<feature name="pcb_model" value="HVC-SKEPROM-01" />
|
||||
<feature name="mmc1_type" value="MMC1A" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="2 a7004 usa.prg" size="0x20000" crc="e767160a" sha1="296f56202a898126f018fc2fa18353834c4b0650" />
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x20000">
|
||||
<rom name="1 a7004 usa.chr" size="0x20000" crc="c2551ea2" sha1="719ca2a44a3ddd300e385aa30cc759d53d06a960" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="ironswrdu" cloneof="ironswrd">
|
||||
<description>IronSword - Wizards & Warriors II (USA)</description>
|
||||
<year>1989</year>
|
||||
@ -30261,6 +30329,22 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="rbibb2p" cloneof="rbibb2">
|
||||
<description>R.B.I. Baseball 2 (USA, prototype, 19900307)</description>
|
||||
<year>1990</year>
|
||||
<publisher>Tengen</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="tengen_800032" />
|
||||
<feature name="pcb" value="TENGEN-800032" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="rbi 2 nes prg 3-7 053c.prg" size="0x20000" crc="5e36afda" sha1="3dce69df6bfcbddb28b7e1ef94f4116d84482d1c" />
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x10000">
|
||||
<rom name="rbi 2 nes chr 2-28 1c8f.chr" size="0x10000" crc="8585d41c" sha1="22e01150578fff75f71697d3b29d43b0c68e1975" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="rbibb3">
|
||||
<description>R.B.I. Baseball 3 (USA)</description>
|
||||
<year>1991</year>
|
||||
@ -30841,6 +30925,23 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="rallybikp" cloneof="rallybik">
|
||||
<description>Rally Bike (USA, prototype, 19900226)</description>
|
||||
<year>1990</year>
|
||||
<publisher>Romstar</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="uxrom" />
|
||||
<feature name="pcb_model" value="NES-UNEPROM-01" />
|
||||
<feature name="mirroring" value="vertical" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="rally bike death 2-26-90.prg" size="0x20000" crc="f43be259" sha1="22d4cca9d826d62731026448a41dde61b6766c23" />
|
||||
</dataarea>
|
||||
<!-- 8k VRAM on cartridge -->
|
||||
<dataarea name="vram" size="0x2000">
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="ramboj" cloneof="rambo">
|
||||
<description>Rambo (Japan)</description>
|
||||
<year>1987</year>
|
||||
@ -33596,6 +33697,23 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="shadninjp" cloneof="blueshad">
|
||||
<description>Shadow of the Ninja (USA, sample)</description>
|
||||
<year>1990</year>
|
||||
<publisher>Natsume</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="txrom" />
|
||||
<feature name="pcb_model" value="NES-TKEPROM-01" />
|
||||
<feature name="mmc3_type" value="MMC3B" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="ninja prg 10-16.u1" size="0x20000" crc="8b2ffbcc" sha1="440ee7ff29af54de2ce526b0a66fa71b28d0a7e3" /> <!-- original label: NINJA PRG 10/16 -->
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="131072">
|
||||
<rom name="ninja chr 10-16.u5" size="0x20000" crc="49c1f66d" sha1="af9a84e55cae2fa646d36bdd8ea5eb4a4a9bffcc" /> <!-- original label: NINJA CHR 10/16 -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="shadgatej" cloneof="shadgate">
|
||||
<description>Shadowgate (Japan)</description>
|
||||
<year>1989</year>
|
||||
@ -34336,6 +34454,23 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="silkwormp" cloneof="silkworm">
|
||||
<description>Silkworm (USA, prototype)</description>
|
||||
<year>1990</year>
|
||||
<publisher>American Sammy</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="sxrom" />
|
||||
<feature name="pcb_model" value="NES-SKEPROM-01" />
|
||||
<feature name="mmc1_type" value="MMC1A" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="silkworm prg nes ver 1.ic1" size="0x20000" crc="0530a8b7" sha1="cc54cd29674138ca5f11380cb703fe82bda7ab61" /> <!-- original label: シルクワーム PRG NES Ver 1 -->
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x20000">
|
||||
<rom name="sw nes chr ver 1 5-25.ic3" size="0x20000" crc="b7000942" sha1="29b617582ed611715d1dbe06c8006295dda97f83" /> <!-- original label: SW NES CHR Ver 1 5/25 -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- dump confirmed by naruko -->
|
||||
<!-- the game misbehaves if SRAM is fully init to 0x00, due to buggy programming of the game -->
|
||||
<software name="silvasag">
|
||||
@ -50408,6 +50543,23 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="roadblstup" cloneof="roadblst">
|
||||
<description>RoadBlasters (USA, prototype)</description>
|
||||
<year>1990</year>
|
||||
<publisher>Mindscape</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="sxrom" />
|
||||
<feature name="pcb" value="NES-SLROM" />
|
||||
<feature name="mmc1_type" value="MMC1B2" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="roadblasters (prototype).prg" size="0x20000" crc="c66bf6b6" sha1="aa7b2f6f17c7b84469afb20b4b835d4841883e72" />
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x20000">
|
||||
<rom name="roadblasters (prototype).chr" size="0x20000" crc="605caf59" sha1="010331e23cb615f0f89f810a2f3464216f5d2d55" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="rbyrnepc">
|
||||
<description>Robert Byrne's Pool Challenge (USA, prototype)</description>
|
||||
<year>1992</year>
|
||||
@ -80495,6 +80647,24 @@ be better to redump them properly. -->
|
||||
|
||||
<!-- These are more recent dumps of unlicensed homebrew games that have been released on cartridge. They need to be verified against physical carts. -->
|
||||
|
||||
<software name="2gemsiam">
|
||||
<description>2 in 1 - GEMiNIM & Siamond</description>
|
||||
<year>2008</year>
|
||||
<publisher>RetroZone</publisher>
|
||||
<info name="serial" value="SIV-M1-GBL"/>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="axrom" />
|
||||
<feature name="pcb_model" value="Sealie Computing ReproPak revC" />
|
||||
<feature name="mirroring" value="horizontal" />
|
||||
<dataarea name="prg" size="0x20000">
|
||||
<rom name="39sf010a.prg" size="0x20000" crc="bf3c0601" sha1="ea92849c5e7285b61a00f3ac37cdc773ba6758a3" />
|
||||
</dataarea>
|
||||
<!-- 8k VRAM on cartridge -->
|
||||
<dataarea name="vram" size="0x2000">
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="puritans">
|
||||
<description>2A03Puritans</description>
|
||||
<year>2013</year>
|
||||
@ -81297,6 +81467,23 @@ be better to redump them properly. -->
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="nightbas">
|
||||
<description>Nighttime Bastards</description>
|
||||
<year>2014</year>
|
||||
<publisher>Infinite NES Lives</publisher>
|
||||
<info name="serial" value="OBG-01"/>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="nrom" />
|
||||
<feature name="mirroring" value="horizontal" />
|
||||
<dataarea name="prg" size="0x8000">
|
||||
<rom name="nighttime bastards.prg" size="0x8000" crc="c45ca4db" sha1="afe7a747539bf64554a3edcdc781ffa12033c0c3" />
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x2000">
|
||||
<rom name="nighttime bastards.chr" size="0x2000" crc="39a54075" sha1="7336854e7ea9ae679aa3177aba456d2abb594587" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="nomolos">
|
||||
<description>Nomolos - Storming the Catsle (v1.01)</description>
|
||||
<year>2014</year>
|
||||
@ -81416,6 +81603,24 @@ be better to redump them properly. -->
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Glitchy music continues to play during game. Should only have movement sfx? -->
|
||||
<software name="sudoku07" supported="partial">
|
||||
<description>Sudoku 2007</description>
|
||||
<year>2007</year>
|
||||
<publisher>RetroZone</publisher>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="nrom" />
|
||||
<feature name="pcb_model" value="Sealie Computing ReproPak revC" />
|
||||
<feature name="mirroring" value="horizontal" />
|
||||
<dataarea name="prg" size="0x8000">
|
||||
<rom name="at27c010.prg" size="0x8000" crc="737a2c4b" sha1="8113124890165d33b2828cf73c196d7de42c66f3" status="baddump" />
|
||||
</dataarea>
|
||||
<dataarea name="chr" size="0x2000">
|
||||
<rom name="at27c512.chr" size="0x2000" crc="aaf8120e" sha1="bfbc8d480ff73b3af746401510f98b1b2c18af86" status="baddump" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="spainter">
|
||||
<description>Super Painter</description>
|
||||
<year>2019</year> <!-- original digital release 20150127 -->
|
||||
|
41
hash/sms.xml
41
hash/sms.xml
@ -3945,6 +3945,18 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="kingqstp1" cloneof="kingqst">
|
||||
<description>King's Quest - Quest for the Crown (USA, prototype, 19890203)</description>
|
||||
<year>1989</year>
|
||||
<publisher>Parker Brothers</publisher>
|
||||
<part name="cart" interface="sms_cart">
|
||||
<feature name="ic3" value="315-5235" /> <!-- Sega Memory Controller -->
|
||||
<dataarea name="rom" size="0x20000">
|
||||
<rom name="king's quest 2-3-89.ic1" size="0x20000" crc="fd27bef1" sha1="9811eb06f4e67bea9c08c4e3446eafed78e2d275" /> <!-- original label: KING'S QUEST 2/3/89 -->
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="kingball">
|
||||
<description>King & Balloon (Korea)</description>
|
||||
<year>19??</year>
|
||||
@ -4612,6 +4624,20 @@ license:CC0
|
||||
<description>Monopoly (USA, prototype)</description>
|
||||
<year>1988</year>
|
||||
<publisher>Sega</publisher>
|
||||
<part name="cart" interface="sms_cart">
|
||||
<feature name="battery" value="yes" />
|
||||
<dataarea name="rom" size="0x20000">
|
||||
<rom name="monopoly [proto 1].bin" size="0x20000" crc="e0d1049b" sha1="6d100d43cddfb761d3560786c26e345873452a4b" />
|
||||
</dataarea>
|
||||
<dataarea name="ram" size="0x2000">
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="monopolyp1" cloneof="monopoly">
|
||||
<description>Monopoly (USA, prototype, alt)</description>
|
||||
<year>1988</year>
|
||||
<publisher>Sega</publisher>
|
||||
<part name="cart" interface="sms_cart">
|
||||
<feature name="battery" value="yes" />
|
||||
<dataarea name="rom" size="131072">
|
||||
@ -6311,6 +6337,21 @@ license:CC0
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="smgpup" cloneof="smgp">
|
||||
<description>Super Monaco GP (USA, prototype)</description>
|
||||
<year>1990</year>
|
||||
<publisher>Sega</publisher>
|
||||
<part name="cart" interface="sms_cart">
|
||||
<feature name="pcb" value="171-5486" />
|
||||
<feature name="ic3" value="315-5235" /> <!-- Sega Memory Controller -->
|
||||
<dataarea name="rom" size="0x40000">
|
||||
<!-- Differs from final release by only 3 header bytes -->
|
||||
<rom name="super monaco 7-18-90.ic1" size="0x20000" crc="e17df02f" sha1="deb24d9b3bbb740ab4e1834328e190b689e85329" offset="0x00000" /> <!-- original label: SUPER MONACO 7/18/90 -->
|
||||
<rom name="ic2" size="0x20000" crc="22418c88" sha1="ddf9c5089cae542d4c752edc98d20dfba81696e7" offset="0x20000" />
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="sms3samp">
|
||||
<description>Promocao Especial M. System III Compact (Brazil, sample)</description>
|
||||
<year>19??</year>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -400,6 +400,18 @@ if (BUSES["ARCHIMEDES_PODULE"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scan256.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scanlight.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scanlight.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_a500.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_a500.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_acorn.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_acorn.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_cumana.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_cumana.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_ling.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_ling.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_morley.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_morley.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_oak.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_oak.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_vti.cpp",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/scsi_vti.h",
|
||||
MAME_DIR .. "src/devices/bus/archimedes/podule/serial.cpp",
|
||||
@ -3539,6 +3551,8 @@ if (BUSES["SMS_CTRL"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/paddle.h",
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/rfu.cpp",
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/rfu.h",
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/rs232adapt.cpp",
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/rs232adapt.h",
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/smsctrl.cpp",
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/smsctrl.h",
|
||||
MAME_DIR .. "src/devices/bus/sms_ctrl/sports.cpp",
|
||||
@ -3569,8 +3583,20 @@ end
|
||||
|
||||
if (BUSES["TANBUS"]~=null) then
|
||||
files {
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/keyboard.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/keyboard.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/mt006.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/mt006.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/mt009.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/mt009.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/spinveti.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/keyboard/spinveti.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/bullsnd.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/bullsnd.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/etirtc.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/etirtc.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/etisnd.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/etisnd.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanbus.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanbus.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanex.cpp",
|
||||
@ -3581,6 +3607,8 @@ if (BUSES["TANBUS"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanhrg.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanram.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanram.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanrtc.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tanrtc.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/mpvdu.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/mpvdu.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/ra32k.cpp",
|
||||
@ -3593,6 +3621,8 @@ if (BUSES["TANBUS"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tug64k.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tug8082.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tug8082.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tugcombo.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tugcombo.h",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tugpgm.cpp",
|
||||
MAME_DIR .. "src/devices/bus/tanbus/tugpgm.h",
|
||||
}
|
||||
|
130
src/devices/bus/archimedes/podule/scsi_a500.cpp
Normal file
130
src/devices/bus/archimedes/podule/scsi_a500.cpp
Normal file
@ -0,0 +1,130 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Acorn A500 SCSI Interface
|
||||
|
||||
https://www.domesday86.com/?page_id=936#Prototype_SCSI_card
|
||||
|
||||
As this podule contains no identification in ROM then the SCSI modules
|
||||
loaded from hard drive would expect to find the SCSI controller in
|
||||
podule slot 1.
|
||||
|
||||
TODO:
|
||||
- map SCSI controller
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "scsi_a500.h"
|
||||
#include "machine/wd33c9x.h"
|
||||
#include "bus/nscsi/devices.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class arc_scsi_a500_device :
|
||||
public device_t,
|
||||
public device_archimedes_podule_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
arc_scsi_a500_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
static constexpr feature_type unemulated_features() { return feature::DISK; }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
// device_archimedes_podule_interface overrides
|
||||
virtual void ioc_map(address_map &map) override;
|
||||
|
||||
private:
|
||||
required_device<wd33c93_device> m_wd33c93;
|
||||
required_memory_region m_podule_rom;
|
||||
};
|
||||
|
||||
|
||||
void arc_scsi_a500_device::ioc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).lr8(NAME([this](offs_t offset) { return m_podule_rom->base()[offset]; })).umask32(0x000000ff);
|
||||
//map(0x2000, 0x2007).rw(m_wd33c93, FUNC(wd33c93_device::indir_r), FUNC(wd33c93_device::indir_w)).umask32(0x000000ff);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( scsi_a500 )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( scsi_a500 )
|
||||
ROM_REGION(0x2000, "podule_rom", ROMREGION_ERASEFF)
|
||||
ROM_LOAD("blank.rom", 0x0000, 0x2000, NO_DUMP) // ROM is labelled 'blank' and contains FF's
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *arc_scsi_a500_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( scsi_a500 );
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_a500_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
NSCSI_BUS(config, "scsi");
|
||||
NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr, false); // Philips VP415
|
||||
NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:7").option_set("wd33c93", WD33C93).clock(DERIVED_CLOCK(1, 1))
|
||||
.machine_config([this](device_t *device)
|
||||
{
|
||||
wd33c93_device &wd33c93(downcast<wd33c93_device &>(*device));
|
||||
wd33c93.irq_cb().set([this](int state) { set_pirq(state); });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// arc_scsi_a500_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
arc_scsi_a500_device::arc_scsi_a500_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, ARC_SCSI_A500, tag, owner, clock)
|
||||
, device_archimedes_podule_interface(mconfig, *this)
|
||||
, m_wd33c93(*this, "scsi:7:wd33c93")
|
||||
, m_podule_rom(*this, "podule_rom")
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_a500_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(ARC_SCSI_A500, device_archimedes_podule_interface, arc_scsi_a500_device, "arc_scsi_a500", "Acorn A500 SCSI Interface")
|
19
src/devices/bus/archimedes/podule/scsi_a500.h
Normal file
19
src/devices/bus/archimedes/podule/scsi_a500.h
Normal file
@ -0,0 +1,19 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Acorn A500 SCSI Interface
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_ARCHIMEDES_PODULE_SCSI_A500_H
|
||||
#define MAME_BUS_ARCHIMEDES_PODULE_SCSI_A500_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "slot.h"
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_A500, device_archimedes_podule_interface)
|
||||
|
||||
#endif // MAME_BUS_ARCHIMEDES_PODULE_SCSI_A500_H
|
253
src/devices/bus/archimedes/podule/scsi_acorn.cpp
Normal file
253
src/devices/bus/archimedes/podule/scsi_acorn.cpp
Normal file
@ -0,0 +1,253 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Acorn AKA31 SCSI Expansion Card
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/32bit_UpgradesA2G/Acorn_AKA31_SCSI.html
|
||||
|
||||
Acorn AKA32 CDFS & SCSI Expansion Card
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/32bit_UpgradesA2G/Acorn_AKA32_SCSI.html
|
||||
|
||||
TODO:
|
||||
- everything, this is skeleton with ROM.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "scsi_acorn.h"
|
||||
#include "machine/upd71071.h"
|
||||
#include "machine/wd33c9x.h"
|
||||
#include "bus/nscsi/devices.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
// ======================> arc_scsi_aka31_device
|
||||
|
||||
class arc_scsi_aka31_device :
|
||||
public device_t,
|
||||
public device_archimedes_podule_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
arc_scsi_aka31_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
static constexpr feature_type unemulated_features() { return feature::DISK; }
|
||||
|
||||
protected:
|
||||
arc_scsi_aka31_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
// device_archimedes_podule_interface overrides
|
||||
virtual void ioc_map(address_map &map) override;
|
||||
virtual void memc_map(address_map &map) override;
|
||||
|
||||
private:
|
||||
required_device<wd33c93a_device> m_wd33c93;
|
||||
required_device<upd71071_device> m_dmac;
|
||||
required_memory_region m_podule_rom;
|
||||
|
||||
void update_interrupts();
|
||||
|
||||
u8 m_memory_page;
|
||||
u8 m_interrupt_status;
|
||||
int m_sbic_int;
|
||||
int m_dmac_int;
|
||||
std::unique_ptr<u16[]> m_podule_ram;
|
||||
};
|
||||
|
||||
|
||||
// ======================> arc_scsi_aka32_device
|
||||
|
||||
class arc_scsi_aka32_device : public arc_scsi_aka31_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
arc_scsi_aka32_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
protected:
|
||||
// optional information overrides
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
};
|
||||
|
||||
|
||||
void arc_scsi_aka31_device::ioc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).lr8(NAME([this](offs_t offset) { return m_podule_rom->base()[offset | (((m_memory_page & 0x3f) << 11) & 0xf800)]; })).umask32(0x000000ff);
|
||||
map(0x2000, 0x2fff).lrw8([this]() { return m_interrupt_status; }, "isr_r", [this](u8 data) { m_dmac_int = 0; update_interrupts(); }, "clrint_w").umask32(0x000000ff);
|
||||
map(0x3000, 0x3000).mirror(0x0fff).lw8(NAME([this](u8 data) { m_memory_page = data; m_wd33c93->reset_w(BIT(data, 7)); update_interrupts(); }));
|
||||
}
|
||||
|
||||
void arc_scsi_aka31_device::memc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).lr16(NAME([this](offs_t offset) { return m_podule_ram[offset | (((m_memory_page & 0x3f) << 11) & 0xf800)]; })).umask32(0x0000ffff);
|
||||
map(0x2000, 0x2007).mirror(0x0ff8).rw(m_wd33c93, FUNC(wd33c93a_device::indir_r), FUNC(wd33c93a_device::indir_w)).umask32(0x000000ff);
|
||||
map(0x3000, 0x33ff).mirror(0x0c00).lr8(NAME([this](offs_t offset) { return m_dmac->read(bitswap<8>(offset, 0, 6, 5, 4, 3, 2, 1, 7)); })).umask32(0x000000ff);
|
||||
map(0x3000, 0x33ff).mirror(0x0c00).lw8(NAME([this](offs_t offset, u8 data) { m_dmac->write(bitswap<8>(offset, 0, 6, 5, 4, 3, 2, 1, 7), data); })).umask32(0x000000ff);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( aka31 )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( aka31 )
|
||||
ROM_REGION(0x10000, "podule_rom", 0)
|
||||
ROM_LOAD("aka31_0273,210-03_scsi_id_prom.rom", 0x0000, 0x10000, CRC(d8a51876) SHA1(fedbd8d8dafb225b931c76704ccb93d4ebdaea10))
|
||||
ROM_END
|
||||
|
||||
ROM_START( aka32 )
|
||||
ROM_REGION(0x10000, "podule_rom", 0)
|
||||
ROM_SYSTEM_BIOS(0, "aka35", "AKA35")
|
||||
ROMX_LOAD("aka35.rom", 0x0000, 0x10000, CRC(2d00a646) SHA1(80e7a88d17bdf5d2111e4e2d1b406a1d8692d41b), ROM_BIOS(0))
|
||||
ROM_SYSTEM_BIOS(1, "aka33", "AKA33")
|
||||
ROMX_LOAD("aka33.rom", 0x0000, 0x10000, CRC(f5b4b6b8) SHA1(ab47366e569add39aea0c6e90e92a4dfd16cb898), ROM_BIOS(1))
|
||||
ROM_SYSTEM_BIOS(2, "aka32", "AKA32")
|
||||
ROMX_LOAD("aka32_acorn_cdfs_version_2.20.rom", 0x0000, 0x10000, CRC(65d74620) SHA1(42bddbe2841de7085371c5fe11d7c9b152070886), ROM_BIOS(2))
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *arc_scsi_aka31_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( aka31 );
|
||||
}
|
||||
|
||||
const tiny_rom_entry *arc_scsi_aka32_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( aka32 );
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_aka31_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
NSCSI_BUS(config, "scsi");
|
||||
NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, "harddisk", false);
|
||||
NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:7").option_set("wd33c93a", WD33C93A).clock(DERIVED_CLOCK(1, 1))
|
||||
.machine_config([this](device_t *device)
|
||||
{
|
||||
wd33c93a_device &wd33c93(downcast<wd33c93a_device &>(*device));
|
||||
wd33c93.irq_cb().set([this](int state) { m_sbic_int = state; update_interrupts(); });
|
||||
wd33c93.drq_cb().set([this](int state) { m_dmac->dmarq(state, 0); });
|
||||
});
|
||||
|
||||
UPD71071(config, m_dmac, 0);
|
||||
m_dmac->set_cpu_tag(":maincpu");
|
||||
m_dmac->set_clock(DERIVED_CLOCK(1, 1));
|
||||
m_dmac->out_eop_callback().set([this](int state) { m_dmac_int = state; update_interrupts(); });
|
||||
m_dmac->dma_read_callback<0>().set(m_wd33c93, FUNC(wd33c93a_device::dma_r));
|
||||
m_dmac->dma_write_callback<0>().set(m_wd33c93, FUNC(wd33c93a_device::dma_w));
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// arc_scsi_aka31_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
arc_scsi_aka31_device::arc_scsi_aka31_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_archimedes_podule_interface(mconfig, *this)
|
||||
, m_wd33c93(*this, "scsi:7:wd33c93a")
|
||||
, m_dmac(*this, "dma")
|
||||
, m_podule_rom(*this, "podule_rom")
|
||||
, m_memory_page(0)
|
||||
, m_interrupt_status(0)
|
||||
, m_sbic_int(0)
|
||||
, m_dmac_int(0)
|
||||
{
|
||||
}
|
||||
|
||||
arc_scsi_aka31_device::arc_scsi_aka31_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: arc_scsi_aka31_device(mconfig, ARC_SCSI_AKA31, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
arc_scsi_aka32_device::arc_scsi_aka32_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: arc_scsi_aka31_device(mconfig, ARC_SCSI_AKA32, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_aka31_device::device_start()
|
||||
{
|
||||
m_podule_ram = std::make_unique<u16[]>(0x8000);
|
||||
|
||||
save_item(NAME(m_memory_page));
|
||||
save_item(NAME(m_interrupt_status));
|
||||
save_pointer(NAME(m_podule_ram), 0x8000);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_aka31_device::device_reset()
|
||||
{
|
||||
m_memory_page = 0x00;
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// IMPLEMENTATION
|
||||
//**************************************************************************
|
||||
|
||||
void arc_scsi_aka31_device::update_interrupts()
|
||||
{
|
||||
// SBIC interrupt
|
||||
if (m_sbic_int)
|
||||
m_interrupt_status |= m_sbic_int << 3;
|
||||
else
|
||||
m_interrupt_status &= ~(m_sbic_int << 3);
|
||||
|
||||
// DMAC terminal count interrupt
|
||||
if (m_dmac_int)
|
||||
m_interrupt_status |= m_dmac_int << 1;
|
||||
else
|
||||
m_interrupt_status &= ~(m_dmac_int << 1);
|
||||
|
||||
// SEC requesting IRQ
|
||||
if (m_dmac_int || m_sbic_int)
|
||||
m_interrupt_status |= 0x01;
|
||||
else
|
||||
m_interrupt_status &= ~(0x01);
|
||||
|
||||
if (BIT(m_memory_page, 6)) // interrupts enabled
|
||||
set_pirq(BIT(m_interrupt_status, 0));
|
||||
else
|
||||
set_pirq(0);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(ARC_SCSI_AKA31, device_archimedes_podule_interface, arc_scsi_aka31_device, "arc_scsi_aka31", "Acorn AKA31 SCSI Expansion Card")
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(ARC_SCSI_AKA32, device_archimedes_podule_interface, arc_scsi_aka32_device, "arc_scsi_aka32", "Acorn AKA32 CDFS & SCSI Expansion Card")
|
21
src/devices/bus/archimedes/podule/scsi_acorn.h
Normal file
21
src/devices/bus/archimedes/podule/scsi_acorn.h
Normal file
@ -0,0 +1,21 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Acorn CDFS & SCSI Expansion Card
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_ARCHIMEDES_PODULE_SCSI_ACORN_H
|
||||
#define MAME_BUS_ARCHIMEDES_PODULE_SCSI_ACORN_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "slot.h"
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_AKA31, device_archimedes_podule_interface)
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_AKA32, device_archimedes_podule_interface)
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_AKA35, device_archimedes_podule_interface)
|
||||
|
||||
#endif // MAME_BUS_ARCHIMEDES_PODULE_SCSI_ACORN_H
|
153
src/devices/bus/archimedes/podule/scsi_cumana.cpp
Normal file
153
src/devices/bus/archimedes/podule/scsi_cumana.cpp
Normal file
@ -0,0 +1,153 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Cumana 16bit SCSI interface
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/32bit_UpgradesA2G/Cumana_16bitSCSI.html
|
||||
|
||||
TODO:
|
||||
- everything, this is skeleton with ROM.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "scsi_cumana.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "machine/ncr5380.h"
|
||||
#include "bus/nscsi/devices.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class arc_scsi_cumana_device :
|
||||
public device_t,
|
||||
public device_archimedes_podule_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
arc_scsi_cumana_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
static constexpr feature_type unemulated_features() { return feature::DISK; }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
// device_archimedes_podule_interface overrides
|
||||
virtual void ioc_map(address_map &map) override;
|
||||
virtual void memc_map(address_map &map) override;
|
||||
|
||||
private:
|
||||
required_device<ncr5380_device> m_ncr5380;
|
||||
required_device<eeprom_serial_93cxx_device> m_eeprom;
|
||||
required_memory_region m_podule_rom;
|
||||
|
||||
u8 m_rom_page;
|
||||
};
|
||||
|
||||
|
||||
void arc_scsi_cumana_device::ioc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).lr8(NAME([this](offs_t offset) { return m_podule_rom->base()[offset | ((m_rom_page << 11) & 0xf800)]; })).umask32(0x000000ff);
|
||||
map(0x0000, 0x1fff).lw8(NAME([this](u8 data) { m_rom_page = data; }));
|
||||
//map(0x2000, 0x201f).mirror(0x0100).rw(m_ncr5380, FUNC(ncr5380_device::read), FUNC(ncr5380_device::write)).umask32(0x000000ff);
|
||||
map(0x2100, 0x211f).m(m_ncr5380, FUNC(ncr5380_device::map)).umask32(0x000000ff);
|
||||
//map(0x2100, 0x2100).r(m_ncr5380, FUNC(ncr5380_device::dma_r));
|
||||
//map(0x2100, 0x2100).w(m_ncr5380, FUNC(ncr5380_device::dma_w));
|
||||
}
|
||||
|
||||
void arc_scsi_cumana_device::memc_map(address_map &map)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( scsi_cumana )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( scsi_cumana )
|
||||
ROM_REGION(0x10000, "podule_rom", 0)
|
||||
ROM_LOAD("cumana_930c.rom", 0x0000, 0x10000, CRC(d121025d) SHA1(293b1dabd02cfa34251116d95dd19e8b58d0f0a5))
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *arc_scsi_cumana_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( scsi_cumana );
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_cumana_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
NSCSI_BUS(config, "scsi");
|
||||
NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, "harddisk", false);
|
||||
NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5380", NCR5380) // DP8490
|
||||
.machine_config([this](device_t *device)
|
||||
{
|
||||
downcast<ncr5380_device &>(*device).irq_handler().set([this](int state) { set_pirq(state); });
|
||||
});
|
||||
|
||||
EEPROM_93C06_16BIT(config, m_eeprom);
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// arc_scsi_cumana_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
arc_scsi_cumana_device::arc_scsi_cumana_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, ARC_SCSI_CUMANA, tag, owner, clock)
|
||||
, device_archimedes_podule_interface(mconfig, *this)
|
||||
, m_ncr5380(*this, "scsi:7:ncr5380")
|
||||
, m_eeprom(*this, "eeprom")
|
||||
, m_podule_rom(*this, "podule_rom")
|
||||
, m_rom_page(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_cumana_device::device_start()
|
||||
{
|
||||
save_item(NAME(m_rom_page));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_cumana_device::device_reset()
|
||||
{
|
||||
m_rom_page = 0x00;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(ARC_SCSI_CUMANA, device_archimedes_podule_interface, arc_scsi_cumana_device, "arc_scsi_cumana", "Cumana 16bit SCSI Interface")
|
19
src/devices/bus/archimedes/podule/scsi_cumana.h
Normal file
19
src/devices/bus/archimedes/podule/scsi_cumana.h
Normal file
@ -0,0 +1,19 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Cumana 16bit SCSI interface
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_ARCHIMEDES_PODULE_SCSI_CUMANA_H
|
||||
#define MAME_BUS_ARCHIMEDES_PODULE_SCSI_CUMANA_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "slot.h"
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_CUMANA, device_archimedes_podule_interface)
|
||||
|
||||
#endif // MAME_BUS_ARCHIMEDES_PODULE_SCSI_CUMANA_H
|
149
src/devices/bus/archimedes/podule/scsi_ling.cpp
Normal file
149
src/devices/bus/archimedes/podule/scsi_ling.cpp
Normal file
@ -0,0 +1,149 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Lingenuity SCSI Podule
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/32bit_UpgradesH2Z/Lingenuity_SCSI.html
|
||||
|
||||
TODO:
|
||||
- everything, this is skeleton with ROM.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "scsi_ling.h"
|
||||
#include "machine/ncr5380.h"
|
||||
#include "bus/nscsi/devices.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class arc_scsi_ling_device :
|
||||
public device_t,
|
||||
public device_archimedes_podule_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
arc_scsi_ling_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
static constexpr feature_type unemulated_features() { return feature::DISK; }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
// device_archimedes_podule_interface overrides
|
||||
virtual void ioc_map(address_map &map) override;
|
||||
virtual void memc_map(address_map &map) override;
|
||||
|
||||
private:
|
||||
required_device<ncr5380_device> m_ncr5380;
|
||||
required_memory_region m_podule_rom;
|
||||
|
||||
u8 m_rom_page;
|
||||
};
|
||||
|
||||
|
||||
void arc_scsi_ling_device::ioc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).lr8(NAME([this](offs_t offset) { return m_podule_rom->base()[offset | ((m_rom_page << 11) & 0xf800)]; })).umask32(0x000000ff);
|
||||
map(0x3800, 0x3800).lw8(NAME([this](u8 data) { m_rom_page = data; }));
|
||||
}
|
||||
|
||||
void arc_scsi_ling_device::memc_map(address_map &map)
|
||||
{
|
||||
//map(0x2000, 0x20ff).m(m_ncr5380, FUNC(ncr5380_device::map)).umask32(0x000000ff);
|
||||
map(0x2000, 0x20ff).lr8(NAME([this](offs_t offset) { logerror("r: offset %02x\n", offset >> 3); return m_ncr5380->read(offset >> 3); })).umask32(0x000000ff);
|
||||
map(0x2000, 0x20ff).lw8(NAME([this](offs_t offset, u8 data) { logerror("w: offset %02x data %02x\n", offset >> 3, data); m_ncr5380->write(offset >> 3, data); })).umask32(0x000000ff);
|
||||
map(0x2100, 0x2100).r(m_ncr5380, FUNC(ncr5380_device::dma_r));
|
||||
map(0x2100, 0x2100).w(m_ncr5380, FUNC(ncr5380_device::dma_w));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( scsi_ling )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( scsi_ling )
|
||||
ROM_REGION(0x10000, "podule_rom", 0)
|
||||
ROM_LOAD("scsi_2.54.rom", 0x0000, 0x10000, CRC(32926220) SHA1(c05ea28f33afa98bd9d18bfe7dafee0a5fe7f2f4))
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *arc_scsi_ling_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( scsi_ling );
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_ling_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
NSCSI_BUS(config, "scsi");
|
||||
NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, "harddisk", false);
|
||||
NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5380", NCR5380)
|
||||
.machine_config([this](device_t *device)
|
||||
{
|
||||
downcast<ncr5380_device &>(*device).irq_handler().set([this](int state) { set_pirq(state); });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// arc_scsi_ling_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
arc_scsi_ling_device::arc_scsi_ling_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, ARC_SCSI_LING, tag, owner, clock)
|
||||
, device_archimedes_podule_interface(mconfig, *this)
|
||||
, m_ncr5380(*this, "scsi:7:ncr5380")
|
||||
, m_podule_rom(*this, "podule_rom")
|
||||
, m_rom_page(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_ling_device::device_start()
|
||||
{
|
||||
save_item(NAME(m_rom_page));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_ling_device::device_reset()
|
||||
{
|
||||
m_rom_page = 0x00;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(ARC_SCSI_LING, device_archimedes_podule_interface, arc_scsi_ling_device, "arc_scsi_ling", "Lingenuity SCSI Podule")
|
19
src/devices/bus/archimedes/podule/scsi_ling.h
Normal file
19
src/devices/bus/archimedes/podule/scsi_ling.h
Normal file
@ -0,0 +1,19 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Lingenuity SCSI Podule
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_ARCHIMEDES_PODULE_SCSI_LING_H
|
||||
#define MAME_BUS_ARCHIMEDES_PODULE_SCSI_LING_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "slot.h"
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_LING, device_archimedes_podule_interface)
|
||||
|
||||
#endif // MAME_BUS_ARCHIMEDES_PODULE_SCSI_LING_H
|
169
src/devices/bus/archimedes/podule/scsi_morley.cpp
Normal file
169
src/devices/bus/archimedes/podule/scsi_morley.cpp
Normal file
@ -0,0 +1,169 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Morley Electronics 16bit Cached SCSI card
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/32bit_UpgradesH2Z/Morley_16bitCachedSCSI.html
|
||||
|
||||
TODO:
|
||||
- ESP216 SCSI controller
|
||||
- everything, this is skeleton with ROM.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "scsi_morley.h"
|
||||
#include "machine/7200fifo.h"
|
||||
#include "machine/ncr5390.h"
|
||||
#include "bus/nscsi/devices.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class arc_scsi_morley_device :
|
||||
public device_t,
|
||||
public device_archimedes_podule_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
arc_scsi_morley_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
static constexpr feature_type unemulated_features() { return feature::DISK; }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
// device_archimedes_podule_interface overrides
|
||||
virtual void ioc_map(address_map &map) override;
|
||||
virtual void memc_map(address_map &map) override;
|
||||
|
||||
private:
|
||||
required_device<ncr53c94_device> m_esp216;
|
||||
required_device<idt7201_device> m_fifo_in;
|
||||
required_device<idt7201_device> m_fifo_out;
|
||||
required_memory_region m_podule_rom;
|
||||
|
||||
u8 m_rom_page;
|
||||
};
|
||||
|
||||
|
||||
void arc_scsi_morley_device::ioc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x0fff).lr8(NAME([this](offs_t offset) { return m_podule_rom->base()[offset | ((m_rom_page << 10) & 0xfc00)]; })).umask32(0x000000ff);
|
||||
//map(0x3000, 0x3000).lrw8(NAME([this]() { return m_rom_page; }), NAME([this](u8 data) { m_rom_page = data; }));
|
||||
//map(0x3000, 0x303f).rw(m_esp216, FUNC(ncr53c94_device::read), FUNC(ncr53c94_device::write)).umask32(0x000000ff);
|
||||
}
|
||||
|
||||
void arc_scsi_morley_device::memc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x0000).lrw8(NAME([this]() { return m_rom_page; }), NAME([this](u8 data) { m_rom_page = data; }));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( scsi_morley )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( scsi_morley )
|
||||
ROM_REGION(0x10000, "podule_rom", ROMREGION_ERASE00)
|
||||
ROM_SYSTEM_BIOS(0, "119", "V1.19")
|
||||
ROMX_LOAD("morley_scsi_rom_v1.19.rom", 0x0000, 0x10000, CRC(78e2e0da) SHA1(08d8f6233d5cae8a3a04f29c16c8cf85788dad46), ROM_BIOS(0))
|
||||
ROM_SYSTEM_BIOS(1, "117", "V1.17")
|
||||
ROMX_LOAD("morley_scsi_rom_v1.17.rom", 0x0000, 0x10000, CRC(1397a7b3) SHA1(5b0b7d2bb123db85922b493213c6d60ad4d89020), ROM_BIOS(1))
|
||||
ROM_SYSTEM_BIOS(2, "114", "V1.14")
|
||||
ROMX_LOAD("morley_scsi_rom_v1.14.rom", 0x0000, 0x10000, CRC(c6e15260) SHA1(e2b591484d47d4b4e0edb823f992257f03d32bd6), ROM_BIOS(2))
|
||||
ROM_SYSTEM_BIOS(3, "110", "V1.10")
|
||||
ROMX_LOAD("morley_scsi_rom_v1.10.rom", 0x0000, 0x10000, CRC(a0941679) SHA1(e92902e67d955e8742a7ac92dd86a8f212801dc5), ROM_BIOS(3))
|
||||
ROM_SYSTEM_BIOS(4, "108", "V1.08")
|
||||
ROMX_LOAD("morley_scsi_rom_v1.08.rom", 0x0000, 0x08000, CRC(e8357473) SHA1(9164ef9edc9d2ed6a7a7c9ba6258e02db9b1d2cb), ROM_BIOS(4))
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *arc_scsi_morley_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( scsi_morley );
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_morley_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
NSCSI_BUS(config, "scsi");
|
||||
NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, "harddisk", false);
|
||||
NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:7").option_set("esp216", NCR53CF94).clock(24_MHz_XTAL) // ESP216
|
||||
.machine_config([this](device_t *device)
|
||||
{
|
||||
ncr53c94_device &esp216(downcast<ncr53c94_device &>(*device));
|
||||
esp216.set_busmd(ncr53c94_device::busmd_t::BUSMD_1);
|
||||
esp216.irq_handler_cb().set([this](int state) { set_pirq(state); });
|
||||
//esp216.drq_handler_cb().set([this](int state) { m_drq_status = state; });
|
||||
});
|
||||
|
||||
IDT7201(config, m_fifo_out);
|
||||
//m_fifo_out->hf_handler().set([this](int state) { set_irq(IRQ_FIFO_OUT, state); });
|
||||
IDT7201(config, m_fifo_in);
|
||||
//m_fifo_in->hf_handler().set([this](int state) { set_irq(IRQ_FIFO_IN, !state); });
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// arc_scsi_morley_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
arc_scsi_morley_device::arc_scsi_morley_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, ARC_SCSI_MORLEY, tag, owner, clock)
|
||||
, device_archimedes_podule_interface(mconfig, *this)
|
||||
, m_esp216(*this, "scsi:7:esp216")
|
||||
, m_fifo_in(*this, "fifo_in")
|
||||
, m_fifo_out(*this, "fifo_out")
|
||||
, m_podule_rom(*this, "podule_rom")
|
||||
, m_rom_page(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_morley_device::device_start()
|
||||
{
|
||||
save_item(NAME(m_rom_page));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_morley_device::device_reset()
|
||||
{
|
||||
m_rom_page = 0x00;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(ARC_SCSI_MORLEY, device_archimedes_podule_interface, arc_scsi_morley_device, "arc_scsi_morley", "Morley Electronics 16bit Cached SCSI card")
|
19
src/devices/bus/archimedes/podule/scsi_morley.h
Normal file
19
src/devices/bus/archimedes/podule/scsi_morley.h
Normal file
@ -0,0 +1,19 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Morley Electronics 16bit Cached SCSI card
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_ARCHIMEDES_PODULE_SCSI_MORLEY_H
|
||||
#define MAME_BUS_ARCHIMEDES_PODULE_SCSI_MORLEY_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "slot.h"
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_MORLEY, device_archimedes_podule_interface)
|
||||
|
||||
#endif // MAME_BUS_ARCHIMEDES_PODULE_SCSI_MORLEY_H
|
263
src/devices/bus/archimedes/podule/scsi_oak.cpp
Normal file
263
src/devices/bus/archimedes/podule/scsi_oak.cpp
Normal file
@ -0,0 +1,263 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Oak Solutions SCSI Interface
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/32bit_UpgradesH2Z/Oak_SCSI.html
|
||||
|
||||
Podule space :
|
||||
ROM: ROM a0..11 from podule A2..13,
|
||||
ROM a12..15 come from latch.
|
||||
A14,15 are inverted to allow any size from 2764 to 512 to be used without
|
||||
link changes. Data is via D0..7
|
||||
|
||||
|
||||
MEMC space :
|
||||
All reads/writes set the latch from b8..11 of the address used,
|
||||
unless b5,6 = 11 (eeprom read)
|
||||
|
||||
Address Address bit
|
||||
|
||||
2,3,4 : 5380 register select :
|
||||
|
||||
&000 000 SCSI Data read/write
|
||||
&004 001 Initiator command register
|
||||
&008 010 Mode register
|
||||
&00C 011 Target command register
|
||||
&010 100 SCSI status/select enable
|
||||
&014 101 Bus & status register /start dma send
|
||||
&018 110 input data/start dma target receive
|
||||
&01C 111 reset IRQ/start DMA init receive
|
||||
|
||||
5,6 : Main address decode :
|
||||
&000 00 Read/write 5380
|
||||
&020 01 Read/write 5380 DMA data (uses DACK instead of CS)
|
||||
(DMA mode bit determines 8 or 16 bit DMA mode)
|
||||
&040 10 d8 = byte flag, d9 = irq state, d10 = DRQ state
|
||||
&060 11 d0 = EEprom data
|
||||
|
||||
&100 8 : EEProm CS
|
||||
&200 9 : ROM A12, 16 bit DMA enable
|
||||
&400 10 : ROM A13, DMA mode select (1=write), EEProm data in
|
||||
&800 11 : ROM !A14, EEProm Clock
|
||||
&1000 12 : ROM !A15
|
||||
|
||||
When 16 bit DMA is enabled, and b5,6 = 01, the i/o cycle is stretched until
|
||||
2 bytes of data have been transferred from SCSI. There is a hardware timeout
|
||||
of 125 microseconds. This period can be changed via a link. All other
|
||||
accesses are fast MEMC cycles (250ns).
|
||||
|
||||
The latch and 5380 are reset after a hardware reset.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "scsi_oak.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "machine/ncr5380.h"
|
||||
#include "bus/nscsi/devices.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class arc_scsi_oak_device :
|
||||
public device_t,
|
||||
public device_archimedes_podule_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
arc_scsi_oak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
static constexpr feature_type unemulated_features() { return feature::DISK; }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
// device_archimedes_podule_interface overrides
|
||||
virtual void ioc_map(address_map &map) override;
|
||||
virtual void memc_map(address_map &map) override;
|
||||
|
||||
private:
|
||||
required_device<ncr5380_device> m_ncr5380;
|
||||
required_device<eeprom_serial_93cxx_device> m_eeprom;
|
||||
required_memory_region m_podule_rom;
|
||||
|
||||
u8 m_rom_page;
|
||||
int m_irq_state;
|
||||
int m_drq_state;
|
||||
};
|
||||
|
||||
|
||||
void arc_scsi_oak_device::ioc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x3fff).lr8(NAME([this](offs_t offset) { return m_podule_rom->base()[offset | (((m_rom_page ^ 0x0c) << 12) & 0xf000)]; })).umask32(0x000000ff);
|
||||
}
|
||||
|
||||
void arc_scsi_oak_device::memc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x3fff).lrw16(
|
||||
NAME([this](offs_t offset)
|
||||
{
|
||||
u16 data = 0xffff;
|
||||
|
||||
offset <<= 2;
|
||||
|
||||
if ((offset & 0xe0) != 0x60)
|
||||
m_rom_page = (offset >> 9) & 0x0f;
|
||||
|
||||
m_eeprom->di_write(BIT(offset, 11));
|
||||
m_eeprom->clk_write(BIT(offset, 10));
|
||||
m_eeprom->cs_write(BIT(offset, 8));
|
||||
|
||||
switch (offset & 0xe0)
|
||||
{
|
||||
case 0x00:
|
||||
data = m_ncr5380->read(offset >> 2);
|
||||
break;
|
||||
|
||||
case 0x20:
|
||||
data = m_ncr5380->dma_r();
|
||||
|
||||
if (offset & 0x200)
|
||||
data |= m_ncr5380->dma_r() << 8;
|
||||
break;
|
||||
|
||||
case 0x40:
|
||||
data = 0x0000;
|
||||
data |= m_irq_state << 9;
|
||||
data |= m_drq_state << 8;
|
||||
break;
|
||||
|
||||
case 0x60:
|
||||
data = m_eeprom->do_read();
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}),
|
||||
NAME([this](offs_t offset, u32 data)
|
||||
{
|
||||
offset <<= 2;
|
||||
|
||||
if ((offset & 0xe0) != 0x60)
|
||||
m_rom_page = (offset >> 9) & 0x0f;
|
||||
|
||||
switch (offset & 0xe0)
|
||||
{
|
||||
case 0x00:
|
||||
m_ncr5380->write(offset >> 2, data & 0xff);
|
||||
break;
|
||||
|
||||
case 0x20:
|
||||
m_ncr5380->dma_w(data & 0xff);
|
||||
|
||||
if (offset & 0x200)
|
||||
m_ncr5380->dma_w(data >> 8);
|
||||
break;
|
||||
}
|
||||
})).umask32(0x0000ffff);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( scsi_oak )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( scsi_oak )
|
||||
ROM_REGION(0x10000, "podule_rom", ROMREGION_ERASE00)
|
||||
ROM_SYSTEM_BIOS(0, "136", "Oak SCSI driver 1.36 (29 Nov 1993)")
|
||||
ROMX_LOAD("scsi_rom_1.36.rom", 0x0000, 0x10000, CRC(9571ac99) SHA1(bf41e422135ceb8048b04efae10cea32eb4bb864), ROM_BIOS(0))
|
||||
ROM_SYSTEM_BIOS(1, "116", "Oak SCSI driver 1.16 (04 Oct 1990)")
|
||||
ROMX_LOAD("scsi_rom_1.16.rom", 0xc000, 0x04000, CRC(f05c414c) SHA1(de7f6cc27ff09b34b132d7ced5123926005be18d), ROM_BIOS(1))
|
||||
ROM_SYSTEM_BIOS(2, "137", "Oak SCSI driver 1.37 (27 Jul 1994)")
|
||||
ROMX_LOAD("scsi_rom_1.37.rom", 0x0000, 0x10000, CRC(c1e12d48) SHA1(cba365e35aa84d6a9ca98d678fa61fe3a7a7ac3c), ROM_BIOS(2))
|
||||
|
||||
ROM_REGION16_LE(0x20, "eeprom", ROMREGION_ERASEFF)
|
||||
ROM_LOAD("93c06n", 0x00, 0x20, CRC(45badabc) SHA1(c102d90e4f5c16fedde1ba4637170a39ed7ab371))
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *arc_scsi_oak_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( scsi_oak );
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_oak_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
NSCSI_BUS(config, "scsi");
|
||||
NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, "harddisk", false);
|
||||
NSCSI_CONNECTOR(config, "scsi:1", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:2", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:3", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:4", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:5", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:6", default_scsi_devices, nullptr, false);
|
||||
NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5380", NCR5380)
|
||||
.machine_config([this](device_t *device)
|
||||
{
|
||||
downcast<ncr5380_device&>(*device).irq_handler().set([this](int state) { m_irq_state = state; });
|
||||
downcast<ncr5380_device &>(*device).drq_handler().set([this](int state) { m_drq_state = state; });
|
||||
});
|
||||
|
||||
EEPROM_93C06_16BIT(config, m_eeprom);
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// arc_scsi_oak_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
arc_scsi_oak_device::arc_scsi_oak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, ARC_SCSI_OAK, tag, owner, clock)
|
||||
, device_archimedes_podule_interface(mconfig, *this)
|
||||
, m_ncr5380(*this, "scsi:7:ncr5380")
|
||||
, m_eeprom(*this, "eeprom")
|
||||
, m_podule_rom(*this, "podule_rom")
|
||||
, m_rom_page(0)
|
||||
, m_irq_state(0)
|
||||
, m_drq_state(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_oak_device::device_start()
|
||||
{
|
||||
save_item(NAME(m_rom_page));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void arc_scsi_oak_device::device_reset()
|
||||
{
|
||||
m_rom_page = 0x00;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(ARC_SCSI_OAK, device_archimedes_podule_interface, arc_scsi_oak_device, "arc_scsi_oak", "Oak Solutions 16 bit SCSI Interface")
|
19
src/devices/bus/archimedes/podule/scsi_oak.h
Normal file
19
src/devices/bus/archimedes/podule/scsi_oak.h
Normal file
@ -0,0 +1,19 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Oak Solutions SCSI Interface
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_ARCHIMEDES_PODULE_SCSI_OAK_H
|
||||
#define MAME_BUS_ARCHIMEDES_PODULE_SCSI_OAK_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "slot.h"
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(ARC_SCSI_OAK, device_archimedes_podule_interface)
|
||||
|
||||
#endif // MAME_BUS_ARCHIMEDES_PODULE_SCSI_OAK_H
|
@ -272,6 +272,7 @@ void device_archimedes_podule_interface::interface_post_start()
|
||||
#include "io.h"
|
||||
#include "io_hccs.h"
|
||||
#include "io_morley.h"
|
||||
//#include "io_oak.h"
|
||||
#include "io_we.h"
|
||||
#include "lark.h"
|
||||
#include "laserd.h"
|
||||
@ -284,11 +285,12 @@ void device_archimedes_podule_interface::interface_post_start()
|
||||
#include "rs423.h"
|
||||
#include "scan256.h"
|
||||
#include "scanlight.h"
|
||||
//#include "scsi_a500.h"
|
||||
//#include "scsi_acorn.h"
|
||||
//#include "scsi_ling.h"
|
||||
//#include "scsi_morley.h"
|
||||
//#include "scsi_oak.h"
|
||||
#include "scsi_a500.h"
|
||||
#include "scsi_acorn.h"
|
||||
#include "scsi_cumana.h"
|
||||
#include "scsi_ling.h"
|
||||
#include "scsi_morley.h"
|
||||
#include "scsi_oak.h"
|
||||
#include "scsi_vti.h"
|
||||
#include "serial.h"
|
||||
#include "spectra.h"
|
||||
@ -351,12 +353,13 @@ void archimedes_exp_devices(device_slot_interface &device)
|
||||
device.option_add("scanjunior", ARC_SCANJUNIOR); // Computer Concepts ScanLight Junior
|
||||
device.option_add("scanjunior3", ARC_SCANJUNIOR3); // Computer Concepts ScanLight Junior Mk3
|
||||
device.option_add("scanvideo", ARC_SCANVIDEO); // Computer Concepts ScanLight Video 256
|
||||
//device.option_add("scsi_a500", ARC_SCSI_A500); // Acorn A500 SCSI Interface
|
||||
//device.option_add("scsi_aka31", ARC_SCSI_AKA31); // Acorn AKA31 SCSI Expansion Card
|
||||
//device.option_add("scsi_aka32", ARC_SCSI_AKA32); // Acorn AKA32 CDFS & SCSI Expansion Card
|
||||
//device.option_add("scsi_ling", ARC_SCSI_LING); // Lingenuity SCSI Podule
|
||||
//device.option_add("scsi_morley", ARC_SCSI_MORLEY); // Morley Electronics 16bit Cached SCSI card
|
||||
//device.option_add("scsi_oak", ARC_SCSI_OAK); // Oak Solutions SCSI Interface
|
||||
device.option_add("scsi_a500", ARC_SCSI_A500); // Acorn A500 SCSI Interface
|
||||
device.option_add("scsi_aka31", ARC_SCSI_AKA31); // Acorn AKA31 SCSI Expansion Card
|
||||
device.option_add("scsi_aka32", ARC_SCSI_AKA32); // Acorn AKA32 CDFS & SCSI Expansion Card
|
||||
device.option_add("scsi_cumana", ARC_SCSI_CUMANA); // Cumana 16bit SCSI interface
|
||||
device.option_add("scsi_ling", ARC_SCSI_LING); // Lingenuity SCSI Podule
|
||||
device.option_add("scsi_morley", ARC_SCSI_MORLEY); // Morley Electronics 16bit Cached SCSI card
|
||||
device.option_add("scsi_oak", ARC_SCSI_OAK); // Oak Solutions SCSI Interface
|
||||
device.option_add("scsi_vti", ARC_SCSI_VTI); // VTI User Port and SCSI Podule
|
||||
device.option_add("serial", ARC_SERIAL); // Atomwide Serial Expansion Card
|
||||
device.option_add("spectra", ARC_SPECTRA); // Beebug Spectra Colour Scanner
|
||||
@ -371,6 +374,7 @@ void archimedes_exp_devices(device_slot_interface &device)
|
||||
|
||||
void archimedes_mini_exp_devices(device_slot_interface &device)
|
||||
{
|
||||
//device.option_add("a3user_oak", ARC_A3USER_OAK); // Oak Solutions A3000 User/Analogue Port
|
||||
device.option_add("bbcio_aga30", ARC_BBCIO_AGA30); // Acorn AGA30 BBC I/O Podule
|
||||
device.option_add("bbcio_we", ARC_BBCIO_WE); // Watford BBC User I/O Card
|
||||
//device.option_add("disc_a3k6", ARC_DISC_A3K6); // PRES A3K6 Disc Buffer
|
||||
|
@ -34,6 +34,12 @@
|
||||
Not a PALPROM carrier board but a larger ROM carrier containing 4x32K
|
||||
and TTL circuits to enable and page each ROM into 16K banks.
|
||||
|
||||
Acornsoft Trilogy Emulator (PAL20R4)
|
||||
An unreleased product that combines the View family of ROMs into a
|
||||
single banked 64K ROM, using a PAL to perform 16K bank switches upon
|
||||
reads from the last 4 bytes of ROM space &BFFC to &BFFF. Only known
|
||||
example loaned by Stuart Swales.
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
@ -53,6 +59,7 @@ DEFINE_DEVICE_TYPE(BBC_PALTED, bbc_palted_device, "bbc_palted", "Watford Electro
|
||||
DEFINE_DEVICE_TYPE(BBC_PALABEP, bbc_palabep_device, "bbc_palabep", "P.R.E.S. 32K ROM Carrier (ABE+)")
|
||||
DEFINE_DEVICE_TYPE(BBC_PALABE, bbc_palabe_device, "bbc_palabe", "P.R.E.S. 32K ROM Carrier (ABE)")
|
||||
DEFINE_DEVICE_TYPE(BBC_PALMO2, bbc_palmo2_device, "bbc_palmo2", "Instant Mini Office 2 ROM Carrier")
|
||||
DEFINE_DEVICE_TYPE(BBC_TRILOGY, bbc_trilogy_device, "bbc_trilogy", "Acornsoft Trilogy Emulator")
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
@ -115,6 +122,11 @@ bbc_palmo2_device::bbc_palmo2_device(const machine_config &mconfig, const char *
|
||||
{
|
||||
}
|
||||
|
||||
bbc_trilogy_device::bbc_trilogy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: bbc_pal_device(mconfig, BBC_TRILOGY, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
@ -310,3 +322,17 @@ uint8_t bbc_palmo2_device::read(offs_t offset)
|
||||
|
||||
return get_rom_base()[(offset & 0x3fff) | (m_bank << 13)];
|
||||
}
|
||||
|
||||
uint8_t bbc_trilogy_device::read(offs_t offset)
|
||||
{
|
||||
if (!machine().side_effects_disabled())
|
||||
{
|
||||
/* switching zones for Acornsoft Trilogy Emulator */
|
||||
switch (offset & 0x3ff8)
|
||||
{
|
||||
case 0x3ff8: m_bank = offset & 0x03; break;
|
||||
}
|
||||
}
|
||||
|
||||
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
|
||||
}
|
||||
|
@ -151,6 +151,19 @@ protected:
|
||||
virtual uint8_t read(offs_t offset) override;
|
||||
};
|
||||
|
||||
// ======================> bbc_trilogy_device
|
||||
|
||||
class bbc_trilogy_device : public bbc_pal_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
bbc_trilogy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
// device_bbc_rom_interface overrides
|
||||
virtual uint8_t read(offs_t offset) override;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(BBC_CCIWORD, bbc_cciword_device)
|
||||
@ -162,6 +175,7 @@ DECLARE_DEVICE_TYPE(BBC_PALTED, bbc_palted_device)
|
||||
DECLARE_DEVICE_TYPE(BBC_PALABEP, bbc_palabep_device)
|
||||
DECLARE_DEVICE_TYPE(BBC_PALABE, bbc_palabe_device)
|
||||
DECLARE_DEVICE_TYPE(BBC_PALMO2, bbc_palmo2_device)
|
||||
DECLARE_DEVICE_TYPE(BBC_TRILOGY, bbc_trilogy_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_BBC_ROM_PAL_H
|
||||
|
@ -213,6 +213,7 @@ void bbc_romslot_device::write(offs_t offset, uint8_t data)
|
||||
#include "datagem.h"
|
||||
#include "dfs.h"
|
||||
#include "genie.h"
|
||||
//#include "gommc.h"
|
||||
#include "pal.h"
|
||||
//#include "ramagic.h"
|
||||
#include "rtc.h"
|
||||
@ -234,8 +235,10 @@ void bbc_rom_devices(device_slot_interface &device)
|
||||
device.option_add_internal("palmo2", BBC_PALMO2);
|
||||
device.option_add_internal("datagem", BBC_DATAGEM);
|
||||
device.option_add_internal("genie", BBC_PMSGENIE);
|
||||
//device.option_add_internal("gommc", BBC_GOMMC);
|
||||
device.option_add_internal("dfse00", BBC_DFSE00);
|
||||
//device.option_add_internal("ramagic", BBC_RAMAGIC);
|
||||
device.option_add_internal("stlrtc", BBC_STLRTC);
|
||||
device.option_add_internal("pmsrtc", BBC_PMSRTC);
|
||||
device.option_add_internal("trilogy", BBC_TRILOGY);
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ void cococart_slot_device::device_start()
|
||||
m_cart_line.value = line_value::CLEAR;
|
||||
m_cart_line.line = 0;
|
||||
m_cart_line.q_count = 0;
|
||||
m_cart_callback.resolve();
|
||||
m_cart_callback.resolve_safe();
|
||||
m_cart_line.callback = &m_cart_callback;
|
||||
|
||||
m_nmi_line.timer_index = 0;
|
||||
@ -161,7 +161,7 @@ void cococart_slot_device::device_start()
|
||||
m_nmi_line.value = line_value::CLEAR;
|
||||
m_nmi_line.line = 0;
|
||||
m_nmi_line.q_count = 0;
|
||||
m_nmi_callback.resolve();
|
||||
m_nmi_callback.resolve_safe();
|
||||
m_nmi_line.callback = &m_nmi_callback;
|
||||
|
||||
m_halt_line.timer_index = 0;
|
||||
@ -169,7 +169,7 @@ void cococart_slot_device::device_start()
|
||||
m_halt_line.value = line_value::CLEAR;
|
||||
m_halt_line.line = 0;
|
||||
m_halt_line.q_count = 0;
|
||||
m_halt_callback.resolve();
|
||||
m_halt_callback.resolve_safe();
|
||||
m_halt_line.callback = &m_halt_callback;
|
||||
|
||||
m_cart = get_card_device();
|
||||
@ -346,9 +346,8 @@ void cococart_slot_device::set_line(line ln, coco_cartridge_line &line, cococart
|
||||
break;
|
||||
}
|
||||
|
||||
/* invoke the callback, if present */
|
||||
if (!(*line.callback).isnull())
|
||||
(*line.callback)(line.line);
|
||||
/* invoke the callback */
|
||||
(*line.callback)(line.line);
|
||||
}
|
||||
}
|
||||
|
||||
@ -657,7 +656,7 @@ template class device_finder<device_cococart_interface, true>;
|
||||
|
||||
device_cococart_interface::device_cococart_interface(const machine_config &mconfig, device_t &device)
|
||||
: device_interface(device, "cococart")
|
||||
, m_owning_slot(nullptr)
|
||||
, m_owning_slot(dynamic_cast<cococart_slot_device *>(device.owner()))
|
||||
, m_host(nullptr)
|
||||
{
|
||||
}
|
||||
@ -678,7 +677,6 @@ device_cococart_interface::~device_cococart_interface()
|
||||
|
||||
void device_cococart_interface::interface_config_complete()
|
||||
{
|
||||
m_owning_slot = dynamic_cast<cococart_slot_device *>(device().owner());
|
||||
m_host = m_owning_slot
|
||||
? dynamic_cast<device_cococart_host_interface *>(m_owning_slot->owner())
|
||||
: nullptr;
|
||||
|
@ -221,7 +221,7 @@ protected:
|
||||
|
||||
private:
|
||||
cococart_base_update_delegate m_update;
|
||||
cococart_slot_device * m_owning_slot;
|
||||
cococart_slot_device * const m_owning_slot;
|
||||
device_cococart_host_interface * m_host;
|
||||
};
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "multitap.h"
|
||||
#include "paddle.h"
|
||||
#include "rfu.h"
|
||||
#include "rs232adapt.h"
|
||||
#include "sports.h"
|
||||
#include "sportsjp.h"
|
||||
|
||||
@ -29,6 +30,7 @@ char const *const SMS_CTRL_OPTION_MULTITAP = "multitap";
|
||||
char const *const SMS_CTRL_OPTION_JOYPAD = "mspad";
|
||||
char const *const SMS_CTRL_OPTION_PADDLE = "paddle";
|
||||
char const *const SMS_CTRL_OPTION_RAPID_FIRE = "rapidfire";
|
||||
char const *const SMS_CTRL_OPTION_RS232 = "rs232";
|
||||
char const *const SMS_CTRL_OPTION_SPORTS = "sports";
|
||||
char const *const SMS_CTRL_OPTION_SPORTS_JP = "sportsjp";
|
||||
|
||||
@ -44,6 +46,7 @@ void sms_control_port_devices(device_slot_interface &device)
|
||||
device.option_add(SMS_CTRL_OPTION_JOYPAD, SMS_JOYPAD);
|
||||
device.option_add(SMS_CTRL_OPTION_PADDLE, SMS_PADDLE);
|
||||
device.option_add(SMS_CTRL_OPTION_RAPID_FIRE, SMS_RAPID_FIRE);
|
||||
device.option_add(SMS_CTRL_OPTION_RS232, SMS_RS232);
|
||||
device.option_add(SMS_CTRL_OPTION_SPORTS, SMS_SPORTS_PAD);
|
||||
device.option_add(SMS_CTRL_OPTION_SPORTS_JP, SMS_SPORTS_PAD_JP);
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ extern char const *const SMS_CTRL_OPTION_MULTITAP;
|
||||
extern char const *const SMS_CTRL_OPTION_JOYPAD;
|
||||
extern char const *const SMS_CTRL_OPTION_PADDLE;
|
||||
extern char const *const SMS_CTRL_OPTION_RAPID_FIRE;
|
||||
extern char const *const SMS_CTRL_OPTION_RS232;
|
||||
extern char const *const SMS_CTRL_OPTION_SPORTS;
|
||||
extern char const *const SMS_CTRL_OPTION_SPORTS_JP;
|
||||
|
||||
|
@ -95,7 +95,7 @@ u8 sms_md6button_device::in_r()
|
||||
if (m_th)
|
||||
result = BIT(lines, 0, 6); // CBRLDU
|
||||
else
|
||||
result = (BIT(lines, 6, 2) << 4); // SA0000
|
||||
result = BIT(lines, 6, 2) << 4; // SA0000
|
||||
break;
|
||||
case 3:
|
||||
if (m_th)
|
||||
|
56
src/devices/bus/sms_ctrl/rs232adapt.cpp
Normal file
56
src/devices/bus/sms_ctrl/rs232adapt.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Vas Crabb
|
||||
/**********************************************************************
|
||||
|
||||
Mega Drive RS-232 Adapter emulation
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "rs232adapt.h"
|
||||
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class sms_rs232_device : public device_t, public device_sms_control_interface
|
||||
{
|
||||
public:
|
||||
sms_rs232_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
|
||||
|
||||
virtual void out_w(u8 data, u8 mem_mask) override;
|
||||
|
||||
protected:
|
||||
virtual void device_start() override { }
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
private:
|
||||
required_device<rs232_port_device> m_port;
|
||||
};
|
||||
|
||||
|
||||
sms_rs232_device::sms_rs232_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) :
|
||||
device_t(mconfig, SMS_RS232, tag, owner, clock),
|
||||
device_sms_control_interface(mconfig, *this),
|
||||
m_port(*this, "com")
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void sms_rs232_device::out_w(u8 data, u8 mem_mask)
|
||||
{
|
||||
m_port->write_txd(BIT(data, 4));
|
||||
}
|
||||
|
||||
|
||||
void sms_rs232_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
RS232_PORT(config, m_port, default_rs232_devices, nullptr);
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
|
||||
DEFINE_DEVICE_TYPE_PRIVATE(SMS_RS232, device_sms_control_interface, sms_rs232_device, "sms_rs232", "Mega Drive RS-232 Adapter")
|
18
src/devices/bus/sms_ctrl/rs232adapt.h
Normal file
18
src/devices/bus/sms_ctrl/rs232adapt.h
Normal file
@ -0,0 +1,18 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Vas Crabb
|
||||
/**********************************************************************
|
||||
|
||||
Mega Drive RS-232 Adapter emulation
|
||||
|
||||
**********************************************************************/
|
||||
#ifndef MAME_BUS_SMS_CTRL_RS232_H
|
||||
#define MAME_BUS_SMS_CTRL_RS232_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smsctrl.h"
|
||||
|
||||
|
||||
DECLARE_DEVICE_TYPE(SMS_RS232, device_sms_control_interface)
|
||||
|
||||
#endif // MAME_BUS_SMS_CTRL_RS232_H
|
@ -2,23 +2,27 @@
|
||||
// copyright-holders:Vas Crabb
|
||||
/**********************************************************************
|
||||
|
||||
Sega DE-9 controller port emulation
|
||||
Sega 7-bit I/O port emulation
|
||||
|
||||
1 Up in
|
||||
2 Down in
|
||||
3 Left in
|
||||
4 Right in
|
||||
5 +5V
|
||||
6 TL TxD in
|
||||
7 TH in/out edge-sensitive
|
||||
8 GND
|
||||
9 TR RxD in/out
|
||||
1 Up in
|
||||
2 Down in
|
||||
3 Left in
|
||||
4 Right in
|
||||
5 +5V
|
||||
6 TL TxD in
|
||||
7 TH in/out edge-sensitive
|
||||
8 GND
|
||||
9 TR RxD in/out
|
||||
10 NC -
|
||||
|
||||
DE-9 connector on most systems, or 10-pin tongue connector on
|
||||
Game Gear. Pin 10 is not connected if present.
|
||||
|
||||
SG-1000 Mark III:
|
||||
* Pin 7 (TH) tied to ground
|
||||
* Pin 9 (TR) is input only
|
||||
|
||||
Mega Drive:
|
||||
Mega Drive, Game Gear:
|
||||
* All pins besides +5V and GND are in/out
|
||||
|
||||
**********************************************************************/
|
||||
|
88
src/devices/bus/tanbus/etirtc.cpp
Normal file
88
src/devices/bus/tanbus/etirtc.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
ETI Real Time Clock/Calendar
|
||||
|
||||
http://www.microtan.ukpc.net/pageProducts.html#CLOCK
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "etirtc.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(TANBUS_ETIRTC, tanbus_etirtc_device, "tanbus_etirtc", "Microtan ETI Real Time Clock")
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_etirtc_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
MM58174(config, "rtc", 32.768_kHz_XTAL);
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// tanbus_etirtc_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
tanbus_etirtc_device::tanbus_etirtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, TANBUS_ETIRTC, tag, owner, clock)
|
||||
, device_tanbus_interface(mconfig, *this)
|
||||
, m_rtc(*this, "rtc")
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_etirtc_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// read - card read
|
||||
//-------------------------------------------------
|
||||
|
||||
uint8_t tanbus_etirtc_device::read(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
uint8_t data = 0xff;
|
||||
|
||||
switch (offset & 0xfff0)
|
||||
{
|
||||
case 0xbc00:
|
||||
data = m_rtc->read(offset);
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// write - card write
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_etirtc_device::write(offs_t offset, uint8_t data, int inhrom, int inhram, int be)
|
||||
{
|
||||
switch (offset & 0xfff0)
|
||||
{
|
||||
case 0xbc00:
|
||||
m_rtc->write(offset, data);
|
||||
break;
|
||||
}
|
||||
}
|
47
src/devices/bus/tanbus/etirtc.h
Normal file
47
src/devices/bus/tanbus/etirtc.h
Normal file
@ -0,0 +1,47 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
ETI Real Time Clock/Calendar
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_ETIRTC_H
|
||||
#define MAME_BUS_TANBUS_ETIRTC_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "tanbus.h"
|
||||
#include "machine/mm58174.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class tanbus_etirtc_device : public device_t, public device_tanbus_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tanbus_etirtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
virtual uint8_t read(offs_t offset, int inhrom, int inhram, int be) override;
|
||||
virtual void write(offs_t offset, uint8_t data, int inhrom, int inhram, int be) override;
|
||||
|
||||
private:
|
||||
required_device<mm58174_device> m_rtc;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(TANBUS_ETIRTC, tanbus_etirtc_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_ETIRTC_H
|
153
src/devices/bus/tanbus/etisnd.cpp
Normal file
153
src/devices/bus/tanbus/etisnd.cpp
Normal file
@ -0,0 +1,153 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
ETI Sound Card
|
||||
|
||||
http://www.microtan.ukpc.net/pageProducts.html#SOUND
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "etisnd.h"
|
||||
#include "speaker.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(TANBUS_ETISND, tanbus_etisnd_device, "tanbus_etisnd", "Microtan ETI Sound Card")
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_etisnd_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
PIA6821(config, m_pia[0], 0);
|
||||
m_pia[0]->writepa_handler().set("dac1", FUNC(dac_byte_interface::data_w));
|
||||
m_pia[0]->writepb_handler().set("dac2", FUNC(dac_byte_interface::data_w));
|
||||
|
||||
PIA6821(config, m_pia[1], 0);
|
||||
m_pia[1]->writepa_handler().set("dac3", FUNC(dac_byte_interface::data_w));
|
||||
m_pia[1]->writepb_handler().set("dac4", FUNC(dac_byte_interface::data_w));
|
||||
|
||||
PIA6821(config, m_pia[2], 0);
|
||||
m_pia[2]->writepa_handler().set("dac5", FUNC(dac_byte_interface::data_w));
|
||||
m_pia[2]->writepb_handler().set("dac6", FUNC(dac_byte_interface::data_w));
|
||||
|
||||
PIA6821(config, m_pia[3], 0);
|
||||
m_pia[2]->writepb_handler().set(FUNC(tanbus_etisnd_device::pia_pb_w));
|
||||
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
DAC0800(config, "dac1", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
DAC0800(config, "dac2", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
DAC0800(config, "dac3", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
DAC0800(config, "dac4", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
DAC0800(config, "dac5", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
DAC0800(config, "dac6", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
|
||||
|
||||
AY8910(config, m_ay8910, DERIVED_CLOCK(1, 4)).add_route(ALL_OUTPUTS, "speaker", 0.5);
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// tanbus_etisnd_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
tanbus_etisnd_device::tanbus_etisnd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, TANBUS_ETISND, tag, owner, clock)
|
||||
, device_tanbus_interface(mconfig, *this)
|
||||
, m_pia(*this, "pia%u", 0)
|
||||
, m_ay8910(*this, "ay8910")
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_etisnd_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// read - card read
|
||||
//-------------------------------------------------
|
||||
|
||||
uint8_t tanbus_etisnd_device::read(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
uint8_t data = 0xff;
|
||||
|
||||
switch (offset & 0xfffc)
|
||||
{
|
||||
case 0xbc00:
|
||||
data = m_pia[0]->read(offset & 3);
|
||||
break;
|
||||
case 0xbc04:
|
||||
data = m_pia[1]->read(offset & 3);
|
||||
break;
|
||||
case 0xbc08:
|
||||
data = m_pia[2]->read(offset & 3);
|
||||
break;
|
||||
case 0xbc0c:
|
||||
data = m_pia[3]->read(offset & 3);
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// write - card write
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_etisnd_device::write(offs_t offset, uint8_t data, int inhrom, int inhram, int be)
|
||||
{
|
||||
switch (offset & 0xfffc)
|
||||
{
|
||||
case 0xbc00:
|
||||
m_pia[0]->write(offset & 3, data);
|
||||
break;
|
||||
case 0xbc04:
|
||||
m_pia[1]->write(offset & 3, data);
|
||||
break;
|
||||
case 0xbc08:
|
||||
m_pia[2]->write(offset & 3, data);
|
||||
break;
|
||||
case 0xbc0c:
|
||||
m_pia[3]->write(offset & 3, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void tanbus_etisnd_device::pia_pb_w(uint8_t data)
|
||||
{
|
||||
// PB0 -> BC1
|
||||
// PB1 -> BDIR
|
||||
// +5v -> BC2
|
||||
switch (data & 3)
|
||||
{
|
||||
case 0:
|
||||
m_pia[3]->porta_w(0xff);
|
||||
break;
|
||||
case 1:
|
||||
m_pia[3]->porta_w(m_ay8910->data_r());
|
||||
break;
|
||||
case 2:
|
||||
m_ay8910->data_w(m_pia[3]->a_output());
|
||||
break;
|
||||
case 3:
|
||||
m_ay8910->address_w(m_pia[3]->a_output());
|
||||
break;
|
||||
}
|
||||
}
|
53
src/devices/bus/tanbus/etisnd.h
Normal file
53
src/devices/bus/tanbus/etisnd.h
Normal file
@ -0,0 +1,53 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
ETI Sound Card
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_ETISND_H
|
||||
#define MAME_BUS_TANBUS_ETISND_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "tanbus.h"
|
||||
#include "machine/6821pia.h"
|
||||
#include "sound/ay8910.h"
|
||||
#include "sound/dac.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class tanbus_etisnd_device : public device_t, public device_tanbus_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tanbus_etisnd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
virtual uint8_t read(offs_t offset, int inhrom, int inhram, int be) override;
|
||||
virtual void write(offs_t offset, uint8_t data, int inhrom, int inhram, int be) override;
|
||||
|
||||
private:
|
||||
required_device_array<pia6821_device, 4> m_pia;
|
||||
required_device<ay8910_device> m_ay8910;
|
||||
|
||||
void pia_pb_w(uint8_t data);
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(TANBUS_ETISND, tanbus_etisnd_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_ETISND_H
|
108
src/devices/bus/tanbus/keyboard/keyboard.cpp
Normal file
108
src/devices/bus/tanbus/keyboard/keyboard.cpp
Normal file
@ -0,0 +1,108 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtan Keyboard Interface
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "keyboard.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(MICROTAN_KBD_SLOT, microtan_kbd_slot_device, "microtan_kbd_slot", "Microtan Keyboard Interface")
|
||||
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE MICROTAN_KBD PORT INTERFACE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_microtan_kbd_interface - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
device_microtan_kbd_interface::device_microtan_kbd_interface(const machine_config &mconfig, device_t &device) :
|
||||
device_interface(device, "microtankbd")
|
||||
{
|
||||
m_slot = dynamic_cast<microtan_kbd_slot_device *>(device.owner());
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// microtan_kbd_slot_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
microtan_kbd_slot_device::microtan_kbd_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, MICROTAN_KBD_SLOT, tag, owner, clock)
|
||||
, device_single_card_slot_interface<device_microtan_kbd_interface>(mconfig, *this)
|
||||
, m_kbd(nullptr)
|
||||
, m_strobe_handler(*this)
|
||||
, m_reset_handler(*this)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void microtan_kbd_slot_device::device_start()
|
||||
{
|
||||
m_kbd = get_card_device();
|
||||
|
||||
// resolve callbacks
|
||||
m_strobe_handler.resolve_safe();
|
||||
m_reset_handler.resolve_safe();
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// kbd_in
|
||||
//-------------------------------------------------
|
||||
|
||||
u8 microtan_kbd_slot_device::read()
|
||||
{
|
||||
if (m_kbd)
|
||||
return m_kbd->read() & 0x7f;
|
||||
else
|
||||
return 0x7f;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// write
|
||||
//-------------------------------------------------
|
||||
|
||||
void microtan_kbd_slot_device::write(uint8_t data)
|
||||
{
|
||||
if (m_kbd)
|
||||
m_kbd->write(data);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// SLOT_INTERFACE( microtan_kbd_devices )
|
||||
//-------------------------------------------------
|
||||
|
||||
|
||||
// slot devices
|
||||
#include "mt006.h"
|
||||
#include "mt009.h"
|
||||
//#include "mt0020.h"
|
||||
#include "spinveti.h"
|
||||
|
||||
|
||||
void microtan_kbd_devices(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("mt006", MICROTAN_KBD_MT006);
|
||||
device.option_add("mt009", MICROTAN_KBD_MT009);
|
||||
//device.option_add("mt0020", MICROTAN_KBD_MT0020);
|
||||
device.option_add("spinveti", MICROTAN_KBD_SPINVETI);
|
||||
}
|
82
src/devices/bus/tanbus/keyboard/keyboard.h
Normal file
82
src/devices/bus/tanbus/keyboard/keyboard.h
Normal file
@ -0,0 +1,82 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtan Keyboard Interface
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_KEYBOARD_H
|
||||
#define MAME_BUS_TANBUS_KEYBOARD_H
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class device_microtan_kbd_interface;
|
||||
|
||||
// ======================> microtan_kbd_slot_device
|
||||
|
||||
class microtan_kbd_slot_device : public device_t, public device_single_card_slot_interface<device_microtan_kbd_interface>
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
template <typename T>
|
||||
microtan_kbd_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
|
||||
: microtan_kbd_slot_device(mconfig, tag, owner, 0)
|
||||
{
|
||||
option_reset();
|
||||
slot_options(*this);
|
||||
set_default_option(default_option);
|
||||
set_fixed(false);
|
||||
}
|
||||
|
||||
microtan_kbd_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0);
|
||||
|
||||
// callbacks
|
||||
auto strobe_handler() { return m_strobe_handler.bind(); }
|
||||
auto reset_handler() { return m_reset_handler.bind(); }
|
||||
|
||||
virtual uint8_t read();
|
||||
virtual void write(uint8_t data);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(strobe_w) { m_strobe_handler(state); }
|
||||
DECLARE_WRITE_LINE_MEMBER(reset_w) { m_reset_handler(state); }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
private:
|
||||
device_microtan_kbd_interface *m_kbd;
|
||||
|
||||
devcb_write_line m_strobe_handler;
|
||||
devcb_write_line m_reset_handler;
|
||||
};
|
||||
|
||||
|
||||
// ======================> device_microtan_kbd_interface
|
||||
|
||||
class device_microtan_kbd_interface : public device_interface
|
||||
{
|
||||
public:
|
||||
virtual uint8_t read() { return 0xff; }
|
||||
virtual void write(uint8_t data) { }
|
||||
|
||||
protected:
|
||||
device_microtan_kbd_interface(const machine_config &mconfig, device_t &device);
|
||||
|
||||
microtan_kbd_slot_device *m_slot;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(MICROTAN_KBD_SLOT, microtan_kbd_slot_device)
|
||||
|
||||
void microtan_kbd_devices(device_slot_interface &device);
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_KEYBOARD_H
|
118
src/devices/bus/tanbus/keyboard/mt006.cpp
Normal file
118
src/devices/bus/tanbus/keyboard/mt006.cpp
Normal file
@ -0,0 +1,118 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtan Keypad (MT006)
|
||||
|
||||
http://www.microtan.ukpc.net/pageProducts.html#KEYBOARDS
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "mt006.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(MICROTAN_KBD_MT006, microtan_kbd_mt006, "microtan_kbd_mt006", "Microtan Keypad (MT006)")
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// input_ports - device-specific input ports
|
||||
//-------------------------------------------------
|
||||
|
||||
static INPUT_PORTS_START( mt006 )
|
||||
PORT_START("KPAD0")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("0") PORT_CODE(KEYCODE_0_PAD)
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("4") PORT_CODE(KEYCODE_4_PAD)
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("8 P") PORT_CODE(KEYCODE_8_PAD)
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("C M") PORT_CODE(KEYCODE_C)
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT)
|
||||
|
||||
PORT_START("KPAD1")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("1") PORT_CODE(KEYCODE_1_PAD)
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("5 O") PORT_CODE(KEYCODE_5_PAD)
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("9 ESC") PORT_CODE(KEYCODE_9_PAD)
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("D G") PORT_CODE(KEYCODE_D)
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LF DEL") PORT_CODE(KEYCODE_DEL_PAD)
|
||||
|
||||
PORT_START("KPAD2")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("2") PORT_CODE(KEYCODE_2_PAD)
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("6 C") PORT_CODE(KEYCODE_6_PAD)
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("E S") PORT_CODE(KEYCODE_E)
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CR SP") PORT_CODE(KEYCODE_ENTER_PAD)
|
||||
|
||||
PORT_START("KPAD3")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("3 '") PORT_CODE(KEYCODE_3_PAD)
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("7 R") PORT_CODE(KEYCODE_7_PAD)
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("B L") PORT_CODE(KEYCODE_B)
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("F N") PORT_CODE(KEYCODE_F)
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
|
||||
PORT_START("RESET")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, microtan_kbd_mt006, trigger_reset, 0)
|
||||
INPUT_PORTS_END
|
||||
|
||||
INPUT_CHANGED_MEMBER(microtan_kbd_mt006::trigger_reset)
|
||||
{
|
||||
m_slot->reset_w(newval ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
|
||||
ioport_constructor microtan_kbd_mt006::device_input_ports() const
|
||||
{
|
||||
return INPUT_PORTS_NAME( mt006 );
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// microtan_kbd_mt006 - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
microtan_kbd_mt006::microtan_kbd_mt006(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, MICROTAN_KBD_MT006, tag, owner, clock)
|
||||
, device_microtan_kbd_interface(mconfig, *this)
|
||||
, m_keypad(*this, "KPAD%u", 0U)
|
||||
, m_column(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void microtan_kbd_mt006::device_start()
|
||||
{
|
||||
save_item(NAME(m_column));
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// IMPLEMENTATION
|
||||
//**************************************************************************
|
||||
|
||||
uint8_t microtan_kbd_mt006::read()
|
||||
{
|
||||
uint8_t data = 0x00;
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
if (BIT(m_column, i))
|
||||
data |= m_keypad[i]->read();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void microtan_kbd_mt006::write(uint8_t data)
|
||||
{
|
||||
m_column = data & 0x0f;
|
||||
|
||||
m_slot->strobe_w(BIT(data, 4));
|
||||
}
|
50
src/devices/bus/tanbus/keyboard/mt006.h
Normal file
50
src/devices/bus/tanbus/keyboard/mt006.h
Normal file
@ -0,0 +1,50 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtan Keypad (MT006)
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_KEYBOARD_MT006_H
|
||||
#define MAME_BUS_TANBUS_KEYBOARD_MT006_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "keyboard.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class microtan_kbd_mt006 : public device_t, public device_microtan_kbd_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
microtan_kbd_mt006(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
|
||||
virtual uint8_t read() override;
|
||||
virtual void write(uint8_t data) override;
|
||||
|
||||
private:
|
||||
required_ioport_array<4> m_keypad;
|
||||
|
||||
uint8_t m_column;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(MICROTAN_KBD_MT006, microtan_kbd_mt006)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_KEYBOARD_MT006_H
|
390
src/devices/bus/tanbus/keyboard/mt009.cpp
Normal file
390
src/devices/bus/tanbus/keyboard/mt009.cpp
Normal file
@ -0,0 +1,390 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtan Keyboard (MT009)
|
||||
|
||||
http://www.microtan.ukpc.net/pageProducts.html#KEYBOARDS
|
||||
|
||||
The keyboard is essentially an ordinary ASCII keyboard, with 71 keys, 8
|
||||
TTL chips and a 2716 eprom labeled MON V1. We currently use a
|
||||
generic keyboard because of the lack of a schematic. Unemulated keys are
|
||||
'SHIFT LOCK' and 'REPT'. Since all commands must be uppercase, capslock
|
||||
is defaulted to on.
|
||||
|
||||
TODO:
|
||||
- use ROM data to determine the returned ASCII code.
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "mt009.h"
|
||||
#include "utf8.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(MICROTAN_KBD_MT009, microtan_kbd_mt009, "microtan_kbd_mt009", "Microtan Keyboard (MT009)")
|
||||
|
||||
|
||||
static const char keyboard[8][9][8] = {
|
||||
{ /* normal */
|
||||
{ 27,'1','2','3','4','5','6','7'},
|
||||
{'8','9','0',':','-', 12,127,'^'},
|
||||
{'q','w','e','r','t','y','u','i'},
|
||||
{'o','p','[',']', 13, 3, 0, 0},
|
||||
{'a','s','d','f','g','h','j','k'},
|
||||
{'l',';','@', 92, 0,'z','x','c'},
|
||||
{'v','b','n','m',',','.','/', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
{ /* Shift */
|
||||
{ 27,'!','"','#','$','%','&', 39},
|
||||
{'(',')','~','*','=', 12,127,'_'},
|
||||
{'Q','W','E','R','T','Y','U','I'},
|
||||
{'O','P','{','}', 13, 3, 0, 0},
|
||||
{'A','S','D','F','G','H','J','K'},
|
||||
{'L','+','`','|', 0,'Z','X','C'},
|
||||
{'V','B','N','M','<','>','?', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
{ /* Control */
|
||||
{ 27,'1','2','3','4','5','6','7'},
|
||||
{'8','9','0',':','-','`',127, 30},
|
||||
{ 17, 23, 5, 18, 20, 25, 21, 9},
|
||||
{ 15, 16, 27, 29, 13, 3, 0, 0},
|
||||
{ 1, 19, 4, 6, 7, 8, 10, 11},
|
||||
{ 12,';','@', 28, 0, 26, 24, 3},
|
||||
{ 22, 2, 14, 13,',','.','/', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
{ /* Shift+Control */
|
||||
{ 27,'!','"','#','$','%','&', 39},
|
||||
{'(',')','~','*','=', 12,127, 31},
|
||||
{ 17, 23, 5, 18, 20, 25, 21, 9},
|
||||
{ 15, 16, 27, 29, 13,127, 0, 0},
|
||||
{ 1, 19, 4, 6, 7, 8, 10, 11},
|
||||
{ 12,'+','`', 28, 0, 26, 24, 3},
|
||||
{ 22, 2, 14, 13,',','.','/', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
{ /* CapsLock */
|
||||
{ 27,'1','2','3','4','5','6','7'},
|
||||
{'8','9','0',':','-', 12,127,'^'},
|
||||
{'Q','W','E','R','T','Y','U','I'},
|
||||
{'O','P','[',']', 13, 3, 0, 0},
|
||||
{'A','S','D','F','G','H','J','K'},
|
||||
{'L',';','@', 92, 0,'Z','X','C'},
|
||||
{'V','B','N','M',',','.','/', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
{ /* Shift+CapsLock */
|
||||
{ 27,'!','"','#','$','%','&', 39},
|
||||
{'(',')','~','*','=', 12,127,'_'},
|
||||
{'q','w','e','r','t','y','u','i'},
|
||||
{'o','p','{','}', 13, 3, 0, 0},
|
||||
{'a','s','d','f','g','h','j','k'},
|
||||
{'l','+','`','|', 0,'z','x','c'},
|
||||
{'v','b','n','m','<','>','?', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
{ /* Control+CapsLock */
|
||||
{ 27,'1','2','3','4','5','6','7'},
|
||||
{'8','9','0',':','-', 12,127, 9},
|
||||
{ 17, 23, 5, 18, 20, 25, 21, 9},
|
||||
{ 15, 16, 27, 29, 13,127, 0, 0},
|
||||
{ 1, 19, 4, 6, 7, 8, 10, 11},
|
||||
{ 12,';', 39, 28, 0, 26, 24, 3},
|
||||
{ 22, 2, 14, 13,',','.','/', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
{ /* Shift+Control+CapsLock */
|
||||
{ 27,'!','"','#','$','%','&', 39},
|
||||
{'(',')','~','*','=', 12,127, 9},
|
||||
{ 17, 23, 5, 18, 20, 25, 21, 9},
|
||||
{ 15, 16, 27, 29, 13,127, 0, 0},
|
||||
{ 1, 19, 4, 6, 7, 8, 10, 11},
|
||||
{ 12,':','"', 28, 0, 26, 24, 3},
|
||||
{ 22, 2, 14, 13,',','.','/', 0},
|
||||
{ 10,' ','-',',', 13,'.','0','1'},
|
||||
{'2','3','4','5','6','7','8','9'},
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// input_ports - device-specific input ports
|
||||
//-------------------------------------------------
|
||||
|
||||
static INPUT_PORTS_START( kbd_mt009 )
|
||||
PORT_START("KBD0")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 \"") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 &") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 \'") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR(39)
|
||||
|
||||
PORT_START("KBD1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('~')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(": *") PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("- =") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=')
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("NEW PAGE") PORT_CODE(KEYCODE_TILDE) PORT_CHAR(12)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RUB OUT") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_TAB) PORT_CHAR('^') PORT_CHAR('_')
|
||||
|
||||
PORT_START("KBD2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHAR('q')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHAR('w')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHAR('e')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHAR('r')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHAR('t')
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHAR('y')
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHAR('u')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHAR('i')
|
||||
|
||||
PORT_START("KBD3")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHAR('o')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHAR('p')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("] }") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(']') PORT_CHAR('}')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("BREAK") PORT_CODE(KEYCODE_DEL) PORT_CHAR(3)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ALFA LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
|
||||
|
||||
PORT_START("KBD4")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHAR('a')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHAR('s')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHAR('d')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHAR('f')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHAR('g')
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHAR('h')
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHAR('j')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHAR('k')
|
||||
|
||||
PORT_START("KBD5")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHAR('l')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("; +") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("@") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('@') PORT_CHAR('`')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("\\ |") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\\') PORT_CHAR('|')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT (L)") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHAR('z')
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHAR('x')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHAR('c')
|
||||
|
||||
PORT_START("KBD6")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHAR('v')
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHAR('b')
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHAR('n')
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHAR('m')
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SHIFT (R)") PORT_CODE(KEYCODE_RSHIFT)
|
||||
|
||||
PORT_START("KBD7")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("LINE FEED") PORT_CHAR(10)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(32)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("- (KP)") PORT_CODE(KEYCODE_MINUS_PAD)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(", (KP)") PORT_CODE(KEYCODE_PLUS_PAD)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("ENTER (KP)") PORT_CODE(KEYCODE_ENTER_PAD)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(". (KP)") PORT_CODE(KEYCODE_DEL_PAD)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 (KP)") PORT_CODE(KEYCODE_0_PAD)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 (KP)") PORT_CODE(KEYCODE_1_PAD)
|
||||
|
||||
PORT_START("KBD8")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 (KP)") PORT_CODE(KEYCODE_2_PAD)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 (KP)") PORT_CODE(KEYCODE_3_PAD)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 (KP)") PORT_CODE(KEYCODE_4_PAD)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 (KP)") PORT_CODE(KEYCODE_5_PAD)
|
||||
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 (KP)") PORT_CODE(KEYCODE_6_PAD)
|
||||
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 (KP)") PORT_CODE(KEYCODE_7_PAD)
|
||||
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 (KP)") PORT_CODE(KEYCODE_8_PAD)
|
||||
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 (KP)") PORT_CODE(KEYCODE_9_PAD)
|
||||
|
||||
PORT_START("BRK")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) PORT_CHANGED_MEMBER(DEVICE_SELF, microtan_kbd_mt009, trigger_reset, 0)
|
||||
INPUT_PORTS_END
|
||||
|
||||
INPUT_CHANGED_MEMBER(microtan_kbd_mt009::trigger_reset)
|
||||
{
|
||||
m_slot->reset_w(newval ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
ioport_constructor microtan_kbd_mt009::device_input_ports() const
|
||||
{
|
||||
return INPUT_PORTS_NAME( kbd_mt009 );
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// rom_region - device-specific ROM region
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START( kbd_mt009 )
|
||||
ROM_REGION( 0x0800, "rom", 0 )
|
||||
ROM_LOAD("ascii_v1.bin", 0x0000, 0x0800, CRC(17a03a82) SHA1(89dcc0712745ed9ba876a78eefd55e9a54fc4fad))
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *microtan_kbd_mt009::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( kbd_mt009 );
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// microtan_kbd_mt009 - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
microtan_kbd_mt009::microtan_kbd_mt009(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, MICROTAN_KBD_MT009, tag, owner, clock)
|
||||
, device_microtan_kbd_interface(mconfig, *this)
|
||||
, m_rom(*this, "rom")
|
||||
, m_keyboard(*this, "KBD%u", 0U)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void microtan_kbd_mt009::device_start()
|
||||
{
|
||||
m_kbd_scan_timer = timer_alloc(FUNC(microtan_kbd_mt009::kbd_scan), this);
|
||||
|
||||
m_kbd_scan_timer->adjust(attotime::from_hz(45), 0, attotime::from_hz(45));
|
||||
|
||||
save_item(NAME(m_kbd_ascii));
|
||||
save_item(NAME(m_keyrows));
|
||||
save_item(NAME(m_lastrow));
|
||||
save_item(NAME(m_mask));
|
||||
save_item(NAME(m_key));
|
||||
save_item(NAME(m_repeat));
|
||||
save_item(NAME(m_repeater));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void microtan_kbd_mt009::device_reset()
|
||||
{
|
||||
for (int i = 1; i < 10; i++)
|
||||
m_keyrows[i] = m_keyboard[i-1]->read();
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// IMPLEMENTATION
|
||||
//**************************************************************************
|
||||
|
||||
uint8_t microtan_kbd_mt009::read()
|
||||
{
|
||||
return m_kbd_ascii;
|
||||
}
|
||||
|
||||
|
||||
void microtan_kbd_mt009::store_key(int key)
|
||||
{
|
||||
m_kbd_ascii = key;
|
||||
m_slot->strobe_w(ASSERT_LINE);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(microtan_kbd_mt009::kbd_scan)
|
||||
{
|
||||
int mod, row, col, chg, newvar;
|
||||
|
||||
if (m_repeat)
|
||||
{
|
||||
if (!--m_repeat)
|
||||
m_repeater = 4;
|
||||
}
|
||||
else if (m_repeater)
|
||||
m_repeat = m_repeater;
|
||||
|
||||
row = 9;
|
||||
newvar = m_keyboard[8]->read();
|
||||
chg = m_keyrows[--row] ^ newvar;
|
||||
|
||||
while (!chg && row > 0)
|
||||
{
|
||||
newvar = m_keyboard[row - 1]->read();
|
||||
chg = m_keyrows[--row] ^ newvar;
|
||||
}
|
||||
if (!chg)
|
||||
--row;
|
||||
|
||||
if (row >= 0)
|
||||
{
|
||||
m_repeater = 0x00;
|
||||
m_mask = 0x00;
|
||||
m_key = 0x00;
|
||||
m_lastrow = row;
|
||||
|
||||
if (newvar & chg) /* key(s) pressed ? */
|
||||
{
|
||||
mod = 0;
|
||||
|
||||
/* Shift modifier */
|
||||
if ((m_keyrows[5] & 0x10) || (m_keyrows[6] & 0x80))
|
||||
mod |= 1;
|
||||
|
||||
/* Control modifier */
|
||||
if (m_keyrows[3] & 0x40)
|
||||
mod |= 2;
|
||||
|
||||
/* CapsLock modifier */
|
||||
if (m_keyrows[3] & 0x80)
|
||||
mod |= 4;
|
||||
|
||||
/* find newvar key */
|
||||
m_mask = 0x01;
|
||||
for (col = 0; col < 8; col++)
|
||||
{
|
||||
if (chg & m_mask)
|
||||
{
|
||||
newvar &= m_mask;
|
||||
m_key = keyboard[mod][row][col];
|
||||
break;
|
||||
}
|
||||
m_mask <<= 1;
|
||||
}
|
||||
if (m_key) /* normal key */
|
||||
{
|
||||
m_repeater = 30;
|
||||
store_key(m_key);
|
||||
}
|
||||
else
|
||||
if ((row == 0) && (chg == 0x04)) /* Ctrl-@ (NUL) */
|
||||
store_key(0);
|
||||
m_keyrows[row] |= newvar;
|
||||
}
|
||||
else
|
||||
m_keyrows[row] = newvar;
|
||||
|
||||
m_repeat = m_repeater;
|
||||
}
|
||||
else
|
||||
if (m_key && (m_keyrows[m_lastrow] & m_mask) && m_repeat == 0)
|
||||
store_key(m_key);
|
||||
}
|
63
src/devices/bus/tanbus/keyboard/mt009.h
Normal file
63
src/devices/bus/tanbus/keyboard/mt009.h
Normal file
@ -0,0 +1,63 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtan Keyboard (MT009)
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_KEYBOARD_MT009_H
|
||||
#define MAME_BUS_TANBUS_KEYBOARD_MT009_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "keyboard.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class microtan_kbd_mt009 : public device_t, public device_microtan_kbd_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
microtan_kbd_mt009(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
|
||||
TIMER_CALLBACK_MEMBER(kbd_scan);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
|
||||
virtual uint8_t read() override;
|
||||
|
||||
private:
|
||||
required_memory_region m_rom;
|
||||
required_ioport_array<9> m_keyboard;
|
||||
|
||||
emu_timer *m_kbd_scan_timer = nullptr;
|
||||
|
||||
uint8_t m_kbd_ascii = 0;
|
||||
uint8_t m_keyrows[10]{};
|
||||
int m_lastrow = 0;
|
||||
int m_mask = 0;
|
||||
int m_key = 0;
|
||||
int m_repeat = 0;
|
||||
int m_repeater = 0;
|
||||
|
||||
void store_key(int key);
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(MICROTAN_KBD_MT009, microtan_kbd_mt009)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_KEYBOARD_MT009_H
|
97
src/devices/bus/tanbus/keyboard/spinveti.cpp
Normal file
97
src/devices/bus/tanbus/keyboard/spinveti.cpp
Normal file
@ -0,0 +1,97 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
ETI Space Invasion Key Unit
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "spinveti.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(MICROTAN_KBD_SPINVETI, microtan_kbd_spinveti, "microtan_kbd_spinveti", "ETI Space Invasion Key Unit")
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// input_ports - device-specific input ports
|
||||
//-------------------------------------------------
|
||||
|
||||
static INPUT_PORTS_START( spinveti )
|
||||
PORT_START("PB")
|
||||
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Start") PORT_CODE(KEYCODE_ENTER)
|
||||
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT)
|
||||
PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT)
|
||||
PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Fire") PORT_CODE(KEYCODE_LCONTROL)
|
||||
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Hold") PORT_CODE(KEYCODE_H)
|
||||
|
||||
PORT_START("SW")
|
||||
PORT_CONFNAME(0x60, 0x20, "Difficulty")
|
||||
PORT_CONFSETTING(0x00, "Easy")
|
||||
PORT_CONFSETTING(0x20, "Normal")
|
||||
PORT_CONFSETTING(0x40, "Hard")
|
||||
PORT_CONFSETTING(0x60, "Hardest")
|
||||
|
||||
PORT_START("RS")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_NAME("Reset") PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, microtan_kbd_spinveti, trigger_reset, 0)
|
||||
INPUT_PORTS_END
|
||||
|
||||
INPUT_CHANGED_MEMBER(microtan_kbd_spinveti::trigger_reset)
|
||||
{
|
||||
m_slot->reset_w(newval ? CLEAR_LINE : ASSERT_LINE);
|
||||
}
|
||||
|
||||
ioport_constructor microtan_kbd_spinveti::device_input_ports() const
|
||||
{
|
||||
return INPUT_PORTS_NAME( spinveti );
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// microtan_kbd_spinveti - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
microtan_kbd_spinveti::microtan_kbd_spinveti(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, MICROTAN_KBD_SPINVETI, tag, owner, clock)
|
||||
, device_microtan_kbd_interface(mconfig, *this)
|
||||
, m_pb(*this, "PB")
|
||||
, m_sw(*this, "SW")
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void microtan_kbd_spinveti::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// IMPLEMENTATION
|
||||
//**************************************************************************
|
||||
|
||||
uint8_t microtan_kbd_spinveti::read()
|
||||
{
|
||||
return m_pb->read() | m_sw->read();
|
||||
}
|
||||
|
||||
|
||||
void microtan_kbd_spinveti::write(uint8_t data)
|
||||
{
|
||||
// TODO: sound effects (heartbeat, fire, saucer, and explosion)
|
||||
// bit 1 Heartbeat (active high)
|
||||
// bit 2 Gun firing (active low)
|
||||
// bit 3 Flying saucer (active high)
|
||||
// bit 4 Explosion (active high)
|
||||
}
|
49
src/devices/bus/tanbus/keyboard/spinveti.h
Normal file
49
src/devices/bus/tanbus/keyboard/spinveti.h
Normal file
@ -0,0 +1,49 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
ETI Space Invasion Key Unit
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_KEYBOARD_SPINVETI_H
|
||||
#define MAME_BUS_TANBUS_KEYBOARD_SPINVETI_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "keyboard.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class microtan_kbd_spinveti : public device_t, public device_microtan_kbd_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
microtan_kbd_spinveti(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
DECLARE_INPUT_CHANGED_MEMBER(trigger_reset);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
|
||||
virtual uint8_t read() override;
|
||||
virtual void write(uint8_t data) override;
|
||||
|
||||
private:
|
||||
required_ioport m_pb;
|
||||
required_ioport m_sw;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(MICROTAN_KBD_SPINVETI, microtan_kbd_spinveti)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_KEYBOARD_SPINVETI_H
|
@ -17,7 +17,8 @@
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(TANBUS_RA32K, tanbus_ra32k_device, "tanbus_ra32k", "Ralph Allen 32K EPROM-RAM Card")
|
||||
DEFINE_DEVICE_TYPE(TANBUS_RA32KRAM, tanbus_ra32kram_device, "tanbus_ra32kram", "Ralph Allen 32K EPROM-RAM Card (RAM)")
|
||||
DEFINE_DEVICE_TYPE(TANBUS_RA32KROM, tanbus_ra32krom_device, "tanbus_ra32krom", "Ralph Allen 32K EPROM-RAM Card (RALBUG)")
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
@ -97,10 +98,9 @@ INPUT_PORTS_START( ra32k )
|
||||
PORT_DIPSETTING(0x0b, "$F000-$6FFF")
|
||||
|
||||
PORT_START("LNK1")
|
||||
PORT_CONFNAME(0x03, 0x00, "Block Enable")
|
||||
PORT_CONFSETTING(0x00, "RAM (permanent)")
|
||||
PORT_CONFSETTING(0x01, "RAM (page selectable)")
|
||||
PORT_CONFSETTING(0x02, "EPROM (page selectable)")
|
||||
PORT_CONFNAME(0x01, 0x00, "Block Enable")
|
||||
PORT_CONFSETTING(0x00, "Permanent")
|
||||
PORT_CONFSETTING(0x01, "Page selectable")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
@ -114,20 +114,20 @@ ioport_constructor tanbus_ra32k_device::device_input_ports() const
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( ra32k )
|
||||
// ROM( ra32krom )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START(ra32k)
|
||||
ROM_START(ra32krom)
|
||||
ROM_REGION(0x8000, "rom", 0)
|
||||
ROM_LOAD("data_v1.4.rom", 0x0000, 0x0800, CRC(de61f11d) SHA1(3e6ddc5dba47d9136f58abc9475c3e73fc8cc0c2))
|
||||
ROM_LOAD("syntax_v1.4.rom", 0x0800, 0x0800, CRC(17438c4c) SHA1(46bf4e33544c19e142b380095736c5c3eb885ba0))
|
||||
ROM_LOAD("ascii_v1.4.rom", 0x1000, 0x0800, CRC(93244a81) SHA1(6149eec9904438a0d23529d2c2428a594d5b1fb9))
|
||||
ROM_LOAD("graph_v1.4.rom", 0x1800, 0x0800, CRC(159eb1f6) SHA1(5e49edda4b550506aca70d1f7e7de7a352f0359f))
|
||||
ROM_LOAD("data_v1.4.rom", 0x2000, 0x0800, CRC(de61f11d) SHA1(3e6ddc5dba47d9136f58abc9475c3e73fc8cc0c2))
|
||||
ROM_LOAD("syntax_v1.4.rom", 0x2800, 0x0800, CRC(17438c4c) SHA1(46bf4e33544c19e142b380095736c5c3eb885ba0))
|
||||
ROM_LOAD("ascii_v1.4.rom", 0x3000, 0x0800, CRC(93244a81) SHA1(6149eec9904438a0d23529d2c2428a594d5b1fb9))
|
||||
ROM_LOAD("graph_v1.4.rom", 0x3800, 0x0800, CRC(159eb1f6) SHA1(5e49edda4b550506aca70d1f7e7de7a352f0359f))
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *tanbus_ra32k_device::device_rom_region() const
|
||||
const tiny_rom_entry *tanbus_ra32krom_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME(ra32k);
|
||||
return ROM_NAME(ra32krom);
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
@ -138,95 +138,50 @@ const tiny_rom_entry *tanbus_ra32k_device::device_rom_region() const
|
||||
// tanbus_ra32k_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
tanbus_ra32k_device::tanbus_ra32k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, TANBUS_RA32K, tag, owner, clock)
|
||||
tanbus_ra32k_device::tanbus_ra32k_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_tanbus_interface(mconfig, *this)
|
||||
, m_rom(*this, "rom")
|
||||
, m_dsw(*this, "DSW%u", 1)
|
||||
, m_link(*this, "LNK1")
|
||||
{
|
||||
}
|
||||
|
||||
tanbus_ra32kram_device::tanbus_ra32kram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_ra32k_device(mconfig, TANBUS_RA32KRAM, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
tanbus_ra32krom_device::tanbus_ra32krom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_ra32k_device(mconfig, TANBUS_RA32KROM, tag, owner, clock)
|
||||
, m_rom(*this, "rom")
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_ra32k_device::device_start()
|
||||
void tanbus_ra32kram_device::device_start()
|
||||
{
|
||||
m_ram = std::make_unique<uint8_t[]>(0x8000);
|
||||
m_ram = make_unique_clear<uint8_t[]>(0x8000);
|
||||
|
||||
save_pointer(NAME(m_ram), 0x8000);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_ra32k_device::device_reset()
|
||||
void tanbus_ra32krom_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// read - card read
|
||||
//-------------------------------------------------
|
||||
|
||||
uint8_t tanbus_ra32k_device::read(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
uint8_t data = 0xff;
|
||||
|
||||
switch (m_link->read() & 0x02)
|
||||
{
|
||||
case 0x00:
|
||||
/* 32K dynamic RAM */
|
||||
if (block_enabled(offset, inhrom, inhram, be))
|
||||
{
|
||||
//logerror("ram read %04x\n", offset);
|
||||
data = m_ram[offset & 0x7fff];
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
/* ROM selected */
|
||||
if (block_enabled(offset, inhrom, inhram, be))
|
||||
{
|
||||
//logerror("rom read %04x\n", offset);
|
||||
data = m_rom->base()[(offset - m_addr_start) & 0x7fff];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// write - card write
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_ra32k_device::write(offs_t offset, uint8_t data, int inhrom, int inhram, int be)
|
||||
{
|
||||
switch (m_link->read() & 0x02)
|
||||
{
|
||||
case 0x00:
|
||||
/* 32K dynamic RAM */
|
||||
if (block_enabled(offset, inhrom, inhram, be))
|
||||
{
|
||||
//logerror("ram write %04x %02x\n", offset, data);
|
||||
m_ram[offset & 0x7fff] = data;
|
||||
}
|
||||
break;
|
||||
case 0x02:
|
||||
/* ROM selected */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool tanbus_ra32k_device::block_enabled(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
m_addr_start = ((bitswap<4>(m_dsw[2]->read(), 1, 0, 3, 2) << 12) + 0x1000) & 0xffff;
|
||||
m_addr_end = (m_addr_start + 0x7fff) & 0xffff;
|
||||
offs_t addr_start = ((bitswap<4>(m_dsw[2]->read(), 1, 0, 3, 2) << 12) + 0x1000) & 0xffff;
|
||||
offs_t addr_end = (addr_start + 0x7fff) & 0xffff;
|
||||
|
||||
//uint8_t block_start = (bitswap<4>(m_dsw[2]->read(), 1, 0, 3, 2) + 1) & 0x0f;
|
||||
uint8_t block = offset >> 12;
|
||||
//logerror("%04x start %04x current %04x\n", offset, block_start, block);
|
||||
uint8_t block = (offset & 0x7800) >> 12;
|
||||
|
||||
if (offset < addr_start || offset > addr_end)
|
||||
return false;
|
||||
|
||||
if (offset & 0x0800)
|
||||
{
|
||||
@ -255,3 +210,37 @@ bool tanbus_ra32k_device::block_enabled(offs_t offset, int inhrom, int inhram, i
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// read - card read
|
||||
//-------------------------------------------------
|
||||
|
||||
uint8_t tanbus_ra32kram_device::read(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
if (block_enabled(offset, inhrom, inhram, be))
|
||||
{
|
||||
return m_ram[offset & 0x7fff];
|
||||
}
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
uint8_t tanbus_ra32krom_device::read(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
if (block_enabled(offset, inhrom, inhram, be))
|
||||
{
|
||||
return m_rom[offset & 0x7fff];
|
||||
}
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// write - card write
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_ra32kram_device::write(offs_t offset, uint8_t data, int inhrom, int inhram, int be)
|
||||
{
|
||||
if (block_enabled(offset, inhrom, inhram, be))
|
||||
{
|
||||
m_ram[offset & 0x7fff] = data;
|
||||
}
|
||||
}
|
||||
|
@ -19,41 +19,66 @@
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class tanbus_ra32k_device :
|
||||
public device_t,
|
||||
public device_tanbus_interface
|
||||
class tanbus_ra32k_device : public device_t, public device_tanbus_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tanbus_ra32k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
tanbus_ra32k_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
|
||||
virtual uint8_t read(offs_t offset, int inhrom, int inhram, int be) override;
|
||||
virtual void write(offs_t offset, uint8_t data, int inhrom, int inhram, int be) override;
|
||||
|
||||
private:
|
||||
required_memory_region m_rom;
|
||||
required_ioport_array<3> m_dsw;
|
||||
required_ioport m_link;
|
||||
|
||||
offs_t m_addr_start;
|
||||
offs_t m_addr_end;
|
||||
std::unique_ptr<uint8_t[]> m_ram;
|
||||
|
||||
bool block_enabled(offs_t offset, int inhrom, int inhram, int be);
|
||||
};
|
||||
|
||||
|
||||
// ======================> tanbus_ra32kram_device
|
||||
|
||||
class tanbus_ra32kram_device : public tanbus_ra32k_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tanbus_ra32kram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
virtual uint8_t read(offs_t offset, int inhrom, int inhram, int be) override;
|
||||
virtual void write(offs_t offset, uint8_t data, int inhrom, int inhram, int be) override;
|
||||
|
||||
private:
|
||||
std::unique_ptr<uint8_t[]> m_ram;
|
||||
};
|
||||
|
||||
|
||||
// ======================> tanbus_ra32krom_device
|
||||
|
||||
class tanbus_ra32krom_device : public tanbus_ra32k_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tanbus_ra32krom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
virtual uint8_t read(offs_t offset, int inhrom, int inhram, int be) override;
|
||||
|
||||
private:
|
||||
required_region_ptr<uint8_t> m_rom;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(TANBUS_RA32K, tanbus_ra32k_device)
|
||||
DECLARE_DEVICE_TYPE(TANBUS_RA32KRAM, tanbus_ra32kram_device)
|
||||
DECLARE_DEVICE_TYPE(TANBUS_RA32KROM, tanbus_ra32krom_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_RA32K_H
|
||||
|
@ -11,6 +11,8 @@
|
||||
|
||||
#include "emu.h"
|
||||
#include "radisc.h"
|
||||
#include "formats/acorn_dsk.h"
|
||||
#include "formats/flex_dsk.h"
|
||||
#include "speaker.h"
|
||||
|
||||
|
||||
@ -31,24 +33,30 @@ static void tandos_floppies(device_slot_interface &device)
|
||||
device.option_add("525qd", FLOPPY_525_QD);
|
||||
}
|
||||
|
||||
void tanbus_radisc_device::floppy_formats(format_registration &fr)
|
||||
{
|
||||
fr.add_mfm_containers();
|
||||
fr.add(FLOPPY_FLEX_FORMAT);
|
||||
fr.add(FLOPPY_ACORN_SSD_FORMAT);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_radisc_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
INPUT_MERGER_ANY_HIGH(config, m_irq_line).output_handler().set(FUNC(tanbus_radisc_device::fdc_irq_w));
|
||||
INPUT_MERGER_ANY_HIGH(config, m_irq_line).output_handler().set(FUNC(tanbus_radisc_device::irq_w));
|
||||
|
||||
FD1793(config, m_fdc, 4_MHz_XTAL / 4);
|
||||
m_fdc->intrq_wr_callback().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_FDC>));
|
||||
m_fdc->intrq_wr_callback().set(FUNC(tanbus_radisc_device::fdc_irq_w));
|
||||
m_fdc->drq_wr_callback().set(FUNC(tanbus_radisc_device::fdc_drq_w));
|
||||
m_fdc->hld_wr_callback().set(FUNC(tanbus_radisc_device::fdc_hld_w));
|
||||
m_fdc->set_force_ready(true);
|
||||
|
||||
FLOPPY_CONNECTOR(config, m_floppies[0], tandos_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[1], tandos_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[2], tandos_floppies, nullptr, floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[3], tandos_floppies, nullptr, floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[0], tandos_floppies, "525qd", tanbus_radisc_device::floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[1], tandos_floppies, "525qd", tanbus_radisc_device::floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[2], tandos_floppies, nullptr, tanbus_radisc_device::floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[3], tandos_floppies, nullptr, tanbus_radisc_device::floppy_formats).enable_sound(true);
|
||||
|
||||
MC146818(config, m_rtc, 32.768_kHz_XTAL);
|
||||
m_rtc->irq().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_RTC>));
|
||||
@ -56,7 +64,6 @@ void tanbus_radisc_device::device_add_mconfig(machine_config &config)
|
||||
MOS6522(config, m_via, 4_MHz_XTAL / 4);
|
||||
m_via->irq_handler().set(m_irq_line, FUNC(input_merger_device::in_w<IRQ_VIA>));
|
||||
|
||||
/* audio hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
BEEP(config, m_beeper, 1000); // TODO: unknown frequency
|
||||
m_beeper->add_route(ALL_OUTPUTS, "mono", 1.0);
|
||||
@ -75,13 +82,14 @@ tanbus_radisc_device::tanbus_radisc_device(const machine_config &mconfig, const
|
||||
, device_tanbus_interface(mconfig, *this)
|
||||
, m_fdc(*this, "fdc")
|
||||
, m_floppies(*this, "fdc:%u", 0)
|
||||
, m_floppy(nullptr)
|
||||
, m_rtc(*this, "rtc")
|
||||
, m_via(*this, "via")
|
||||
, m_irq_line(*this, "irq_line")
|
||||
, m_beeper(*this, "beeper")
|
||||
, m_beeper_state(0)
|
||||
, m_drive_control(0)
|
||||
, m_status(0)
|
||||
, m_irq_enable(0)
|
||||
, m_drq_enable(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -94,14 +102,6 @@ void tanbus_radisc_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_radisc_device::device_reset()
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// read - card read
|
||||
//-------------------------------------------------
|
||||
@ -119,7 +119,7 @@ uint8_t tanbus_radisc_device::read(offs_t offset, int inhrom, int inhram, int be
|
||||
data = m_fdc->read(offset & 0x03);
|
||||
break;
|
||||
case 0xbf94:
|
||||
data = control_r();
|
||||
data = status_r();
|
||||
break;
|
||||
case 0xbf98: case 0xbf99:
|
||||
data = m_rtc->read(offset & 0x01);
|
||||
@ -160,39 +160,38 @@ void tanbus_radisc_device::write(offs_t offset, uint8_t data, int inhrom, int in
|
||||
// IMPLEMENTATION
|
||||
//**************************************************************************
|
||||
|
||||
void tanbus_radisc_device::control_w(uint8_t val)
|
||||
void tanbus_radisc_device::control_w(uint8_t data)
|
||||
{
|
||||
logerror("control_w %02x\n", val);
|
||||
m_drive_control = val;
|
||||
m_status = data & 0x3e;
|
||||
|
||||
// bit 0: irq enable
|
||||
m_irq_enable = BIT(val, 0);
|
||||
m_irq_enable = BIT(data, 0);
|
||||
|
||||
// bit 1: data select (data stream controller)
|
||||
|
||||
// bit 2, 3: drive select
|
||||
m_floppy = m_floppies[(val >> 2) & 0x03]->get_device();
|
||||
m_fdc->set_floppy(m_floppy);
|
||||
floppy_image_device *floppy = m_floppies[BIT(data, 2, 2)]->get_device();
|
||||
m_fdc->set_floppy(floppy);
|
||||
|
||||
// bit 4: side select
|
||||
if (m_floppy)
|
||||
m_floppy->ss_w(BIT(val, 4));
|
||||
if (floppy)
|
||||
floppy->ss_w(BIT(data, 4));
|
||||
|
||||
// bit 5: density
|
||||
m_fdc->dden_w(BIT(val, 5));
|
||||
m_fdc->dden_w(BIT(data, 5));
|
||||
|
||||
// bit 6: head load
|
||||
if (m_floppy)
|
||||
m_floppy->mon_w(BIT(val, 6));
|
||||
// bit 6: head load timing
|
||||
m_fdc->hlt_w(BIT(data, 6));
|
||||
if (floppy)
|
||||
floppy->mon_w(!BIT(data, 6));
|
||||
|
||||
// bit 7: drq enable
|
||||
m_drq_enable = BIT(val, 7);
|
||||
m_drq_enable = BIT(data, 7);
|
||||
}
|
||||
|
||||
uint8_t tanbus_radisc_device::control_r()
|
||||
uint8_t tanbus_radisc_device::status_r()
|
||||
{
|
||||
logerror("control_r %02x\n", m_drive_control);
|
||||
return m_drive_control;
|
||||
return m_status | (m_fdc->drq_r() << 7) | (m_fdc->hld_r() << 6) | (m_fdc->intrq_r() << 0);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(tanbus_radisc_device::fdc_drq_w)
|
||||
@ -202,12 +201,10 @@ WRITE_LINE_MEMBER(tanbus_radisc_device::fdc_drq_w)
|
||||
|
||||
WRITE_LINE_MEMBER(tanbus_radisc_device::fdc_irq_w)
|
||||
{
|
||||
m_tanbus->irq_w((m_irq_enable && state) ? ASSERT_LINE : CLEAR_LINE);
|
||||
m_irq_line->in_w<IRQ_FDC>((m_irq_enable && state) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(tanbus_radisc_device::fdc_hld_w)
|
||||
WRITE_LINE_MEMBER(tanbus_radisc_device::irq_w)
|
||||
{
|
||||
logerror("fdc_hld_w %d\n", state);
|
||||
if (m_floppy)
|
||||
m_floppy->mon_w(state);
|
||||
m_tanbus->irq_w(state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
@ -13,22 +13,22 @@
|
||||
#pragma once
|
||||
|
||||
#include "bus/tanbus/tanbus.h"
|
||||
#include "imagedev/floppy.h"
|
||||
#include "machine/wd_fdc.h"
|
||||
#include "machine/mc146818.h"
|
||||
#include "machine/6522via.h"
|
||||
#include "machine/input_merger.h"
|
||||
#include "sound/beep.h"
|
||||
#include "imagedev/floppy.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class tanbus_radisc_device :
|
||||
public device_t,
|
||||
public device_tanbus_interface
|
||||
class tanbus_radisc_device : public device_t, public device_tanbus_interface
|
||||
{
|
||||
public:
|
||||
static constexpr feature_type imperfect_features() { return feature::DISK; }
|
||||
|
||||
// construction/destruction
|
||||
tanbus_radisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
@ -37,7 +37,6 @@ public:
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
@ -48,22 +47,21 @@ protected:
|
||||
private:
|
||||
enum { IRQ_FDC, IRQ_VIA, IRQ_RTC };
|
||||
|
||||
void control_w(uint8_t val);
|
||||
uint8_t control_r();
|
||||
void control_w(uint8_t data);
|
||||
uint8_t status_r();
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(irq_w);
|
||||
|
||||
required_device<fd1793_device> m_fdc;
|
||||
required_device_array<floppy_connector, 4> m_floppies;
|
||||
floppy_image_device *m_floppy;
|
||||
required_device<mc146818_device> m_rtc;
|
||||
required_device<via6522_device> m_via;
|
||||
required_device<input_merger_device> m_irq_line;
|
||||
required_device<beep_device> m_beeper;
|
||||
|
||||
int m_beeper_state;
|
||||
uint8_t m_drive_control;
|
||||
uint8_t m_status;
|
||||
int m_irq_enable;
|
||||
int m_drq_enable;
|
||||
};
|
||||
|
@ -104,9 +104,6 @@ void tanbus_device::device_reset()
|
||||
|
||||
void tanbus_device::set_inhibit_lines(offs_t offset)
|
||||
{
|
||||
// prevent debugger from changing inhibit lines
|
||||
if (machine().side_effects_disabled()) return;
|
||||
|
||||
// reset inhibit lines
|
||||
m_inhram = m_inhrom = 0;
|
||||
|
||||
@ -134,7 +131,7 @@ uint8_t tanbus_device::read(offs_t offset)
|
||||
while (card)
|
||||
{
|
||||
// set block enable line for current card
|
||||
if ((card->m_page == 0) || ((m_block_register >> 4) & 7) == card->m_page)
|
||||
if (BIT(m_block_register, 4, 3) == card->m_page)
|
||||
m_block_enable = 1;
|
||||
else
|
||||
m_block_enable = 0;
|
||||
@ -155,7 +152,7 @@ void tanbus_device::write(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (offset == 0xffff)
|
||||
{
|
||||
logerror("write: Memory management control (read %d, write %d)\n", (data >> 4) & 7, data & 7);
|
||||
logerror("write: Memory management control %02x (read %d, write %d)\n", data, BIT(data, 4, 3), BIT(data, 0, 3));
|
||||
m_block_register = data;
|
||||
}
|
||||
else if (offset >= 0xf800)
|
||||
@ -170,7 +167,7 @@ void tanbus_device::write(offs_t offset, uint8_t data)
|
||||
while (card)
|
||||
{
|
||||
// set block enable line for current card
|
||||
if ((card->m_page == 0) || (m_block_register & 7) == card->m_page)
|
||||
if (BIT(m_block_register, 0,3) == card->m_page)
|
||||
m_block_enable = 1;
|
||||
else
|
||||
m_block_enable = 0;
|
||||
@ -204,16 +201,20 @@ device_tanbus_interface::device_tanbus_interface(const machine_config &mconfig,
|
||||
|
||||
// slot devices
|
||||
#include "bullsnd.h"
|
||||
#include "etirtc.h"
|
||||
#include "etisnd.h"
|
||||
#include "mpvdu.h"
|
||||
#include "ra32k.h"
|
||||
#include "radisc.h"
|
||||
#include "ravdu.h"
|
||||
#include "tanram.h"
|
||||
#include "tanrtc.h"
|
||||
#include "tandos.h"
|
||||
#include "tanex.h"
|
||||
#include "tanhrg.h"
|
||||
#include "tug64k.h"
|
||||
#include "tug8082.h"
|
||||
#include "tugcombo.h"
|
||||
#include "tugpgm.h"
|
||||
|
||||
void tanex_devices(device_slot_interface &device)
|
||||
@ -224,19 +225,29 @@ void tanex_devices(device_slot_interface &device)
|
||||
void tanbus_devices(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("bullsnd", TANBUS_BULLSND);
|
||||
device.option_add("etirtc", TANBUS_ETIRTC);
|
||||
device.option_add("etisnd", TANBUS_ETISND);
|
||||
//device.option_add("intelgraph", TANBUS_INTELGRAPH);
|
||||
device.option_add("mpvdu", TANBUS_MPVDU);
|
||||
device.option_add("tanram", TANBUS_TANRAM);
|
||||
device.option_add("tanrtc", TANBUS_TANRTC);
|
||||
device.option_add("tandos", TANBUS_TANDOS);
|
||||
device.option_add("tanhrg", TANBUS_TANHRG);
|
||||
device.option_add("tanhrgc", TANBUS_TANHRGC);
|
||||
device.option_add("tug64k", TANBUS_TUG64K);
|
||||
device.option_add("tug8082", TANBUS_TUG8082);
|
||||
device.option_add("tugesc2716", TANBUS_TUGESC2716);
|
||||
device.option_add("tugesc2732", TANBUS_TUGESC2732);
|
||||
device.option_add("tugcombo2716", TANBUS_TUGCOMBO2716);
|
||||
device.option_add("tugcombo2732", TANBUS_TUGCOMBO2732);
|
||||
device.option_add("tugcombo6116", TANBUS_TUGCOMBO6116);
|
||||
device.option_add("tugpgm", TANBUS_TUGPGM);
|
||||
}
|
||||
|
||||
void tanbus6809_devices(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("ra32k", TANBUS_RA32K);
|
||||
device.option_add("ra32kram", TANBUS_RA32KRAM);
|
||||
device.option_add("ra32krom", TANBUS_RA32KROM);
|
||||
device.option_add("radisc", TANBUS_RADISC);
|
||||
device.option_add("ravdu", TANBUS_RAVDU);
|
||||
device.option_add("tanram", TANBUS_TANRAM);
|
||||
|
@ -59,6 +59,29 @@ void tanbus_tandos_device::device_add_mconfig(machine_config &config)
|
||||
FLOPPY_CONNECTOR(config, m_floppies[1], tandos_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[2], tandos_floppies, nullptr, floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
|
||||
FLOPPY_CONNECTOR(config, m_floppies[3], tandos_floppies, nullptr, floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
|
||||
|
||||
TMS9914(config, m_tms9914, 8_MHz_XTAL / 2);
|
||||
m_tms9914->dio_read_cb().set(IEEE488_TAG, FUNC(ieee488_device::dio_r));
|
||||
m_tms9914->dio_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_dio_w));
|
||||
m_tms9914->eoi_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_eoi_w));
|
||||
m_tms9914->dav_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_dav_w));
|
||||
m_tms9914->nrfd_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_nrfd_w));
|
||||
m_tms9914->ndac_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ndac_w));
|
||||
m_tms9914->ifc_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ifc_w));
|
||||
m_tms9914->srq_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_srq_w));
|
||||
m_tms9914->atn_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
|
||||
m_tms9914->ren_write_cb().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
|
||||
|
||||
IEEE488(config, m_ieee);
|
||||
m_ieee->eoi_callback().set(m_tms9914, FUNC(tms9914_device::eoi_w));
|
||||
m_ieee->dav_callback().set(m_tms9914, FUNC(tms9914_device::dav_w));
|
||||
m_ieee->nrfd_callback().set(m_tms9914, FUNC(tms9914_device::nrfd_w));
|
||||
m_ieee->ndac_callback().set(m_tms9914, FUNC(tms9914_device::ndac_w));
|
||||
m_ieee->ifc_callback().set(m_tms9914, FUNC(tms9914_device::ifc_w));
|
||||
m_ieee->srq_callback().set(m_tms9914, FUNC(tms9914_device::srq_w));
|
||||
m_ieee->atn_callback().set(m_tms9914, FUNC(tms9914_device::atn_w));
|
||||
m_ieee->ren_callback().set(m_tms9914, FUNC(tms9914_device::ren_w));
|
||||
IEEE488_SLOT(config, "ieee_dev", 0, cbm_ieee488_devices, nullptr);
|
||||
}
|
||||
|
||||
const tiny_rom_entry *tanbus_tandos_device::device_rom_region() const
|
||||
@ -78,10 +101,12 @@ tanbus_tandos_device::tanbus_tandos_device(const machine_config &mconfig, const
|
||||
: device_t(mconfig, TANBUS_TANDOS, tag, owner, clock)
|
||||
, device_tanbus_interface(mconfig, *this)
|
||||
, m_dos_rom(*this, "dos_rom")
|
||||
, m_ieee(*this, IEEE488_TAG)
|
||||
, m_tms9914(*this, "hpib")
|
||||
, m_fdc(*this, "fdc")
|
||||
, m_floppies(*this, "fdc:%u", 0)
|
||||
, m_floppy(nullptr)
|
||||
, m_drive_control(0)
|
||||
, m_status(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -138,7 +163,7 @@ uint8_t tanbus_tandos_device::read(offs_t offset, int inhrom, int inhram, int be
|
||||
// GPIB PCB Switches
|
||||
break;
|
||||
case 0xbf98: case 0xbf99: case 0xbf9a: case 0xbf9b: case 0xbf9c: case 0xbf9d: case 0xbf9e: case 0xbf9f:
|
||||
// GPIB (9914)
|
||||
data = m_tms9914->read(offset & 0x07);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -169,7 +194,7 @@ void tanbus_tandos_device::write(offs_t offset, uint8_t data, int inhrom, int in
|
||||
control_w(data);
|
||||
break;
|
||||
case 0xbf98: case 0xbf99: case 0xbf9a: case 0xbf9b: case 0xbf9c: case 0xbf9d: case 0xbf9e: case 0xbf9f:
|
||||
// GPIB (9914)
|
||||
m_tms9914->write(offset & 0x07, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@ -195,8 +220,7 @@ void tanbus_tandos_device::set_inhibit_lines(offs_t offset, int &inhram, int &in
|
||||
|
||||
void tanbus_tandos_device::control_w(uint8_t data)
|
||||
{
|
||||
logerror("control_w %02x\n", data);
|
||||
m_drive_control = data;
|
||||
m_status = data & 0x3e;
|
||||
|
||||
// bit 0: irq enable
|
||||
m_irq_enable = BIT(data, 0);
|
||||
@ -204,7 +228,7 @@ void tanbus_tandos_device::control_w(uint8_t data)
|
||||
// bit 1: data select (data stream controller)
|
||||
|
||||
// bit 2, 3: drive select
|
||||
m_floppy = m_floppies[(data >> 2) & 0x03]->get_device();
|
||||
m_floppy = m_floppies[BIT(data, 2, 2)]->get_device();
|
||||
m_fdc->set_floppy(m_floppy);
|
||||
|
||||
// bit 4: side select
|
||||
@ -225,14 +249,7 @@ void tanbus_tandos_device::control_w(uint8_t data)
|
||||
|
||||
uint8_t tanbus_tandos_device::status_r()
|
||||
{
|
||||
uint8_t data = 0x00;
|
||||
|
||||
data |= m_drive_control & 0x3c;
|
||||
data |= m_fdc->intrq_r() << 0;
|
||||
data |= m_fdc->hld_r() << 6;
|
||||
data |= m_fdc->drq_r() << 7;
|
||||
|
||||
return data;
|
||||
return m_status | (m_fdc->drq_r() << 7) | (m_fdc->hld_r() << 6) | (m_fdc->intrq_r() << 0);
|
||||
}
|
||||
|
||||
|
||||
@ -248,7 +265,6 @@ WRITE_LINE_MEMBER(tanbus_tandos_device::fdc_irq_w)
|
||||
|
||||
WRITE_LINE_MEMBER(tanbus_tandos_device::fdc_hld_w)
|
||||
{
|
||||
logerror("fdc_hld_w %d\n", state);
|
||||
if (m_floppy)
|
||||
m_floppy->mon_w(state);
|
||||
}
|
||||
|
@ -12,17 +12,17 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "bus/tanbus/tanbus.h"
|
||||
#include "imagedev/floppy.h"
|
||||
#include "tanbus.h"
|
||||
#include "machine/wd_fdc.h"
|
||||
#include "machine/tms9914.h"
|
||||
#include "bus/ieee488/ieee488.h"
|
||||
#include "imagedev/floppy.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class tanbus_tandos_device :
|
||||
public device_t,
|
||||
public device_tanbus_interface
|
||||
class tanbus_tandos_device : public device_t, public device_tanbus_interface
|
||||
{
|
||||
public:
|
||||
static constexpr feature_type imperfect_features() { return feature::DISK; }
|
||||
@ -46,18 +46,20 @@ protected:
|
||||
virtual void set_inhibit_lines(offs_t offset, int &inhram, int &inhrom) override;
|
||||
|
||||
private:
|
||||
void control_w(uint8_t val);
|
||||
void control_w(uint8_t data);
|
||||
uint8_t status_r();
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
|
||||
|
||||
required_memory_region m_dos_rom;
|
||||
required_device<ieee488_device> m_ieee;
|
||||
required_device<tms9914_device> m_tms9914;
|
||||
required_device<fd1793_device> m_fdc;
|
||||
required_device_array<floppy_connector, 4> m_floppies;
|
||||
floppy_image_device *m_floppy;
|
||||
|
||||
uint8_t m_drive_control;
|
||||
uint8_t m_status;
|
||||
int m_irq_enable;
|
||||
int m_drq_enable;
|
||||
|
||||
|
@ -55,17 +55,11 @@ uint8_t tanbus_tanram_device::read(offs_t offset, int inhrom, int inhram, int be
|
||||
|
||||
if (be && !inhram)
|
||||
{
|
||||
/* 32K dynamic ram */
|
||||
if ((offset >= 0x2000) && (offset < 0xa000))
|
||||
/* 32K dynamic ram + 7K static ram */
|
||||
if ((offset >= 0x2000) && (offset < 0xbc00))
|
||||
{
|
||||
data = m_ram[offset - 0x2000];
|
||||
}
|
||||
|
||||
/* 7K static ram */
|
||||
if ((offset >= 0xa000) && (offset < 0xbc00))
|
||||
{
|
||||
data = m_ram[offset - 0xa000];
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
@ -78,16 +72,10 @@ void tanbus_tanram_device::write(offs_t offset, uint8_t data, int inhrom, int in
|
||||
{
|
||||
if (be && !inhram)
|
||||
{
|
||||
/* 32K dynamic ram */
|
||||
if ((offset >= 0x2000) && (offset < 0xa000))
|
||||
/* 32K dynamic ram + 7K static ram */
|
||||
if ((offset >= 0x2000) && (offset < 0xbc00))
|
||||
{
|
||||
m_ram[offset - 0x2000] = data;
|
||||
}
|
||||
|
||||
/* 7K static ram */
|
||||
if ((offset >= 0xa000) && (offset < 0xbc00))
|
||||
{
|
||||
m_ram[offset - 0xa000] = data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
86
src/devices/bus/tanbus/tanrtc.cpp
Normal file
86
src/devices/bus/tanbus/tanrtc.cpp
Normal file
@ -0,0 +1,86 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtanic Real Time Clock
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "tanrtc.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(TANBUS_TANRTC, tanbus_tanrtc_device, "tanbus_tanrtc", "Microtanic Real Time Clock")
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_tanrtc_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
MC146818(config, m_rtc, 32.768_kHz_XTAL);
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// tanbus_tanrtc_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
tanbus_tanrtc_device::tanbus_tanrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, TANBUS_TANRTC, tag, owner, clock)
|
||||
, device_tanbus_interface(mconfig, *this)
|
||||
, m_rtc(*this, "rtc")
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_tanrtc_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// read - card read
|
||||
//-------------------------------------------------
|
||||
|
||||
uint8_t tanbus_tanrtc_device::read(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
uint8_t data = 0xff;
|
||||
|
||||
switch (offset & 0xffc0)
|
||||
{
|
||||
case 0xbc00:
|
||||
data = m_rtc->read_direct(offset);
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// write - card write
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_tanrtc_device::write(offs_t offset, uint8_t data, int inhrom, int inhram, int be)
|
||||
{
|
||||
switch (offset & 0xffc0)
|
||||
{
|
||||
case 0xbc00:
|
||||
m_rtc->write_direct(offset, data);
|
||||
break;
|
||||
}
|
||||
}
|
47
src/devices/bus/tanbus/tanrtc.h
Normal file
47
src/devices/bus/tanbus/tanrtc.h
Normal file
@ -0,0 +1,47 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
Microtanic Real Time Clock
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_TANRTC_H
|
||||
#define MAME_BUS_TANBUS_TANRTC_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "tanbus.h"
|
||||
#include "machine/mc146818.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class tanbus_tanrtc_device : public device_t, public device_tanbus_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
tanbus_tanrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
virtual uint8_t read(offs_t offset, int inhrom, int inhram, int be) override;
|
||||
virtual void write(offs_t offset, uint8_t data, int inhrom, int inhram, int be) override;
|
||||
|
||||
private:
|
||||
required_device<mc146818_device> m_rtc;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(TANBUS_TANRTC, tanbus_tanrtc_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_TANRTC_H
|
270
src/devices/bus/tanbus/tugcombo.cpp
Normal file
270
src/devices/bus/tanbus/tugcombo.cpp
Normal file
@ -0,0 +1,270 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
TUG Combo Card / TUG EPROM Storage Card
|
||||
|
||||
http://www.microtan.ukpc.net/pageProducts.html#ROM
|
||||
|
||||
Usage:
|
||||
G EFFC
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "tugcombo.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(TANBUS_TUGCOMBO2716, tanbus_tugcombo2716_device, "tanbus_tugcombo2716", "TUG Combo Card (2716)")
|
||||
DEFINE_DEVICE_TYPE(TANBUS_TUGCOMBO2732, tanbus_tugcombo2732_device, "tanbus_tugcombo2732", "TUG Combo Card (2732)")
|
||||
DEFINE_DEVICE_TYPE(TANBUS_TUGCOMBO6116, tanbus_tugcombo6116_device, "tanbus_tugcombo6116", "TUG Combo Card (6116)")
|
||||
DEFINE_DEVICE_TYPE(TANBUS_TUGESC2716, tanbus_tugesc2716_device, "tanbus_tugesc2716", "TUG EPROM Storage Card (2716)")
|
||||
DEFINE_DEVICE_TYPE(TANBUS_TUGESC2732, tanbus_tugesc2732_device, "tanbus_tugesc2732", "TUG EPROM Storage Card (2732)")
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// INPUT_PORTS( tugcombo )
|
||||
//-------------------------------------------------
|
||||
|
||||
INPUT_PORTS_START(tugcombo)
|
||||
PORT_START("LINKS")
|
||||
PORT_DIPNAME(0x88, 0x00, "I/O Address")
|
||||
PORT_DIPSETTING(0x00, "$BD00 - $BD07")
|
||||
PORT_DIPSETTING(0x08, "$BD08 - $BD0F")
|
||||
PORT_DIPSETTING(0x80, "$BD80 - $BD87")
|
||||
PORT_DIPSETTING(0x88, "$BD88 - $BD8F")
|
||||
INPUT_PORTS_END
|
||||
|
||||
//-------------------------------------------------
|
||||
// input_ports - device-specific input ports
|
||||
//-------------------------------------------------
|
||||
|
||||
ioport_constructor tanbus_tugcombo_device::device_input_ports() const
|
||||
{
|
||||
return INPUT_PORTS_NAME(tugcombo);
|
||||
}
|
||||
|
||||
|
||||
void tanbus_tugcombo2716_device::mem_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x07ff).mirror(0x8000).r(m_rom[0], FUNC(generic_slot_device::read_rom));
|
||||
map(0x0800, 0x0fff).mirror(0x8000).r(m_rom[1], FUNC(generic_slot_device::read_rom));
|
||||
map(0x1000, 0x17ff).mirror(0x8000).r(m_rom[2], FUNC(generic_slot_device::read_rom));
|
||||
map(0x1800, 0x1fff).mirror(0x8000).r(m_rom[3], FUNC(generic_slot_device::read_rom));
|
||||
map(0x2000, 0x27ff).mirror(0x8000).r(m_rom[4], FUNC(generic_slot_device::read_rom));
|
||||
map(0x2800, 0x2fff).mirror(0x8000).r(m_rom[5], FUNC(generic_slot_device::read_rom));
|
||||
map(0x3000, 0x37ff).mirror(0x8000).r(m_rom[6], FUNC(generic_slot_device::read_rom));
|
||||
map(0x3800, 0x3fff).mirror(0x8000).r(m_rom[7], FUNC(generic_slot_device::read_rom));
|
||||
map(0x4000, 0x47ff).mirror(0x8000).r(m_rom[8], FUNC(generic_slot_device::read_rom));
|
||||
map(0x4800, 0x4fff).mirror(0x8000).r(m_rom[9], FUNC(generic_slot_device::read_rom));
|
||||
map(0x5000, 0x57ff).mirror(0x8000).r(m_rom[10], FUNC(generic_slot_device::read_rom));
|
||||
map(0x5800, 0x5fff).mirror(0x8000).r(m_rom[11], FUNC(generic_slot_device::read_rom));
|
||||
map(0x6000, 0x67ff).mirror(0x8000).r(m_rom[12], FUNC(generic_slot_device::read_rom));
|
||||
map(0x6800, 0x6fff).mirror(0x8000).r(m_rom[13], FUNC(generic_slot_device::read_rom));
|
||||
map(0x7000, 0x77ff).mirror(0x8000).r(m_rom[14], FUNC(generic_slot_device::read_rom));
|
||||
map(0x7800, 0x7fff).mirror(0x8000).r(m_rom[15], FUNC(generic_slot_device::read_rom));
|
||||
}
|
||||
|
||||
void tanbus_tugcombo2732_device::mem_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x0fff).r(m_rom[0], FUNC(generic_slot_device::read_rom));
|
||||
map(0x1000, 0x1fff).r(m_rom[1], FUNC(generic_slot_device::read_rom));
|
||||
map(0x2000, 0x2fff).r(m_rom[2], FUNC(generic_slot_device::read_rom));
|
||||
map(0x3000, 0x3fff).r(m_rom[3], FUNC(generic_slot_device::read_rom));
|
||||
map(0x4000, 0x4fff).r(m_rom[4], FUNC(generic_slot_device::read_rom));
|
||||
map(0x5000, 0x5fff).r(m_rom[5], FUNC(generic_slot_device::read_rom));
|
||||
map(0x6000, 0x6fff).r(m_rom[6], FUNC(generic_slot_device::read_rom));
|
||||
map(0x7000, 0x7fff).r(m_rom[7], FUNC(generic_slot_device::read_rom));
|
||||
map(0x8000, 0x8fff).r(m_rom[8], FUNC(generic_slot_device::read_rom));
|
||||
map(0x9000, 0x9fff).r(m_rom[9], FUNC(generic_slot_device::read_rom));
|
||||
map(0xa000, 0xafff).r(m_rom[10], FUNC(generic_slot_device::read_rom));
|
||||
map(0xb000, 0xbfff).r(m_rom[11], FUNC(generic_slot_device::read_rom));
|
||||
map(0xc000, 0xcfff).r(m_rom[12], FUNC(generic_slot_device::read_rom));
|
||||
map(0xd000, 0xdfff).r(m_rom[13], FUNC(generic_slot_device::read_rom));
|
||||
map(0xe000, 0xefff).r(m_rom[14], FUNC(generic_slot_device::read_rom));
|
||||
map(0xf000, 0xffff).r(m_rom[15], FUNC(generic_slot_device::read_rom));
|
||||
}
|
||||
|
||||
void tanbus_tugcombo6116_device::mem_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x7fff).mirror(0x8000).ram().share("nvram");
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_tugcombo_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
PIA6821(config, m_pia[0]);
|
||||
m_pia[0]->writepa_handler().set([this](uint8_t data) { m_addr = (m_addr & 0xff00) | data; });
|
||||
m_pia[0]->writepb_handler().set([this](uint8_t data) { m_addr = (m_addr & 0x00ff) | (data << 8); });
|
||||
|
||||
PIA6821(config, m_pia[1]);
|
||||
m_pia[1]->readpb_handler().set([this]() { return m_space->read_byte(m_addr); });
|
||||
m_pia[1]->writepb_handler().set([this](uint8_t data) { m_space->write_byte(m_addr, data); });
|
||||
}
|
||||
|
||||
void tanbus_tugcombo2716_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
tanbus_tugcombo_device::device_add_mconfig(config);
|
||||
|
||||
for (int i = 0; i < 16; i++)
|
||||
GENERIC_SOCKET(config, m_rom[i], generic_linear_slot, "rom_esc2716", "bin,rom");
|
||||
}
|
||||
|
||||
void tanbus_tugcombo2732_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
tanbus_tugcombo_device::device_add_mconfig(config);
|
||||
|
||||
for (int i = 0; i < 16; i++)
|
||||
GENERIC_SOCKET(config, m_rom[i], generic_linear_slot, "rom_esc2732", "bin,rom");
|
||||
}
|
||||
|
||||
void tanbus_tugcombo6116_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
tanbus_tugcombo_device::device_add_mconfig(config);
|
||||
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// tanbus_tugcombo_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
tanbus_tugcombo_device::tanbus_tugcombo_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_memory_interface(mconfig, *this)
|
||||
, device_tanbus_interface(mconfig, *this)
|
||||
, m_space(nullptr)
|
||||
, m_links(*this, "LINKS")
|
||||
, m_pia(*this, "pia%u", 0)
|
||||
, m_addr(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
tanbus_tugcombo2716_device::tanbus_tugcombo2716_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo_device(mconfig, type, tag, owner, clock)
|
||||
, m_rom(*this, "rom%u", 0)
|
||||
{
|
||||
m_space_config = address_space_config("memory", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(tanbus_tugcombo2716_device::mem_map), this));
|
||||
}
|
||||
|
||||
tanbus_tugcombo2716_device::tanbus_tugcombo2716_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo2716_device(mconfig, TANBUS_TUGCOMBO2716, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
tanbus_tugesc2716_device::tanbus_tugesc2716_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo2716_device(mconfig, TANBUS_TUGESC2716, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
tanbus_tugcombo2732_device::tanbus_tugcombo2732_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo_device(mconfig, type, tag, owner, clock)
|
||||
, m_rom(*this, "rom%u", 0)
|
||||
{
|
||||
m_space_config = address_space_config("memory", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(tanbus_tugcombo2732_device::mem_map), this));
|
||||
}
|
||||
|
||||
tanbus_tugcombo2732_device::tanbus_tugcombo2732_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo2732_device(mconfig, TANBUS_TUGCOMBO2732, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
tanbus_tugesc2732_device::tanbus_tugesc2732_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo2732_device(mconfig, TANBUS_TUGESC2732, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
tanbus_tugcombo6116_device::tanbus_tugcombo6116_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo_device(mconfig, type, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
tanbus_tugcombo6116_device::tanbus_tugcombo6116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: tanbus_tugcombo6116_device(mconfig, TANBUS_TUGCOMBO6116, tag, owner, clock)
|
||||
{
|
||||
m_space_config = address_space_config("memory", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(tanbus_tugcombo6116_device::mem_map), this));
|
||||
}
|
||||
|
||||
|
||||
device_memory_interface::space_config_vector tanbus_tugcombo_device::memory_space_config() const
|
||||
{
|
||||
return space_config_vector{ std::make_pair(0, &m_space_config) };
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_tugcombo_device::device_start()
|
||||
{
|
||||
m_space = &space(0);
|
||||
|
||||
save_item(NAME(m_addr));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// read - card read
|
||||
//-------------------------------------------------
|
||||
|
||||
uint8_t tanbus_tugcombo_device::read(offs_t offset, int inhrom, int inhram, int be)
|
||||
{
|
||||
uint8_t data = 0xff;
|
||||
|
||||
offs_t addr = 0xbd00 | m_links->read();
|
||||
|
||||
if (addr == (offset & 0xfff8))
|
||||
{
|
||||
switch (offset & 0x04)
|
||||
{
|
||||
case 0x00:
|
||||
data = m_pia[0]->read(offset & 3);
|
||||
break;
|
||||
case 0x04:
|
||||
data = m_pia[1]->read(offset & 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// write - card write
|
||||
//-------------------------------------------------
|
||||
|
||||
void tanbus_tugcombo_device::write(offs_t offset, uint8_t data, int inhrom, int inhram, int be)
|
||||
{
|
||||
offs_t addr = 0xbd00 | m_links->read();
|
||||
|
||||
if (addr == (offset & 0xfff8))
|
||||
{
|
||||
switch (offset & 0x04)
|
||||
{
|
||||
case 0x00:
|
||||
m_pia[0]->write(offset & 3, data);
|
||||
break;
|
||||
case 0x04:
|
||||
m_pia[1]->write(offset & 3, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
142
src/devices/bus/tanbus/tugcombo.h
Normal file
142
src/devices/bus/tanbus/tugcombo.h
Normal file
@ -0,0 +1,142 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
TUG Combo Card / TUG EPROM Storage Card
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#ifndef MAME_BUS_TANBUS_TUGCOMBO_H
|
||||
#define MAME_BUS_TANBUS_TUGCOMBO_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "tanbus.h"
|
||||
#include "machine/6821pia.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "bus/generic/slot.h"
|
||||
#include "bus/generic/carts.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class tanbus_tugcombo_device
|
||||
: public device_t
|
||||
, public device_memory_interface
|
||||
, public device_tanbus_interface
|
||||
{
|
||||
protected:
|
||||
tanbus_tugcombo_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;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual space_config_vector memory_space_config() const override;
|
||||
|
||||
virtual uint8_t read(offs_t offset, int inhrom, int inhram, int be) override;
|
||||
virtual void write(offs_t offset, uint8_t data, int inhrom, int inhram, int be) override;
|
||||
|
||||
address_space_config m_space_config;
|
||||
address_space *m_space;
|
||||
|
||||
private:
|
||||
required_ioport m_links;
|
||||
required_device_array<pia6821_device, 2> m_pia;
|
||||
|
||||
uint16_t m_addr;
|
||||
};
|
||||
|
||||
|
||||
// ======================> tanbus_tugcombo2716_device
|
||||
|
||||
class tanbus_tugcombo2716_device : public tanbus_tugcombo_device
|
||||
{
|
||||
public:
|
||||
tanbus_tugcombo2716_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
tanbus_tugcombo2716_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
private:
|
||||
required_device_array<generic_slot_device, 16> m_rom;
|
||||
|
||||
void mem_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// ======================> tanbus_tugcombo2732_device
|
||||
|
||||
class tanbus_tugcombo2732_device : public tanbus_tugcombo_device
|
||||
{
|
||||
public:
|
||||
tanbus_tugcombo2732_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
tanbus_tugcombo2732_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
private:
|
||||
required_device_array<generic_slot_device, 16> m_rom;
|
||||
|
||||
void mem_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// ======================> tanbus_tugcombo6116_device
|
||||
|
||||
class tanbus_tugcombo6116_device : public tanbus_tugcombo_device
|
||||
{
|
||||
public:
|
||||
tanbus_tugcombo6116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
tanbus_tugcombo6116_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
private:
|
||||
void mem_map(address_map &map);
|
||||
};
|
||||
|
||||
|
||||
// ======================> tanbus_tugesc2716_device
|
||||
|
||||
class tanbus_tugesc2716_device : public tanbus_tugcombo2716_device
|
||||
{
|
||||
public:
|
||||
tanbus_tugesc2716_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
};
|
||||
|
||||
|
||||
// ======================> tanbus_tugesc2732_device
|
||||
|
||||
class tanbus_tugesc2732_device : public tanbus_tugcombo2732_device
|
||||
{
|
||||
public:
|
||||
tanbus_tugesc2732_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(TANBUS_TUGCOMBO2716, tanbus_tugcombo2716_device)
|
||||
DECLARE_DEVICE_TYPE(TANBUS_TUGCOMBO2732, tanbus_tugcombo2732_device)
|
||||
DECLARE_DEVICE_TYPE(TANBUS_TUGCOMBO6116, tanbus_tugcombo6116_device)
|
||||
DECLARE_DEVICE_TYPE(TANBUS_TUGESC2716, tanbus_tugesc2716_device)
|
||||
DECLARE_DEVICE_TYPE(TANBUS_TUGESC2732, tanbus_tugesc2732_device)
|
||||
|
||||
|
||||
#endif // MAME_BUS_TANBUS_TUGCOMBO_H
|
@ -440,7 +440,7 @@ EXG:
|
||||
write_exgtfr_register(param >> 0, reg2);
|
||||
write_exgtfr_register(param >> 4, reg1);
|
||||
}
|
||||
eat(hd6309_native_mode() ? 3 : 6);
|
||||
eat(3);
|
||||
return;
|
||||
|
||||
TFR:
|
||||
@ -450,7 +450,7 @@ TFR:
|
||||
uint16_t reg = read_exgtfr_register(param >> 0);
|
||||
write_exgtfr_register(param >> 4, reg);
|
||||
}
|
||||
eat(hd6309_native_mode() ? 2 : 4);
|
||||
eat(2);
|
||||
return;
|
||||
|
||||
SETLINE:
|
||||
|
@ -148,7 +148,7 @@ void rocvfd_device::device_start()
|
||||
|
||||
m_sclk = 0;
|
||||
m_data = 0;
|
||||
m_por = 1;
|
||||
m_por = 0;
|
||||
|
||||
save_item(NAME(m_cursor_pos));
|
||||
save_item(NAME(m_window_size));
|
||||
@ -161,11 +161,16 @@ void rocvfd_device::device_start()
|
||||
save_item(NAME(m_data));
|
||||
save_item(NAME(m_por));
|
||||
save_item(NAME(m_duty));
|
||||
save_item(NAME(m_disp));
|
||||
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(*m_outputs), std::end(*m_outputs), 0);
|
||||
|
||||
}
|
||||
|
||||
void rocvfd_device::device_reset()
|
||||
{
|
||||
//We don't clear the buffers on reset as JPM games rely on the buffers being intact after POR
|
||||
//On real hardware, garbage patterns can appear unless specifically cleared, so this makes sense.
|
||||
m_cursor_pos = 0;
|
||||
m_window_size = 16;
|
||||
m_shift_count = 0;
|
||||
@ -173,13 +178,8 @@ void rocvfd_device::device_reset()
|
||||
m_pcursor_pos = 0;
|
||||
m_count = 0;
|
||||
m_duty = 0;
|
||||
m_disp = 0;
|
||||
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(*m_outputs), std::end(*m_outputs), 0);
|
||||
|
||||
(*m_brightness)[0] = 0;
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@ -207,7 +207,14 @@ WRITE_LINE_MEMBER( rocvfd_device::sclk )
|
||||
|
||||
WRITE_LINE_MEMBER( rocvfd_device::data )
|
||||
{
|
||||
m_data = state;
|
||||
if (state)
|
||||
{
|
||||
m_data = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_data = 0;
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( rocvfd_device::por )
|
||||
@ -239,10 +246,9 @@ void rocvfd_device::shift_clock(int state)
|
||||
m_shift_data = 0;
|
||||
}
|
||||
update_display();
|
||||
|
||||
}
|
||||
m_sclk = state;
|
||||
}
|
||||
m_sclk = state;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@ -294,12 +300,11 @@ void rocvfd_device::write_char(int data)
|
||||
else if ( (data & 0xE0) == 0x80 ) // 100x ---
|
||||
{ // 100x xxxx Test mode
|
||||
popmessage("TEST MODE ENABLED!");
|
||||
m_duty = 4;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // Display data
|
||||
// data &= 0x3F;
|
||||
data &= 0x3F;
|
||||
|
||||
switch ( data )
|
||||
{
|
||||
|
@ -40,7 +40,6 @@ protected:
|
||||
int m_count;
|
||||
int m_data;
|
||||
int m_duty;
|
||||
int m_disp;
|
||||
int m_sclk;
|
||||
int m_por;
|
||||
uint8_t m_cursor;
|
||||
|
@ -219,16 +219,16 @@ void device_serial_interface::receive_register_reset()
|
||||
WRITE_LINE_MEMBER(device_serial_interface::rx_w)
|
||||
{
|
||||
m_rcv_line = state;
|
||||
if(m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED)
|
||||
if (m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED)
|
||||
return;
|
||||
receive_register_update_bit(state);
|
||||
if(m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED)
|
||||
if (m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED)
|
||||
{
|
||||
LOGMASKED(LOG_RX, "Receiver is synchronized\n");
|
||||
if(m_rcv_clock && !(m_rcv_rate.is_never()))
|
||||
if (m_rcv_clock && !(m_rcv_rate.is_never()))
|
||||
// make start delay just a bit longer to make sure we are called after the sender
|
||||
m_rcv_clock->adjust(((m_rcv_rate*3)/2), 0, m_rcv_rate);
|
||||
else if(m_start_bit_hack_for_external_clocks)
|
||||
else if (m_start_bit_hack_for_external_clocks)
|
||||
m_rcv_bit_count_received--;
|
||||
}
|
||||
return;
|
||||
@ -274,8 +274,7 @@ void device_serial_interface::receive_register_update_bit(int bit)
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED)
|
||||
else if (m_rcv_flags & RECEIVE_REGISTER_SYNCHRONISED)
|
||||
{
|
||||
LOGMASKED(LOG_RX, "Received bit %d as %d\n", m_rcv_bit_count_received, bit);
|
||||
m_rcv_bit_count_received++;
|
||||
|
@ -2,9 +2,9 @@
|
||||
// copyright-holders:James Wallace
|
||||
/**********************************************************************
|
||||
|
||||
Bellfruit BD1 VFD module interface and emulation by J.Wallace
|
||||
Bellfruit BD1 VFD module interface and emulation
|
||||
|
||||
TODO: Implement flashing (our only datasheet has that section
|
||||
TODO: Verify flashing (our only datasheet has that section
|
||||
completely illegible)
|
||||
|
||||
This is a simulation of code running on an NEC D78042GF-090
|
||||
@ -76,7 +76,7 @@ static const uint16_t BD1charset[]=
|
||||
0xC62D, // 1100 0110 0010 1101 $.
|
||||
0x0100, // 0000 0001 0000 0000 flash character
|
||||
0x0000, // 0000 0000 0000 0000 not defined
|
||||
0x0040, // 0000 0000 1000 0000 '.
|
||||
0x0080, // 0000 0000 1000 0000 '.
|
||||
0x0880, // 0000 1000 1000 0000 (.
|
||||
0x0050, // 0000 0000 0101 0000 ).
|
||||
0xCCD8, // 1100 1100 1101 1000 *.
|
||||
@ -88,7 +88,7 @@ static const uint16_t BD1charset[]=
|
||||
0x22B7, // 0010 0010 1011 0111 0.
|
||||
0x0408, // 0000 0100 0000 1000 1.
|
||||
0xE206, // 1110 0010 0000 0110 2.
|
||||
0x4226, // 0100 0010 0010 0110 3.
|
||||
0xC226, // 0100 0010 0010 0110 3.
|
||||
0xC023, // 1100 0000 0010 0011 4.
|
||||
0xC225, // 1100 0010 0010 0101 5.
|
||||
0xE225, // 1110 0010 0010 0101 6.
|
||||
@ -146,10 +146,12 @@ void bfm_bd1_device::device_reset()
|
||||
m_shift_count = 0;
|
||||
m_shift_data = 0;
|
||||
m_pcursor_pos = 0;
|
||||
m_scroll_active = 0;
|
||||
m_scroll_active = false;
|
||||
m_display_mode = 0;
|
||||
m_flash_rate = 0;
|
||||
m_flash_control = 0;
|
||||
m_flash = false;
|
||||
m_flash_timer = 0;
|
||||
m_user_data = 0;
|
||||
m_user_def = 0;
|
||||
m_sclk = 0;
|
||||
@ -171,8 +173,64 @@ void bfm_bd1_device::device_post_load()
|
||||
|
||||
void bfm_bd1_device::update_display()
|
||||
{
|
||||
if (m_flash_timer)
|
||||
{
|
||||
m_flash_timer--;
|
||||
if (!m_flash_timer)
|
||||
{
|
||||
m_flash_timer = 20;
|
||||
if (!m_flash)
|
||||
{
|
||||
switch (m_flash_control)
|
||||
{
|
||||
case 1: // Flash Inside Window
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
if ((i >= m_window_start) && (i <= m_window_end))
|
||||
m_attrs[i] = AT_FLASH;
|
||||
else
|
||||
m_attrs[i] = AT_NORMAL;
|
||||
}
|
||||
m_flash = true;
|
||||
break;
|
||||
case 2: // Flash Outside Window
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
if ((i < m_window_start) || (i > m_window_end))
|
||||
m_attrs[i] = AT_FLASH;
|
||||
else
|
||||
m_attrs[i] = AT_NORMAL;
|
||||
}
|
||||
m_flash = true;
|
||||
break;
|
||||
case 3: // Flash All
|
||||
for ( int i = 0; i < 16; i++ )
|
||||
m_attrs[i] = AT_FLASH;
|
||||
m_flash = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_flash_rate--;
|
||||
if (!m_flash_rate)
|
||||
{
|
||||
m_flash_timer = 0;
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
m_attrs[i] = AT_NORMAL;
|
||||
}
|
||||
}
|
||||
if (m_flash_control)
|
||||
{
|
||||
m_flash = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 16; i++)
|
||||
(*m_outputs)[i] = (m_attrs[i] != AT_BLANK) ? set_display(m_chars[i]) : 0;
|
||||
(*m_outputs)[i] = (m_attrs[i] == AT_NORMAL) ? set_display(m_chars[i]) : 0;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
void bfm_bd1_device::blank(int data)
|
||||
@ -187,7 +245,7 @@ void bfm_bd1_device::blank(int data)
|
||||
break;
|
||||
|
||||
case 0x01: // blank inside window
|
||||
if ( m_window_size > 0 )
|
||||
if (m_window_size > 0)
|
||||
{
|
||||
for (int i = m_window_start; i < m_window_end ; i++)
|
||||
{
|
||||
@ -197,9 +255,9 @@ void bfm_bd1_device::blank(int data)
|
||||
break;
|
||||
|
||||
case 0x02: // blank outside window
|
||||
if ( m_window_size > 0 )
|
||||
if (m_window_size > 0)
|
||||
{
|
||||
if ( m_window_start > 0 )
|
||||
if (m_window_start > 0)
|
||||
{
|
||||
for (int i = 0; i < m_window_start; i++)
|
||||
{
|
||||
@ -228,61 +286,66 @@ void bfm_bd1_device::blank(int data)
|
||||
|
||||
int bfm_bd1_device::write_char(int data)
|
||||
{
|
||||
if ( m_user_def )
|
||||
if (m_user_def)
|
||||
{
|
||||
m_user_def--;
|
||||
|
||||
m_user_data <<= 8;
|
||||
m_user_data |= data;
|
||||
|
||||
if ( m_user_def )
|
||||
if (m_user_def)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
setdata( m_user_data, data);
|
||||
setdata(m_user_data, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(data < 0x80)//characters
|
||||
{
|
||||
if (data > 0x3F)
|
||||
if (data > 0x3f)
|
||||
{
|
||||
// logerror("Undefined character %x \n", data);
|
||||
logerror("Undefined character %x \n", data);
|
||||
}
|
||||
|
||||
setdata(BD1charset[(data & 0x3F)], data);
|
||||
setdata(BD1charset[(data & 0x3f)], data);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( data & 0xF0 )
|
||||
switch (data & 0xf0)
|
||||
{
|
||||
case 0x80: // 0x80 - 0x8F Set display blanking
|
||||
blank(data&0x03);//use the blanking data
|
||||
break;
|
||||
|
||||
case 0x90: // 0x90 - 0x9F Set cursor pos
|
||||
m_cursor_pos = data & 0x0F;
|
||||
m_scroll_active = 0;
|
||||
if ( m_display_mode == 2 )
|
||||
if (data == 0x84)
|
||||
{
|
||||
if ( m_cursor_pos >= m_window_end) m_scroll_active = 1;
|
||||
popmessage("Duty control active, contact MAMEDEV");
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xA0: // 0xA0 - 0xAF Set display mode
|
||||
case 0x90: // 0x90 - 0x9F Set cursor pos
|
||||
m_cursor_pos = data & 0x0f;
|
||||
m_scroll_active = false;
|
||||
if (m_display_mode == 2)
|
||||
{
|
||||
if (m_cursor_pos >= m_window_end) m_scroll_active = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xa0: // 0xA0 - 0xAF Set display mode
|
||||
m_display_mode = data &0x03;
|
||||
break;
|
||||
|
||||
case 0xB0: // 0xB0 - 0xBF Clear display area
|
||||
case 0xb0: // 0xB0 - 0xBF Clear display area
|
||||
|
||||
switch ( data & 0x03 )
|
||||
switch (data & 0x03)
|
||||
{
|
||||
case 0x00: // clr nothing
|
||||
break;
|
||||
|
||||
case 0x01: // clr inside window
|
||||
if ( m_window_size > 0 )
|
||||
if (m_window_size > 0)
|
||||
{
|
||||
std::fill_n(m_chars + m_window_start, m_window_size, 0);
|
||||
std::fill_n(m_attrs + m_window_start, m_window_size, 0);
|
||||
@ -291,9 +354,9 @@ int bfm_bd1_device::write_char(int data)
|
||||
break;
|
||||
|
||||
case 0x02: // clr outside window
|
||||
if ( m_window_size > 0 )
|
||||
if (m_window_size > 0)
|
||||
{
|
||||
if ( m_window_start > 0 )
|
||||
if (m_window_start > 0)
|
||||
{
|
||||
for (int i = 0; i < m_window_start; i++)
|
||||
{
|
||||
@ -302,7 +365,7 @@ int bfm_bd1_device::write_char(int data)
|
||||
}
|
||||
}
|
||||
|
||||
if (m_window_end < 15 )
|
||||
if (m_window_end < 15)
|
||||
{
|
||||
for (int i = m_window_end; i < 15- m_window_end ; i++)
|
||||
{
|
||||
@ -319,32 +382,44 @@ int bfm_bd1_device::write_char(int data)
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xC0: // 0xC0 - 0xCF Set flash rate
|
||||
m_flash_rate = data & 0x0F;
|
||||
case 0xc0: // 0xC0 - 0xCF Set flash rate
|
||||
m_flash_rate = data & 0x0f;
|
||||
if (!m_flash_rate && m_flash)
|
||||
{
|
||||
m_flash = false;
|
||||
}
|
||||
m_flash_timer = 20;
|
||||
break;
|
||||
|
||||
case 0xD0: // 0xD0 - 0xDF Set Flash control
|
||||
case 0xd0: // 0xD0 - 0xDF Set Flash control
|
||||
m_flash_control = data & 0x03;
|
||||
if (m_flash_control == 0 && m_flash)
|
||||
{
|
||||
m_flash = false;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xE0: // 0xE0 - 0xEF Set window start pos
|
||||
m_window_start = data &0x0F;
|
||||
case 0xe0: // 0xE0 - 0xEF Set window start pos
|
||||
m_window_start = data &0x0f;
|
||||
m_window_size = (m_window_end - m_window_start)+1;
|
||||
break;
|
||||
|
||||
case 0xF0: // 0xF0 - 0xFF Set window end pos
|
||||
m_window_end = data &0x0F;
|
||||
case 0xf0: // 0xF0 - 0xFF Set window end pos
|
||||
m_window_end = data &0x0f;
|
||||
m_window_size = (m_window_end - m_window_start)+1;
|
||||
m_scroll_active = 0;
|
||||
if ( m_display_mode == 2 )
|
||||
if (m_display_mode == 2)
|
||||
{
|
||||
if ( m_cursor_pos >= m_window_end)
|
||||
if (m_cursor_pos >= m_window_end)
|
||||
{
|
||||
m_scroll_active = 1;
|
||||
m_cursor_pos = m_window_end;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
popmessage("%x",data);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -358,7 +433,7 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
{
|
||||
int move = 0;
|
||||
int change =0;
|
||||
switch ( data )
|
||||
switch (data)
|
||||
{
|
||||
case 0x25: // flash
|
||||
if(m_chars[m_pcursor_pos] & (1<<8))
|
||||
@ -367,6 +442,7 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
}
|
||||
else
|
||||
{
|
||||
m_attrs[m_pcursor_pos] = AT_FLASH;
|
||||
m_chars[m_pcursor_pos] |= (1<<8);
|
||||
}
|
||||
break;
|
||||
@ -374,9 +450,9 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
case 0x26: // undefined
|
||||
break;
|
||||
|
||||
case 0x2C: // semicolon
|
||||
case 0x2E: // decimal point
|
||||
if( m_chars[m_pcursor_pos] & (1<<12))
|
||||
case 0x2c: // semicolon
|
||||
case 0x2e: // decimal point
|
||||
if (m_chars[m_pcursor_pos] & (1<<12))
|
||||
{
|
||||
move++;
|
||||
}
|
||||
@ -386,20 +462,21 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x3B: // dummy char
|
||||
case 0x3a:
|
||||
m_user_def = 2;
|
||||
break;
|
||||
|
||||
case 0x3b: // dummy char
|
||||
move++;
|
||||
break;
|
||||
|
||||
case 0x3A:
|
||||
m_user_def = 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
move++;
|
||||
change++;
|
||||
}
|
||||
|
||||
if ( move )
|
||||
if (move)
|
||||
{
|
||||
int mode = m_display_mode;
|
||||
|
||||
@ -407,40 +484,40 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
|
||||
if ( m_window_size <= 0 || (m_window_size > 16))
|
||||
{ // if no window selected default to equivalent rotate mode
|
||||
if ( mode == 2 ) mode = 0;
|
||||
else if ( mode == 3 ) mode = 1;
|
||||
if (mode == 2) mode = 0;
|
||||
else if (mode == 3) mode = 1;
|
||||
}
|
||||
|
||||
switch ( mode )
|
||||
switch (mode)
|
||||
{
|
||||
case 0: // rotate left
|
||||
m_cursor_pos &= 0x0F;
|
||||
m_cursor_pos &= 0x0f;
|
||||
|
||||
if ( change )
|
||||
if (change)
|
||||
{
|
||||
m_chars[m_cursor_pos] = segdata;
|
||||
}
|
||||
m_cursor_pos++;
|
||||
if ( m_cursor_pos >= 16 ) m_cursor_pos = 0;
|
||||
if (m_cursor_pos >= 16) m_cursor_pos = 0;
|
||||
break;
|
||||
|
||||
|
||||
case 1: // Rotate right
|
||||
m_cursor_pos &= 0x0F;
|
||||
m_cursor_pos &= 0x0f;
|
||||
|
||||
if ( change )
|
||||
if (change)
|
||||
{
|
||||
m_chars[m_cursor_pos] = segdata;
|
||||
}
|
||||
m_cursor_pos--;
|
||||
if ( m_cursor_pos < 0 ) m_cursor_pos = 15;
|
||||
if (m_cursor_pos < 0) m_cursor_pos = 15;
|
||||
break;
|
||||
|
||||
case 2: // Scroll left
|
||||
if ( m_cursor_pos < m_window_end )
|
||||
{
|
||||
m_scroll_active = 0;
|
||||
if ( change )
|
||||
if (change)
|
||||
{
|
||||
m_chars[m_cursor_pos] = segdata;
|
||||
}
|
||||
@ -448,12 +525,12 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( move )
|
||||
if (move)
|
||||
{
|
||||
if ( m_scroll_active )
|
||||
if (m_scroll_active)
|
||||
{
|
||||
int i = m_window_start;
|
||||
while ( i < m_window_end )
|
||||
while (i < m_window_end)
|
||||
{
|
||||
m_chars[i] = m_chars[i+1];
|
||||
i++;
|
||||
@ -462,7 +539,7 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
else m_scroll_active = 1;
|
||||
}
|
||||
|
||||
if ( change )
|
||||
if (change)
|
||||
{
|
||||
m_chars[m_window_end] = segdata;
|
||||
}
|
||||
@ -474,24 +551,24 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
break;
|
||||
|
||||
case 3: // Scroll right
|
||||
if ( m_cursor_pos > m_window_start )
|
||||
if (m_cursor_pos > m_window_start)
|
||||
{
|
||||
if ( change )
|
||||
if (change)
|
||||
{
|
||||
m_chars[m_cursor_pos] = segdata;
|
||||
}
|
||||
m_cursor_pos--;
|
||||
if ( m_cursor_pos > 15 ) m_cursor_pos = 0;
|
||||
if (m_cursor_pos > 15) m_cursor_pos = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( move )
|
||||
if (move)
|
||||
{
|
||||
if ( m_scroll_active )
|
||||
if (m_scroll_active)
|
||||
{
|
||||
int i = m_window_end;
|
||||
|
||||
while ( i > m_window_start )
|
||||
while (i > m_window_start)
|
||||
{
|
||||
m_chars[i] = m_chars[i-1];
|
||||
i--;
|
||||
@ -499,13 +576,13 @@ void bfm_bd1_device::setdata(int segdata, int data)
|
||||
}
|
||||
else m_scroll_active = 1;
|
||||
}
|
||||
if ( change )
|
||||
if (change)
|
||||
{
|
||||
m_chars[m_window_start] = segdata;
|
||||
}
|
||||
m_chars[m_window_start] = segdata;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_chars[m_window_start] = 0;
|
||||
m_chars[m_window_start] = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -45,24 +45,26 @@ private:
|
||||
std::unique_ptr<output_finder<16> > m_outputs;
|
||||
uint8_t m_port_val;
|
||||
|
||||
int m_cursor_pos = 0;
|
||||
int m_window_start = 0; // display window start pos 0-15
|
||||
int m_window_end = 0; // display window end pos 0-15
|
||||
int m_window_size = 0; // window size
|
||||
int m_shift_count = 0;
|
||||
int m_shift_data = 0;
|
||||
int m_pcursor_pos = 0;
|
||||
int m_scroll_active = 0;
|
||||
int m_display_mode = 0;
|
||||
int m_flash_rate = 0;
|
||||
int m_flash_control = 0;
|
||||
int m_sclk = 0;
|
||||
int m_data = 0;
|
||||
uint8_t m_cursor_pos = 0;
|
||||
uint8_t m_window_start = 0; // display window start pos 0-15
|
||||
uint8_t m_window_end = 0; // display window end pos 0-15
|
||||
uint8_t m_window_size = 0; // window size
|
||||
uint8_t m_shift_count = 0;
|
||||
uint8_t m_shift_data = 0;
|
||||
uint8_t m_pcursor_pos = 0;
|
||||
bool m_scroll_active = false;
|
||||
uint8_t m_display_mode = 0;
|
||||
bool m_flash = false;
|
||||
uint8_t m_flash_rate = 0;
|
||||
uint8_t m_flash_control = 0;
|
||||
uint8_t m_flash_timer = 0;
|
||||
uint8_t m_sclk = 0;
|
||||
uint8_t m_data = 0;
|
||||
|
||||
uint8_t m_cursor = 0;
|
||||
uint16_t m_chars[16]{};
|
||||
uint8_t m_attrs[16]{};
|
||||
uint16_t m_user_data = 0; // user defined character data (16 bit)
|
||||
uint16_t m_user_data = 0; // user defined character data (16 bit)
|
||||
uint16_t m_user_def = 0; // user defined character state
|
||||
};
|
||||
|
||||
|
@ -13,8 +13,6 @@
|
||||
DEFINE_DEVICE_TYPE(BFM_BDA, bfm_bda_device, "bfm_bda", "BFM BDA VFD controller")
|
||||
|
||||
|
||||
//I currently use the BDA character set, until a suitable image can be programmed
|
||||
|
||||
static const uint16_t BDAcharset[]=
|
||||
{ // FEDC BA98 7654 3210
|
||||
0xA626, // 1010 0110 0010 0110 @.
|
||||
@ -95,10 +93,13 @@ void bfm_bda_device::device_start()
|
||||
m_outputs = std::make_unique<output_finder<16> >(*this, "vfd%u", unsigned(m_port_val) << 4);
|
||||
m_outputs->resolve();
|
||||
|
||||
m_brightness = std::make_unique<output_finder<1> >(*this, "vfdduty%u", unsigned(m_port_val));
|
||||
m_brightness->resolve();
|
||||
|
||||
save_item(NAME(m_cursor_pos));
|
||||
save_item(NAME(m_window_start)); // display window start pos 0-15
|
||||
save_item(NAME(m_window_end)); // display window end pos 0-15
|
||||
save_item(NAME(m_window_size)); // window size
|
||||
save_item(NAME(m_window_end)); // display window end pos 0-15
|
||||
save_item(NAME(m_window_size)); // window size
|
||||
save_item(NAME(m_shift_count));
|
||||
save_item(NAME(m_shift_data));
|
||||
save_item(NAME(m_pcursor_pos));
|
||||
@ -114,6 +115,7 @@ void bfm_bda_device::device_start()
|
||||
save_item(NAME(m_attrs));
|
||||
save_item(NAME(m_user_data)); // user defined character data (16 bit)
|
||||
save_item(NAME(m_user_def)); // user defined character state
|
||||
save_item(NAME(m_duty));
|
||||
}
|
||||
|
||||
void bfm_bda_device::device_reset()
|
||||
@ -134,6 +136,9 @@ void bfm_bda_device::device_reset()
|
||||
m_flash_control = 0;
|
||||
m_user_data = 0;
|
||||
m_user_def = 0;
|
||||
m_duty = 0;
|
||||
|
||||
(*m_brightness)[0] = 0;
|
||||
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
|
||||
@ -152,24 +157,24 @@ void bfm_bda_device::device_post_load()
|
||||
void bfm_bda_device::update_display()
|
||||
{
|
||||
for (int i = 0; i < 16; i++)
|
||||
(*m_outputs)[i] = (m_attrs[i] != AT_BLANK) ? set_display(m_chars[i]) : 0;
|
||||
(*m_outputs)[i] = (m_attrs[i] == AT_NORMAL) ? set_display(m_chars[i]) : 0;
|
||||
(*m_brightness)[0] = m_duty;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
void bfm_bda_device::blank(int data)
|
||||
{
|
||||
switch ( data & 0x03 ) // TODO: wrong case values???
|
||||
{
|
||||
case 0x00: // clear blanking
|
||||
case 0x00: //blank all
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
m_attrs[i] = 0;
|
||||
}
|
||||
m_attrs[i] = AT_BLANK;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 0x01: // blank inside window
|
||||
if ( m_window_size > 0 )
|
||||
if (m_window_size > 0)
|
||||
{
|
||||
for (int i = m_window_start; i < m_window_end ; i++)
|
||||
{
|
||||
@ -179,7 +184,7 @@ void bfm_bda_device::blank(int data)
|
||||
break;
|
||||
|
||||
case 0x02: // blank outside window
|
||||
if ( m_window_size > 0 )
|
||||
if (m_window_size > 0)
|
||||
{
|
||||
if ( m_window_start > 0 )
|
||||
{
|
||||
@ -199,12 +204,10 @@ void bfm_bda_device::blank(int data)
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x03: //blank all
|
||||
case 0x03: // clear blanking
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
m_attrs[i] = AT_BLANK;
|
||||
}
|
||||
m_attrs[i] = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -212,7 +215,7 @@ void bfm_bda_device::blank(int data)
|
||||
|
||||
int bfm_bda_device::write_char(int data)
|
||||
{
|
||||
if ( m_user_def )
|
||||
if (m_user_def)
|
||||
{
|
||||
m_user_def--;
|
||||
|
||||
@ -228,26 +231,18 @@ int bfm_bda_device::write_char(int data)
|
||||
}
|
||||
else
|
||||
{
|
||||
if(data < 0x80)//characters
|
||||
if (!(data & 0x80))//characters
|
||||
{
|
||||
if (m_blank_flag || m_flash_flag)
|
||||
if (m_blank_flag)
|
||||
{
|
||||
if (m_blank_flag)
|
||||
{
|
||||
logerror("Brightness data %x \n", data) ;
|
||||
m_blank_flag = 0;
|
||||
}
|
||||
if (m_flash_flag)
|
||||
{
|
||||
//not setting yet
|
||||
m_flash_flag = 0;
|
||||
}
|
||||
m_duty = 7 - data;
|
||||
m_blank_flag = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (data > 0x3F)
|
||||
{
|
||||
logerror("Undefined character %x \n", data);
|
||||
logerror("BDA Undefined character, needs populating 0x%1$02X\n", data);
|
||||
}
|
||||
|
||||
setdata(BDAcharset[(data & 0x3F)], data);
|
||||
@ -255,96 +250,93 @@ int bfm_bda_device::write_char(int data)
|
||||
}
|
||||
else
|
||||
{
|
||||
switch ( data & 0xF0 )
|
||||
switch (data & 0xf0)
|
||||
{
|
||||
case 0x80: // 0x80 - 0x8F Set display blanking
|
||||
if (data==0x84)// futaba setup
|
||||
if (data == 0x84)// duty setup
|
||||
{
|
||||
m_blank_flag = 1;
|
||||
m_flash_flag = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
logerror("80s %x \n",data);
|
||||
//blank(data&0x03);//use the blanking data
|
||||
blank(data & 0x03);//use the blanking data
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x90: // 0x90 - 0x9F Set cursor pos
|
||||
m_cursor_pos = data & 0x0F;
|
||||
m_cursor_pos = data & 0x0f;
|
||||
m_scroll_active = 0;
|
||||
if ( m_display_mode == 2 )
|
||||
if (m_display_mode == 2)
|
||||
{
|
||||
if ( m_cursor_pos >= m_window_end) m_scroll_active = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xA0: // 0xA0 - 0xAF Set display mode
|
||||
m_display_mode = data &0x03;
|
||||
break;
|
||||
|
||||
case 0xB0: // 0xB0 - 0xBF Clear display area
|
||||
|
||||
switch ( data & 0x03 )
|
||||
case 0xa0: // 0xA0 - 0xAF Set display mode
|
||||
if (data == 0xa8)// userdef
|
||||
{
|
||||
case 0x00: // clr nothing
|
||||
break;
|
||||
|
||||
case 0x01: // clr inside window
|
||||
if ( m_window_size > 0 )
|
||||
{
|
||||
std::fill_n(m_chars + m_window_start, m_window_size, 0);
|
||||
std::fill_n(m_attrs + m_window_start, m_window_size, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 0x02: // clr outside window
|
||||
if ( m_window_size > 0 )
|
||||
{
|
||||
if ( m_window_start > 0 )
|
||||
{
|
||||
for (int i = 0; i < m_window_start; i++)
|
||||
{
|
||||
memset(m_chars+i,0,i);
|
||||
memset(m_attrs+i,0,i);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_window_end < 15 )
|
||||
{
|
||||
for (int i = m_window_end; i < 15- m_window_end ; i++)
|
||||
{
|
||||
memset(m_chars+i,0,i);
|
||||
memset(m_attrs+i,0,i);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x03: // clr entire display
|
||||
std::fill(std::begin(m_chars), std::end(m_chars), 0);
|
||||
std::fill(std::begin(m_attrs), std::end(m_attrs), 0);
|
||||
m_user_def = 2;
|
||||
}
|
||||
else if (data == 0xac)
|
||||
{
|
||||
popmessage("TEST MODE");
|
||||
}
|
||||
else
|
||||
{
|
||||
m_display_mode = data & 0x03;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xC0: // 0xC0 - 0xCF Set flash rate
|
||||
m_flash_rate = data & 0x0F;
|
||||
case 0xb0: // 0xB0 - 0xBF Clear display area
|
||||
if (data == 0xbc)
|
||||
{
|
||||
popmessage("CLEAR USERDEF");
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (data & 0x03)
|
||||
{
|
||||
case 0x00: // clr nothing
|
||||
break;
|
||||
|
||||
case 0x01: // clr inside window
|
||||
if (m_window_size > 0)
|
||||
{
|
||||
std::fill_n(m_chars + m_window_start, m_window_size, 0);
|
||||
std::fill_n(m_attrs + m_window_start, m_window_size, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xD0: // 0xD0 - 0xDF Set Flash control
|
||||
case 0xc0:
|
||||
if (data == 0xc8)
|
||||
{
|
||||
m_flash_flag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_flash_rate = data & 0x0f;
|
||||
logerror("BDA flash %x", m_flash_rate);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xd0: // 0xD0 - 0xDF Set Flash control
|
||||
m_flash_control = data & 0x03;
|
||||
break;
|
||||
|
||||
case 0xE0: // 0xE0 - 0xEF Set window start pos
|
||||
m_window_start = data &0x0F;
|
||||
case 0xe0: // 0xE0 - 0xEF Set window start pos
|
||||
m_window_start = data & 0x0f;
|
||||
m_window_size = (m_window_end - m_window_start)+1;
|
||||
break;
|
||||
|
||||
case 0xF0: // 0xF0 - 0xFF Set window end pos
|
||||
m_window_end = data &0x0F;
|
||||
m_window_size = (m_window_end - m_window_start)+1;
|
||||
case 0xf0: // 0xF0 - 0xFF Set window end pos
|
||||
m_window_end = data & 0x0f;
|
||||
m_window_size = (m_window_end - m_window_start) + 1;
|
||||
m_scroll_active = 0;
|
||||
if ( m_display_mode == 2 )
|
||||
if (m_display_mode == 2)
|
||||
{
|
||||
if ( m_cursor_pos >= m_window_end)
|
||||
{
|
||||
@ -360,6 +352,7 @@ int bfm_bda_device::write_char(int data)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void bfm_bda_device::setdata(int segdata, int data)
|
||||
|
@ -40,6 +40,7 @@ private:
|
||||
static const uint8_t AT_FLASHED = 0x80; // set when character should be blinked off
|
||||
|
||||
std::unique_ptr<output_finder<16> > m_outputs;
|
||||
std::unique_ptr<output_finder<1> > m_brightness;
|
||||
uint8_t m_port_val;
|
||||
|
||||
int m_cursor_pos = 0;
|
||||
@ -55,6 +56,7 @@ private:
|
||||
int m_display_mode = 0;
|
||||
int m_flash_rate = 0;
|
||||
int m_flash_control = 0;
|
||||
int m_duty;
|
||||
|
||||
uint8_t m_cursor = 0;
|
||||
uint16_t m_chars[16]{};
|
||||
|
@ -13839,7 +13839,7 @@ ROM_START( pokonyan )
|
||||
*/
|
||||
ROM_END
|
||||
|
||||
ROM_START( mpumpkin ) // B board: ? C board: 92631C-6
|
||||
ROM_START( mpumpkin ) // B board: 91634B-? C board: 92631C-6
|
||||
ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
|
||||
ROM_LOAD16_WORD_SWAP( "mpa_23.8f", 0x00000, 0x80000, CRC(38b9883a) SHA1(94a89a360a502f209aa905e7eb2f1d472960850f) )
|
||||
// remaining sockets are empty
|
||||
@ -13994,6 +13994,9 @@ ROM_START( sfach )
|
||||
ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
|
||||
ROM_LOAD( "sfz18", 0x00000, 0x20000, CRC(61022b2d) SHA1(6369d0c1d08a30ee19b94e52ab1463a7784b9de5) )
|
||||
ROM_LOAD( "sfz19", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58) )
|
||||
|
||||
ROM_REGION( 0x0200, "bboardplds", 0 )
|
||||
ROM_LOAD( "sfz63b.1a", 0x0000, 0x0104, CRC(f5a351da) SHA1(a867947d784167b5284efb76a8634ca5713dafdb) )
|
||||
ROM_END
|
||||
|
||||
/* FIXME B-Board uncertain but should be 91634B from the program ROM names */
|
||||
@ -14032,6 +14035,12 @@ ROM_START( sfzch )
|
||||
ROM_REGION( 0x40000, "oki",0 ) /* Samples */
|
||||
ROM_LOAD( "sfz_18.11c", 0x00000, 0x20000, CRC(61022b2d) SHA1(6369d0c1d08a30ee19b94e52ab1463a7784b9de5) )
|
||||
ROM_LOAD( "sfz_19.12c", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58) )
|
||||
|
||||
// SFZ63B was found on mpumpkin, assumed to be from SFZ
|
||||
ROM_REGION( 0x0200, "bboardplds", 0 )
|
||||
ROM_LOAD( "sfz63b.1a", 0x0000, 0x0104, CRC(f5a351da) SHA1(a867947d784167b5284efb76a8634ca5713dafdb) ) // PAL16L8
|
||||
|
||||
// TODO... confirm other pals (could be unique as this is the "cps changer" home console)
|
||||
ROM_END
|
||||
|
||||
/* FIXME B-Board uncertain but should be 91634B from the program ROM names */
|
||||
@ -14070,6 +14079,9 @@ ROM_START( sfzbch )
|
||||
ROM_REGION( 0x40000, "oki",0 ) /* Samples */
|
||||
ROM_LOAD( "sfz_18.11c", 0x00000, 0x20000, CRC(61022b2d) SHA1(6369d0c1d08a30ee19b94e52ab1463a7784b9de5) )
|
||||
ROM_LOAD( "sfz_19.12c", 0x20000, 0x20000, CRC(3b5886d5) SHA1(7e1b7d40ef77b5df628dd663d45a9a13c742cf58) )
|
||||
|
||||
ROM_REGION( 0x0200, "bboardplds", 0 )
|
||||
ROM_LOAD( "sfz63b.1a", 0x0000, 0x0104, CRC(f5a351da) SHA1(a867947d784167b5284efb76a8634ca5713dafdb) )
|
||||
ROM_END
|
||||
|
||||
|
||||
|
@ -1452,14 +1452,34 @@ static const struct gfx_range mapper_TN2292_table[] =
|
||||
};
|
||||
|
||||
|
||||
// RCM63B, SFZ63B (megaman, sfzch) are equivalent, should be interchangeable on real PCBs without issue
|
||||
|
||||
#define mapper_RCM63B { 0x8000, 0x8000, 0x8000, 0x8000 }, mapper_RCM63B_table
|
||||
static const struct gfx_range mapper_RCM63B_table[] =
|
||||
{
|
||||
// verified from PAL dump:
|
||||
// bank0 = pin 19 (ROMs 1,3) & pin 18 (ROMs 2,4)
|
||||
// bank1 = pin 17 (ROMs 5,7) & pin 16 (ROMs 6,8)
|
||||
// bank0 = pin 15 (ROMs 10,12) & pin 14 (ROMs 11,13)
|
||||
// bank1 = pin 13 (ROMs 14,16) & pin 12 (ROMs 15,17)
|
||||
// bank2 = pin 15 (ROMs 10,12) & pin 14 (ROMs 11,13)
|
||||
// bank3 = pin 13 (ROMs 14,16) & pin 12 (ROMs 15,17)
|
||||
|
||||
/* type start end bank */
|
||||
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL1 | GFXTYPE_SCROLL2 | GFXTYPE_SCROLL3, 0x00000, 0x07fff, 0 },
|
||||
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL1 | GFXTYPE_SCROLL2 | GFXTYPE_SCROLL3, 0x08000, 0x0ffff, 1 },
|
||||
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL1 | GFXTYPE_SCROLL2 | GFXTYPE_SCROLL3, 0x10000, 0x17fff, 2 },
|
||||
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL1 | GFXTYPE_SCROLL2 | GFXTYPE_SCROLL3, 0x18000, 0x1ffff, 3 },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
|
||||
#define mapper_SFZ63B { 0x8000, 0x8000, 0x8000, 0x8000 }, mapper_SFZ63B_table
|
||||
static const struct gfx_range mapper_SFZ63B_table[] =
|
||||
{
|
||||
// verified from PAL dump:
|
||||
// bank0 = pin 19 (ROMs 1,3) & pin 18 (ROMs 2,4)
|
||||
// bank1 = pin 17 (ROMs 5,7) & pin 16 (ROMs 6,8)
|
||||
// bank2 = pin 15 (ROMs 10,12) & pin 14 (ROMs 11,13)
|
||||
// bank3 = pin 13 (ROMs 14,16) & pin 12 (ROMs 15,17)
|
||||
|
||||
/* type start end bank */
|
||||
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL1 | GFXTYPE_SCROLL2 | GFXTYPE_SCROLL3, 0x00000, 0x07fff, 0 },
|
||||
@ -1551,9 +1571,9 @@ static const struct gfx_range mapper_CP1B1F_boot_table[] =
|
||||
};
|
||||
|
||||
|
||||
/* unverified, no dump */
|
||||
#define mapper_sfzch { 0x20000, 0, 0, 0 }, mapper_sfzch_table
|
||||
static const struct gfx_range mapper_sfzch_table[] =
|
||||
// varthb2, slampic2 bootlegs
|
||||
#define mapper_varthb2 { 0x20000, 0, 0, 0 }, mapper_varthb2_table
|
||||
static const struct gfx_range mapper_varthb2_table[] =
|
||||
{
|
||||
/* type start end bank */
|
||||
{ GFXTYPE_SPRITES | GFXTYPE_SCROLL1 | GFXTYPE_SCROLL2 | GFXTYPE_SCROLL3, 0x00000, 0x1ffff, 0 },
|
||||
@ -1821,7 +1841,7 @@ static const struct CPS1config cps1_config_table[]=
|
||||
{"sf2qp2", CPS_B_14, mapper_STF29, 0x36 },
|
||||
{"sf2thndr", CPS_B_17, mapper_STF29, 0x36 },
|
||||
{"sf2thndr2", CPS_B_17, mapper_STF29, 0x36 },
|
||||
{"mpumpkin", CPS_B_21_DEF, mapper_sfzch }, // PAL is dumped but not analyzed yet, same as SFZCH
|
||||
{"mpumpkin", CPS_B_21_DEF, mapper_SFZ63B },
|
||||
|
||||
/* from here onwards the CPS-B board has suicide battery and multiply protection */
|
||||
|
||||
@ -1913,7 +1933,7 @@ static const struct CPS1config cps1_config_table[]=
|
||||
{"sf2mkot", CPS_B_21_DEF, mapper_S9263B, 0x36, 0, 0, 0x41 },
|
||||
{"varth", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */
|
||||
{"varthb", CPS_B_04, mapper_VA63B, 0, 0, 0, 0x0F },
|
||||
{"varthb2", HACK_B_3, mapper_sfzch, 0, 0, 0, 0xc1 }, // unknown gal, other varth mappers don't work (game looks for sprites in >0x8000 unmapped region)
|
||||
{"varthb2", HACK_B_3, mapper_varthb2, 0, 0, 0, 0xc1 }, // unknown gal, other varth mappers don't work (game looks for sprites in >0x8000 unmapped region)
|
||||
{"varthb3", CPS_B_04, mapper_VA63B, 0, 0, 0, 0x0F }, // TODO: wrong
|
||||
{"varthr1", CPS_B_04, mapper_VA24B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */
|
||||
{"varthu", CPS_B_04, mapper_VA63B }, /* CPSB test has been patched out (60=0008) register is also written to, possibly leftover from development */
|
||||
@ -1948,7 +1968,7 @@ static const struct CPS1config cps1_config_table[]=
|
||||
{"slammast", CPS_B_21_QS4, mapper_MB63B },
|
||||
{"slammastu", CPS_B_21_QS4, mapper_MB63B },
|
||||
{"slampic", CPS_B_21_QS4, mapper_MB63B },
|
||||
{"slampic2", CPS_B_21_QS4, mapper_sfzch }, // default cps2 mapper breaks scroll layers
|
||||
{"slampic2", CPS_B_21_QS4, mapper_varthb2 }, // default cps2 mapper breaks scroll layers
|
||||
{"mbomberj", CPS_B_21_QS4, mapper_MB63B },
|
||||
{"mbombrd", CPS_B_21_QS5, mapper_MB63B },
|
||||
{"mbombrdj", CPS_B_21_QS5, mapper_MB63B },
|
||||
@ -1975,9 +1995,9 @@ static const struct CPS1config cps1_config_table[]=
|
||||
|
||||
/* CPS Changer */
|
||||
|
||||
{"sfach", CPS_B_21_DEF, mapper_sfzch }, // wrong, this set uses an unknown PAL, still not dumped
|
||||
{"sfzbch", CPS_B_21_DEF, mapper_sfzch }, // wrong, this set uses an unknown PAL, still not dumped
|
||||
{"sfzch", CPS_B_21_DEF, mapper_sfzch }, // wrong, this set uses an unknown PAL, still not dumped
|
||||
{"sfach", CPS_B_21_DEF, mapper_SFZ63B }, // SFZ63B found on mpumpkin, assumed to be from SFZ
|
||||
{"sfzbch", CPS_B_21_DEF, mapper_SFZ63B },
|
||||
{"sfzch", CPS_B_21_DEF, mapper_SFZ63B },
|
||||
{"wofch", CPS_B_21_DEF, mapper_TK263B },
|
||||
|
||||
/* CPS2 games */
|
||||
|
@ -60,15 +60,19 @@ private:
|
||||
void main_io(address_map &map);
|
||||
|
||||
void select_w(u8 data);
|
||||
u8 select_r();
|
||||
void led_w(u8 data);
|
||||
u8 input_r();
|
||||
u8 led_r();
|
||||
void input_w(u8 data);
|
||||
u8 sound_r();
|
||||
u8 input_r();
|
||||
void sound_w(u8 data);
|
||||
u8 sound_r();
|
||||
|
||||
u8 m_inp_sel = 0;
|
||||
u8 m_input = 0;
|
||||
u8 m_sound = 0;
|
||||
u8 m_select = 0;
|
||||
u8 m_led_data = 0;
|
||||
};
|
||||
|
||||
void teammate_state::machine_start()
|
||||
@ -76,6 +80,8 @@ void teammate_state::machine_start()
|
||||
save_item(NAME(m_inp_sel));
|
||||
save_item(NAME(m_input));
|
||||
save_item(NAME(m_sound));
|
||||
save_item(NAME(m_select));
|
||||
save_item(NAME(m_led_data));
|
||||
}
|
||||
|
||||
|
||||
@ -92,12 +98,29 @@ void teammate_state::select_w(u8 data)
|
||||
// P02,P03,P05: input select
|
||||
// P04: N/C
|
||||
m_inp_sel = (data >> 3 & 4) | (data >> 2 & 3);
|
||||
m_select = data;
|
||||
}
|
||||
|
||||
u8 teammate_state::select_r()
|
||||
{
|
||||
return m_select;
|
||||
}
|
||||
|
||||
void teammate_state::led_w(u8 data)
|
||||
{
|
||||
// P10-P17: DS8817N to leds
|
||||
m_display->write_mx(bitswap<8>(~data,0,1,2,3,4,5,6,7));
|
||||
m_led_data = data;
|
||||
}
|
||||
|
||||
u8 teammate_state::led_r()
|
||||
{
|
||||
return m_led_data;
|
||||
}
|
||||
|
||||
void teammate_state::input_w(u8 data)
|
||||
{
|
||||
m_input = data;
|
||||
}
|
||||
|
||||
u8 teammate_state::input_r()
|
||||
@ -112,11 +135,6 @@ u8 teammate_state::input_r()
|
||||
return data | m_input;
|
||||
}
|
||||
|
||||
void teammate_state::input_w(u8 data)
|
||||
{
|
||||
m_input = data;
|
||||
}
|
||||
|
||||
void teammate_state::sound_w(u8 data)
|
||||
{
|
||||
// P50: speaker out
|
||||
@ -143,8 +161,8 @@ void teammate_state::main_map(address_map &map)
|
||||
|
||||
void teammate_state::main_io(address_map &map)
|
||||
{
|
||||
map(0x00, 0x00).w(FUNC(teammate_state::select_w));
|
||||
map(0x01, 0x01).w(FUNC(teammate_state::led_w));
|
||||
map(0x00, 0x00).rw(FUNC(teammate_state::select_r), FUNC(teammate_state::select_w));
|
||||
map(0x01, 0x01).rw(FUNC(teammate_state::led_r), FUNC(teammate_state::led_w));
|
||||
map(0x04, 0x07).rw("psu", FUNC(f38t56_device::read), FUNC(f38t56_device::write));
|
||||
}
|
||||
|
||||
|
@ -248,6 +248,17 @@ void jpmimpct_state::machine_start()
|
||||
{
|
||||
m_digits.resolve();
|
||||
m_lamp_output.resolve();
|
||||
|
||||
save_item(NAME(m_optic_pattern));
|
||||
save_item(NAME(m_payen));
|
||||
save_item(NAME(m_hopinhibit));
|
||||
save_item(NAME(m_slidesout));
|
||||
save_item(NAME(m_hopper));
|
||||
save_item(NAME(m_motor));
|
||||
save_item(NAME(m_volume_latch));
|
||||
save_item(NAME(m_global_volume));
|
||||
save_item(NAME(m_coinstate));
|
||||
|
||||
}
|
||||
|
||||
void jpmimpct_state::machine_reset()
|
||||
|
@ -154,14 +154,14 @@ private:
|
||||
void impact_non_video_map(address_map &map);
|
||||
|
||||
uint8_t m_Lamps[256]{};
|
||||
int m_optic_pattern = 0;
|
||||
int m_payen = 0;
|
||||
int m_hopinhibit = 0;
|
||||
int m_slidesout = 0;
|
||||
int m_hopper[3]{};
|
||||
int m_motor[3]{};
|
||||
int m_volume_latch = 0;
|
||||
int m_global_volume = 0;
|
||||
uint8_t m_optic_pattern = 0;
|
||||
bool m_payen = false;
|
||||
uint8_t m_hopinhibit = 0;
|
||||
uint8_t m_slidesout = 0;
|
||||
uint8_t m_hopper[3]{};
|
||||
uint8_t m_motor[3]{};
|
||||
uint8_t m_volume_latch = 0;
|
||||
uint8_t m_global_volume = 0;
|
||||
uint16_t m_coinstate = 0;
|
||||
required_device_array<timer_device, 6> m_cointimer;
|
||||
|
||||
|
@ -17,7 +17,7 @@ Preliminary driver by:
|
||||
#include "k052109.h"
|
||||
#include "konamipt.h"
|
||||
|
||||
#include "cpu/m6809/konami.h" // for the callback and the firq irq definition
|
||||
#include "cpu/m6809/konami.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "machine/watchdog.h"
|
||||
|
@ -331,8 +331,7 @@ u8 k052109_device::read(offs_t offset)
|
||||
{ /* B y scroll */ }
|
||||
else if (offset >= 0x3a00 && offset < 0x3c00)
|
||||
{ /* B x scroll */ }
|
||||
// else
|
||||
//logerror("%s: read from unknown 052109 address %04x\n",m_maincpu->pc(),offset);
|
||||
//else logerror("%s: read from unknown 052109 address %04x\n",machine().describe_context(),offset);
|
||||
}
|
||||
|
||||
return m_ram[offset];
|
||||
@ -350,15 +349,15 @@ u8 k052109_device::read(offs_t offset)
|
||||
|
||||
bank |= (m_charrombank_2[(color & 0x0c) >> 2] >> 2); // Surprise Attack uses this 2nd bank in the rom test
|
||||
|
||||
if (m_has_extra_video_ram)
|
||||
code |= color << 8; /* kludge for X-Men */
|
||||
else
|
||||
m_k052109_cb(0, bank, &code, &color, &flags, &priority);
|
||||
if (m_has_extra_video_ram)
|
||||
code |= color << 8; /* kludge for X-Men */
|
||||
else
|
||||
m_k052109_cb(0, bank, &code, &color, &flags, &priority);
|
||||
|
||||
addr = (code << 5) + (offset & 0x1f);
|
||||
addr &= m_char_rom.length() - 1;
|
||||
addr = (code << 5) + (offset & 0x1f);
|
||||
addr &= m_char_rom.length() - 1;
|
||||
|
||||
// logerror("%s: off = %04x sub = %02x (bnk = %x) adr = %06x\n", m_maincpu->pc(), offset, m_romsubbank, bank, addr);
|
||||
//logerror("%s: off = %04x sub = %02x (bnk = %x) adr = %06x\n", machine().describe_context(), offset, m_romsubbank, bank, addr);
|
||||
|
||||
return m_char_rom[addr];
|
||||
}
|
||||
@ -386,14 +385,14 @@ void k052109_device::write(offs_t offset, u8 data)
|
||||
{
|
||||
if (m_scrollctrl != data)
|
||||
{
|
||||
//popmessage("scrollcontrol = %02x", data);
|
||||
//logerror("%s: rowscrollcontrol = %02x\n", m_maincpu->pc(), data);
|
||||
//popmessage("scrollcontrol = %02x", data);
|
||||
//logerror("%s: rowscrollcontrol = %02x\n", machine().describe_context(), data);
|
||||
m_scrollctrl = data;
|
||||
}
|
||||
}
|
||||
else if (offset == 0x1d00)
|
||||
{
|
||||
//logerror("%s: 052109 register 1d00 = %02x\n", m_maincpu->pc(), data);
|
||||
//logerror("%s: 052109 register 1d00 = %02x\n", machine().describe_context(), data);
|
||||
/* bit 2 = irq enable */
|
||||
/* the custom chip can also generate NMI and FIRQ, for use with a 6809 */
|
||||
m_irq_enabled = data & 0x04;
|
||||
@ -428,12 +427,12 @@ void k052109_device::write(offs_t offset, u8 data)
|
||||
}
|
||||
else if (offset == 0x1e00 || offset == 0x3e00) // Surprise Attack uses offset 0x3e00
|
||||
{
|
||||
//logerror("%s: 052109 register 1e00 = %02x\n",m_maincpu->pc(),data);
|
||||
//logerror("%s: 052109 register 1e00 = %02x\n",machine().describe_context(),data);
|
||||
m_romsubbank = data;
|
||||
}
|
||||
else if (offset == 0x1e80)
|
||||
{
|
||||
//if ((data & 0xfe)) logerror("%s: 052109 register 1e80 = %02x\n",m_maincpu->pc(),data);
|
||||
//if ((data & 0xfe)) logerror("%s: 052109 register 1e80 = %02x\n",machine().describe_context(),data);
|
||||
m_tilemap[0]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
|
||||
m_tilemap[1]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
|
||||
m_tilemap[2]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
|
||||
@ -487,8 +486,7 @@ void k052109_device::write(offs_t offset, u8 data)
|
||||
m_charrombank_2[2] = data & 0x0f;
|
||||
m_charrombank_2[3] = (data >> 4) & 0x0f;
|
||||
}
|
||||
// else
|
||||
// logerror("%s: write %02x to unknown 052109 address %04x\n",m_maincpu->pc(),data,offset);
|
||||
//else logerror("%s: write %02x to unknown 052109 address %04x\n",machine().describe_context(),data,offset);
|
||||
}
|
||||
}
|
||||
|
||||
@ -527,16 +525,14 @@ void k052109_device::tilemap_update( )
|
||||
int xscroll, yscroll, offs;
|
||||
|
||||
#if 0
|
||||
{
|
||||
popmessage("%x %x %x %x",
|
||||
m_charrombank[0],
|
||||
m_charrombank[1],
|
||||
m_charrombank[2],
|
||||
m_charrombank[3]);
|
||||
}
|
||||
popmessage("%x %x %x %x",
|
||||
m_charrombank[0],
|
||||
m_charrombank[1],
|
||||
m_charrombank[2],
|
||||
m_charrombank[3]);
|
||||
#endif
|
||||
|
||||
// note: this chip can do both per-column and per-row scroll in the same time, currently not emulated.
|
||||
// note: this chip can do both per-column and per-row scroll in the same time, currently not emulated.
|
||||
|
||||
if ((m_scrollctrl & 0x03) == 0x02)
|
||||
{
|
||||
@ -654,24 +650,24 @@ popmessage("%x %x %x %x",
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ((m_scrollctrl & 0x03) == 0x01 ||
|
||||
(m_scrollctrl & 0x18) == 0x08 ||
|
||||
((m_scrollctrl & 0x04) && (m_scrollctrl & 0x03)) ||
|
||||
((m_scrollctrl & 0x20) && (m_scrollctrl & 0x18)) ||
|
||||
(m_scrollctrl & 0xc0) != 0)
|
||||
popmessage("scrollcontrol = %02x", m_scrollctrl);
|
||||
if ((m_scrollctrl & 0x03) == 0x01 ||
|
||||
(m_scrollctrl & 0x18) == 0x08 ||
|
||||
((m_scrollctrl & 0x04) && (m_scrollctrl & 0x03)) ||
|
||||
((m_scrollctrl & 0x20) && (m_scrollctrl & 0x18)) ||
|
||||
(m_scrollctrl & 0xc0) != 0)
|
||||
popmessage("scrollcontrol = %02x", m_scrollctrl);
|
||||
|
||||
if (machine().input().code_pressed(KEYCODE_F))
|
||||
{
|
||||
FILE *fp;
|
||||
fp=fopen("TILE.DMP", "w+b");
|
||||
if (fp)
|
||||
if (machine().input().code_pressed(KEYCODE_F))
|
||||
{
|
||||
fwrite(m_ram, 0x6000, 1, fp);
|
||||
popmessage("saved");
|
||||
fclose(fp);
|
||||
FILE *fp;
|
||||
fp=fopen("TILE.DMP", "w+b");
|
||||
if (fp)
|
||||
{
|
||||
fwrite(m_ram, 0x6000, 1, fp);
|
||||
popmessage("saved");
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include "k053251.h"
|
||||
#include "konami_helper.h"
|
||||
|
||||
#include "cpu/m6809/konami.h" // for the callback and the firq irq definition
|
||||
#include "cpu/m6809/konami.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/bankdev.h"
|
||||
#include "machine/watchdog.h"
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include "k053244_k053245.h"
|
||||
#include "konami_helper.h"
|
||||
|
||||
#include "cpu/m6809/konami.h" // for the callback and the firq irq definition
|
||||
#include "cpu/m6809/konami.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/k053252.h"
|
||||
#include "machine/watchdog.h"
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include "k053251.h"
|
||||
#include "konami_helper.h"
|
||||
|
||||
#include "cpu/m6809/konami.h" // for the callback and the FIRQ IRQ definition
|
||||
#include "cpu/m6809/konami.h"
|
||||
#include "machine/bankdev.h"
|
||||
#include "machine/watchdog.h"
|
||||
#include "sound/ymopm.h"
|
||||
|
@ -96,7 +96,7 @@
|
||||
#include "k054000.h"
|
||||
#include "konami_helper.h"
|
||||
|
||||
#include "cpu/m6809/konami.h" // for the callback and the firq irq definition
|
||||
#include "cpu/m6809/konami.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/eepromser.h"
|
||||
#include "machine/k053252.h"
|
||||
@ -172,11 +172,10 @@ private:
|
||||
void z80_nmi_w(int state);
|
||||
void z80_irq_w(uint8_t data = 0);
|
||||
uint8_t z80_irq_r();
|
||||
void vblank_irq(int state);
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
INTERRUPT_GEN_MEMBER(irq);
|
||||
|
||||
K052109_CB_MEMBER(vendetta_tile_callback);
|
||||
K052109_CB_MEMBER(esckids_tile_callback);
|
||||
void banking_callback(uint8_t data);
|
||||
@ -286,7 +285,6 @@ void vendetta_state::eeprom_w(uint8_t data)
|
||||
// bit 6 - IRQ enable
|
||||
// bit 7 - Unused
|
||||
|
||||
|
||||
if (data == 0xff ) // this is a bug in the EEPROM write code
|
||||
return;
|
||||
|
||||
@ -294,6 +292,8 @@ void vendetta_state::eeprom_w(uint8_t data)
|
||||
m_eeprom_out->write(data, 0xff);
|
||||
|
||||
m_irq_enabled = (data >> 6) & 1;
|
||||
if (!m_irq_enabled)
|
||||
m_maincpu->set_input_line(KONAMI_IRQ_LINE, CLEAR_LINE);
|
||||
|
||||
m_videoview0.select(BIT(data, 0));
|
||||
m_videoview1.select(BIT(data, 0));
|
||||
@ -549,10 +549,10 @@ INPUT_PORTS_END
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
INTERRUPT_GEN_MEMBER(vendetta_state::irq)
|
||||
void vendetta_state::vblank_irq(int state)
|
||||
{
|
||||
if (m_irq_enabled)
|
||||
device.execute().set_input_line(KONAMI_IRQ_LINE, HOLD_LINE);
|
||||
if (state && m_irq_enabled)
|
||||
m_maincpu->set_input_line(KONAMI_IRQ_LINE, ASSERT_LINE);
|
||||
}
|
||||
|
||||
void vendetta_state::machine_start()
|
||||
@ -597,7 +597,6 @@ void vendetta_state::vendetta(machine_config &config)
|
||||
// basic machine hardware
|
||||
KONAMI(config, m_maincpu, XTAL(24'000'000) / 8); // 052001 (verified on PCB)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &vendetta_state::main_map);
|
||||
m_maincpu->set_vblank_int("screen", FUNC(vendetta_state::irq));
|
||||
m_maincpu->line().set(FUNC(vendetta_state::banking_callback));
|
||||
|
||||
Z80(config, m_audiocpu, XTAL(3'579'545)); // verified with PCB
|
||||
@ -615,6 +614,7 @@ void vendetta_state::vendetta(machine_config &config)
|
||||
screen.set_visarea(13*8, (64-13)*8-1, 2*8, 30*8-1);
|
||||
screen.set_screen_update(FUNC(vendetta_state::screen_update));
|
||||
screen.set_palette(m_palette);
|
||||
screen.screen_vblank().set(FUNC(vendetta_state::vblank_irq));
|
||||
|
||||
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 2048);
|
||||
m_palette->enable_shadows();
|
||||
@ -662,7 +662,7 @@ void vendetta_state::esckids(machine_config &config)
|
||||
|
||||
m_k053246->set_config(NORMAL_PLANE_ORDER, 101, 6);
|
||||
|
||||
K053252(config, "k053252", 6000000).set_offsets(12*8, 1*8);
|
||||
K053252(config, "k053252", XTAL(24'000'000) / 4).set_offsets(12*8, 1*8);
|
||||
}
|
||||
|
||||
|
||||
|
@ -800,7 +800,14 @@ license:CC0
|
||||
<repeat count="16">
|
||||
<param name="i" start="15" increment="-1"/>
|
||||
<param name="x" start="0" increment="9"/>
|
||||
<element name="vfdblank~i~" ref="vfd0">
|
||||
<color red="0.14" green="0.14" blue="0.14"/>
|
||||
<bounds x="~x~" y="120" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd~i~" ref="vfd0">
|
||||
<animate name="vfdduty0" />
|
||||
<color state="0" red="0.00" green="0.6" blue="1.00" alpha="0.0"/>
|
||||
<color state="31" red="0.00" green="0.6" blue="1.00" alpha="1.0"/>
|
||||
<bounds x="~x~" y="120" width="9" height="14"/>
|
||||
</element>
|
||||
</repeat>
|
||||
|
@ -836,48 +836,13 @@ license:CC0
|
||||
<bounds x="120" y="120" width="7" height="7"/>
|
||||
</element>
|
||||
|
||||
<element name="vfd0" ref="vfd0" state="0">
|
||||
<bounds x="17" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd1" ref="vfd0" state="0">
|
||||
<bounds x="24" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd2" ref="vfd0" state="0">
|
||||
<bounds x="31" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd3" ref="vfd0" state="0">
|
||||
<bounds x="38" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd4" ref="vfd0" state="0">
|
||||
<bounds x="45" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd5" ref="vfd0" state="0">
|
||||
<bounds x="52" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd6" ref="vfd0" state="0">
|
||||
<bounds x="59" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd7" ref="vfd0" state="0">
|
||||
<bounds x="66" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd8" ref="vfd0" state="0">
|
||||
<bounds x="73" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd9" ref="vfd0" state="0">
|
||||
<bounds x="80" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd10" ref="vfd0" state="0">
|
||||
<bounds x="87" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd11" ref="vfd0" state="0">
|
||||
<bounds x="94" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd12" ref="vfd0" state="0">
|
||||
<bounds x="101" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd13" ref="vfd0" state="0">
|
||||
<bounds x="108" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<repeat count="14">
|
||||
<param name="i" start="0" increment="1"/>
|
||||
<param name="x" start="17" increment="7"/>
|
||||
<element name="vfd~i~" ref="vfd0">
|
||||
<bounds x="~x~" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
</repeat>
|
||||
|
||||
<element name="sreel1" ref="SteppersReel1" state="0">
|
||||
<bounds x="17" y="300" width="32" height="32"/>
|
||||
|
@ -836,48 +836,13 @@ license:CC0
|
||||
<bounds x="120" y="120" width="7" height="7"/>
|
||||
</element>
|
||||
|
||||
<element name="vfd0" ref="vfd0" state="0">
|
||||
<bounds x="17" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd1" ref="vfd0" state="0">
|
||||
<bounds x="24" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd2" ref="vfd0" state="0">
|
||||
<bounds x="31" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd3" ref="vfd0" state="0">
|
||||
<bounds x="38" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd4" ref="vfd0" state="0">
|
||||
<bounds x="45" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd5" ref="vfd0" state="0">
|
||||
<bounds x="52" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd6" ref="vfd0" state="0">
|
||||
<bounds x="59" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd7" ref="vfd0" state="0">
|
||||
<bounds x="66" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd8" ref="vfd0" state="0">
|
||||
<bounds x="73" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd9" ref="vfd0" state="0">
|
||||
<bounds x="80" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd10" ref="vfd0" state="0">
|
||||
<bounds x="87" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd11" ref="vfd0" state="0">
|
||||
<bounds x="94" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd12" ref="vfd0" state="0">
|
||||
<bounds x="101" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<element name="vfd13" ref="vfd0" state="0">
|
||||
<bounds x="108" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
<repeat count="14">
|
||||
<param name="i" start="0" increment="1"/>
|
||||
<param name="x" start="17" increment="7"/>
|
||||
<element name="vfd~i~" ref="vfd0">
|
||||
<bounds x="~x~" y="280" width="7" height="10"/>
|
||||
</element>
|
||||
</repeat>
|
||||
|
||||
<element name="sreel1" ref="SteppersReel1" state="0">
|
||||
<bounds x="17" y="300" width="32" height="32"/>
|
||||
|
@ -10,54 +10,20 @@ license:CC0
|
||||
</element>
|
||||
|
||||
<view name="VFD">
|
||||
<element name="vfd0" ref="vfd0" state="0">
|
||||
<bounds x="0" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd1" ref="vfd0" state="0">
|
||||
<bounds x="9" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd2" ref="vfd0" state="0">
|
||||
<bounds x="18" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd3" ref="vfd0" state="0">
|
||||
<bounds x="27" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd4" ref="vfd0" state="0">
|
||||
<bounds x="36" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd5" ref="vfd0" state="0">
|
||||
<bounds x="45" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd6" ref="vfd0" state="0">
|
||||
<bounds x="54" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd7" ref="vfd0" state="0">
|
||||
<bounds x="63" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd8" ref="vfd0" state="0">
|
||||
<bounds x="72" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd9" ref="vfd0" state="0">
|
||||
<bounds x="81" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd10" ref="vfd0" state="0">
|
||||
<bounds x="90" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd11" ref="vfd0" state="0">
|
||||
<bounds x="99" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd12" ref="vfd0" state="0">
|
||||
<bounds x="108" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd13" ref="vfd0" state="0">
|
||||
<bounds x="117" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd14" ref="vfd0" state="0">
|
||||
<bounds x="126" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd15" ref="vfd0" state="0">
|
||||
<bounds x="135" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
</view>
|
||||
<repeat count="16">
|
||||
<param name="i" start="0" increment="1"/>
|
||||
<param name="x" start="0" increment="9"/>
|
||||
<element name="vfdblank~i~" ref="vfd0">
|
||||
<color red="0.14" green="0.14" blue="0.14"/>
|
||||
<bounds x="~x~" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
<element name="vfd~i~" ref="vfd0">
|
||||
<animate name="vfdduty0" />
|
||||
<color state="0" red="0.00" green="0.6" blue="1.00" alpha="0.0"/>
|
||||
<color state="31" red="0.00" green="0.6" blue="1.00" alpha="1.0"/>
|
||||
<bounds x="~x~" y="280" width="9" height="14"/>
|
||||
</element>
|
||||
</repeat>
|
||||
|
||||
</view>
|
||||
</mamelayout>
|
||||
|
@ -2706,9 +2706,9 @@
|
||||
</led7seg>
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="vfd0_background">
|
||||
<rect>
|
||||
@ -2844,9 +2844,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2173,9 +2173,9 @@
|
||||
</led7seg>
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="vfd0_background">
|
||||
<rect>
|
||||
@ -2355,9 +2355,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2842,9 +2842,9 @@
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<!-- if these are really 14 segs, and the hookups are meant to be compaible with the 16segs then the MAME bit order is incorrect -->
|
||||
<!--<led14segsc>
|
||||
<!--<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>-->
|
||||
</led16segsc>-->
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led16segsc>
|
||||
|
@ -726,9 +726,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2567,9 +2567,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2961,9 +2961,9 @@
|
||||
</led7seg>
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="vfd0_background">
|
||||
<rect>
|
||||
@ -3101,9 +3101,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -958,9 +958,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2317,9 +2317,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2370,9 +2370,9 @@
|
||||
</led7seg>
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="vfd0_background">
|
||||
<rect>
|
||||
@ -2600,9 +2600,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2246,9 +2246,9 @@
|
||||
</led7seg>
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="vfd0_background">
|
||||
<rect>
|
||||
@ -2390,9 +2390,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -977,9 +977,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -3538,9 +3538,9 @@
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<!-- if these are really 14 segs, and the hookups are meant to be compaible with the 16segs then the MAME bit order is incorrect -->
|
||||
<!--<led14segsc>
|
||||
<!--<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>-->
|
||||
</led16segsc>-->
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led16segsc>
|
||||
@ -3705,9 +3705,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -834,9 +834,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -1315,9 +1315,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2511,9 +2511,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -1601,9 +1601,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -1355,9 +1355,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -1875,9 +1875,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -1984,9 +1984,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -704,9 +704,9 @@
|
||||
</led7seg>
|
||||
</element>
|
||||
<element name="vfd0">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="vfd0_background">
|
||||
<rect>
|
||||
@ -888,9 +888,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -2210,9 +2210,9 @@
|
||||
</element>
|
||||
</repeat>
|
||||
<element name="debug_vfd">
|
||||
<led14segsc>
|
||||
<led16segsc>
|
||||
<color red="0.0" green="1.0" blue="1.0"/>
|
||||
</led14segsc>
|
||||
</led16segsc>
|
||||
</element>
|
||||
<element name="debug_stepper_value" defstate="0">
|
||||
<simplecounter maxstate="999" digits="3">
|
||||
|
@ -4320,6 +4320,9 @@
|
||||
<param name="i" start="0" increment="1"/>
|
||||
<param name="x" start="300" increment="17"/>
|
||||
<element name="vfd~i~" ref="vfd0">
|
||||
<animate name="vfdduty0"/>
|
||||
<color state="0" red="0.00" green="1.00" blue="1.00" alpha="0.0"/>
|
||||
<color state="31" red="0.00" green="1.00" blue="1.00" alpha="1.0"/>
|
||||
<bounds x="~x~" y="391" width="17" height="30"/>
|
||||
</element>
|
||||
</repeat>
|
||||
|
@ -4394,7 +4394,10 @@
|
||||
<repeat count="16">
|
||||
<param name="i" start="0" increment="1"/>
|
||||
<param name="x" start="295" increment="17"/>
|
||||
<element name="vfd~i~" ref="vfd0">
|
||||
<element name="vfd~i~" ref="vfd0" blend="add">
|
||||
<animate name="vfdduty0"/>
|
||||
<color state="0" red="0.14" green="0.14" blue="0.14" alpha="1.0"/>
|
||||
<color state="31" red="0.00" green="1.00" blue="1.00" alpha="1.0"/>
|
||||
<bounds x="~x~" y="320" width="17" height="30"/>
|
||||
</element>
|
||||
</repeat>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user