This commit is contained in:
wd40yasu 2022-12-12 09:05:38 +09:00
commit c47b2e3eb7
191 changed files with 7550 additions and 3467 deletions

View File

@ -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
View 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>

View File

@ -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 &amp; 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 &amp; 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 -->

View File

@ -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 &amp; 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

View File

@ -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",
}

View 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")

View 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

View 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")

View 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

View 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")

View 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

View 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")

View 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

View 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")

View 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

View 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")

View 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

View File

@ -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

View File

@ -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)];
}

View File

@ -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

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
};

View File

@ -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);
}

View File

@ -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;

View File

@ -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)

View 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")

View 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

View File

@ -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
**********************************************************************/

View 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;
}
}

View 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

View 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;
}
}

View 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

View 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);
}

View 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

View 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));
}

View 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

View 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);
}

View 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

View 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)
}

View 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

View File

@ -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;
}
}

View File

@ -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

View File

@ -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);
}

View File

@ -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;
};

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}
}
}

View 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;
}
}

View 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

View 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;
}
}
}

View 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

View File

@ -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:

View File

@ -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 )
{

View File

@ -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;

View File

@ -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++;

View File

@ -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;

View File

@ -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
};

View File

@ -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)

View File

@ -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]{};

View File

@ -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

View File

@ -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 */

View File

@ -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));
}

View File

@ -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()

View File

@ -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;

View File

@ -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"

View File

@ -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
}

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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);
}

View File

@ -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>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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>

View File

@ -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">

View File

@ -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">

View File

@ -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>

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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>

View File

@ -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