Merge tag 'mame0280' of https://github.com/mamedev/mame into 0280

MAME 0.280
This commit is contained in:
sonninnos committed 2025-09-02 02:09:02 +03:00
commit 87e4b9f6ca
521 files changed
+41810 -25939

No files matched your search

+1
View File
@@ -56,6 +56,7 @@ namespace spv {
}
#include <algorithm>
#include <cstdint>
#include <map>
#include <memory>
#include <set>
@@ -4,8 +4,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mamedev.mame"
android:versionCode="279"
android:versionName="0.279"
android:versionCode="280"
android:versionName="0.280"
android:installLocation="auto">
<!-- OpenGL ES 2.0 -->
+2 -2
View File
@@ -63,9 +63,9 @@ copyright = u'1997-2025, MAMEdev and contributors'
# built documents.
#
# The short X.Y version.
version = '0.279'
version = '0.280'
# The full version, including alpha/beta/rc tags.
release = '0.279'
release = '0.280'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
+13 -4
View File
@@ -100,7 +100,8 @@ Missing [PWM] samples
<year>1994</year>
<publisher>Sega</publisher>
<notes><![CDATA[
Some 3d geometry bugs when [DRC] is used
Some 3d geometry bugs when [-drc] is used
Accesses [cart] backup RAM
]]></notes>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="_32x_cart">
@@ -1699,6 +1700,7 @@ Master SH-2 enables HINT
<notes><![CDATA[
left/right column sprites don't wraparound properly (webs in stage 1, first boss intro roar) (verify)
Waterfall in stage 2 is static on left side, looks less prominent in YT videos (verify)
Update: writes to no man's land area with [SH-2] around $0009'0xxx, very likely cache shenanigans
Randomly crashed once during stage 2
Reportedly runs at 30 FPS on real HW
]]></notes>
@@ -2293,8 +2295,10 @@ Accesses [cart] backup RAM
<year>199?</year>
<publisher>Time Warner Interactive</publisher>
<notes><![CDATA[
Black screen, needs tighter sync after FIFO rewrite (?)
Uses [DE-9] port 2 button B for something
[Slave SH-2] tests [SCI] port
Writes 0x0f1f to $a130e0 in undefined [cart] area
]]></notes>
<part name="cart" interface="_32x_cart">
<dataarea name="rom" size="262144">
@@ -2436,7 +2440,8 @@ Uses [DE-9] port 2 button B for something
<year>1994</year>
<publisher>Sega</publisher>
<notes><![CDATA[
Some 3d geometry bugs when [DRC] is used
Some 3d geometry bugs with [-drc]
Accesses [cart] backup RAM
]]></notes>
<info name="serial" value="GM-5001 (JPN)"/>
<info name="release" value="19941216 (JPN)"/>
@@ -2454,7 +2459,8 @@ Some 3d geometry bugs when [DRC] is used
<year>1994</year>
<publisher>Sega</publisher>
<notes><![CDATA[
Some 3d geometry bugs when [DRC] is used
Some 3d geometry bugs when [-drc] is used
Accesses [cart] backup RAM
]]></notes>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cart" interface="_32x_cart">
@@ -2521,10 +2527,13 @@ Extensive checks for [cart] SRAM space, boots back to main menu if a new league
</software>
<!-- TODO: sometimes it corrupts sound? -->
<software name="wwfraw">
<software name="wwfraw" supported="no">
<description>WWF Raw (World)</description>
<year>1994</year>
<publisher>Acclaim Entertainment</publisher>
<notes><![CDATA[
Background doesn't draw with [-nodrc], uses [SH-2] cache for cartridge RAM write
]]></notes>
<info name="usage" value="Supports 4-players thru teamplay option"/>
<info name="serial" value="T-8101A (JPN)"/>
<info name="release" value="19950901 (JPN)"/>
+2
View File
@@ -47,6 +47,8 @@ Thanks to DCALICE (http://alice32.free.fr) for info!
<description>Galixian</description>
<year>1984</year>
<publisher>Sprites</publisher>
<info name="author" value="François Chaumartin" />
<info name="serial" value="AE 001" />
<part name="cass" interface="mc10_cass">
<dataarea name="cass" size="20961">
+2 -8
View File
@@ -5028,7 +5028,7 @@ ATK test: C:0 H:U Bad
</part>
</software>
<software name="batman1" cloneof="batman" supported="no">
<software name="batman1" cloneof="batman" supported="yes">
<!-- SPS (CAPS) release 19 -->
<description>Batman (Europe, Single Disk)</description>
<!-- retail, standalone -->
@@ -5036,7 +5036,6 @@ ATK test: C:0 H:U Bad
<year>1989</year>
<publisher>Ocean</publisher>
<notes><![CDATA[
Black screen, [CIAB] fails on comparing a TOD 9 > 0x115 at PC=de4
ATK test: C:0 H:U Bad
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -34925,8 +34924,6 @@ ATK test: OK
<year>1989</year>
<publisher>Psyclapse</publisher>
<notes><![CDATA[
black screen with eventually running irq at $ffffff, [FDC] dsksync (fixed)
Hangs on [CIA] timer A readback while setting mode $99 (fixed)
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -37062,7 +37059,7 @@ ATK test: C:even H:L 1 Sector Bad
</part>
</software>
<software name="pang" supported="no">
<software name="pang" supported="yes">
<!-- SPS (CAPS) release 929 -->
<description>Pang (Europe)</description>
<!-- retail, standalone -->
@@ -37070,8 +37067,6 @@ ATK test: C:even H:L 1 Sector Bad
<year>1990</year>
<publisher>Ocean</publisher>
<notes><![CDATA[
Throws a Guru Meditation on first boot, boots afterwards, [CIAB]?
black screen after level select, trashes memory, [FDC]
ATK test: failed
]]></notes>
<part name="flop1" interface="floppy_3_5">
@@ -45869,7 +45864,6 @@ ATK test: C:79 Bad
<year>1993</year>
<publisher>Krisalis</publisher>
<notes><![CDATA[
new68k: trashes memory after initial loading, reports regressed track reading in ATK, [FDC] or [CIA]
ATK test: OK
]]></notes>
<part name="flop1" interface="floppy_3_5">
+33
View File
@@ -0,0 +1,33 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
-->
<softwarelist name="bbc_vsm" description="Acorn BBC Micro Speech PHROMs">
<software name="cm62024">
<description>CM62064 (Kenneth Kendall)</description>
<year>1982</year>
<publisher>Acorn Computers</publisher>
<part name="rom" interface="bbc_vsm">
<feature name="bank" value="15" />
<dataarea name="rom" size="0x4000">
<rom name="cm62024.bin" size="0x4000" crc="98e1bf9e" sha1="b369809275cb67dfd8a749265e91adb2d2558ae6" />
</dataarea>
</part>
</software>
<software name="vm61002">
<description>VM61002 (Industrial)</description>
<year>1981</year>
<publisher>Texas Instruments</publisher>
<part name="rom" interface="bbc_vsm">
<feature name="bank" value="0" />
<dataarea name="rom" size="0x4000">
<rom name="vm61002.bin" size="0x4000" crc="bf4b3b64" sha1="66876702d1d95eecc034d20f25047f893a27cde5" />
</dataarea>
</part>
</software>
</softwarelist>
+1 -1
View File
@@ -13,7 +13,7 @@ license:CC0-1.0
<!-- only the single known cart exists for this system -->
<software name="ver1" supported="no">
<description>Duel Masters: Duel Station Ver.1</description>
<description>Duel Masters: Duel Station Senyō Cartridge Ver.1</description>
<year>2003</year>
<publisher>Takara</publisher>
<info name="alt_title" value="デュエルマスターズ デュエルステーション専用カートリッジ Ver.1" />
+108
View File
@@ -0,0 +1,108 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
-->
<softwarelist name="gaelco_ds5002fp_rom" description="Gaelco DS5002FP Programmer ROMs">
<software name="aligator" supported="no">
<description>Alligator Hunt</description>
<year>1994</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="aligator_47dF_22-nov_27c1024.bin" size="0x20000" crc="ec47f05e" sha1="782eb1398a60d54e5bcbe76e22000f6adc710bfe" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="maniacsq" supported="no">
<description>Maniac Square</description>
<year>1996</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="maniac_825c_22-5-96_27c1024.bin" size="0x20000" crc="89db7181" sha1="fcdc8077c4247ca24d19c7f61fcb9e1bc93e36fd" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="targeth" supported="no">
<description>Target Hits</description>
<year>1994</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="escopeta_2088_27c1024.bin" size="0x20000" crc="ac13d038" sha1="eb0fd071e92154c1002e9955b72bcde4cafbfb51" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="glass" supported="no">
<description>Glass</description>
<year>1993</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="glass_9970_27c1024.bin" size="0x20000" crc="6cdf4f11" sha1="f6ca3421497468b925af0f5124c798e1555aa990" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="thoop2" supported="no">
<description>TH Strikes Back</description>
<year>1994</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="thunder_h_6886_4-5-94_27c1024.bin" size="0x20000" crc="1074c715" sha1="3c9504ed9321f45cd0f3f9d943702d555a4d3a38" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="touchgo" supported="no">
<description>Touch and Go</description>
<year>1995</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="voley_27c1024.bin" size="0x20000" crc="9fbbee8c" sha1="89ad2014efe10555a045c56cffd20004d572cc4e" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="wrally2" supported="no">
<description>World Rally 2</description>
<year>1995</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="wr2_usa_cafe_31-7_27c1024.bin" size="0x20000" crc="7a1725ec" sha1="58157ebe3a27c8505843a6157243ef5acd14b670" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="wrally2a" supported="no">
<description>World Rally 2 (older)</description>
<year>1995</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="wr2_b2d2_29-06_27c1024.bin" size="0x20000" crc="a5f30e85" sha1="d9a744c7cfd7e67e9bb84a0d21bfcc7f90aaa1f4" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="goldart" supported="no">
<description>Goldart</description>
<year>1994</year>
<publisher>Gaelco</publisher>
<part name="cart" interface="gaelcods_rom">
<dataarea name="rom" width="16" endianness="big" size="0x20000">
<rom name="diana_27c1024.bin" size="0x20000" crc="20c4d1d9" sha1="067be3b3efa0f37dfb7b06d3a83452a1619933e2" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
</softwarelist>
+199
View File
@@ -28533,4 +28533,203 @@ license:CC0-1.0
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<!-- Super Mario Bros. Mini on GitHub: https://github.com/Mico27/SuperMarioBrosMini
All ROM images were downloaded from the GitHub releases page.
-->
<software name="smbmini">
<description>Super Mario Bros. Mini (v2.0.8)</description>
<year>2024</year>
<publisher>Mico27</publisher>
<info name="release" value="20241120" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="c2bfe433" sha1="c9eee8d916390e3bd6142370de4d9fe501fd44a8" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini207" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.7)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241112" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="f50ee02c" sha1="f01983381be22973c289690cc1bb068294b4b28c" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini206" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.6)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241102" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="9d42c762" sha1="784e563c4e66f27d84c181650a39be6d7f3b9429" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini205" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.5)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241102" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="bf2ce7b7" sha1="a0958a1cd5b279984b3cc54602df453193088425" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini204" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.4)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241030" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="6eb7bf49" sha1="6c70bf7ec4911c08a2364fba0a7ef114c50519b5" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini203" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.3)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241029" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="e95dd63b" sha1="76dfad666d1669b4916d872a5587e222de3632a1" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini202" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.2)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241028" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="1b5a3936" sha1="50ff764fd2357ffd2a477ffe698bf122ac98d5db" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini201" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.1)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241026" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="5bcbd303" sha1="7f14089f5b4e5c8f278ca20a14205361b9dcdf66" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini200" cloneof="smbmini">
<description>Super Mario Bros. Mini (v2.0.0)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241026" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="2097152">
<rom name="SuperMarioBrosMini.gb" size="2097152" crc="89105d14" sha1="edad2d93bf395f48a9184704f9e6b0970b8d0cfa" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini103" cloneof="smbmini">
<description>Super Mario Bros. Mini (v1.0.3)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241007" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="1048576">
<rom name="SuperMarioBrosMini.gb" size="1048576" crc="fe2bfa0a" sha1="46a9795cb1adf5242ffd34b06fa23b5c39815fca" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini102" cloneof="smbmini">
<description>Super Mario Bros. Mini (v1.0.2)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241006" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="1048576">
<rom name="SuperMarioBrosMini.gb" size="1048576" crc="7d30a1d3" sha1="dbfbc0bdfa80ad3bb2aff3a5359f872d9b30c60d" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini101" cloneof="smbmini">
<description>Super Mario Bros. Mini (v1.0.1)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241005" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="1048576">
<rom name="SuperMarioBrosMini.gb" size="1048576" crc="9e27eeeb" sha1="bb74bfc6fd6edfb6d7d8a1fd01b84047b4ae82fd" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
<software name="smbmini100" cloneof="smbmini">
<description>Super Mario Bros. Mini (v1.0.0)</description>
<year>2024</year>
<publisher>Micro27</publisher>
<info name="release" value="20241002" />
<sharedfeat name="compatibility" value="GBC" />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_mbc5" />
<dataarea name="rom" size="1048576">
<rom name="SuperMarioBrosMini.gb" size="1048576" crc="79ca4ac0" sha1="bbc8f13f2191dd53741fe70554613ccb2c5552ab" />
</dataarea>
<dataarea name="nvram" size="0x8000" />
</part>
</software>
</softwarelist>
+85
View File
@@ -0,0 +1,85 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
NOTE:
- we treat supported="no" for something that have major issues everywhere,
"partial" for stuff running on 1+ systems but don't on others.
-->
<softwarelist name="generic_flop_525" description="Cross-platform 5.25&quot; disk images">
<!-- original from pc8801_flop -->
<software name="gruppe" supported="no">
<description>Gruppe</description>
<year>1985</year>
<publisher>SPS</publisher>
<notes><![CDATA[
All systems: fails to load with "program load error".
https://github.com/mamedev/mame/issues/2349
]]></notes>
<info name="release" value="198504xx"/>
<info name="alt_title" value="ぐるっぺ"/>
<sharedfeat name="compatibility" value="mz2200,pc8801,x1"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="349392">
<rom name="gruppe.d88" size="349392" crc="d7efdc5d" sha1="ab4da770fae54f306bfdc8fc9df3c52f3b4a1a65"/>
</dataarea>
</part>
</software>
<!-- original from x1_flop -->
<software name="gruppea" cloneof="gruppe" supported="no">
<description>Gruppe (alt)</description>
<year>1985</year>
<publisher>SPS</publisher>
<notes><![CDATA[
(same as gruppe)
]]></notes>
<info name="release" value="198506xx"/>
<info name="alt_title" value="ぐるっぺ"/>
<sharedfeat name="compatibility" value="mz2200,pc8801,x1"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="348848">
<rom name="gruppe.d88" size="348848" crc="a50dfd33" sha1="551749d2ec4deb3919f2111d234450fd4f90d54a"/>
</dataarea>
</part>
</software>
<software name="kitahei">
<description>Kitahei</description>
<year>1985</year>
<publisher>SPS</publisher>
<notes><![CDATA[
mz2000: needs to press G on concealed text prompt on title (verify)
]]></notes>
<info name="release" value="198509xx"/>
<info name="alt_title" value="棋太平"/>
<sharedfeat name="compatibility" value="mz2000,mz2200,pc8801,x1"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="349392">
<rom name="kitahei.d88" size="349392" crc="53ae4f58" sha1="bbdff7ac4d6a844580bb06accb1d8d88759b8ae9"/>
</dataarea>
</part>
</software>
<!-- original in x1_flop.xml -->
<software name="victnined" supported="partial">
<description>Victorious Nine (demo)</description>
<year>1985</year>
<publisher>ニデコム (Nidecom)</publisher>
<notes><![CDATA[
pc8801: crashes before reaching title screen (has V2 mode detection, which implies being compatible)
]]></notes>
<info name="release" value="198509xx"/>
<info name="alt_title" value="ビクトリアスナイン"/>
<sharedfeat name="compatibility" value="mz2200,pc8801,x1"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="350560">
<rom name="victorious nine.d88" size="350560" crc="2fc94dfd" sha1="e29f55bed953e0304d88b8eed9448f31eb888298"/>
</dataarea>
</part>
</software>
</softwarelist>
+2
View File
@@ -60,9 +60,11 @@ license:CC0-1.0
* H6232 - Juice Box Music Video (Zoegirl, Jump5, Jump5, Baha Men, Atomic Kitten)
H6233 - Kenny Chesney - 'Live Those Songs', 'No Shoes, No Shirt, No Problems', 'I Go Back' Sara Evans - 'Suds in the Bucket, Martina McBride - 'This One's For The Girls'
H6234 - Juice Box Music Video (Ashlee Simpson, Ashlee Simpson) (same 2 Ashlee Simpson songs as H6226, but without other tracks)
H6236 - Juice Box Music Video (Liz Phair, Stacie Orrico, Sarah Hudson, Steriogram)
* H6247 - Dexter's Laboratory Episode 51
H6248 - Codename: Kids Next Door - Episode #19
* H6254 - Juice Box Music Video (Liz Phair, Stacie Orrico, Skye Sweetnam, Zoegirl) (full part # H6254-0971G1) (include 'the making of' for Skye Sweetnam Tangled Up in Me)
H6257 - Yu-Gi-oh! Episode 229
*V H6258 - Winx Club Episode 103
H6259 - SonicX Episode 3: Missile Wrist Rampage
*V H6260 - Teenage Mutant Ninja Turtles Episode 36
+119 -119
View File
@@ -1,119 +1,119 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
-->
<!--
Most KIM-1 software is complex to use. Refer to the manuals for information.
MAME's KIM-1 driver is not good at loading cassette recordings. So instead,
the ones provided here are re-encodings made with a BIN to WAV conversion tool,
such as KIMTAPE 0.5 (at default speed), eg:
kimtape -m -a0 -da1 a1.bin a1.wav
-->
<softwarelist name="kim1_cass" description="KIM-1 cassettes">
<software name="baseball">
<description>Baseball</description>
<year>1979</year>
<publisher>Robert Leedom</publisher>
<info name="usage" value="Loads in 3 parts. ID 01, ID 02, ID 03, GO 0200" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="26518684">
<rom name="baseball.wav" size="26518684" crc="01e1f702" sha1="7ed49cc17781ca2abfb6496071a88fb8c1f17137"/>
</dataarea>
</part>
</software>
<software name="focal">
<description>FOCAL-65 (V3D)</description>
<year>1977</year>
<publisher>Aresco</publisher>
<info name="usage" value="terminal, Loads in 2 parts. ID 01, ID 02, GO 2000" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="16230584">
<rom name="focal.wav" size="16230584" crc="e8eb2679" sha1="7ef83fa37077987551e4e48f16ba1494b5d827e7"/>
</dataarea>
</part>
</software>
<software name="hexpawn">
<description>Hexpawn</description>
<year>1978</year>
<publisher>Robert Leedom</publisher>
<info name="usage" value="ID 01, GO 0100" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="2361357">
<rom name="hexpawn.wav" size="2361357" crc="2a0810be" sha1="c0656f9e99b071396263d98bbc87d2de9cd68e72"/>
</dataarea>
</part>
</software>
<software name="kimbasic">
<description>MOS TECH 6502 BASIC 9-digit v1.1</description>
<year>1977</year>
<publisher>Microsoft Co.</publisher>
<info name="usage" value="terminal, ID 01, GO 4065" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="23219181">
<rom name="kim basic 911.wav" size="23219181" crc="72470b66" sha1="0d4c00bde405ea491f27b1fffee7f07d45ee09a0"/>
</dataarea>
</part>
</software>
<software name="kb6" cloneof="kimbasic">
<description>MOS TECH 6502 BASIC 6-digit</description>
<year>1977</year>
<publisher>Microsoft Co.</publisher>
<info name="usage" value="terminal, ID 01, GO 3D73" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="21267405">
<rom name="kim basic 6.wav" size="21267405" crc="0ba87eaa" sha1="46f2f23a9a41a9fe95080c87acd7bc8929161717"/>
</dataarea>
</part>
</software>
<software name="microade">
<description>Micro-ADE</description>
<year>1977</year>
<publisher>MicroWare Ltd</publisher>
<info name="usage" value="terminal, ID 01, GO 2000" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="10984941">
<rom name="microade.wav" size="10984941" crc="defbe148" sha1="40ce84727d65f195aa1ef451714781c78b1d2785"/>
</dataarea>
</part>
</software>
<software name="mchess">
<description>Microchess</description>
<year>1976</year>
<publisher>Micro-Ware Ltd.</publisher>
<info name="usage" value="Enter 'R -00F1=00 -17F9=C0 -1873X'. Play tape, pause when display shows 0000 (P). 'R -17F9=C1 -1873X', (P), 'R X'." />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="9953338">
<!-- IDs C0,C1 are the main program, IDs 01-05 are optional chess openings -->
<rom name="microchess.wav" size="9953338" crc="c7584ae0" sha1="9f1ac8f439e083dd592664a0f1e6ba1530836120"/>
</dataarea>
</part>
</software>
<software name="kimvent">
<description>KIM-Venture</description>
<year>1979</year>
<publisher>Robert C. Leedom.</publisher>
<info name="usage" value="Enter 'R -00F1=00 -17F9=A1 -1873X'. Play tape, pause when display shows 0000 (P). '-17F9=A2 -1873X', (P), '-17F9=A3 -1873X', (P), '-0100X'." />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="9515290">
<!-- IDs A1,A2,A3 are the main program, ID 06 is the K-V SCORE program -->
<rom name="kimventure.wav" size="9515290" crc="bb3fde67" sha1="da525cb544e785d6751d759d905f0f4c7af483d7"/>
</dataarea>
</part>
</software>
</softwarelist>
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
-->
<!--
Most KIM-1 software is complex to use. Refer to the manuals for information.
MAME's KIM-1 driver is not good at loading cassette recordings. So instead,
the ones provided here are re-encodings made with a BIN to WAV conversion tool,
such as KIMTAPE 0.5 (at default speed), eg:
kimtape -m -a0 -da1 a1.bin a1.wav
-->
<softwarelist name="kim1_cass" description="KIM-1 cassettes">
<software name="baseball">
<description>Baseball</description>
<year>1979</year>
<publisher>Robert Leedom</publisher>
<info name="usage" value="Loads in 3 parts. ID 01, ID 02, ID 03, GO 0200" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="26518684">
<rom name="baseball.wav" size="26518684" crc="01e1f702" sha1="7ed49cc17781ca2abfb6496071a88fb8c1f17137"/>
</dataarea>
</part>
</software>
<software name="focal">
<description>FOCAL-65 (V3D)</description>
<year>1977</year>
<publisher>Aresco</publisher>
<info name="usage" value="terminal, Loads in 2 parts. ID 01, ID 02, GO 2000" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="16230584">
<rom name="focal.wav" size="16230584" crc="e8eb2679" sha1="7ef83fa37077987551e4e48f16ba1494b5d827e7"/>
</dataarea>
</part>
</software>
<software name="hexpawn">
<description>Hexpawn</description>
<year>1978</year>
<publisher>Robert Leedom</publisher>
<info name="usage" value="ID 01, GO 0100" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="2361357">
<rom name="hexpawn.wav" size="2361357" crc="2a0810be" sha1="c0656f9e99b071396263d98bbc87d2de9cd68e72"/>
</dataarea>
</part>
</software>
<software name="kimbasic">
<description>MOS TECH 6502 BASIC 9-digit v1.1</description>
<year>1977</year>
<publisher>Microsoft Co.</publisher>
<info name="usage" value="terminal, ID 01, GO 4065" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="23219181">
<rom name="kim basic 911.wav" size="23219181" crc="72470b66" sha1="0d4c00bde405ea491f27b1fffee7f07d45ee09a0"/>
</dataarea>
</part>
</software>
<software name="kb6" cloneof="kimbasic">
<description>MOS TECH 6502 BASIC 6-digit</description>
<year>1977</year>
<publisher>Microsoft Co.</publisher>
<info name="usage" value="terminal, ID 01, GO 3D73" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="21267405">
<rom name="kim basic 6.wav" size="21267405" crc="0ba87eaa" sha1="46f2f23a9a41a9fe95080c87acd7bc8929161717"/>
</dataarea>
</part>
</software>
<software name="microade">
<description>Micro-ADE</description>
<year>1977</year>
<publisher>MicroWare Ltd</publisher>
<info name="usage" value="terminal, ID 01, GO 2000" />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="10984941">
<rom name="microade.wav" size="10984941" crc="defbe148" sha1="40ce84727d65f195aa1ef451714781c78b1d2785"/>
</dataarea>
</part>
</software>
<software name="mchess">
<description>Microchess</description>
<year>1976</year>
<publisher>Micro-Ware Ltd.</publisher>
<info name="usage" value="Enter 'R -00F1=00 -17F9=C0 -1873X'. Play tape, pause when display shows 0000 (P). 'R -17F9=C1 -1873X', (P), 'R X'." />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="9953338">
<!-- IDs C0,C1 are the main program, IDs 01-05 are optional chess openings -->
<rom name="microchess.wav" size="9953338" crc="c7584ae0" sha1="9f1ac8f439e083dd592664a0f1e6ba1530836120"/>
</dataarea>
</part>
</software>
<software name="kimvent">
<description>KIM-Venture</description>
<year>1979</year>
<publisher>Robert C. Leedom.</publisher>
<info name="usage" value="Enter 'R -00F1=00 -17F9=A1 -1873X'. Play tape, pause when display shows 0000 (P). '-17F9=A2 -1873X', (P), '-17F9=A3 -1873X', (P), '-0100X'." />
<part name="cass" interface="kim1_cass">
<dataarea name="cass" size="9515290">
<!-- IDs A1,A2,A3 are the main program, ID 06 is the K-V SCORE program -->
<rom name="kimventure.wav" size="9515290" crc="bb3fde67" sha1="da525cb544e785d6751d759d905f0f4c7af483d7"/>
</dataarea>
</part>
</software>
</softwarelist>
+42 -1
View File
@@ -3,7 +3,7 @@
<!--
license:CC0-1.0
-->
<softwarelist name="leapfrog_leappad_cart" description="LeapFrog LeapPad / CocoPad cartridges">
<softwarelist name="leapfrog_leappad_cart" description="LeapFrog LeapPad / CocoPad / Benesse Qpad cartridges">
<software name="tiggerbnca" cloneof="tiggerbnc" supported="no">
<description>Disney's Bounce, Tigger, Bounce (UK)</description>
@@ -1034,6 +1034,19 @@ license:CC0-1.0
</part>
</software>
<software name="minnatana" cloneof="minnatan" supported="no">
<description>Minna de tanoshiku! CoCoPad (Otameshi soft) (Japan, older)</description>
<year>2002</year>
<publisher>LeapFrog / Sega Toys</publisher>
<info name="alt_title" value="みんなでたのしく!ココパッド おためしソフト" />
<info name="serial" value="9P4-0092A"/>
<part name="cart" interface="leapfrog_leappad_cart">
<dataarea name="rom" size="0x200000">
<rom name="9p4-0092a.u1" size="0x200000" crc="02871b3d" sha1="fa16a444bdf14d4f50ab1e2de28acb0b5ecabdd8" />
</dataarea>
</part>
</software>
<software name="bennyeng2" supported="no">
<description>Benny and Friends English Book Vol. 2 -Majo to taiketsu! Daibouken- (Japan)</description>
<year>2002</year>
@@ -1500,4 +1513,32 @@ license:CC0-1.0
</dataarea>
</part>
</software>
<!-- Benesse Qpad cartridges -->
<software name="gogogoj" supported="no">
<description>Hirogaru Sekai-e Go! Go! Go! (Japan)</description>
<year>2002</year>
<publisher>LeapFrog / Benesse</publisher>
<info name="alt_title" value="広がる世界へ GO!GO!GO!" />
<!-- no obvious serial or label on ROM, 066 (or 990) is stamped on PCB though -->
<part name="cart" interface="leapfrog_leappad_cart">
<dataarea name="rom" size="0x400000">
<rom name="gogogo_red.bin" size="0x400000" crc="988a39ee" sha1="621e1459db8a11152d384d9d9c7d7a43b31859ff" />
</dataarea>
</part>
</software>
<software name="lgengj" supported="no">
<description>Kagayaku Kimi no Mirai-e Let's Go English! (Japan)</description>
<year>2003</year>
<publisher>LeapFrog / Benesse</publisher>
<info name="alt_title" value="輝くキミの未来へ Let's Go English!" />
<!-- no obvious serial or label anywhere -->
<part name="cart" interface="leapfrog_leappad_cart">
<dataarea name="rom" size="0x400000">
<rom name="letsgoenglish.bin" size="0x400000" crc="69c5dc8a" sha1="49857adf4e96fca7346f74de849373c1fd2a711e" />
</dataarea>
</part>
</software>
</softwarelist>
+781 -319
View File
File diff suppressed because it is too large. Load diff
+390 -60
View File
@@ -2189,6 +2189,96 @@ The three available regions are PAL, NTSC-U and NTSC-J or a combination such as
</part>
</software>
<software name="devwill">
<description>Devwill Too MD</description>
<year>2019</year>
<publisher>Mega Cat Studios</publisher>
<info name="developer" value="Mangangá Team" />
<info name="language" value="English" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="Devwill Too.bin" size="4194304" crc="34031793" sha1="b4acee3bf9053a76f70f0cb6229d72346610e92f" />
</dataarea>
</part>
</software>
<software name="devwill_pt" cloneof="devwill">
<description>Devwill Too MD (Portuguese)</description>
<year>2019</year>
<publisher>Mega Cat Studios</publisher>
<info name="developer" value="Mangangá Team" />
<info name="language" value="Portuguese (Brazil)" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="Devwill Too MD (World) (Pt-BR).bin" size="4194304" crc="7748c2df" sha1="1057beec9661d9ade4351d08ac9a7bcf36b190df" />
</dataarea>
</part>
</software>
<software name="devwilldg" cloneof="devwill">
<description>Devwill Too MD (English, digital release)</description>
<year>2019</year>
<publisher>Itch.io</publisher>
<info name="developer" value="Mangangá Team" />
<info name="language" value="English" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="3538944">
<rom name="Devwill Too MD (World) (Digital).bin" size="3538944" crc="25736e4f" sha1="0d94389305c0ef13b694327ef4fb80d2700b391c" />
</dataarea>
</part>
</software>
<software name="devwilldg_pt" cloneof="devwill">
<description>Devwill Too MD (Portuguese, digital release)</description>
<year>2019</year>
<publisher>Itch.io</publisher>
<info name="developer" value="Mangangá Team" />
<info name="language" value="Portuguese (Brazil)" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="3538944">
<rom name="Devwill Too MD (World) (Pt-BR) (Digital).bin" size="3538944" crc="c14fc0d4" sha1="bb37a1b58eda33b6ce108e770fda389476b328cf" />
</dataarea>
</part>
</software>
<software name="devwill_d1" cloneof="devwill">
<description>Devwill Too MD (demo v1)</description>
<year>2019</year>
<publisher>Mangangá Team</publisher>
<info name="developer" value="Mangangá Team" />
<info name="language" value="English" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1966080">
<rom name="devwill too demonstracao.bin" size="1966080" crc="c53c9cee" sha1="fcb54d04dbb5e44f7727ef189e830a1fb48e6058" />
</dataarea>
</part>
</software>
<software name="devwill_d2" cloneof="devwill">
<description>Devwill Too MD (demo v2)</description>
<year>2019</year>
<publisher>Mangangá Team</publisher>
<info name="developer" value="Mangangá Team" />
<info name="language" value="English" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1966080">
<rom name="Devwill-Too-MD_Demo-V2.bin" size="1966080" crc="7e1f260c" sha1="468ec80143806f0d697ff40c5ce19b681bb23c1f" />
</dataarea>
</part>
</software>
<software name="devwillpr">
<description>Devwill Too - Prologue</description>
<year>2021</year>
<publisher>Itch.io</publisher>
<info name="developer" value="Mangangá Team" />
<info name="language" value="English/Portuguese (Brazil)" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="3168608">
<rom name="Devwill Too Prologue (ENG - PTBR).bin" size="3168608" crc="736a07e2" sha1="5cb22aadeba74ea155be1eb846a428bd665d5a16" />
</dataarea>
</part>
</software>
<!-- Both Euro and USA confirmed -->
<software name="dicktr">
@@ -2712,10 +2802,13 @@ No [VDP] sprites
<!-- This board contains no SRAM, despite the header reporting 16k of battery -->
<software name="espnnflp" cloneof="espnnfl" supported="no"> <!-- it freezes at head/tail -->
<software name="espnnflp" cloneof="espnnfl" supported="no">
<description>ESPN Sunday Night NFL (USA, prototype)</description>
<year>1994</year>
<publisher>Sony Imagesoft</publisher>
<notes><![CDATA[
Black screen after head/tails, reads at $d68000 (?)
]]></notes>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cart" interface="megadriv_cart">
<feature name="u1" value="TC57400AD-120"/>
@@ -3055,14 +3148,11 @@ No [VDP] sprites
<!-- This was marked as rev. A on the EA sticker, but its header (and ROM markings) uses the Jpn title... weird situation :-) -->
<software name="fatalrewa" cloneof="fatalrew" supported="no">
<software name="fatalrewa" cloneof="fatalrew" supported="yes">
<!-- Originally marked as Fatal Rewind, boots as The Killing Game Show -->
<description>The Killing Game Show (Europe)</description>
<year>1991</year>
<publisher>Electronic Arts</publisher>
<notes><![CDATA[
Crashes after EA logo, requires better [VDP] irq handling
]]></notes>
<part name="cart" interface="megadriv_cart">
<feature name="pcb" value="PWB SC40X1 REV B"/>
<feature name="u1" value="KILLING GAME SHOW KIL03"/> <!-- location not really marked on PCB, using u1 for consistency -->
@@ -3073,13 +3163,13 @@ Crashes after EA logo, requires better [VDP] irq handling
</software>
<!-- Only Euro is confirmed -->
<software name="fatalrew" supported="no">
<!-- Only Euro is confirmed -->
<software name="fatalrew" supported="partial">
<description>Fatal Rewind (Europe, USA, rev. A)</description>
<year>1991</year>
<publisher>Electronic Arts</publisher>
<notes><![CDATA[
Crashes after EA logo, requires better [VDP] irq handling
Crashes with NTSC machines after EOA logo (verify)
]]></notes>
<part name="cart" interface="megadriv_cart">
<feature name="pcb" value="PWB SC40X1 REV B"/>
@@ -6638,6 +6728,9 @@ Unsupported [Menacer] peripheral
<description>PGA Tour Golf II for use with the Personal Trainer</description>
<year>1995</year>
<publisher>HeartBeat Corp</publisher>
<notes><![CDATA[
Unemulated HeartBeat peripheral
]]></notes>
<info name="usage" value="Requires HeartBeat Personal Trainer activity tracker"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom"/>
@@ -8072,6 +8165,19 @@ Unsupported [Menacer] peripheral
</software>
<software name="sovietbg">
<description>Sovietborgs (demo)</description>
<year>2025</year>
<publisher>Retro Sumus</publisher>
<info name="language" value="English" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2752512">
<rom name="sovietborgs-demo.bin" size="2752512" crc="e11938d4" sha1="ecd9dc5b87124ad9fe134b80a23062c5fa811608" />
</dataarea>
</part>
</software>
<!-- Only Euro and Jpn are confirmed -->
<!-- USA has been found on a 171-5702 PCB with two chips MPR-12360 T23 + MPR-12361 T24, but needs to be verified -->
<software name="sharrier">
@@ -10826,6 +10932,9 @@ Only Road Rash portion is present in the dump, the other two entries and menu ar
<description>The Addams Family (USA, prototype, alt)</description>
<year>1994</year>
<publisher>Flying Edge</publisher>
<notes><![CDATA[
Black screen after starting a game, access $be1040-3 for a 0x524e4302 value (?)
]]></notes>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="addams family, the (usa) (beta) (alt).bin" size="1048576" crc="3a173e1f" sha1="632b321b860021f8a473fccc7bf8a03bd9c2d581"/>
@@ -12598,6 +12707,9 @@ https://bootleggames.fandom.com/wiki/Barver_Battle_Saga:_Tai_Kong_Zhan_Shi
<description>Beavis and Butt-Head (USA, prototype)</description>
<year>1994</year>
<publisher>Viacom New Media</publisher>
<notes><![CDATA[
Black screen, keeps accessing [VDP] with an illegal D3=0xffffffff, eventually crashes
]]></notes>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="beavis and butt-head (usa) (beta).bin" size="2097152" crc="81ed5335" sha1="f9ed871867f543a8d94c47270cd530a5ca410664"/>
@@ -13739,169 +13851,349 @@ No [VDP] sprites
</software>
<software name="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, English)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="English" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-en.bin" size="4194304" crc="75c4bc1d" sha1="527faa9ce836cd900e29559ad51b6eda28cf5835" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_br" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Portuguese Brazil)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Portuguese (Brazil)" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-br.bin" size="4194304" crc="138e52b9" sha1="ef47fc0a5cf6d8bcd99f3abdeb7033dbe4adc580" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_de" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, German)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="German" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-de.bin" size="4194304" crc="3c249258" sha1="3d7736b4b48b1567cd3648bcc18a87292c6e256b" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_es" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Spanish)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Spanish" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-es.bin" size="4194304" crc="471a20b8" sha1="3485725a8186e8b74f490ec46c045bd2075774e5" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_fi" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Finnish)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Finnish" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-fi.bin" size="4194304" crc="0f09b3ef" sha1="bc5b30ac1634c5bd4fb7210801237a8e94b7cec5" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_fr" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, French)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="French" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-fr.bin" size="4194304" crc="9df9b830" sha1="f9158a4644b3234e667274ec98fd8f0bad0e24a3" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_it" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Italian)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Italian" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-it.bin" size="4194304" crc="3bba32e1" sha1="c69c71d150981eca3f75bbef92d3e84f37b1bd51" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_ja" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Japanese)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Japanese" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-ja.bin" size="4194304" crc="649348a2" sha1="62b9dc5e472b675516cd1fd75d40d489b50183a7" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_ko" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Korean)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Korean" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-ko.bin" size="4194304" crc="b4a41427" sha1="b6b7de9262beeb77ebb9701dc74a10ee4a591d9a" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_pt" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Portuguese)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Portuguese" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-pt.bin" size="4194304" crc="b55866d9" sha1="a0b896e0098026ffdf20f2a626f224a16a024fd6" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_ru" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Russian)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Russian" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-ru.bin" size="4194304" crc="c8fc8114" sha1="57f02cc25bda2935706c03c6826a52121ed3cfcd" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory085_zh" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.5, Chinese)</description>
<year>2025</year>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Chinese" />
<info name="version" value="0.8.5 2025.08" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-zh.bin" size="4194304" crc="d66a325e" sha1="080b383f3fd0ec5bece38db80658848aff83783b" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory080_en" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, English)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="English" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-en.bin" size="4194304" crc="d476a108" sha1="79c6833b187a02a51f6eccf9283e4d82cca877b5" />
<rom name="doukutsu-en (v0.8.0).bin" size="4194304" crc="d476a108" sha1="79c6833b187a02a51f6eccf9283e4d82cca877b5" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_zh" cloneof="cavestory">
<software name="cavestory080_zh" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Chinese)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Chinese" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-zh.bin" size="4194304" crc="0c1517fc" sha1="da7286cdc75f6e3846f8351abf9325fdbdc687a8" />
<rom name="doukutsu-zh (v0.8.0).bin" size="4194304" crc="0c1517fc" sha1="da7286cdc75f6e3846f8351abf9325fdbdc687a8" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_fr" cloneof="cavestory">
<software name="cavestory080_fr" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, French)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="French" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-fr.bin" size="4194304" crc="f00a8d9f" sha1="d1b89e2e364cd595b5d4c6a2e417f7b79337378a" />
<rom name="doukutsu-fr (v0.8.0).bin" size="4194304" crc="f00a8d9f" sha1="d1b89e2e364cd595b5d4c6a2e417f7b79337378a" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_de" cloneof="cavestory">
<software name="cavestory080_de" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, German)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="German" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-de.bin" size="4194304" crc="a04d7b69" sha1="b0ba518ee523fec58bfbcdd2685f507e288b6c14" />
<rom name="doukutsu-de (v0.8.0).bin" size="4194304" crc="a04d7b69" sha1="b0ba518ee523fec58bfbcdd2685f507e288b6c14" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_it" cloneof="cavestory">
<software name="cavestory080_it" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Italian)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Italian" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-it.bin" size="4194304" crc="8ec855f9" sha1="34d95d7d0278cb9b7479c262a019692b09e13533" />
<rom name="doukutsu-it (v0.8.0).bin" size="4194304" crc="8ec855f9" sha1="34d95d7d0278cb9b7479c262a019692b09e13533" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_ja" cloneof="cavestory">
<software name="cavestory080_ja" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Japanese)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Japanese" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-ja.bin" size="4194304" crc="21acbe48" sha1="a22a72b38c02b777729cb158ed4d4564dbdd1cd3" />
<rom name="doukutsu-ja (v0.8.0).bin" size="4194304" crc="21acbe48" sha1="a22a72b38c02b777729cb158ed4d4564dbdd1cd3" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_ko" cloneof="cavestory">
<software name="cavestory080_ko" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Korean)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Korean" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-ko.bin" size="4194304" crc="0e411955" sha1="910948d9187d0f11e811ff09d94bcb8977d612ce" />
<rom name="doukutsu-ko (v0.8.0).bin" size="4194304" crc="0e411955" sha1="910948d9187d0f11e811ff09d94bcb8977d612ce" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_pt" cloneof="cavestory">
<software name="cavestory080_pt" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Portuguese)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Portuguese" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-pt.bin" size="4194304" crc="965704dd" sha1="da54faea4f7b2ec6822e710ba200890653dcee79" />
<rom name="doukutsu-pt (v0.8.0).bin" size="4194304" crc="965704dd" sha1="da54faea4f7b2ec6822e710ba200890653dcee79" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_br" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Portuguese-Brazil)</description>
<software name="cavestory080_br" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Portuguese Brazil)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Portuguese (Brazil)" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-br.bin" size="4194304" crc="4b52107a" sha1="4dc22a573c82c8d3403a0ccb062ba489fd0af70b" />
<rom name="doukutsu-br (v0.8.0).bin" size="4194304" crc="4b52107a" sha1="4dc22a573c82c8d3403a0ccb062ba489fd0af70b" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory_es" cloneof="cavestory">
<software name="cavestory080_es" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.8.0, Spanish)</description>
<year>2022</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Spanish" />
<info name="version" value="0.8.0 2022.02" />
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="doukutsu-es.bin" size="4194304" crc="06405697" sha1="481683730b0496af80f28441aec2a31525c45519" />
<rom name="doukutsu-es (v0.8.0).bin" size="4194304" crc="06405697" sha1="481683730b0496af80f28441aec2a31525c45519" />
</dataarea>
<dataarea name="sram" size="65536">
</dataarea>
</part>
</software>
<software name="cavestory070" cloneof="cavestory">
<software name="cavestory070_en" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.7.0, English)</description>
<year>2020</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="English" />
<info name="version" value="0.7.0 - Test build Sep 15 2020" />
<part name="cart" interface="megadriv_cart">
@@ -13917,7 +14209,7 @@ No [VDP] sprites
<software name="cavestory070_fr" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.7.0, French)</description>
<year>2020</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="French" />
<info name="version" value="0.7.0" />
<part name="cart" interface="megadriv_cart">
@@ -13933,7 +14225,7 @@ No [VDP] sprites
<software name="cavestory070_it" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.7.0, Italian)</description>
<year>2020</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Italian" />
<info name="version" value="0.7.0" />
<part name="cart" interface="megadriv_cart">
@@ -13949,7 +14241,7 @@ No [VDP] sprites
<software name="cavestory070_pt" cloneof="cavestory">
<description>Cave Story - Doukutsu Monogatari (v0.7.0, Portuguese)</description>
<year>2020</year>
<publisher>Studio Pixel</publisher>
<publisher>Andrew DeRosier</publisher>
<info name="language" value="Portuguese" />
<info name="version" value="0.7.0" />
<part name="cart" interface="megadriv_cart">
@@ -15895,6 +16187,7 @@ https://bootleggames.fandom.com/wiki/Chaoji_Dafuweng
</part>
</software>
<!-- TODO: all non-working asteborg entries needs their own mapper -->
<software name="asteborg" supported="no">
<description>Demons of Asteborg (demo 20210913)</description>
<year>2021</year>
@@ -17742,12 +18035,12 @@ https://segaretro.org/Elitserien_96
</part>
</software>
<software name="killshow" cloneof="fatalrew" supported="no">
<software name="killshow" cloneof="fatalrew" supported="partial">
<description>The Killing Game Show (Japan)</description>
<year>1993</year>
<publisher>Electronic Arts Victor</publisher>
<notes><![CDATA[
Crashes after EA logo, requires better [VDP] irq handling
No sound in intro opening (verify)
]]></notes>
<info name="serial" value="EM20021"/>
<info name="release" value="19930820"/>
@@ -19157,7 +19450,7 @@ Unemulated [Sega Mega Modem] features
</part>
</software>
<software name="hyokkohj" supported="partial">
<software name="hyokkohj">
<description>Hyokkori Hyoutan-jima - Daitouryou o Mezase! (Japan)</description>
<year>1992</year>
<publisher>Sega</publisher>
@@ -20244,8 +20537,20 @@ Black screen
</part>
</software>
<software name="kirito">
<description>Kirito - The Game (demo)</description>
<software name="kiritotg">
<description>Kirito - The Game (demo 1.1)</description>
<year>2024</year>
<publisher>Tulfared</publisher>
<info name="language" value="English/French" />
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2228224">
<rom name="rom_demo_ktg_d11.bin" size="2228224" crc="03b9a3be" sha1="50f51e180cc1877ebeae366435f6fbbd35068232" />
</dataarea>
</part>
</software>
<software name="kiritotg_d10" cloneof="kiritotg">
<description>Kirito - The Game (demo 1.0)</description>
<year>2024</year>
<publisher>Tulfared</publisher>
<info name="language" value="English/French" />
@@ -27237,13 +27542,10 @@ Throws "this game is [...] european megadrive system" even with megadriv system
</part>
</software>
<software name="sesame" supported="no">
<software name="sesame" supported="yes">
<description>Sesame Street Counting Cafe (USA)</description>
<year>1994</year>
<publisher>Electronic Arts</publisher>
<notes><![CDATA[
Black screen, requires better [VDP] irq handling
]]></notes>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="sesame street counting cafe (usa).bin" size="1048576" crc="0a4f48c3" sha1="d5ef2b50cf1a22e07401f6a14c7946df66d8b605"/>
@@ -31879,7 +32181,7 @@ No BGMs
<publisher>Electronic Arts</publisher>
<!-- TODO: starts off with music off (still coming from the dump?) -->
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<feature name="slot" value="rom_tplay96"/>
<!-- baddump: Sports non-default save, "Ghetto USA" instead of NY Yankees -->
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="triple play '96 (usa).bin" size="4194304" crc="f1748e91" sha1="c0981b524d5e1c5368f9e74a4ce9c57d87fe323a" status="baddump"/>
@@ -31895,7 +32197,7 @@ No BGMs
<publisher>Electronic Arts</publisher>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<feature name="slot" value="rom_tplay96"/>
<!-- baddump: Sports non-default save, "TODDs Team" instead of San Francisco -->
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="triple play gold (usa).bin" size="4194304" crc="bbe69017" sha1="007bee242384db1887c5831657470584ff77a163" status="baddump"/>
@@ -33280,7 +33582,7 @@ Has missing sound samples (i.e. tire screech, "time bonus" on checkpoints)
<software name="wondlib" supported="no">
<description>Wonder Library (Japan)</description>
<year>199?</year>
<year>1993</year>
<publisher>Victor</publisher>
<notes><![CDATA[
Unsupported Mega-CD/Wondermega cart allowing EBXA format to be played back
@@ -36043,9 +36345,15 @@ https://bootleggames.fandom.com/wiki/Super_Bubble_Bobble_MD
<!-- This is the System Cart of the Magistr 16 computer, needs emulation of the system -->
<software name="magist16" supported="no">
<description>Magistr 16 (Russia)</description>
<year>199?</year>
<!-- Obuchayushchii kartridzh? -->
<description>Magistr 16 Learning Set (Russia)</description>
<!-- Either 2001 or 2002 -->
<year>200?</year>
<publisher>&lt;unknown&gt;</publisher>
<notes><![CDATA[
https://segaretro.org/Magistr_16
Throws error #100A at boot (has BASIC strings, may require keyboard with [VDP] irq 2)
]]></notes>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
<rom name="magistr 16.bin" size="4194304" crc="2488e685" sha1="6568b3a4e096159776ef8687a80d43589741fd60"/>
@@ -37500,6 +37808,8 @@ Black screen
<publisher>Titan</publisher>
<notes><![CDATA[
Most effects fails
Crashes at the very end
https://jsgroth.dev/blog/posts/titan-overdrive/
]]></notes>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="0x400000">
@@ -37515,15 +37825,35 @@ Most effects fails
<year>2017</year>
<publisher>Titan</publisher>
<notes><![CDATA[
Punts to a 0d2 B50D stack trace screen
Tries to jump to jsr $a385b86.l (?) at PC=0x38b0, must be using its own mapper rather than ssf2
Most effects fails
https://jsgroth.dev/blog/posts/titan-overdrive-2-part-1/
https://jsgroth.dev/blog/posts/titan-overdrive-2-part-2/
]]></notes>
<sharedfeat name="compatibility" value="PAL"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_ssf2"/>
<feature name="slot" value="rom_titan"/>
<dataarea name="rom" width="16" endianness="big" size="16777216">
<rom name="titan-overdrive2.bin" size="8386056" crc="f0429fd6" sha1="603db0a214ee50c6c11e15c0d1d3bba919116d07" offset="00000"/>
</dataarea>
</part>
</software>
<!-- https://github.com/Stephane-D/SGDK/releases/tag/v1.62 -->
<software name="sgdk_bap" supported="partial">
<description>SGDK Bad Apple PV demo (v1.62)</description>
<!-- header with (c) 2020 but release happened in 2021, also repeated at demo end -->
<year>2021</year>
<publisher>SGDK</publisher>
<notes><![CDATA[
Crashes at startup with megadriv (verify)
]]></notes>
<!-- <sharedfeat name="compatibility" value="NTSC-J,NTSC-U"/> -->
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_titan"/>
<dataarea name="rom" width="16" endianness="big" size="0x1000000">
<rom name="sgdk_bad_apple.bin" size="0x980000" crc="ab53f304" sha1="56c927144438d0581baa88141ff2258c8d1e4e6b" offset="00000"/>
</dataarea>
</part>
</software>
</softwarelist>
+1 -1
View File
@@ -7710,7 +7710,7 @@ license:CC0-1.0
-->
<software name="flipshot">
<description>Battle Flip Shot</description>
<description>Flip Shot</description>
<year>1998</year>
<publisher>Visco</publisher>
<info name="serial" value="NGM-2470"/>
-31
View File
@@ -4422,7 +4422,6 @@ ExtractDisk [04]"Disk 2 " -> "battle gorilla_04.d88"
</part>
</software>
<!-- -->
<software name="bgorillaa" cloneof="bgorilla" supported="partial">
<description>Battle Gorilla (alt)</description>
<year>1988</year>
@@ -14629,20 +14628,6 @@ ExtractDisk [02]"Gradius改 " -> "gradius kai_02.d88"
</part>
</software>
<software name="gruppe">
<description>Gruppe</description>
<year>1985</year>
<publisher>SPS</publisher>
<!-- PC8801 -->
<info name="release" value="198504xx"/>
<info name="alt_title" value="ぐるっぺ"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="349392">
<rom name="gruppe.d88" size="349392" crc="d7efdc5d" sha1="ab4da770fae54f306bfdc8fc9df3c52f3b4a1a65"/>
</dataarea>
</part>
</software>
<software name="guinsaga" supported="yes">
<description>Guin Saga - Hyoto no Kamen</description>
<year>1987</year>
@@ -18995,20 +18980,6 @@ Has serious [3301] corruption in gameplay
</part>
</software>
<software name="kitahei">
<description>Kitahei</description>
<year>1985</year>
<publisher>SPS</publisher>
<!-- PC8801 -->
<info name="release" value="198509xx"/>
<info name="alt_title" value="棋太平"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="349392">
<rom name="kitahei.d88" size="349392" crc="53ae4f58" sha1="bbdff7ac4d6a844580bb06accb1d8d88759b8ae9"/>
</dataarea>
</part>
</software>
<software name="klax" supported="yes">
<description>Klax</description>
<year>1990</year>
@@ -34659,7 +34630,6 @@ To test Jast Sound: during gameplay press * numpad then enter twice (first comma
<!-- PC8801 -->
<info name="release" value="198506xx"/>
<info name="alt_title" value="天使たちの午後"/>
<!-- -->
<info name="usage" value="Uses optional Jast Sound, enable it by -centronics covox"/>
<!--combined image-->
<!--rom name="tenshi-tachi no gogo.d88" size="827952" crc="44b55927" sha1="81579d738bc062538459c10cf0980eef9a8971f1"/-->
@@ -49111,7 +49081,6 @@ Doesn't load, throws "Bad allocation table" with a Disk Basic FILES command, is
</part>
</software>
<!-- -->
<software name="fanteatra" cloneof="fanteatr" supported="no">
<description>Fantastic Eaters (alt)</description>
<year>19??</year>
+39 -2
View File
@@ -179,7 +179,7 @@ license:CC0-1.0
</part>
</software>
<software name="enroute">
<software name="enroute_b" cloneof="enroute">
<description>En Route: Belgium, Netherlands, Luxembourg</description>
<year>1997</year>
<publisher>Palmtop BV</publisher>
@@ -187,7 +187,32 @@ license:CC0-1.0
<sharedfeat name="compatibility" value="S3A"/>
<part name="cart" interface="psion_ssd">
<dataarea name="rom" size="1048576">
<rom name="EnRoute.rom" size="1048576" crc="5af14e37" sha1="8ce7adfad71392a2d5854c5bb1e7724ac36ce1f6"/>
<rom name="EnRoute_B.rom" size="1048576" crc="5af14e37" sha1="8ce7adfad71392a2d5854c5bb1e7724ac36ce1f6"/>
</dataarea>
</part>
</software>
<software name="enroute">
<description>En Route: United Kingdom, Eire</description>
<year>1997</year>
<publisher>Palmtop BV</publisher>
<info name="usage" value="Requires 512K" />
<sharedfeat name="compatibility" value="S3A"/>
<part name="cart" interface="psion_ssd">
<dataarea name="rom" size="1048576">
<rom name="EnRoute_UK.rom" size="1048576" crc="e3baa9c2" sha1="dc8f28300961321bc5d7d382a25176a51a95263a"/>
</dataarea>
</part>
</software>
<software name="finpack3">
<description>Finance Pack 3</description>
<year>1993</year>
<publisher>Widget Software</publisher>
<sharedfeat name="compatibility" value="S3"/>
<part name="cart" interface="psion_ssd">
<dataarea name="rom" size="131072">
<rom name="Finance_Pack_3.rom" size="131072" crc="cdc7f002" sha1="e02a5ece237d79e71c28a4cb7314ba4572ff4878"/>
</dataarea>
</part>
</software>
@@ -398,6 +423,18 @@ license:CC0-1.0
</part>
</software>
<software name="telenote">
<description>Telenote Link</description>
<year>1995</year>
<publisher>Psion</publisher>
<sharedfeat name="compatibility" value="S3A"/>
<part name="cart" interface="psion_ssd">
<dataarea name="rom" size="131072">
<rom name="Telenote_Link.rom" size="131072" crc="d59111fb" sha1="cbb74fe07cf6580e67144459ee82e36eaed8bb59"/>
</dataarea>
</part>
</software>
<software name="toolkit1">
<description>ToolKit 1</description>
<year>1995</year>
+84 -48
View File
@@ -33,7 +33,7 @@ NOTE: There is also a newer version of the Smart Cycle with 3D games, this howev
<softwarelist name="smartcycle_cart" description="Fisher Price Smart Cycle cartridges">
<software name="sc0308" supported="no">
<software name="dinos" supported="no">
<description>Discover the Dinosaurs (0308)</description>
<year>2006</year>
<publisher>Fisher Price</publisher>
@@ -44,52 +44,7 @@ NOTE: There is also a newer version of the Smart Cycle with 3D games, this howev
</part>
</software>
<software name="sc0608" supported="no">
<description>Learning Adventure (0608)</description>
<year>2006</year>
<publisher>Fisher Price</publisher>
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000"> <!-- checksum in header matches -->
<rom name="0608.bin" size="0x800000" crc="167b2069" sha1="af5056db116020fd3096794a6166f0f13184a5df"/>
</dataarea>
</part>
</software>
<software name="sc1410" supported="no">
<description>The Penguins of Madagascar (1410)</description>
<year>2009</year>
<publisher>Fisher Price</publisher>
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000"> <!-- checksum in header matches -->
<rom name="1410.bin" size="0x800000" crc="01eccc39" sha1="33cf330c3523343ec857a779a22d498215cb2362"/>
</dataarea>
</part>
</software>
<software name="sc2108" supported="no"> <!-- VBL interrupt is turned off and never back on? -->
<description>Scooby-Doo! (2108)</description>
<year>2007</year>
<publisher>Fisher Price</publisher>
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000"> <!-- checksum in header matches -->
<rom name="2108.bin" size="0x800000" crc="050c1806" sha1="0ac208781ef2172a1a3c6a974825d5f80e3ef291"/>
</dataarea>
</part>
</software>
<software name="n5992" supported="no">
<description>Dora l'Exploratrice - Dora L'Aventure de l'Amitié (France)</description>
<year>2008</year>
<publisher>Fisher Price</publisher>
<info name="serial" value="N5992" />
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000">
<rom name="N5992 - Dora l'Exploratrice - Dora L'Aventure de l'Amitie (FR).u1" size="0x800000" crc="fa590280" sha1="5767536e1781fee06c52671bc7ca7b639a99e50b"/>
</dataarea>
</part>
</software>
<software name="n5993" cloneof="sc0308" supported="no">
<software name="dinosfr" cloneof="dinos" supported="no">
<description>À la Découverte des Dinosaures (France)</description>
<year>2008</year>
<publisher>Fisher Price</publisher>
@@ -101,7 +56,64 @@ NOTE: There is also a newer version of the Smart Cycle with 3D games, this howev
</part>
</software>
<software name="n5994" supported="no"> <!-- VBL interrupt is turned off and never back on? -->
<software name="learnadv" supported="no">
<description>Learning Adventure (0608)</description>
<year>2006</year>
<publisher>Fisher Price</publisher>
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000"> <!-- checksum in header matches -->
<rom name="0608.bin" size="0x800000" crc="167b2069" sha1="af5056db116020fd3096794a6166f0f13184a5df"/>
</dataarea>
</part>
</software>
<software name="pengmad" supported="no"> <!-- VBL interrupt is turned off and never back on? and other IRQ issues? -->
<description>The Penguins of Madagascar (1410)</description>
<year>2009</year>
<publisher>Fisher Price</publisher>
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000"> <!-- checksum in header matches -->
<rom name="1410.bin" size="0x800000" crc="01eccc39" sha1="33cf330c3523343ec857a779a22d498215cb2362"/>
</dataarea>
</part>
</software>
<software name="scooby" supported="no"> <!-- VBL interrupt is turned off and never back on? -->
<description>Scooby-Doo! (2108)</description>
<year>2007</year>
<publisher>Fisher Price</publisher>
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000"> <!-- checksum in header matches -->
<rom name="2108.bin" size="0x800000" crc="050c1806" sha1="0ac208781ef2172a1a3c6a974825d5f80e3ef291"/>
</dataarea>
</part>
</software>
<software name="dora" supported="no"> <!-- might not be UK specific, packaging had 'color' spelling -->
<description>Dora the Explorer - Friendship Adventure (UK)</description>
<year>2006</year>
<publisher>Fisher Price</publisher>
<info name="serial" value="K6689" />
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000">
<rom name="K6689 - Dora the Explorer - Friendship Adventure (UK).bin" size="0x800000" crc="569acece" sha1="c774da691bb1d5e3ae900449be24e1e598764f26"/>
</dataarea>
</part>
</software>
<software name="dorafr" cloneof="dora" supported="no">
<description>Dora l'Exploratrice - Dora L'Aventure de l'Amitié (France)</description>
<year>2008</year>
<publisher>Fisher Price</publisher>
<info name="serial" value="N5992" />
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000">
<rom name="N5992 - Dora l'Exploratrice - Dora L'Aventure de l'Amitie (FR).u1" size="0x800000" crc="fa590280" sha1="5767536e1781fee06c52671bc7ca7b639a99e50b"/>
</dataarea>
</part>
</software>
<software name="hotwfr" supported="no"> <!-- VBL interrupt is turned off and never back on? -->
<description>Hot Wheels - Pédale à Toute Vitesse (France)</description>
<year>2008</year>
<publisher>Fisher Price</publisher>
@@ -113,4 +125,28 @@ NOTE: There is also a newer version of the Smart Cycle with 3D games, this howev
</part>
</software>
<software name="spongeb" supported="no"> <!-- might not be UK specific, packaging had 'color' spelling --> <!-- VBL interrupt is turned off and never back on? -->
<description>Spongebob Squarepants - Ocean Adventure (UK)</description>
<year>2007</year>
<publisher>Fisher Price</publisher>
<info name="serial" value="K6690" />
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000">
<rom name="K6690 - Spongebob Squarepants - Ocean Adventure (UK).bin" size="0x800000" crc="dde4d2d6" sha1="88751c6f57c323f18d3eee89430f32977339398e"/>
</dataarea>
</part>
</software>
<software name="barbie" supported="no"> <!-- might not be UK specific, packaging had 'color' spelling --> <!-- VBL interrupt is turned off and never back on? -->
<description>Barbie - Fairytopia (UK)</description>
<year>2007</year>
<publisher>Fisher Price</publisher>
<info name="serial" value="L0544" />
<part name="cart" interface="smartcycle_cart">
<dataarea name="rom" size="0x800000">
<rom name="L0544 - Barbie - Fairytopia (UK).bin" size="0x800000" crc="453268e1" sha1="4d9b3f27d7b1923178c047945b5598556275a19c"/>
</dataarea>
</part>
</software>
</softwarelist>
+3 -3
View File
@@ -20615,7 +20615,7 @@ more investigation needed...
</software>
<software name="ninjawaru" cloneof="ninjawar">
<description>The Ninjawarriors (USA)</description>
<description>The Ninja Warriors (USA)</description>
<year>1994</year>
<publisher>Taito</publisher>
<info name="serial" value="SNS-NI-USA" />
@@ -52008,7 +52008,7 @@ to ensure nothing has been touched in the Retro Quest cart production in 2013/20
</software>
<software name="ninjawarj" cloneof="ninjawar">
<description>The Ninjawarriors Again (Japan)</description>
<description>The Ninja Warriors Again (Japan)</description>
<year>1994</year>
<publisher>Taito</publisher>
<info name="serial" value="SHVC-NI" />
@@ -52023,7 +52023,7 @@ to ensure nothing has been touched in the Retro Quest cart production in 2013/20
</software>
<software name="ninjawar">
<description>The Ninjawarriors (Europe)</description>
<description>The Ninja Warriors (Europe)</description>
<year>1994</year>
<publisher>Titus</publisher>
<info name="alt_title" value="Ninjawarriors - The New Generation (Box)" />
+3 -2
View File
@@ -100,8 +100,9 @@ Broken [video] during intro, uses bitmap mode with ROZ layer
<publisher>C&amp;E Soft</publisher>
<notes><![CDATA[
[video] ROZ is misaligned during intro, and initially concealed (blending?).
[sound] missing crowd noise during gameplay, tries to play an empty buffer in the $2xxx range.
[sound] DMA driven samples cuts off too early.
[sound] missing crowd noise during gameplay, tries to play an empty buffer in the $2xxx range. (fixed with internal sound BIOS dump for attract)
[sound] Keeps ringing a sound sample on main menu.
[sound] DMA driven samples cuts off too early during gameplay.
]]></notes>
<info name="serial" value="F005" />
<info name="alt_title" value="超級中華職棒聯盟" />
+85
View File
@@ -0,0 +1,85 @@
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<!--
license:CC0-1.0
Known undumped list (* denotes availablity in HDD folder):
- Auto Net-S (G-3003), TERA-NET BBS software
- Drakkhen (ドラッケン, G-?)
- Janou Touryuumon II (雀皇登竜門 II, T-45019)
- Page Pro-S (G-3004), desktop publishing software
* Puzzle Construction (パズルコンストラクション, G-3002)
- The BestPlay Baseball (ベストプレーベースボール)
* The Manhole
- CCT/V, may be just DOS/V compatible
- Daisenryaku Construction (大戦略 コンストラクション), prototype at best
- Princess Maker (プリンセスメーカー), may be just DOS/V compatible
- Wibarm U.S.A. (ウイバーン U.S.A.), may be just DOS/V compatible
-->
<softwarelist name="teradrive_flop" description="Sega Teradrive floppy disk images">
<!--!Operating Systems -->
<!-- DOS/V sets have "for Sega Teradrive" and "IBM Personal System/55" labels -->
<software name="dosv407" supported="partial">
<description>IBM DOS (J4.07/V)</description>
<year>1991</year>
<publisher>IBM</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
<rom name="ibm-dos-j4.07.ima" size="1474560" crc="0c94926a" sha1="0763ac53e07dc6b40e23ab6bd126e74278c87a4a"/>
</dataarea>
</part>
</software>
<software name="dosv406" cloneof="dosv407" supported="partial">
<description>IBM DOS (J4.06/V)</description>
<year>1991</year>
<publisher>IBM</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
<!-- original in .imz format -->
<!-- <rom name="ibm-dos-j4.0-v-rev-4.06.imz" size="559221" crc="e7bd130e" sha1="14180c714cff70b63b0dac588f0dcd04873dece2"/> -->
<rom name="ibm dos j4.0-v-rev-4.06.ima" size="1474560" crc="53620fed" sha1="de070ea9c9aa443fc26949e54d3b276239cee59b"/>
</dataarea>
</part>
</software>
<software name="dosv512" supported="no">
<description>IBM DOS (J5.00/V, rev 1.2)</description>
<year>1993</year>
<publisher>IBM</publisher>
<notes><![CDATA[
Non-bootable, contains AX, J3, TE, CHPRN, SP, ESCP12 and $ANSI folders
Part of a multidisk set?
]]></notes>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
<!-- original in .imz format -->
<!-- <rom name="ibm-dos-j5.0-v-rev-1.2.imz" size="144603" crc="1a7b6d79" sha1="d08d8b7c0328bcbf5254a66ae32f240d8cbad838"/> -->
<rom name="ibm-dos-j5.0-v-rev-1.2.ima" size="1474560" crc="dfaf3948" sha1="2ff8991aa0a211ba87d22847ff29360cdfbc2073"/>
</dataarea>
</part>
</software>
<!--!Driver disks -->
<software name="drv4" supported="partial">
<description>Teradrive Driver Disk (J4.0)</description>
<year>1991</year>
<publisher>IBM / Sega</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="1474560">
<rom name="driver-disk-j4.0-serial.ima" size="1474560" crc="ca62ad08" sha1="f8c0c707cca8c949a6e2ff61034a14560ac6f567"/>
</dataarea>
</part>
</software>
<!-- another dump floating, same contents plus extra empty folders -->
<!-- JDASH, JSW, JSFONT, JSUT -->
<!-- <rom name="driver-disk-j4.0-no-serial.ima" size="1474560" crc="b2060607" sha1="b7aba7da01bc3846c1d88857d067e5febafd63f1"/>-->
</softwarelist>
-30
View File
@@ -1039,23 +1039,6 @@ IPL loading resolves to a red and corrupt screen, baddump?
</part>
</software>
<software name="gruppe" supported="no">
<description>Gruppe</description>
<year>1985</year>
<publisher>SPS</publisher>
<notes><![CDATA[
Shows a random bitmap graphic then returns "program load error", wants [FDC] write protection enabled (regression)
]]></notes>
<info name="release" value="198506xx"/>
<info name="alt_title" value="ぐるっぺ"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="348848">
<rom name="gruppe.d88" size="348848" crc="a50dfd33" sha1="551749d2ec4deb3919f2111d234450fd4f90d54a"/>
</dataarea>
</part>
</software>
<software name="hajafuin">
<description>Haja no Fuuin</description>
<year>1986</year>
@@ -3394,19 +3377,6 @@ Expects [KBD] name entry presses with shift held
</part>
</software>
<software name="victnine">
<description>Victorious Nine</description>
<year>1985</year>
<publisher>ニデコム (Nidecom)</publisher>
<info name="release" value="198509xx"/>
<info name="alt_title" value="ビクトリアスナイン"/>
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size="350560">
<rom name="victorious nine.d88" size="350560" crc="2fc94dfd" sha1="e29f55bed953e0304d88b8eed9448f31eb888298"/>
</dataarea>
</part>
</software>
<!-- There exists an alt checksum for the first disk (due to differences only in the d88 header, but exact same data)
<rom name="zzz-unk-wib_sys.d88" size="414992" crc="9670c2c2" sha1="49d4539a8eaa81818da1f192cd6bc56dc779291f"/>
-->
+5243 -4095
View File
File diff suppressed because it is too large. Load diff
+1369 -1249
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -1617,7 +1617,7 @@ endif
ifeq (posix,$(SHELLTYPE))
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo '#define BARE_BUILD_VERSION "0.279"' > $@
@echo '#define BARE_BUILD_VERSION "0.280"' > $@
@echo '#define BARE_VCS_REVISION "$(NEW_GIT_VERSION)"' >> $@
@echo 'extern const char bare_build_version[];' >> $@
@echo 'extern const char bare_vcs_revision[];' >> $@
@@ -1627,7 +1627,7 @@ $(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo 'const char build_version[] = BARE_BUILD_VERSION " (" BARE_VCS_REVISION ")";' >> $@
else
$(GENDIR)/version.cpp: makefile $(GENDIR)/git_desc | $(GEN_FOLDERS)
@echo #define BARE_BUILD_VERSION "0.279" > $@
@echo #define BARE_BUILD_VERSION "0.280" > $@
@echo #define BARE_VCS_REVISION "$(NEW_GIT_VERSION)" >> $@
@echo extern const char bare_build_version[]; >> $@
@echo extern const char bare_vcs_revision[]; >> $@
+4 -1
View File
@@ -16,8 +16,11 @@ function dat.check(set, softlist)
if not status or not info then
return nil
end
local sourcefile = emu.driver_find(set).source_file:match('[^/\\]*$')
local sourcefile = emu.driver_find(set).source_file:match('[^/\\]+[/\\\\][^/\\]*$')
status, drvinfo = pcall(datread, 'drv', 'info', sourcefile)
if not drvinfo then
status, drvinfo = pcall(datread, 'drv', 'info', sourcefile:match('[^/\\]*$'))
end
if drvinfo then
info = info .. _p('plugin-data', '\n\n--- DRIVER INFO ---\nDriver: ') .. sourcefile .. '\n\n' .. drvinfo
end
+4 -1
View File
@@ -16,8 +16,11 @@ function dat.check(set, softlist)
if not status or not info then
return nil
end
local sourcefile = emu.driver_find(set).source_file:match('[^/\\]*$')
local sourcefile = emu.driver_find(set).source_file:match('[^/\\]+[/\\\\][^/\\]*$')
status, drvinfo = pcall(datread, 'drv', 'info', sourcefile)
if not drvinfo then
status, drvinfo = pcall(datread, 'drv', 'info', sourcefile:match('[^/\\]*$'))
end
if drvinfo then
info = info .. _p('plugin-data', '\n\n--- DRIVER INFO ---\nDriver: ') .. sourcefile .. '\n\n' .. drvinfo
end
+157 -158
View File
@@ -2586,7 +2586,6 @@ ragtimea:
;forcebrk:******Force Break (Japan)
brkthru:
brkthrubl:
brkthruj:
forcebrk:
@:maincpu,program,0531,27,00,32
@@ -4126,8 +4125,8 @@ wrally2a:
;maniac square (unprotected)(by tamphax)
maniacsq:
maniacsqa:
maniacsqb:
maniacsqs:
maniacsqu:
@:maincpu,program,fe982c,48,50,00
@@ -8910,13 +8909,6 @@ miraxa:
@:maincpu,program,d021,6,00,00
;@s:misc/mole.cpp
mole:
@:maincpu,program,02e1,0a,00,05
@:maincpu,program,0375,50,19,00
;@s:misc/mosaic.cpp
;(mosaic)
@@ -9015,14 +9007,6 @@ sprcros2a:
@:master_cpu,program,f013,1,03,03
;@s:misc/sstrangr.cpp
;(space stranger & space stranger 2)
sstrangr:
sstrangr2:
@:maincpu,program,20f4,2,00,00
;@s:misc/statriv2.cpp
;*******super triv II(By Firebrand)
@@ -9052,6 +9036,24 @@ stuntair:
@:maincpu,program,f9a1,01,b0,b0
;@s:misc/timelimt.cpp
;(time limit) (by GeoMan)
timelimt:
@:maincpu,program,80ca,3,0,0
@:maincpu,program,8981,1,27,27
@:maincpu,program,89a1,1,00,00
@:maincpu,program,89c1,1,27,27
@:maincpu,program,89e1,1,27,27
@:maincpu,program,8a01,1,27,27
@:maincpu,program,8a21,1,27,27
;*******progress(By Firebrand)(Hiscore does not seem to change during game)
progress:
@:maincpu,program,8711,e,00,01
;@s:misc/tugboat.cpp
berenstn:
@@ -9292,7 +9294,7 @@ cgangpzlj:
;**** thanks to Takasaki for this fix ****
emeralda:
emeraldaj:
emeraldaja:
emeraldajb:
@:maincpu,program,9c9e,10e,4b,01
@@ -12303,6 +12305,15 @@ ssf2mdb:
@:maincpu,program,fffcb3,29,00,20
;@s:sega/megadriv_ybox.cpp
;*******puckman pockimon
jingling:
puckpkmn:
puckpkmnb:
@:maincpu,program,ff0020,30,38,36
;@s:sega/megatech.cpp
;******megatech: e-swat
@@ -12335,15 +12346,6 @@ vf:
@:maincpu,program,40f800,b3,09,4d
;@s:sega/puckpkmn.cpp
;*******puckman pockimon
jingling:
puckpkmn:
puckpkmnb:
@:maincpu,program,ff0020,30,38,36
;@s:sega/segac2.cpp
ooparts:
@@ -15966,6 +15968,105 @@ rollace:
@:maincpu,program,c026,3,00,00
;@s:taito/roundup.cpp
theportr:
@:maincpu,program,40fd,3,00,00
@:maincpu,program,9201,1,24,24
@:maincpu,program,91e1,1,24,24
@:maincpu,program,91c1,1,24,24
@:maincpu,program,91a1,1,24,24
@:maincpu,program,9181,1,00,00
thehole:
@:maincpu,program,8283,1a,19,00
@:maincpu,program,8039,f,19,00
;porter:******Port Man (bootleg on Moon Cresta hardware)
dockman:
dockmanb:
dockmanc:
porter:
portera:
portman:
portmanj:
@:maincpu,program,80fd,3,00,00
@:maincpu,program,92c1,1,00,00
@:maincpu,program,92e1,1,24,24
@:maincpu,program,9301,1,24,24
@:maincpu,program,9321,1,24,24
@:maincpu,program,9341,1,24,24
@:maincpu,program,9181,1,00,00
@:maincpu,program,91a1,1,24,24
@:maincpu,program,91c1,1,24,24
@:maincpu,program,91e1,1,24,24
@:maincpu,program,9201,1,24,24
intrepid:
intrepid2:
intrepidb:
intrepidb2:
intrepidb3:
@:maincpu,program,803c,3d,02,fd
@:maincpu,program,8035,2,00,00
;(funny mouse) parent
funnymou:
suprmous:
@:maincpu,program,804a,03,00,00
@:maincpu,program,9221,01,24,24
@:maincpu,program,9201,01,24,24
@:maincpu,program,91e1,01,24,24
@:maincpu,program,91c1,01,24,24
@:maincpu,program,91a1,01,24,24
@:maincpu,program,9181,01,00,00
machomou:
@:maincpu,program,804a,3,00,00
@:maincpu,program,9181,1,00,00
@:maincpu,program,91a1,1,24,24
@:maincpu,program,91c1,1,24,24
@:maincpu,program,91e1,1,24,24
@:maincpu,program,9201,1,24,24
@:maincpu,program,9221,1,24,24
fitter:
fitterbl:
roundup:
ttfitter:
@:maincpu,program,8050,03,00,00
@:maincpu,program,9621,01,24,24
@:maincpu,program,9601,01,24,24
@:maincpu,program,95e1,01,24,24
@:maincpu,program,95c1,01,24,24
@:maincpu,program,95a1,01,24,24
@:maincpu,program,9581,01,00,00
thepitu2:
@:maincpu,program,8283,17,10,00
@:maincpu,program,8037,f,10,00
;thepit:******The Pit (Bootleg)
thepit:
thepitj:
thepitu1:
@:maincpu,program,8283,17,10,0
@:maincpu,program,8039,f,10,0
desertdn:
@:maincpu,program,82c7,3,00,00
@:maincpu,program,82c8,1,50,50
;@s:taito/sbowling.cpp
;******strike bowling(By Firebrand)
@@ -16027,6 +16128,19 @@ perestrof:
@:maincpu,program,f8f1,4,00,00
;@s:taito/suprridr.cpp
;******super rider
suprridr:
@:maincpu,program,80ca,3,00,00
@:maincpu,program,8a21,1,24,24
@:maincpu,program,8a01,1,24,24
@:maincpu,program,89e1,1,24,24
@:maincpu,program,89c1,1,24,24
@:maincpu,program,89a1,1,24,24
@:maincpu,program,8981,1,00,00
;@s:taito/taito_b.cpp
ryujin:
@@ -17069,7 +17183,7 @@ wyvernf0a:
@:maincpu,program,8800,190,00,26
;@s:tatsumi/tatsumi.cpp
;@s:tatsumi/cyclwarr.cpp
bigfight:
bigfightj:
@@ -17608,123 +17722,6 @@ twcup90t:
@:maincpu,program,804d,01,11,11
;@s:thepit/thepit.cpp
theportr:
@:maincpu,program,40fd,3,00,00
@:maincpu,program,9201,1,24,24
@:maincpu,program,91e1,1,24,24
@:maincpu,program,91c1,1,24,24
@:maincpu,program,91a1,1,24,24
@:maincpu,program,9181,1,00,00
thehole:
@:maincpu,program,8283,1a,19,00
@:maincpu,program,8039,f,19,00
;porter:******Port Man (bootleg on Moon Cresta hardware)
dockman:
dockmanb:
dockmanc:
porter:
portera:
portman:
portmanj:
@:maincpu,program,80fd,3,00,00
@:maincpu,program,92c1,1,00,00
@:maincpu,program,92e1,1,24,24
@:maincpu,program,9301,1,24,24
@:maincpu,program,9321,1,24,24
@:maincpu,program,9341,1,24,24
@:maincpu,program,9181,1,00,00
@:maincpu,program,91a1,1,24,24
@:maincpu,program,91c1,1,24,24
@:maincpu,program,91e1,1,24,24
@:maincpu,program,9201,1,24,24
intrepid:
intrepid2:
intrepidb:
intrepidb2:
intrepidb3:
@:maincpu,program,803c,3d,02,fd
@:maincpu,program,8035,2,00,00
;(funny mouse) parent
funnymou:
suprmous:
@:maincpu,program,804a,03,00,00
@:maincpu,program,9221,01,24,24
@:maincpu,program,9201,01,24,24
@:maincpu,program,91e1,01,24,24
@:maincpu,program,91c1,01,24,24
@:maincpu,program,91a1,01,24,24
@:maincpu,program,9181,01,00,00
machomou:
@:maincpu,program,804a,3,00,00
@:maincpu,program,9181,1,00,00
@:maincpu,program,91a1,1,24,24
@:maincpu,program,91c1,1,24,24
@:maincpu,program,91e1,1,24,24
@:maincpu,program,9201,1,24,24
@:maincpu,program,9221,1,24,24
fitter:
fitterbl:
roundup:
ttfitter:
@:maincpu,program,8050,03,00,00
@:maincpu,program,9621,01,24,24
@:maincpu,program,9601,01,24,24
@:maincpu,program,95e1,01,24,24
@:maincpu,program,95c1,01,24,24
@:maincpu,program,95a1,01,24,24
@:maincpu,program,9581,01,00,00
thepitu2:
@:maincpu,program,8283,17,10,00
@:maincpu,program,8037,f,10,00
;thepit:******The Pit (Bootleg)
thepit:
thepitj:
thepitu1:
@:maincpu,program,8283,17,10,0
@:maincpu,program,8039,f,10,0
desertdn:
@:maincpu,program,82c7,3,00,00
@:maincpu,program,82c8,1,50,50
;@s:thepit/timelimt.cpp
;(time limit) (by GeoMan)
timelimt:
@:maincpu,program,80ca,3,0,0
@:maincpu,program,8981,1,27,27
@:maincpu,program,89a1,1,00,00
@:maincpu,program,89c1,1,27,27
@:maincpu,program,89e1,1,27,27
@:maincpu,program,8a01,1,27,27
@:maincpu,program,8a21,1,27,27
;*******progress(By Firebrand)(Hiscore does not seem to change during game)
progress:
@:maincpu,program,8711,e,00,01
;@s:toaplan/batsugun.cpp
batsugun:
@@ -18545,19 +18542,6 @@ spcforce:
@:maincpu,program,4300,50,30,30
;@s:venture/suprridr.cpp
;******super rider
suprridr:
@:maincpu,program,80ca,3,00,00
@:maincpu,program,8a21,1,24,24
@:maincpu,program,8a01,1,24,24
@:maincpu,program,89e1,1,24,24
@:maincpu,program,89c1,1,24,24
@:maincpu,program,89a1,1,24,24
@:maincpu,program,8981,1,00,00
;@s:vsystem/aerofgt.cpp
aerofgt:
@@ -18746,6 +18730,21 @@ superwng:
@:maincpu,program,7920,c8,00,19
;@s:yachiyo/mole.cpp
mole:
@:maincpu,program,02e1,0a,00,05
@:maincpu,program,0375,50,19,00
;@s:yachiyo/sstrangr.cpp
;(space stranger & space stranger 2)
sstrangr:
sstrangr2:
@:maincpu,program,20f4,2,00,00
;@s:yunsung/nmg5.cpp
;wondstck:******Wonder Stick
+94
View File
@@ -875,6 +875,23 @@ if (BUSES["BBC_USERPORT"]~=null) then
end
---------------------------------------------------
--
--@src/devices/bus/bbc/vsp/slot.h,BUSES["BBC_VSP"] = true
---------------------------------------------------
if (BUSES["BBC_VSP"]~=null) then
files {
MAME_DIR .. "src/devices/bus/bbc/vsp/slot.cpp",
MAME_DIR .. "src/devices/bus/bbc/vsp/slot.h",
MAME_DIR .. "src/devices/bus/bbc/vsp/speech.cpp",
MAME_DIR .. "src/devices/bus/bbc/vsp/speech.h",
MAME_DIR .. "src/devices/bus/bbc/vsp/sweetalker.cpp",
MAME_DIR .. "src/devices/bus/bbc/vsp/sweetalker.h",
}
end
---------------------------------------------------
--
--@src/devices/bus/bw2/exp.h,BUSES["BW2"] = true
@@ -1953,6 +1970,24 @@ if (BUSES["JAKKS_GAMEKEY"]~=null) then
}
end
---------------------------------------------------
--
--@src/devices/bus/keytronic/keytronic.h,BUSES["KEYTRONIC"] = true
---------------------------------------------------
if (BUSES["KEYTRONIC"]~=null) then
files {
MAME_DIR .. "src/devices/bus/keytronic/informer_kbd.cpp",
MAME_DIR .. "src/devices/bus/keytronic/informer_kbd.h",
MAME_DIR .. "src/devices/bus/keytronic/kay_kbd.cpp",
MAME_DIR .. "src/devices/bus/keytronic/kay_kbd.h",
MAME_DIR .. "src/devices/bus/keytronic/keytronic.cpp",
MAME_DIR .. "src/devices/bus/keytronic/keytronic.h",
MAME_DIR .. "src/devices/bus/keytronic/keytronic_l2207.cpp",
MAME_DIR .. "src/devices/bus/keytronic/keytronic_l2207.h",
}
end
---------------------------------------------------
--
--@src/devices/bus/mpf1/slot.h,BUSES["MPF1"] = true
@@ -2177,10 +2212,16 @@ end
if (BUSES["MZ80"]~=null) then
files {
MAME_DIR .. "src/devices/bus/mz80/ar_romcard.cpp",
MAME_DIR .. "src/devices/bus/mz80/ar_romcard.h",
MAME_DIR .. "src/devices/bus/mz80/mz1e05.cpp",
MAME_DIR .. "src/devices/bus/mz80/mz1e05.h",
MAME_DIR .. "src/devices/bus/mz80/mz1e30.cpp",
MAME_DIR .. "src/devices/bus/mz80/mz1e30.h",
MAME_DIR .. "src/devices/bus/mz80/mz1e35.cpp",
MAME_DIR .. "src/devices/bus/mz80/mz1e35.h",
MAME_DIR .. "src/devices/bus/mz80/mz1r18.cpp",
MAME_DIR .. "src/devices/bus/mz80/mz1r18.h",
MAME_DIR .. "src/devices/bus/mz80/mz1r37.cpp",
MAME_DIR .. "src/devices/bus/mz80/mz1r37.h",
MAME_DIR .. "src/devices/bus/mz80/mz80_exp.cpp",
@@ -3365,6 +3406,8 @@ if (BUSES["CENTRONICS"]~=null) then
MAME_DIR .. "src/devices/bus/centronics/epson_lx810l.h",
MAME_DIR .. "src/devices/bus/centronics/epson_rx80.cpp",
MAME_DIR .. "src/devices/bus/centronics/epson_rx80.h",
MAME_DIR .. "src/devices/bus/centronics/mz1p16.cpp",
MAME_DIR .. "src/devices/bus/centronics/mz1p16.h",
MAME_DIR .. "src/devices/bus/centronics/nec_p72.cpp",
MAME_DIR .. "src/devices/bus/centronics/nec_p72.h",
MAME_DIR .. "src/devices/bus/centronics/nlq401.cpp",
@@ -3807,9 +3850,26 @@ if (BUSES["MEGADRIVE"]~=null) then
MAME_DIR .. "src/devices/bus/megadrive/stm95.h",
MAME_DIR .. "src/devices/bus/megadrive/svp.cpp",
MAME_DIR .. "src/devices/bus/megadrive/svp.h",
MAME_DIR .. "src/devices/bus/megadrive/titan.cpp",
MAME_DIR .. "src/devices/bus/megadrive/titan.h",
MAME_DIR .. "src/devices/bus/megadrive/tplay96.cpp",
MAME_DIR .. "src/devices/bus/megadrive/tplay96.h",
}
end
---------------------------------------------------
--
--@src/devices/bus/megadrive/ctrl/mdioport.h,BUSES["MEGADRIVE_CTRL"] = true
---------------------------------------------------
if (BUSES["MEGADRIVE_CTRL"]~=null) then
files {
MAME_DIR .. "src/devices/bus/megadrive/ctrl/mdioport.cpp",
MAME_DIR .. "src/devices/bus/megadrive/ctrl/mdioport.h",
}
end
---------------------------------------------------
--
--@src/devices/bus/mononcol/slot.h,BUSES["MONONCOL"] = true
@@ -5889,6 +5949,38 @@ if (BUSES["H89BUS"]~=null) then
}
end
---------------------------------------------------
--
--@src/devices/bus/heathzenith/h8/h8bus.h,BUSES["H8BUS"] = true
---------------------------------------------------
if (BUSES["H8BUS"]~=null) then
files {
MAME_DIR .. "src/devices/bus/heathzenith/h8/cards.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h8/cards.h",
MAME_DIR .. "src/devices/bus/heathzenith/h8/cpu8080.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h8/cpu8080.h",
MAME_DIR .. "src/devices/bus/heathzenith/h8/front_panel.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h8/front_panel.h",
MAME_DIR .. "src/devices/bus/heathzenith/h8/h8bus.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h8/h8bus.h",
MAME_DIR .. "src/devices/bus/heathzenith/h8/h_8_1.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h8/h_8_1.h",
MAME_DIR .. "src/devices/bus/heathzenith/h8/h_8_5.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h8/h_8_5.h",
MAME_DIR .. "src/devices/bus/heathzenith/h8/wh_8_64.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h8/wh_8_64.h",
}
dependency {
{ MAME_DIR .. "src/devices/bus/heathzenith/h8/front_panel.cpp", GEN_DIR .. "emu/layout/h8_fp.lh" },
}
custombuildtask {
layoutbuildtask("emu/layout", "h8_fp"),
}
end
---------------------------------------------------
--
--@src/devices/bus/heathzenith/intr_cntrl/intr_cntrl.h,BUSES["HEATH_INTR_SOCKET"] = true
@@ -5946,5 +6038,7 @@ if (BUSES["STCART_CONNECTOR"]~=null) then
MAME_DIR .. "src/devices/bus/st/stcart.h",
MAME_DIR .. "src/devices/bus/st/replay.cpp",
MAME_DIR .. "src/devices/bus/st/replay.h",
MAME_DIR .. "src/devices/bus/st/rom.cpp",
MAME_DIR .. "src/devices/bus/st/rom.h",
}
end
-24
View File
@@ -1922,18 +1922,6 @@ if (MACHINES["KB3600"]~=null) then
}
end
---------------------------------------------------
--
--@src/devices/machine/keytronic_l2207.h,MACHINES["KEYTRONIC_L2207"] = true
---------------------------------------------------
if (MACHINES["KEYTRONIC_L2207"]~=null) then
files {
MAME_DIR .. "src/devices/machine/keytronic_l2207.cpp",
MAME_DIR .. "src/devices/machine/keytronic_l2207.h",
}
end
---------------------------------------------------
--
--@src/devices/machine/kr1601rr1.h,MACHINES["KR1601RR1"] = true
@@ -1970,18 +1958,6 @@ if (MACHINES["LATCH8"]~=null) then
}
end
---------------------------------------------------
--
--@src/devices/machine/lc89510.h,MACHINES["LC89510"] = true
---------------------------------------------------
if (MACHINES["LC89510"]~=null) then
files {
MAME_DIR .. "src/devices/machine/lc89510.cpp",
MAME_DIR .. "src/devices/machine/lc89510.h",
}
end
---------------------------------------------------
--
--@src/devices/machine/ldpr8210.h,MACHINES["LDPR8210"] = true
+13
View File
@@ -43,6 +43,19 @@ if (VIDEOS["SEGA315_5313"]~=null) then
}
end
--------------------------------------------------
--
--@src/devices/video/ym7101.h,VIDEOS["YM7101"] = true
--------------------------------------------------
if (VIDEOS["YM7101"]~=null) then
files {
MAME_DIR .. "src/devices/video/ym7101.cpp",
MAME_DIR .. "src/devices/video/ym7101.h",
}
end
--------------------------------------------------
--
--@src/devices/video/am8052.h,VIDEOS["AM8052"] = true
+1 -1
View File
@@ -42,7 +42,7 @@ skeleton/palestra.cpp
nintendo/popeye.cpp
alliedl/aleisttl.cpp
misc/usbilliards.cpp
midway/sspeedr.cpp
taito/sspeedr.cpp
ramtek/starcrus.cpp
skeleton/testpat.cpp
misc/a1supply.cpp
+1 -3
View File
@@ -4,8 +4,6 @@
Atari A800/A5200/XEGS cart slot emulation
<fill me>
References:
- Altirra HW reference manual 2022-07-07 edition, chapter 8;
- https://github.com/atari800/atari800/blob/master/DOC/cart.txt
@@ -741,7 +739,7 @@ template <unsigned Bank> uint8_t a800_cart_slot_device::read_cart(offs_t offset)
template <unsigned Bank> void a800_cart_slot_device::write_cart(offs_t offset, uint8_t data)
{
return m_space_mem->write_byte(offset | Bank << 13, data);
m_space_mem->write_byte(offset | Bank << 13, data);
}
// Instantiate maps
+12 -12
View File
@@ -17,7 +17,6 @@
DEFINE_DEVICE_TYPE(BBC_1MHZBUS_SLOT, bbc_1mhzbus_slot_device, "bbc_1mhzbus_slot", "BBC Micro 1MHz Bus port")
//**************************************************************************
// DEVICE BBC_1MHZBUS PORT INTERFACE
//**************************************************************************
@@ -41,12 +40,13 @@ device_bbc_1mhzbus_interface::device_bbc_1mhzbus_interface(const machine_config
// bbc_1mhzbus_slot_device - constructor
//-------------------------------------------------
bbc_1mhzbus_slot_device::bbc_1mhzbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, BBC_1MHZBUS_SLOT, tag, owner, clock),
device_single_card_slot_interface<device_bbc_1mhzbus_interface>(mconfig, *this),
m_card(nullptr),
m_irq_handler(*this),
m_nmi_handler(*this)
bbc_1mhzbus_slot_device::bbc_1mhzbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_1MHZBUS_SLOT, tag, owner, clock)
, device_single_card_slot_interface<device_bbc_1mhzbus_interface>(mconfig, *this)
, device_mixer_interface(mconfig, *this)
, m_card(nullptr)
, m_irq_handler(*this)
, m_nmi_handler(*this)
{
}
@@ -136,7 +136,7 @@ void bbc_1mhzbus_slot_device::jim_w(offs_t offset, uint8_t data)
void bbc_1mhzbus_devices(device_slot_interface &device)
{
//device.option_add("teletext", BBC_TELETEXT); /* Acorn ANE01 Teletext Adapter */
//device.option_add("ttxta", BBC_TTXTA); /* Acorn ANE01 Teletext Adapter */
device.option_add("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */
device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
device.option_add("awhd", BBC_AWHD); /* Acorn Winchester Disc */
@@ -167,7 +167,7 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
device.option_add("beebopl", BBC_BEEBOPL); /* BeebOPL */
device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */
device.option_add("cc500", BBC_CC500); /* CTS Colour Card 500 */
//device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
//device.option_add("prisma3", BBC_PRISMA3); /* Millipede PRISMA-3 1988 */
device.option_add("sprite", BBC_SPRITE); /* Logotron Sprite Board */
device.option_add_internal("cfa3000opt", CFA3000_OPT);/* Henson CFA 3000 Option Board */
device.option_add_internal("cisco", BBC_CISCO); /* Cisco Terminal */
@@ -175,7 +175,7 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
void bbcm_1mhzbus_devices(device_slot_interface &device)
{
//device.option_add("teletext", BBC_TELETEXT); /* Acorn ANE01 Teletext Adapter */
//device.option_add("ttxta", BBC_TTXTA); /* Acorn ANE01 Teletext Adapter */
device.option_add("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */
device.option_add("awhd", BBC_AWHD); /* Acorn Winchester Disc */
device.option_add("barrybox", BBC_BARRYBOX); /* The Barry-Box */
@@ -193,7 +193,7 @@ void bbcm_1mhzbus_devices(device_slot_interface &device)
device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
device.option_add("m87", BBC_M87); /* Peartree Music 87 Synthesiser */
device.option_add("multiform", BBC_MULTIFORM); /* PEDL Multiform Z80 */
device.option_add("opusa", BBC_OPUSA); /* Opus Challenger ADFS */
device.option_add("opusa", BBC_OPUSA); /* Opus Challenger 3 ADFS */
device.option_add("pdram", BBC_PDRAM); /* Micro User Pull Down RAM */
device.option_add("pms64k", BBC_PMS64K); /* PMS 64K Non-Volatile Ram Module */
device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */
@@ -203,7 +203,7 @@ void bbcm_1mhzbus_devices(device_slot_interface &device)
device.option_add("beebopl", BBC_BEEBOPL); /* BeebOPL */
device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */
device.option_add("cc500", BBC_CC500); /* CTS Colour Card 500 */
//device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
//device.option_add("prisma3", BBC_PRISMA3); /* Millipede PRISMA-3 1988 */
device.option_add("sprite", BBC_SPRITE); /* Logotron Sprite Board */
device.option_add_internal("cfa3000opt", CFA3000_OPT);/* Henson CFA 3000 Option Board */
}
+2 -2
View File
@@ -59,7 +59,7 @@
NRST (pin 14) - Not RESET. This is an active low output from the system reset line. It may
be used to initialise peripherals whenever a power up or a BREAK causes a
reset.
Analog In (pin 16) - This is an input to the audio amplifier on the main computer. The amplified
Audio In (pin 16) - This is an input to the audio amplifier on the main computer. The amplified
signal is produced over the speaker on the keyboard. Its input impedance is
9K Ohms and a 3 volt RMS signal will produce maximum volume on the speaker.
Note however that signals as large as this will cause distortion if the sound
@@ -87,7 +87,7 @@
class device_bbc_1mhzbus_interface;
class bbc_1mhzbus_slot_device : public device_t, public device_single_card_slot_interface<device_bbc_1mhzbus_interface>
class bbc_1mhzbus_slot_device : public device_t, public device_single_card_slot_interface<device_bbc_1mhzbus_interface>, public device_mixer_interface
{
public:
// construction/destruction
+72 -53
View File
@@ -10,20 +10,57 @@
**********************************************************************/
#include "emu.h"
#include "ramdisc.h"
#include "machine/nvram.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_RAMDISC, bbc_ramdisc_device, "bbc_ramdisc", "Morley Electronics RAM Disc");
namespace {
class bbc_ramdisc_device: public device_t, public device_bbc_1mhzbus_interface
{
public:
bbc_ramdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_RAMDISC, tag, owner, clock)
, device_bbc_1mhzbus_interface(mconfig, *this)
, m_1mhzbus(*this, "1mhzbus")
, m_nvram(*this, "nvram")
, m_ram_size(*this, "SIZE")
, m_power(*this, "POWER")
, m_sector(0)
{
}
DECLARE_INPUT_CHANGED_MEMBER(power_changed);
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual uint8_t fred_r(offs_t offset) override;
virtual void fred_w(offs_t offset, uint8_t data) override;
virtual uint8_t jim_r(offs_t offset) override;
virtual void jim_w(offs_t offset, uint8_t data) override;
private:
required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
required_device<nvram_device> m_nvram;
required_ioport m_ram_size;
required_ioport m_power;
std::unique_ptr<uint8_t[]> m_ram;
uint16_t m_sector;
};
//-------------------------------------------------
// INPUT_PORTS( ramdisc )
// input_ports - device-specific input ports
//-------------------------------------------------
static INPUT_PORTS_START(ramdisc)
@@ -37,17 +74,14 @@ static INPUT_PORTS_START(ramdisc)
PORT_CONFSETTING(0x02, "2MB")
INPUT_PORTS_END
//-------------------------------------------------
// input_ports - device-specific input ports
//-------------------------------------------------
ioport_constructor bbc_ramdisc_device::device_input_ports() const
{
return INPUT_PORTS_NAME(ramdisc);
}
//-------------------------------------------------
// ROM( ramdisc )
// rom_region - device-specific ROM region
//-------------------------------------------------
ROM_START(ramdisc)
@@ -55,47 +89,27 @@ ROM_START(ramdisc)
ROM_LOAD("ramdisc101.rom", 0x0000, 0x4000, CRC(627568c2) SHA1(17e727998756fe35ff451fd2ce1d4b5977be24fc))
ROM_END
const tiny_rom_entry *bbc_ramdisc_device::device_rom_region() const
{
return ROM_NAME(ramdisc);
}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_ramdisc_device::device_add_mconfig(machine_config &config)
{
/* ram disk */
// ram disk
NVRAM(config, "nvram", nvram_device::DEFAULT_NONE);
BBC_1MHZBUS_SLOT(config, m_1mhzbus, DERIVED_CLOCK(1, 1), bbc_1mhzbus_devices, nullptr);
m_1mhzbus->irq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
m_1mhzbus->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::nmi_w));
//m_1mhzbus->add_route(ALL_OUTPUTS, DEVICE_SELF_OWNER, 1.0);
}
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const tiny_rom_entry *bbc_ramdisc_device::device_rom_region() const
{
return ROM_NAME(ramdisc);
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_ramdisc_device - constructor
//-------------------------------------------------
bbc_ramdisc_device::bbc_ramdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_RAMDISC, tag, owner, clock)
, device_bbc_1mhzbus_interface(mconfig, *this)
, m_1mhzbus(*this, "1mhzbus")
, m_nvram(*this, "nvram")
, m_ram_size(*this, "SIZE")
, m_power(*this, "POWER")
, m_sector(0)
{
}
//-------------------------------------------------
// device_start - device-specific startup
@@ -103,11 +117,11 @@ bbc_ramdisc_device::bbc_ramdisc_device(const machine_config &mconfig, const char
void bbc_ramdisc_device::device_start()
{
/* define 2mb ram */
// define 2mb ram
m_ram = std::make_unique<uint8_t[]>(0x200000);
m_nvram->set_base(m_ram.get(), 0x200000);
/* register for save states */
// register for save states
save_pointer(NAME(m_ram), 0x200000);
save_item(NAME(m_sector));
}
@@ -119,7 +133,7 @@ void bbc_ramdisc_device::device_start()
INPUT_CHANGED_MEMBER(bbc_ramdisc_device::power_changed)
{
/* clear RAM on power off */
// clear RAM on power off
if (!newval)
{
memset(m_ram.get(), 0xff, 0x200000);
@@ -135,17 +149,17 @@ uint8_t bbc_ramdisc_device::fred_r(offs_t offset)
switch (offset)
{
case 0xc0:
/* sector LSB */
// sector LSB
data = m_sector & 0x00ff;
break;
case 0xc2:
/* sector MSB */
// sector MSB
data = (m_sector & 0xff00) >> 8;
break;
case 0xc1:
case 0xc3:
/* TODO: unknown purpose, must return 0x3f or 0x5f */
data = 0x3f;
// TODO: unknown purpose, must return 0x3f or 0x5f
data = 0x1f | (m_ram_size->read() << 5);
logerror("Read %04x -> %02x\n", offset | 0xfcc0, data);
break;
}
@@ -163,16 +177,16 @@ void bbc_ramdisc_device::fred_w(offs_t offset, uint8_t data)
switch (offset)
{
case 0xc0:
/* sector LSB */
// sector LSB
m_sector = (m_sector & 0xff00) | data;
break;
case 0xc2:
/* sector MSB */
// sector MSB
m_sector = (m_sector & 0x00ff) | (data << 8);
break;
case 0xc1:
case 0xc3:
/* TODO: unknown purpose, always writes 0x00 or 0xff */
// TODO: unknown purpose, always writes 0x00 or 0xff
logerror("Write %04x <- %02x\n", offset | 0xfcc0, data);
break;
}
@@ -185,8 +199,8 @@ uint8_t bbc_ramdisc_device::jim_r(offs_t offset)
{
uint8_t data = 0xff;
/* power on and sector < 2mb */
if (m_power->read() && m_sector < (m_ram_size->read() << 8))
// power on and sector < 2mb
if (m_power->read() && m_sector < (m_ram_size->read() << 12))
{
data &= m_ram[(m_sector << 8) | offset];
}
@@ -198,11 +212,16 @@ uint8_t bbc_ramdisc_device::jim_r(offs_t offset)
void bbc_ramdisc_device::jim_w(offs_t offset, uint8_t data)
{
/* power on and sector < 2mb */
if (m_power->read() && m_sector < (m_ram_size->read() << 8))
// power on and sector < 2mb
if (m_power->read() && m_sector < (m_ram_size->read() << 12))
{
m_ram[(m_sector << 8) | offset] = data;
}
m_1mhzbus->jim_w(offset, data);
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(BBC_RAMDISC, device_bbc_1mhzbus_interface, bbc_ramdisc_device, "bbc_ramdisc", "Morley Electronics RAM Disc");
+4 -50
View File
@@ -1,59 +1,13 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Morley Electronics RAM Disc
**********************************************************************/
#ifndef MAME_BUS_BBC_1MHZBUS_RAMDISC_H
#define MAME_BUS_BBC_1MHZBUS_RAMDISC_H
#pragma once
#include "1mhzbus.h"
#include "machine/nvram.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class bbc_ramdisc_device:
public device_t,
public device_bbc_1mhzbus_interface
{
public:
// construction/destruction
bbc_ramdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_INPUT_CHANGED_MEMBER(power_changed);
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual uint8_t fred_r(offs_t offset) override;
virtual void fred_w(offs_t offset, uint8_t data) override;
virtual uint8_t jim_r(offs_t offset) override;
virtual void jim_w(offs_t offset, uint8_t data) override;
private:
required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
required_device<nvram_device> m_nvram;
required_ioport m_ram_size;
required_ioport m_power;
std::unique_ptr<uint8_t[]> m_ram;
uint16_t m_sector;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_RAMDISC, bbc_ramdisc_device);
DECLARE_DEVICE_TYPE(BBC_RAMDISC, device_bbc_1mhzbus_interface);
#endif /* MAME_BUS_BBC_1MHZBUS_RAMDISC_H */
#endif // MAME_BUS_BBC_1MHZBUS_RAMDISC_H
+26 -11
View File
@@ -26,10 +26,10 @@ DEFINE_DEVICE_TYPE(BBC_EXP_SLOT, bbc_exp_slot_device, "bbc_exp_slot", "BBC Maste
// device_bbc_exp_interface - constructor
//-------------------------------------------------
device_bbc_exp_interface::device_bbc_exp_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "bbcexp")
device_bbc_exp_interface::device_bbc_exp_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "bbcexp")
, m_slot(dynamic_cast<bbc_exp_slot_device*>(device.owner()))
{
m_slot = dynamic_cast<bbc_exp_slot_device *>(device.owner());
}
@@ -83,14 +83,6 @@ uint8_t bbc_exp_slot_device::jim_r(offs_t offset)
return 0xff;
}
uint8_t bbc_exp_slot_device::sheila_r(offs_t offset)
{
if (m_card)
return m_card->sheila_r(offset);
else
return 0xfe;
}
//-------------------------------------------------
// write
//-------------------------------------------------
@@ -136,6 +128,29 @@ void bbc_exp_slot_device::pb_w(uint8_t data)
m_card->pb_w(data);
}
//-------------------------------------------------
// write_cb1
//-------------------------------------------------
void bbc_exp_slot_device::write_cb1(int state)
{
if (m_card)
m_card->write_cb1(state);
}
//-------------------------------------------------
// write_cb2
//-------------------------------------------------
void bbc_exp_slot_device::write_cb2(int state)
{
if (m_card)
m_card->write_cb2(state);
}
//-------------------------------------------------
// SLOT_INTERFACE( bbc_exp_devices )
//-------------------------------------------------
+8 -4
View File
@@ -71,9 +71,6 @@ public:
auto irq_handler() { return m_irq_handler.bind(); }
auto nmi_handler() { return m_nmi_handler.bind(); }
// callbacks for mertec device (also connects to joyport)
auto cb1_handler() { return m_cb1_handler.bind(); }
auto cb2_handler() { return m_cb2_handler.bind(); }
uint8_t fred_r(offs_t offset);
void fred_w(offs_t offset, uint8_t data);
@@ -85,12 +82,17 @@ public:
void irq_w(int state) { m_irq_handler(state); }
void nmi_w(int state) { m_nmi_handler(state); }
// additional handlers for mertec device
// additional callbacks/handlers for mertec device (also connects to joyport)
auto cb1_handler() { return m_cb1_handler.bind(); }
auto cb2_handler() { return m_cb2_handler.bind(); }
void cb1_w(int state) { m_cb1_handler(state); }
void cb2_w(int state) { m_cb2_handler(state); }
uint8_t pb_r();
void pb_w(uint8_t data);
void write_cb1(int state);
void write_cb2(int state);
protected:
// device-level overrides
@@ -121,6 +123,8 @@ public:
virtual uint8_t pb_r() { return 0xff; }
virtual void pb_w(uint8_t data) { }
virtual void write_cb1(int state) { }
virtual void write_cb2(int state) { }
protected:
device_bbc_exp_interface(const machine_config &mconfig, device_t &device);
+2 -2
View File
@@ -37,10 +37,10 @@ device_bbc_internal_interface::device_bbc_internal_interface(const machine_confi
, m_maincpu(*this, ":maincpu")
, m_mb_ram(*this, ":ram")
, m_mb_rom(*this, ":romslot%u", 0U)
, m_region_swr(*this, ":swr")
, m_region_swr(*this, ":rom")
, m_region_mos(*this, ":mos")
, m_slot(dynamic_cast<bbc_internal_slot_device *>(device.owner()))
{
m_slot = dynamic_cast<bbc_internal_slot_device *>(device.owner());
}
+1 -1
View File
@@ -50,7 +50,7 @@ protected:
required_memory_region m_region_swr;
required_memory_region m_region_mos;
bbc_internal_slot_device *m_slot;
bbc_internal_slot_device *const m_slot;
};
// ======================> bbc_internal_slot_device
+30 -23
View File
@@ -10,27 +10,30 @@
#include "datagem.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
namespace {
DEFINE_DEVICE_TYPE(BBC_DATAGEM, bbc_datagem_device, "bbc_datagem", "Gemini DataGem ROM Carrier")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_datagem_device - constructor
//-------------------------------------------------
bbc_datagem_device::bbc_datagem_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_DATAGEM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
, m_bank(0)
class bbc_datagem_device : public device_t, public device_bbc_rom_interface
{
}
public:
bbc_datagem_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_DATAGEM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
, m_bank(0)
{
}
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint32_t get_rom_size() override { return 0x4000; }
virtual uint8_t read(offs_t offset) override;
virtual void decrypt_rom() override;
private:
uint8_t m_bank;
};
//-------------------------------------------------
@@ -39,7 +42,6 @@ bbc_datagem_device::bbc_datagem_device(const machine_config &mconfig, const char
void bbc_datagem_device::device_start()
{
/* register for save states */
save_item(NAME(m_bank));
}
@@ -53,7 +55,7 @@ void bbc_datagem_device::decrypt_rom()
for (int i = 0x0000; i < 0x6000; i++)
{
/* decrypt 16K and 8K ROM data lines */
// decrypt 16K and 8K ROM data lines
switch (rom[i] & 0x07)
{
case 0x01: case 0x06: rom[i] = bitswap<8>(rom[i], 7, 6, 5, 4, 3, 0, 1, 2); break;
@@ -61,7 +63,7 @@ void bbc_datagem_device::decrypt_rom()
case 0x03: case 0x04: rom[i] = bitswap<8>(rom[i], 7, 6, 5, 4, 3, 1, 2, 0); break;
}
/* decrypt additional 8K ROM data lines */
// decrypt additional 8K ROM data lines
if (i & 0x4000)
{
rom[i] = bitswap<8>(rom[i], 3, 6, 5, 4, 7, 2, 1, 0);
@@ -77,7 +79,7 @@ uint8_t bbc_datagem_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for DataGem */
// switching zones for DataGem
switch (offset & 0x3fff)
{
case 0x1ffe: m_bank = 1; break;
@@ -94,3 +96,8 @@ uint8_t bbc_datagem_device::read(offs_t offset)
return get_rom_base()[offset & 0x3fff];
}
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(BBC_DATAGEM, device_bbc_rom_interface, bbc_datagem_device, "bbc_datagem", "Gemini DataGem ROM Carrier")
+1 -36
View File
@@ -1,11 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/***************************************************************************
Gemini DataGem ROM Carrier
***************************************************************************/
#ifndef MAME_BUS_BBC_ROM_DATAGEM_H
#define MAME_BUS_BBC_ROM_DATAGEM_H
@@ -14,35 +8,6 @@
#include "slot.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_datagem_device
class bbc_datagem_device : public device_t,
public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_datagem_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint32_t get_rom_size() override { return 0x4000; }
virtual uint8_t read(offs_t offset) override;
virtual void decrypt_rom() override;
private:
uint8_t m_bank;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_DATAGEM, bbc_datagem_device)
DECLARE_DEVICE_TYPE(BBC_DATAGEM, device_bbc_rom_interface)
#endif // MAME_BUS_BBC_ROM_DATAGEM_H
+31 -40
View File
@@ -13,51 +13,42 @@
#include "dfs.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
namespace {
DEFINE_DEVICE_TYPE(BBC_DFSE00, bbc_dfse00_device, "bbc_dfse00", "BBC Micro E00 DFS")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_rom_device - constructor
//-------------------------------------------------
bbc_dfse00_device::bbc_dfse00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_DFSE00, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
class bbc_dfse00_device : public device_t, public device_bbc_rom_interface
{
}
public:
bbc_dfse00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_DFSE00, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
, m_ram(*this, "ram", 0x800, ENDIANNESS_LITTLE)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD { }
void bbc_dfse00_device::device_start()
{
}
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (offset & 0x2000)
return m_ram[offset & 0x7ff];
else
return get_rom_base()[offset];
}
//-------------------------------------------------
// read
//-------------------------------------------------
virtual void write(offs_t offset, uint8_t data) override
{
if (offset & 0x2000)
m_ram[offset & 0x7ff] = data;
}
uint8_t bbc_dfse00_device::read(offs_t offset)
{
if (offset < get_rom_size())
return get_rom_base()[offset & (get_rom_size() - 1)];
else
return get_ram_base()[offset & (get_ram_size() - 1)];
}
private:
memory_share_creator<uint8_t> m_ram;
};
//-------------------------------------------------
// write
//-------------------------------------------------
} // anonymous namespace
void bbc_dfse00_device::write(offs_t offset, uint8_t data)
{
get_ram_base()[offset & (get_ram_size() - 1)] = data;
}
DEFINE_DEVICE_TYPE_PRIVATE(BBC_DFSE00, device_bbc_rom_interface, bbc_dfse00_device, "bbc_dfse00", "BBC Micro E00 DFS")
+1 -29
View File
@@ -1,11 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/***************************************************************************
BBC Micro E00 DFS emulation
***************************************************************************/
#ifndef MAME_BUS_BBC_ROM_DFS_H
#define MAME_BUS_BBC_ROM_DFS_H
@@ -13,29 +7,7 @@
#include "slot.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_dfse00_device
class bbc_dfse00_device : public device_t, public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_dfse00_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
virtual void write(offs_t offset, uint8_t data) override;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_DFSE00, bbc_dfse00_device)
DECLARE_DEVICE_TYPE(BBC_DFSE00, device_bbc_rom_interface)
#endif // MAME_BUS_BBC_ROM_DFS_H
+27 -32
View File
@@ -10,25 +10,33 @@
#include "nvram.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
namespace {
DEFINE_DEVICE_TYPE(BBC_NVRAM, bbc_nvram_device, "bbc_nvram", "BBC Micro Sideways RAM (Battery Backup)")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_nvram_device - constructor
//-------------------------------------------------
bbc_nvram_device::bbc_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_NVRAM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
class bbc_nvram_device : public device_t, public device_bbc_rom_interface
{
}
public:
bbc_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_NVRAM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
{
}
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
return get_nvram_base()[offset & (get_nvram_size() - 1)];
}
virtual void write(offs_t offset, uint8_t data) override
{
get_nvram_base()[offset & (get_nvram_size() - 1)] = data;
}
};
//-------------------------------------------------
// device_start - device-specific startup
@@ -39,20 +47,7 @@ void bbc_nvram_device::device_start()
nvram_alloc(0x4000);
}
//-------------------------------------------------
// read
//-------------------------------------------------
} // anonymous namespace
uint8_t bbc_nvram_device::read(offs_t offset)
{
return get_nvram_base()[offset & (get_nvram_size() - 1)];
}
//-------------------------------------------------
// write
//-------------------------------------------------
void bbc_nvram_device::write(offs_t offset, uint8_t data)
{
get_nvram_base()[offset & (get_nvram_size() - 1)] = data;
}
DEFINE_DEVICE_TYPE_PRIVATE(BBC_NVRAM, device_bbc_rom_interface, bbc_nvram_device, "bbc_nvram", "BBC Micro Sideways RAM (Battery Backup)")
+1 -30
View File
@@ -1,11 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/***************************************************************************
BBC Micro Sideways RAM (Battery Backup) emulation
***************************************************************************/
#ifndef MAME_BUS_BBC_ROM_NVRAM_H
#define MAME_BUS_BBC_ROM_NVRAM_H
@@ -13,30 +7,7 @@
#include "slot.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_nvram_device
class bbc_nvram_device : public device_t,
public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_nvram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
virtual void write(offs_t offset, uint8_t data) override;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_NVRAM, bbc_nvram_device)
DECLARE_DEVICE_TYPE(BBC_NVRAM, device_bbc_rom_interface)
#endif // MAME_BUS_BBC_ROM_NVRAM_H
+354 -262
View File
@@ -46,86 +46,364 @@
#include "pal.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
namespace {
DEFINE_DEVICE_TYPE(BBC_CCIWORD, bbc_cciword_device, "bbc_cciword", "Computer Concepts 32K ROM Carrier (Inter-Word)")
DEFINE_DEVICE_TYPE(BBC_CCIBASE, bbc_ccibase_device, "bbc_ccibase", "Computer Concepts 64K ROM Carrier (Inter-Base)")
DEFINE_DEVICE_TYPE(BBC_CCISPELL, bbc_ccispell_device, "bbc_ccispell", "Computer Concepts 128K ROM Carrier (SpellMaster)")
DEFINE_DEVICE_TYPE(BBC_PALQST, bbc_palqst_device, "bbc_palqst", "Watford Electronics ROM Carrier (Quest Paint)")
DEFINE_DEVICE_TYPE(BBC_PALWAP, bbc_palwap_device, "bbc_palwap", "Watford Electronics ROM Carrier (Wapping Editor)")
DEFINE_DEVICE_TYPE(BBC_PALTED, bbc_palted_device, "bbc_palted", "Watford Electronics ROM Carrier (TED)")
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")
// ======================> bbc_pal_device
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_palprom_device - constructor
//-------------------------------------------------
bbc_pal_device::bbc_pal_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_bbc_rom_interface(mconfig, *this)
, m_bank(0)
class bbc_pal_device : public device_t, public device_bbc_rom_interface
{
}
protected:
bbc_pal_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_bbc_rom_interface(mconfig, *this)
, m_bank(0)
{
}
bbc_cciword_device::bbc_cciword_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_CCIWORD, tag, owner, clock)
{
}
// device_t overrides
virtual void device_start() override ATTR_COLD;
bbc_ccibase_device::bbc_ccibase_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_CCIBASE, tag, owner, clock)
{
}
// device_bbc_rom_interface overrides
virtual uint32_t get_rom_size() override { return 0x4000; }
bbc_ccispell_device::bbc_ccispell_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_CCISPELL, tag, owner, clock)
{
}
uint8_t m_bank;
};
bbc_palqst_device::bbc_palqst_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALQST, tag, owner, clock)
{
}
bbc_palwap_device::bbc_palwap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALWAP, tag, owner, clock)
{
}
// ======================> bbc_cciword_device
bbc_palted_device::bbc_palted_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALTED, tag, owner, clock)
class bbc_cciword_device : public bbc_pal_device
{
}
public:
bbc_cciword_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_CCIWORD, tag, owner, clock)
{
}
bbc_palabep_device::bbc_palabep_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALABEP, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for Inter-Word
switch (offset & 0x3fe0)
{
case 0x0060:
case 0x3fc0: m_bank = 0; break;
case 0x0040:
case 0x3fa0:
case 0x3fe0: m_bank = 1; break;
}
}
bbc_palabe_device::bbc_palabe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALABE, tag, owner, clock)
{
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
};
bbc_palmo2_device::bbc_palmo2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALMO2, tag, owner, clock)
{
}
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)
// ======================> bbc_ccibase_device
class bbc_ccibase_device : public bbc_pal_device
{
}
public:
bbc_ccibase_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_CCIBASE, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for Inter-Base
switch (offset & 0x3fe0)
{
case 0x3f80: m_bank = 0; break;
case 0x3fa0: m_bank = 1; break;
case 0x3fc0: m_bank = 2; break;
case 0x3fe0: m_bank = 3; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
};
// ======================> bbc_ccispell_device
class bbc_ccispell_device : public bbc_pal_device
{
public:
bbc_ccispell_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_CCISPELL, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for SpellMaster
if (offset == 0x3fe0)
{
m_bank = 0;
}
else if (m_bank == 0)
{
switch (offset & 0x3fe0)
{
case 0x3fc0: m_bank = 1; break;
case 0x3fa0: m_bank = 2; break;
case 0x3f80: m_bank = 3; break;
case 0x3f60: m_bank = 4; break;
case 0x3f40: m_bank = 5; break;
case 0x3f20: m_bank = 6; break;
case 0x3f00: m_bank = 7; break;
}
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
};
// ======================> bbc_palqst_device
class bbc_palqst_device : public bbc_pal_device
{
public:
bbc_palqst_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALQST, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for Quest Paint and ConQuest
switch (offset & 0x3fe0)
{
case 0x0820: m_bank = 2; break;
case 0x11e0: m_bank = 1; break;
case 0x12c0: m_bank = 3; break;
case 0x1340: m_bank = 0; break;
}
}
if (offset & 0x2000)
{
return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
}
else
{
return get_rom_base()[offset & 0x1fff];
}
}
};
// ======================> bbc_palwap_device
class bbc_palwap_device : public bbc_pal_device
{
public:
bbc_palwap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALWAP, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for Wapping Editor
switch (offset & 0x3fe0)
{
case 0x1f00: m_bank = 0; break;
case 0x1f20: m_bank = 1; break;
case 0x1f40: m_bank = 2; break;
case 0x1f60: m_bank = 3; break;
case 0x1f80: m_bank = 4; break;
case 0x1fa0: m_bank = 5; break;
case 0x1fc0: m_bank = 6; break;
case 0x1fe0: m_bank = 7; break;
}
}
if (offset & 0x2000)
{
return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
}
else
{
return get_rom_base()[offset & 0x1fff];
}
}
};
// ======================> bbc_palted_device
class bbc_palted_device : public bbc_pal_device
{
public:
bbc_palted_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALTED, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for TED
switch (offset & 0x3fe0)
{
case 0x1f80: m_bank = 0; break;
case 0x1fa0: m_bank = 1; break;
case 0x1fc0: m_bank = 2; break;
case 0x1fe0: m_bank = 3; break;
}
}
if (offset & 0x2000)
{
return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
}
else
{
return get_rom_base()[offset & 0x1fff];
}
}
};
// ======================> bbc_palabep_device
class bbc_palabep_device : public bbc_pal_device
{
public:
bbc_palabep_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALABEP, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for Advanced BASIC Editor Plus
switch (offset & 0x3ffc)
{
case 0x3ff8: m_bank = 0; break;
case 0x3ffc: m_bank = 1; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
};
// ======================> bbc_palabe_device
class bbc_palabe_device : public bbc_pal_device
{
public:
bbc_palabe_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALABE, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for Advanced BASIC Editor
switch (offset & 0x3ffc)
{
case 0x3ff8: m_bank = 1; break;
case 0x3ffc: m_bank = 0; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
};
// ======================> bbc_palmo2_device
class bbc_palmo2_device : public bbc_pal_device
{
public:
bbc_palmo2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: bbc_pal_device(mconfig, BBC_PALMO2, tag, owner, clock)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
if (!machine().side_effects_disabled())
{
// switching zones for Instant Mini Office 2
switch (offset & 0x3ff0)
{
case 0x2000: m_bank = offset & 0x0f; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 13)];
}
};
// ======================> bbc_trilogy_device
class bbc_trilogy_device : public bbc_pal_device
{
public:
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)
{
}
protected:
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
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)];
}
};
//-------------------------------------------------
@@ -137,202 +415,16 @@ void bbc_pal_device::device_start()
save_item(NAME(m_bank));
}
//-------------------------------------------------
// read
//-------------------------------------------------
} // anonymous namespace
uint8_t bbc_cciword_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for Inter-Word */
switch (offset & 0x3fe0)
{
case 0x0060:
case 0x3fc0: m_bank = 0; break;
case 0x0040:
case 0x3fa0:
case 0x3fe0: m_bank = 1; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
uint8_t bbc_ccibase_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for Inter-Base */
switch (offset & 0x3fe0)
{
case 0x3f80: m_bank = 0; break;
case 0x3fa0: m_bank = 1; break;
case 0x3fc0: m_bank = 2; break;
case 0x3fe0: m_bank = 3; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
uint8_t bbc_ccispell_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for SpellMaster */
if (offset == 0x3fe0)
{
m_bank = 0;
}
else if (m_bank == 0)
{
switch (offset & 0x3fe0)
{
case 0x3fc0: m_bank = 1; break;
case 0x3fa0: m_bank = 2; break;
case 0x3f80: m_bank = 3; break;
case 0x3f60: m_bank = 4; break;
case 0x3f40: m_bank = 5; break;
case 0x3f20: m_bank = 6; break;
case 0x3f00: m_bank = 7; break;
}
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
uint8_t bbc_palqst_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for Quest Paint and ConQuest */
switch (offset & 0x3fe0)
{
case 0x0820: m_bank = 2; break;
case 0x11e0: m_bank = 1; break;
case 0x12c0: m_bank = 3; break;
case 0x1340: m_bank = 0; break;
}
}
if (offset & 0x2000)
{
return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
}
else
{
return get_rom_base()[offset & 0x1fff];
}
}
uint8_t bbc_palwap_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for Wapping Editor */
switch (offset & 0x3fe0)
{
case 0x1f00: m_bank = 0; break;
case 0x1f20: m_bank = 1; break;
case 0x1f40: m_bank = 2; break;
case 0x1f60: m_bank = 3; break;
case 0x1f80: m_bank = 4; break;
case 0x1fa0: m_bank = 5; break;
case 0x1fc0: m_bank = 6; break;
case 0x1fe0: m_bank = 7; break;
}
}
if (offset & 0x2000)
{
return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
}
else
{
return get_rom_base()[offset & 0x1fff];
}
}
uint8_t bbc_palted_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for TED */
switch (offset & 0x3fe0)
{
case 0x1f80: m_bank = 0; break;
case 0x1fa0: m_bank = 1; break;
case 0x1fc0: m_bank = 2; break;
case 0x1fe0: m_bank = 3; break;
}
}
if (offset & 0x2000)
{
return get_rom_base()[(offset & 0x1fff) | (m_bank << 13)];
}
else
{
return get_rom_base()[offset & 0x1fff];
}
}
uint8_t bbc_palabep_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for Advanced BASIC Editor Plus */
switch (offset & 0x3ffc)
{
case 0x3ff8: m_bank = 0; break;
case 0x3ffc: m_bank = 1; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
uint8_t bbc_palabe_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for Advanced BASIC Editor */
switch (offset & 0x3ffc)
{
case 0x3ff8: m_bank = 1; break;
case 0x3ffc: m_bank = 0; break;
}
}
return get_rom_base()[(offset & 0x3fff) | (m_bank << 14)];
}
uint8_t bbc_palmo2_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
{
/* switching zones for Instant Mini Office 2 */
switch (offset & 0x3ff0)
{
case 0x2000: m_bank = offset & 0x0f; break;
}
}
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)];
}
DEFINE_DEVICE_TYPE_PRIVATE(BBC_CCIWORD, device_bbc_rom_interface, bbc_cciword_device, "bbc_cciword", "Computer Concepts 32K ROM Carrier (Inter-Word)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_CCIBASE, device_bbc_rom_interface, bbc_ccibase_device, "bbc_ccibase", "Computer Concepts 64K ROM Carrier (Inter-Base)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_CCISPELL, device_bbc_rom_interface, bbc_ccispell_device, "bbc_ccispell", "Computer Concepts 128K ROM Carrier (SpellMaster)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_PALQST, device_bbc_rom_interface, bbc_palqst_device, "bbc_palqst", "Watford Electronics ROM Carrier (Quest Paint)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_PALWAP, device_bbc_rom_interface, bbc_palwap_device, "bbc_palwap", "Watford Electronics ROM Carrier (Wapping Editor)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_PALTED, device_bbc_rom_interface, bbc_palted_device, "bbc_palted", "Watford Electronics ROM Carrier (TED)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_PALABEP, device_bbc_rom_interface, bbc_palabep_device, "bbc_palabep", "P.R.E.S. 32K ROM Carrier (ABE+)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_PALABE, device_bbc_rom_interface, bbc_palabe_device, "bbc_palabe", "P.R.E.S. 32K ROM Carrier (ABE)")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_PALMO2, device_bbc_rom_interface, bbc_palmo2_device, "bbc_palmo2", "Instant Mini Office 2 ROM Carrier")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_TRILOGY, device_bbc_rom_interface, bbc_trilogy_device, "bbc_trilogy", "Acornsoft Trilogy Emulator")
+10 -169
View File
@@ -1,11 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/***************************************************************************
BBC Micro PALPROM carrier boards
***************************************************************************/
#ifndef MAME_BUS_BBC_ROM_PAL_H
#define MAME_BUS_BBC_ROM_PAL_H
@@ -14,168 +8,15 @@
#include "slot.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_pal_device
class bbc_pal_device : public device_t,
public device_bbc_rom_interface
{
protected:
// construction/destruction
bbc_pal_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 ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint32_t get_rom_size() override { return 0x4000; }
uint8_t m_bank;
};
// ======================> bbc_cciword_device
class bbc_cciword_device : public bbc_pal_device
{
public:
// construction/destruction
bbc_cciword_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;
};
// ======================> bbc_ccibase_device
class bbc_ccibase_device : public bbc_pal_device
{
public:
// construction/destruction
bbc_ccibase_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;
};
// ======================> bbc_ccispell_device
class bbc_ccispell_device : public bbc_pal_device
{
public:
// construction/destruction
bbc_ccispell_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;
};
// ======================> bbc_palqst_device
class bbc_palqst_device : public bbc_pal_device
{
public:
bbc_palqst_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;
};
// ======================> bbc_palwap_device
class bbc_palwap_device : public bbc_pal_device
{
public:
bbc_palwap_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;
};
// ======================> bbc_palted_device
class bbc_palted_device : public bbc_pal_device
{
public:
// construction/destruction
bbc_palted_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;
};
// ======================> bbc_palabep_device
class bbc_palabep_device : public bbc_pal_device
{
public:
// construction/destruction
bbc_palabep_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;
};
// ======================> bbc_palabe_device
class bbc_palabe_device : public bbc_pal_device
{
public:
// construction/destruction
bbc_palabe_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;
};
// ======================> bbc_palmo2_device
class bbc_palmo2_device : public bbc_pal_device
{
public:
// construction/destruction
bbc_palmo2_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;
};
// ======================> 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)
DECLARE_DEVICE_TYPE(BBC_CCIBASE, bbc_ccibase_device)
DECLARE_DEVICE_TYPE(BBC_CCISPELL, bbc_ccispell_device)
DECLARE_DEVICE_TYPE(BBC_PALQST, bbc_palqst_device)
DECLARE_DEVICE_TYPE(BBC_PALWAP, bbc_palwap_device)
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)
DECLARE_DEVICE_TYPE(BBC_CCIWORD, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_CCIBASE, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_CCISPELL, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_PALQST, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_PALWAP, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_PALTED, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_PALABEP, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_PALABE, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_PALMO2, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_TRILOGY, device_bbc_rom_interface)
#endif // MAME_BUS_BBC_ROM_PAL_H
+27 -32
View File
@@ -10,25 +10,33 @@
#include "ram.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
namespace {
DEFINE_DEVICE_TYPE(BBC_RAM, bbc_ram_device, "bbc_ram", "BBC Micro Sideways RAM")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_ram_device - constructor
//-------------------------------------------------
bbc_ram_device::bbc_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_RAM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
class bbc_ram_device : public device_t, public device_bbc_rom_interface
{
}
public:
bbc_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_RAM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
{
}
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
return get_ram_base()[offset & (get_ram_size() - 1)];
}
virtual void write(offs_t offset, uint8_t data) override
{
get_ram_base()[offset & (get_ram_size() - 1)] = data;
}
};
//-------------------------------------------------
// device_start - device-specific startup
@@ -39,20 +47,7 @@ void bbc_ram_device::device_start()
ram_alloc(0x8000);
}
//-------------------------------------------------
// read
//-------------------------------------------------
} // anonymous namespace
uint8_t bbc_ram_device::read(offs_t offset)
{
return get_ram_base()[offset & (get_ram_size() - 1)];
}
//-------------------------------------------------
// write
//-------------------------------------------------
void bbc_ram_device::write(offs_t offset, uint8_t data)
{
get_ram_base()[offset & (get_ram_size() - 1)] = data;
}
DEFINE_DEVICE_TYPE_PRIVATE(BBC_RAM, device_bbc_rom_interface, bbc_ram_device, "bbc_ram", "BBC Micro Sideways RAM")
+1 -30
View File
@@ -1,11 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/***************************************************************************
BBC Micro Sideways RAM emulation
***************************************************************************/
#ifndef MAME_BUS_BBC_ROM_RAM_H
#define MAME_BUS_BBC_ROM_RAM_H
@@ -13,30 +7,7 @@
#include "slot.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_ram_device
class bbc_ram_device : public device_t,
public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
virtual void write(offs_t offset, uint8_t data) override;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_RAM, bbc_ram_device)
DECLARE_DEVICE_TYPE(BBC_RAM, device_bbc_rom_interface)
#endif // MAME_BUS_BBC_ROM_RAM_H
+20 -30
View File
@@ -10,39 +10,29 @@
#include "rom.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
namespace {
DEFINE_DEVICE_TYPE(BBC_ROM, bbc_rom_device, "bbc_rom", "BBC Micro Sideways ROM")
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_rom_device - constructor
//-------------------------------------------------
bbc_rom_device::bbc_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_ROM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
class bbc_rom_device : public device_t, public device_bbc_rom_interface
{
}
public:
bbc_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_ROM, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD { }
void bbc_rom_device::device_start()
{
}
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override
{
return get_rom_base()[offset & (get_rom_size() - 1)];
}
};
//-------------------------------------------------
// read
//-------------------------------------------------
} // anonymous namespace
uint8_t bbc_rom_device::read(offs_t offset)
{
return get_rom_base()[offset & (get_rom_size() - 1)];
}
DEFINE_DEVICE_TYPE_PRIVATE(BBC_ROM, device_bbc_rom_interface, bbc_rom_device, "bbc_rom", "BBC Micro Sideways ROM")
+1 -29
View File
@@ -1,11 +1,5 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/***************************************************************************
BBC Micro Sideways ROM emulation
***************************************************************************/
#ifndef MAME_BUS_BBC_ROM_ROM_H
#define MAME_BUS_BBC_ROM_ROM_H
@@ -13,29 +7,7 @@
#include "slot.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_rom_device
class bbc_rom_device : public device_t,
public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_ROM, bbc_rom_device)
DECLARE_DEVICE_TYPE(BBC_ROM, device_bbc_rom_interface)
#endif // MAME_BUS_BBC_ROM_ROM_H
+63 -39
View File
@@ -13,13 +13,62 @@
#include "emu.h"
#include "rtc.h"
#include "machine/ds1215.h"
#include "machine/mc146818.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_STLRTC, bbc_stlrtc_device, "bbc_stlrtc", "Solidisk Real Time Clock")
DEFINE_DEVICE_TYPE(BBC_PMSRTC, bbc_pmsrtc_device, "bbc_pmsrtc", "PMS Genie Real Time Clock")
namespace {
// ======================> bbc_stlrtc_device
class bbc_stlrtc_device : public device_t, public device_bbc_rom_interface
{
public:
bbc_stlrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_STLRTC, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
, m_rtc(*this, "rtc")
{
}
protected:
// device_t overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual void device_start() override ATTR_COLD { }
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
private:
required_device<mc146818_device> m_rtc;
};
// ======================> bbc_pmsrtc_device
class bbc_pmsrtc_device : public device_t, public device_bbc_rom_interface
{
public:
bbc_pmsrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_PMSRTC, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
, m_rtc(*this, "rtc")
{
}
protected:
// device_t overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual void device_start() override ATTR_COLD { }
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
private:
required_device<ds1216e_device> m_rtc;
};
//-------------------------------------------------
@@ -31,45 +80,13 @@ void bbc_stlrtc_device::device_add_mconfig(machine_config &config)
MC146818(config, m_rtc, 32.768_kHz_XTAL); // TODO: verify clock
}
void bbc_pmsrtc_device::device_add_mconfig(machine_config &config)
{
/* Dallas DS1216 SmartWatch ROM */
// Dallas DS1216 SmartWatch ROM
DS1216E(config, m_rtc);
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_stlrtc_device - constructor
//-------------------------------------------------
bbc_stlrtc_device::bbc_stlrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_STLRTC, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
, m_rtc(*this, "rtc")
{
}
bbc_pmsrtc_device::bbc_pmsrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_PMSRTC, tag, owner, clock)
, device_bbc_rom_interface(mconfig, *this)
, m_rtc(*this, "rtc")
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_stlrtc_device::device_start()
{
}
void bbc_pmsrtc_device::device_start()
{
}
//-------------------------------------------------
// read
@@ -103,6 +120,7 @@ uint8_t bbc_stlrtc_device::read(offs_t offset)
return data;
}
uint8_t bbc_pmsrtc_device::read(offs_t offset)
{
uint8_t data = get_rom_base()[offset & 0x1fff];
@@ -114,3 +132,9 @@ uint8_t bbc_pmsrtc_device::read(offs_t offset)
return data;
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(BBC_STLRTC, device_bbc_rom_interface, bbc_stlrtc_device, "bbc_stlrtc", "Solidisk Real Time Clock")
DEFINE_DEVICE_TYPE_PRIVATE(BBC_PMSRTC, device_bbc_rom_interface, bbc_pmsrtc_device, "bbc_pmsrtc", "PMS Genie Real Time Clock")
+2 -60
View File
@@ -1,72 +1,14 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/***************************************************************************
Solidisk Real Time Clock emulation
PMS Genie Watch (RTC for the BBC)
***************************************************************************/
#ifndef MAME_BUS_BBC_ROM_RTC_H
#define MAME_BUS_BBC_ROM_RTC_H
#pragma once
#include "slot.h"
#include "machine/mc146818.h"
#include "machine/ds1215.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_stlrtc_device
class bbc_stlrtc_device : public device_t,
public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_stlrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
private:
required_device<mc146818_device> m_rtc;
};
// ======================> bbc_pmsrtc_device
class bbc_pmsrtc_device : public device_t,
public device_bbc_rom_interface
{
public:
// construction/destruction
bbc_pmsrtc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
// device_bbc_rom_interface overrides
virtual uint8_t read(offs_t offset) override;
private:
required_device<ds1216e_device> m_rtc;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_STLRTC, bbc_stlrtc_device)
DECLARE_DEVICE_TYPE(BBC_PMSRTC, bbc_pmsrtc_device)
DECLARE_DEVICE_TYPE(BBC_STLRTC, device_bbc_rom_interface)
DECLARE_DEVICE_TYPE(BBC_PMSRTC, device_bbc_rom_interface)
#endif // MAME_BUS_BBC_ROM_RTC_H
+27 -10
View File
@@ -123,20 +123,24 @@ std::pair<std::error_condition, std::string> bbc_romslot_device::call_load()
if (size % 0x2000)
return std::make_pair(image_error::INVALIDLENGTH, "Invalid ROM size (must be a multiple of 8K)");
m_cart->rom_alloc(size, tag());
uint8_t *base;
const char *pcb_name = get_feature("slot");
if (pcb_name && !strcmp(pcb_name, "ram"))
{
base = m_cart->get_ram_base();
}
else
{
m_cart->rom_alloc(size, tag());
base = m_cart->get_rom_base();
}
if (!loaded_through_softlist())
fread(m_cart->get_rom_base(), size);
fread(base, size);
else
memcpy(m_cart->get_rom_base(), get_software_region("rom"), size);
memcpy(base, get_software_region("rom"), size);
m_cart->decrypt_rom();
if (get_software_region("ram"))
m_cart->ram_alloc(get_software_region_length("ram"));
if (get_software_region("nvram"))
m_cart->nvram_alloc(get_software_region_length("nvram"));
}
return std::make_pair(std::error_condition(), std::string());
@@ -216,10 +220,23 @@ void bbc_romslot_device::write(offs_t offset, uint8_t data)
#include "rtc.h"
//-------------------------------------------------
// present - rom/ram selected
//-------------------------------------------------
bool bbc_romslot_device::present()
{
if (m_cart && ((m_cart->device().type() == BBC_RAM) || m_cart->device().type() == BBC_NVRAM))
return true;
else
return is_loaded() || loaded_through_softlist();
}
void bbc_rom_devices(device_slot_interface &device)
{
device.option_add("ram", BBC_RAM);
device.option_add_internal("rom", BBC_ROM);
device.option_add_internal("ram", BBC_RAM);
device.option_add_internal("nvram", BBC_NVRAM);
device.option_add_internal("cciword", BBC_CCIWORD);
device.option_add_internal("ccibase", BBC_CCIBASE);
+2 -2
View File
@@ -46,7 +46,7 @@ public:
void set_fixed_ram(bool fixed) { this->set_fixed(fixed); this->set_user_loadable(!fixed); }
virtual bool present() { return is_loaded() || loaded_through_softlist() || !user_loadable(); }
virtual bool present();
uint32_t get_rom_size();
uint32_t get_slot_size() const { return m_slot_size; }
@@ -61,7 +61,7 @@ protected:
uint32_t m_slot_size;
private:
device_bbc_rom_interface* m_cart;
device_bbc_rom_interface *m_cart;
};
// ======================> bbc_romslot16_device
+126
View File
@@ -0,0 +1,126 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
BBC Micro Voice Synthesis Processor slot emulation
This socket is intended to have a TMS5220 fitted as part of the Acorn
Speech System upgrade, but Cheetah provided a cheaper speech solution
using a SP0256 that fitted a board into this socket.
**********************************************************************/
#include "emu.h"
#include "slot.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_VSP_SLOT, bbc_vsp_slot_device, "bbc_vsp_slot", "BBC Micro Voice Synthesis Processor slot")
//**************************************************************************
// DEVICE BBC_VSP CARD INTERFACE
//**************************************************************************
//-------------------------------------------------
// device_bbc_vsp_interface - constructor
//-------------------------------------------------
device_bbc_vsp_interface::device_bbc_vsp_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "bbcvsp")
, m_slot(dynamic_cast<bbc_vsp_slot_device *>(device.owner()))
{
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_vsp_slot_device - constructor
//-------------------------------------------------
bbc_vsp_slot_device::bbc_vsp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_VSP_SLOT, tag, owner, clock)
, device_single_card_slot_interface<device_bbc_vsp_interface>(mconfig, *this)
, device_mixer_interface(mconfig, *this)
, m_vsm(*this, finder_base::DUMMY_TAG)
, m_card(nullptr)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_vsp_slot_device::device_start()
{
m_card = get_card_device();
}
//-------------------------------------------------
// read
//-------------------------------------------------
uint8_t bbc_vsp_slot_device::read()
{
if (m_card)
return m_card->read();
else
return 0x00;
}
int bbc_vsp_slot_device::readyq_r()
{
if (m_card)
return m_card->readyq_r();
else
return 1;
}
int bbc_vsp_slot_device::intq_r()
{
if (m_card)
return m_card->intq_r();
else
return 1;
}
//-------------------------------------------------
// write
//-------------------------------------------------
void bbc_vsp_slot_device::write(uint8_t data)
{
if (m_card)
m_card->write(data);
}
void bbc_vsp_slot_device::combined_rsq_wsq_w(uint8_t data)
{
if (m_card)
m_card->combined_rsq_wsq_w(data);
}
//-------------------------------------------------
// SLOT_INTERFACE( bbc_vsp_devices )
//-------------------------------------------------
// slot devices
#include "speech.h"
#include "sweetalker.h"
void bbc_vsp_devices(device_slot_interface &device)
{
device.option_add("speech", BBC_SPEECH);
device.option_add("sweetalker", BBC_SWEETALKER);
}
+86
View File
@@ -0,0 +1,86 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
BBC Micro Voice Synthesis Processor slot emulation
**********************************************************************/
#ifndef MAME_BUS_BBC_VSP_SLOT_H
#define MAME_BUS_BBC_VSP_SLOT_H
#pragma once
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> bbc_vsp_slot_device
class device_bbc_vsp_interface;
class bbc_vsp_slot_device : public device_t, public device_single_card_slot_interface<device_bbc_vsp_interface>, public device_mixer_interface
{
public:
// construction/destruction
template <typename T>
bbc_vsp_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
: bbc_vsp_slot_device(mconfig, tag, owner)
{
option_reset();
slot_options(*this);
set_default_option(default_option);
set_fixed(false);
}
bbc_vsp_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
template <class Object> void set_vsm_region(Object &&tag) { m_vsm.set_tag(std::forward<Object>(tag)); }
virtual void combined_rsq_wsq_w(uint8_t data);
virtual uint8_t read();
virtual void write(uint8_t data);
int readyq_r();
int intq_r();
memory_region &vsm() const { return *m_vsm; }
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD;
required_memory_region m_vsm;
device_bbc_vsp_interface *m_card;
};
// ======================> device_bbc_vsp_interface
class device_bbc_vsp_interface : public device_interface
{
public:
virtual void combined_rsq_wsq_w(uint8_t data) { };
virtual uint8_t read() { return 0x00; }
virtual void write(uint8_t data) { }
virtual int readyq_r() { return 1; }
virtual int intq_r() { return 1; }
protected:
device_bbc_vsp_interface(const machine_config &mconfig, device_t &device);
bbc_vsp_slot_device *const m_slot;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_VSP_SLOT, bbc_vsp_slot_device)
void bbc_vsp_devices(device_slot_interface &device);
#endif // MAME_BUS_BBC_VSP_SLOT_H
+132
View File
@@ -0,0 +1,132 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Acorn Speech System
**********************************************************************/
#include "emu.h"
#include "speech.h"
#include "bus/generic/slot.h"
#include "bus/generic/carts.h"
#include "machine/tms6100.h"
#include "sound/tms5220.h"
namespace {
class bbc_speech_device : public device_t, public device_bbc_vsp_interface
{
public:
bbc_speech_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_SPEECH, tag, owner, clock)
, device_bbc_vsp_interface(mconfig, *this)
, m_vsp(*this, "vsp")
{
}
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void combined_rsq_wsq_w(uint8_t data) override { m_vsp->combined_rsq_wsq_w(data); }
virtual uint8_t read() override { return m_vsp->status_r(); }
virtual void write(uint8_t data) override { m_vsp->data_w(data); }
virtual int readyq_r() override { return m_vsp->readyq_r(); }
virtual int intq_r() override { return m_vsp->intq_r(); }
private:
required_device<tms5220_device> m_vsp;
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(load_phrom);
};
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
ROM_START( speech )
ROM_REGION(0x40000, "vsm", ROMREGION_ERASE00)
ROM_END
const tiny_rom_entry *bbc_speech_device::device_rom_region() const
{
return ROM_NAME( speech );
}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_speech_device::device_add_mconfig(machine_config &config)
{
TMS5220(config, m_vsp, 640000);
m_vsp->add_route(ALL_OUTPUTS, DEVICE_SELF_OWNER, 0.5);
TMS6100(config, "vsm", 0);
m_vsp->m0_cb().set("vsm", FUNC(tms6100_device::m0_w));
m_vsp->m1_cb().set("vsm", FUNC(tms6100_device::m1_w));
m_vsp->addr_cb().set("vsm", FUNC(tms6100_device::add_w));
m_vsp->data_cb().set("vsm", FUNC(tms6100_device::data_line_r));
m_vsp->romclk_cb().set("vsm", FUNC(tms6100_device::clk_w));
GENERIC_SOCKET(config, "phrom", generic_plain_slot, "bbc_vsm", "bin,rom").set_device_load(FUNC(bbc_speech_device::load_phrom));
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_speech_device::device_start()
{
// copy vsm region from machine to TMS6100 device region
memcpy(memregion("vsm")->base(), m_slot->vsm().base(), 0x40000);
}
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
DEVICE_IMAGE_LOAD_MEMBER(bbc_speech_device::load_phrom)
{
offs_t size;
if (!image.loaded_through_softlist())
size = image.length();
else
size = image.get_software_region_length("rom");
if (size < 0x1000 || size > 0x4000 || (size & (size - 1)) != 0)
return std::make_pair(image_error::INVALIDLENGTH, "Invalid PHROM size");
uint8_t *vsm = memregion("vsm")->base();
if (image.loaded_through_softlist())
{
int bank = strtol(image.get_feature("bank"), nullptr, 0);
if (bank < 0 || bank > 15)
bank = 0;
memcpy(vsm + (bank * 0x4000), image.get_software_region("rom"), size);
}
else
{
image.fread(vsm, size);
}
return std::make_pair(std::error_condition(), std::string());
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(BBC_SPEECH, device_bbc_vsp_interface, bbc_speech_device, "bbc_speech", "Acorn Speech System")
+13
View File
@@ -0,0 +1,13 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
#ifndef MAME_BUS_BBC_VSP_SPEECH_H
#define MAME_BUS_BBC_VSP_SPEECH_H
#pragma once
#include "slot.h"
DECLARE_DEVICE_TYPE(BBC_SPEECH, device_bbc_vsp_interface)
#endif // MAME_BUS_BBC_VSP_SPEECH_H
+71
View File
@@ -0,0 +1,71 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Cheetah Sweet Talker
**********************************************************************/
#include "emu.h"
#include "sweetalker.h"
#include "sound/sp0256.h"
namespace {
class bbc_sweetalker_device : public device_t, public device_bbc_vsp_interface
{
public:
bbc_sweetalker_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_SWEETALKER, tag, owner, clock)
, device_bbc_vsp_interface(mconfig, *this)
, m_nsp(*this, "sp0256")
{
}
protected:
// device_t overrides
virtual void device_start() override ATTR_COLD { }
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void write(uint8_t data) override { m_nsp->ald_w(data & 0x3f); }
virtual int intq_r() override { return m_nsp->sby_r(); }
private:
required_device<sp0256_device> m_nsp;
};
///-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
ROM_START( sweetalker )
ROM_REGION(0x10000, "sp0256", 0)
ROM_LOAD("sp0256a-al2.bin", 0x1000, 0x0800, CRC(b504ac15) SHA1(e60fcb5fa16ff3f3b69d36c7a6e955744d3feafc))
ROM_END
const tiny_rom_entry *bbc_sweetalker_device::device_rom_region() const
{
return ROM_NAME( sweetalker );
}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_sweetalker_device::device_add_mconfig(machine_config &config)
{
SP0256(config, m_nsp, 3.2768_MHz_XTAL);
m_nsp->add_route(ALL_OUTPUTS, DEVICE_SELF_OWNER, 1.00);
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(BBC_SWEETALKER, device_bbc_vsp_interface, bbc_sweetalker_device, "bbc_sweetalker", "Cheetah Sweet Talker (BBC)")
+13
View File
@@ -0,0 +1,13 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
#ifndef MAME_BUS_BBC_VSP_SWEETALKER_H
#define MAME_BUS_BBC_VSP_SWEETALKER_H
#pragma once
#include "slot.h"
DECLARE_DEVICE_TYPE(BBC_SWEETALKER, device_bbc_vsp_interface)
#endif // MAME_BUS_BBC_VSP_SWEETALKER_H
+2
View File
@@ -132,6 +132,7 @@ device_centronics_peripheral_interface::~device_centronics_peripheral_interface(
#include "chessmec.h"
#include "smartboard.h"
#include "nlq401.h"
#include "mz1p16.h"
void centronics_devices(device_slot_interface &device)
{
@@ -153,4 +154,5 @@ void centronics_devices(device_slot_interface &device)
device.option_add("chessmec", CENTRONICS_CHESSMEC);
device.option_add("smartboard", CENTRONICS_SMARTBOARD);
device.option_add("nlq401", NLQ401);
device.option_add("mz1p16", MZ1P16);
}
+226
View File
@@ -0,0 +1,226 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/**********************************************************************
Sharp MZ-1P16 4-color plot printer (skeleton)
This printer was sold for use with the Sharp MZ-800.
**********************************************************************/
#include "emu.h"
#include "mz1p16.h"
#include "cpu/mcs48/mcs48.h"
//**************************************************************************
// DEVICE DEFINITION
//**************************************************************************
// device type definition
DEFINE_DEVICE_TYPE(MZ1P16, mz1p16_device, "mz1p16", "Sharp MZ-1P16 Plotter Printer")
//-------------------------------------------------
// mz1p16_device - constructor
//-------------------------------------------------
mz1p16_device::mz1p16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MZ1P16, tag, owner, clock)
, device_centronics_peripheral_interface(mconfig, *this)
, m_mcu(*this, "mcu")
, m_buffer(*this, "buffer")
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void mz1p16_device::device_start()
{
}
//-------------------------------------------------
// input_data0 - RD1 line handler
//-------------------------------------------------
void mz1p16_device::input_data0(int state)
{
m_buffer->write_bit0(state);
}
//-------------------------------------------------
// input_data1 - RD2 line handler
//-------------------------------------------------
void mz1p16_device::input_data1(int state)
{
m_buffer->write_bit1(state);
}
//-------------------------------------------------
// input_data2 - RD3 line handler
//-------------------------------------------------
void mz1p16_device::input_data2(int state)
{
m_buffer->write_bit2(state);
}
//-------------------------------------------------
// input_data3 - RD4 line handler
//-------------------------------------------------
void mz1p16_device::input_data3(int state)
{
m_buffer->write_bit3(state);
}
//-------------------------------------------------
// input_data4 - RD5 line handler
//-------------------------------------------------
void mz1p16_device::input_data4(int state)
{
m_buffer->write_bit4(state);
}
//-------------------------------------------------
// input_data5 - RD6 line handler
//-------------------------------------------------
void mz1p16_device::input_data5(int state)
{
m_buffer->write_bit5(state);
}
//-------------------------------------------------
// input_data6 - RD7 line handler
//-------------------------------------------------
void mz1p16_device::input_data6(int state)
{
m_buffer->write_bit6(state);
}
//-------------------------------------------------
// input_data7 - RD8 line handler
//-------------------------------------------------
void mz1p16_device::input_data7(int state)
{
m_buffer->write_bit7(state);
}
//-------------------------------------------------
// input_strobe - RDP line handler
//-------------------------------------------------
void mz1p16_device::input_strobe(int state)
{
m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? ASSERT_LINE : CLEAR_LINE);
}
//-------------------------------------------------
// input_init - IRT line handler
//-------------------------------------------------
void mz1p16_device::input_init(int state)
{
m_mcu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE);
}
//-------------------------------------------------
// xy_step_w - set X and Y stepper motor outputs
//-------------------------------------------------
void mz1p16_device::xy_step_w(u8 data)
{
// TODO
}
//-------------------------------------------------
// control_w - set miscellaneous control outputs
//-------------------------------------------------
void mz1p16_device::control_w(u8 data)
{
// P14 = /RDA (ready to receive)
output_busy(BIT(data, 4));
// P17 = /STA (status check)
output_busy(BIT(data, 7));
}
//-------------------------------------------------
// device_add_mconfig - device-specific config
//-------------------------------------------------
void mz1p16_device::device_add_mconfig(machine_config &config)
{
mcs48_cpu_device &mcu(I8050(config, m_mcu, 6_MHz_XTAL));
mcu.bus_out_cb().set(FUNC(mz1p16_device::xy_step_w));
mcu.p1_out_cb().set(FUNC(mz1p16_device::control_w));
mcu.p2_in_cb().set(m_buffer, FUNC(input_buffer_device::read));
mcu.t0_in_cb().set_ioport("KEYSW").bit(0);
mcu.t1_in_cb().set_ioport("KEYSW").bit(1);
INPUT_BUFFER(config, m_buffer);
}
//**************************************************************************
// INPUT PORTS
//**************************************************************************
//-------------------------------------------------
// reset_sw_w - handle local reset button
//-------------------------------------------------
void mz1p16_device::reset_sw_w(int state)
{
// TODO
}
static INPUT_PORTS_START(mz1p16)
PORT_START("KEYSW")
PORT_BIT(1, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Pen Change")
PORT_BIT(2, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Paper Feed")
PORT_BIT(4, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Reset") PORT_WRITE_LINE_MEMBER(FUNC(mz1p16_device::reset_sw_w))
INPUT_PORTS_END
//-------------------------------------------------
// device_input_ports - device-specific ports
//-------------------------------------------------
ioport_constructor mz1p16_device::device_input_ports() const
{
return INPUT_PORTS_NAME(mz1p16);
}
//**************************************************************************
// ROM DEFINITION
//**************************************************************************
ROM_START(mz1p16)
ROM_REGION(0x1000, "mcu", 0)
ROM_LOAD("m5m8050h-059p.ic1", 0x0000, 0x1000, CRC(beb12a84) SHA1(2e059c2f7d653294c77fe8e1a37436b4c028e122))
ROM_END
//-------------------------------------------------
// device_rom_region - device-specific ROM region
//-------------------------------------------------
const tiny_rom_entry *mz1p16_device::device_rom_region() const
{
return ROM_NAME(mz1p16);
}
+60
View File
@@ -0,0 +1,60 @@
// license:BSD-3-Clause
// copyright-holders:AJR
#ifndef MAME_BUS_CENTRONICS_MZ1P16_H
#define MAME_BUS_CENTRONICS_MZ1P16_H
#pragma once
#include "ctronics.h"
#include "machine/buffer.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> mz1p16_device
class mz1p16_device : public device_t, public device_centronics_peripheral_interface
{
public:
// device type constructor
mz1p16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
static constexpr feature_type unemulated_features() { return feature::PRINTER; }
void reset_sw_w(int state);
protected:
// device_t implementation
virtual void device_start() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
// device_centronics_peripheral_interface implementation
virtual void input_data0(int state) override;
virtual void input_data1(int state) override;
virtual void input_data2(int state) override;
virtual void input_data3(int state) override;
virtual void input_data4(int state) override;
virtual void input_data5(int state) override;
virtual void input_data6(int state) override;
virtual void input_data7(int state) override;
virtual void input_strobe(int state) override;
virtual void input_init(int state) override;
virtual bool supports_pin35_5v() override { return false; }
private:
void xy_step_w(u8 data);
void control_w(u8 data);
required_device<cpu_device> m_mcu;
required_device<input_buffer_device> m_buffer;
};
// device type declaration
DECLARE_DEVICE_TYPE(MZ1P16, mz1p16_device)
#endif // MAME_BUS_CENTRONICS_MZ1P16_H
+1 -1
View File
@@ -888,7 +888,7 @@ static INPUT_PORTS_START( gp19 )
PORT_DIPSETTING( 0x01, "CR")
PORT_DIPSETTING( 0x02, DEF_STR( None ) )
PORT_DIPSETTING( 0x03, "CR,EOT")
PORT_DIPNAME( 0x04, 0x01, "Shift Key") PORT_DIPLOCATION("SW1:3")
PORT_DIPNAME( 0x04, 0x00, "Shift Key") PORT_DIPLOCATION("SW1:3")
PORT_DIPSETTING( 0x00, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x04, "Shift key inverts CAPS LOCK")
PORT_DIPNAME( 0x08, 0x00, "Terminal Transmission Rate") PORT_DIPLOCATION("SW1:4")
+43
View File
@@ -0,0 +1,43 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
Cards for the H8 Benton Harbor Bus
***************************************************************************/
#include "emu.h"
#include "cards.h"
#include "cpu8080.h"
#include "front_panel.h"
#include "h8bus.h"
#include "h_8_1.h"
#include "h_8_5.h"
#include "wh_8_64.h"
// P1 is reserved for the Front Panel
void h8_p1_cards(device_slot_interface &device)
{
device.option_add("fp", H8BUS_FRONT_PANEL);
}
// P2 is reserved for the CPU board.
void h8_p2_cards(device_slot_interface &device)
{
device.option_add("cpu8080", H8BUS_CPU_8080);
}
// P10 is reserved for the HA-8-8 Extended Configuration Option card, which is
// required to run CP/M with the 8080 CPU board.
// TODO - add the HA-8-8
void h8_p10_cards(device_slot_interface &device)
{
}
void h8_cards(device_slot_interface &device)
{
device.option_add("h_8_1", H8BUS_H_8_1);
device.option_add("h_8_5", H8BUS_H_8_5);
device.option_add("wh_8_64", H8BUS_WH_8_64);
}
+19
View File
@@ -0,0 +1,19 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
Cards for the Heath H8 Benton Harbor Bus
***************************************************************************/
#ifndef MAME_BUS_HEATHZENITH_H8_CARDS_H
#define MAME_BUS_HEATHZENITH_H8_CARDS_H
#pragma once
void h8_p1_cards(device_slot_interface &device) ATTR_COLD;
void h8_p2_cards(device_slot_interface &device) ATTR_COLD;
void h8_p10_cards(device_slot_interface &device) ATTR_COLD;
void h8_cards(device_slot_interface &device) ATTR_COLD;
#endif // MAME_BUS_HEATHZENITH_H8_CARDS_H
+350
View File
@@ -0,0 +1,350 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
Heathkit 8080A CPU card
Original 8080A 2.048MHz CPU board from Heath Company.
Onboard Jumpers
Label Default Emulated Description (if jumper is closed)
-------------------------------------------------------------------------
B1-B2 Open Yes Allow /INT1 (INT 10) from the BH Bus (pin 8).
C1-C2 Open Yes Allow /INT2 (Int 20) from the BH Bus (pin 9).
E1-E2 Close No Allow inverted signal from J jumper to HOLD/HLDA on BH Bus (pin 25)
F1-F2 Close No Allow /HOLD from the BH Bus (pin 27) to CPU Hold line.
H1-H3 Open No Tie Ready-in from IC212 Generator to CPU Wait line
H2-H3 Close No Tie Ready-in from IC212 Generator to CPU Ready line
J1-J2 Close No CPU HLDA out through flip-flop, use /Q output to E jumper
J2-J3 Open No CPU HLDA out through flip-flop, use Q output to E jumper
K1-K2 Close No Affects Data-in/out buffers enabled signals based on /MEMR & /IOR signals
K1-K3 Open No Affects Data-in/out buffers enabled signals based on /MEMR & /IOR signals
L1-L2 Close No Tie CPU /INTA to interrupt buffer
L2-L3 Open No Tie CPU /INTA to +12V
P1-P2 Open No A10 to pin 19 of IC204 ROM
P2-P3 Close No R jumper to pin 19 of IC204 ROM
R1-R2 Close No +12V selected
R2-R3 Open No S jumper selection selected
S1-S2 Open No +5V selected
S2-S3 Close No GND selected
T1-T2 Close No -5V to pin 21 of IC204 ROM
T2-T3 Open No +5V to pin 21 of IC204 ROM
X1-X2 Open No Allow /ROM_Disable from BH bus (pin 46) to disable ROM
Z1-Z2 Close No Tie /A10 to ROM decoder select line
Z2-Z3 Open No Tie +5V to ROM decoder select line
RDYIN Close No Allow RDYIN from BH Bus (pin 20) to IC212 Generator
****************************************************************************/
#include "emu.h"
#include "cpu8080.h"
#include "bus/heathzenith/intr_cntrl/intr_cntrl.h"
#include "cpu/i8085/i8085.h"
namespace {
class h_8_cpu_8080_device : public device_t, public device_h8bus_card_interface, public device_p201_p2_card_interface
{
public:
h_8_cpu_8080_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
virtual void int1_w(int state) override;
virtual void int2_w(int state) override;
virtual void int3_w(int state) override;
virtual void int4_w(int state) override;
virtual void int5_w(int state) override;
virtual void int6_w(int state) override;
virtual void int7_w(int state) override;
virtual void p201_reset_w(int state) override;
virtual void p201_int1_w(int state) override;
virtual void p201_int2_w(int state) override;
protected:
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
void handle_int1();
void handle_int2();
private:
void h8_status_callback(u8 data);
void h8_inte_callback(int state);
void mem_map(address_map &map) ATTR_COLD;
void io_map(address_map &map) ATTR_COLD;
void bus_mem_w(offs_t offset, u8 data) { m_mem.write_byte(offset, data); }
u8 bus_mem_r(offs_t offset) { return m_mem.read_byte(offset); }
void bus_io_w(offs_t offset, u8 data) { m_io.write_byte(offset, data); }
u8 bus_io_r(offs_t offset) { return m_io.read_byte(offset); }
required_device<i8080_cpu_device> m_maincpu;
required_device<heath_intr_socket> m_intr_socket;
required_ioport m_config;
memory_access<16, 0, 0, ENDIANNESS_LITTLE>::specific m_mem;
memory_access<8, 0, 0, ENDIANNESS_LITTLE>::specific m_io;
bool m_m1_state;
bool m_allow_bus_int1;
bool m_allow_bus_int2;
bool m_p201_int1;
bool m_p201_int2;
bool m_bus_int1;
bool m_bus_int2;
};
h_8_cpu_8080_device::h_8_cpu_8080_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, H8BUS_CPU_8080, tag, owner, 0)
, device_h8bus_card_interface(mconfig, *this)
, device_p201_p2_card_interface(*this, tag)
, m_maincpu(*this, "maincpu")
, m_intr_socket(*this, "intr_socket")
, m_config(*this, "CONFIG")
{
}
void h_8_cpu_8080_device::h8_inte_callback(int state)
{
m_p201_inte(state);
}
void h_8_cpu_8080_device::h8_status_callback(u8 data)
{
int state = (data & i8080_cpu_device::STATUS_M1) ? 1 : 0;
if (state != m_m1_state)
{
set_slot_m1(state);
m_m1_state = state;
}
}
void h_8_cpu_8080_device::int1_w(int state)
{
if (m_allow_bus_int1)
{
m_bus_int1 = bool(state);
handle_int1();
}
}
void h_8_cpu_8080_device::int2_w(int state)
{
if (m_allow_bus_int2)
{
m_bus_int2 = bool(state);
handle_int2();
}
}
void h_8_cpu_8080_device::int3_w(int state)
{
m_intr_socket->set_irq_level(3, state);
}
void h_8_cpu_8080_device::int4_w(int state)
{
m_intr_socket->set_irq_level(4, state);
}
void h_8_cpu_8080_device::int5_w(int state)
{
m_intr_socket->set_irq_level(5, state);
}
void h_8_cpu_8080_device::int6_w(int state)
{
m_intr_socket->set_irq_level(6, state);
}
void h_8_cpu_8080_device::int7_w(int state)
{
m_intr_socket->set_irq_level(7, state);
}
void h_8_cpu_8080_device::p201_reset_w(int state)
{
if (state)
{
m_maincpu->reset();
}
set_slot_reset(state);
}
void h_8_cpu_8080_device::p201_int1_w(int state)
{
m_p201_int1 = bool(state);
handle_int1();
}
void h_8_cpu_8080_device::p201_int2_w(int state)
{
m_p201_int2 = bool(state);
handle_int2();
}
void h_8_cpu_8080_device::handle_int1()
{
m_intr_socket->set_irq_level(1, (m_p201_int1 || m_bus_int1) ? ASSERT_LINE : CLEAR_LINE);
}
void h_8_cpu_8080_device::handle_int2()
{
m_intr_socket->set_irq_level(2, (m_p201_int2 || m_bus_int2) ? ASSERT_LINE : CLEAR_LINE);
}
static void intr_ctrl_options(device_slot_interface &device)
{
device.option_add("original", HEATH_INTR_CNTRL);
}
void h_8_cpu_8080_device::mem_map(address_map &map)
{
map.unmap_value_high();
// default mem access to h8bus
map(0x0000, 0xffff).rw(FUNC(h_8_cpu_8080_device::bus_mem_r), FUNC(h_8_cpu_8080_device::bus_mem_w));
// main rom
map(0x0000, 0x0fff).rom().region("maincpu", 0).unmapw();
}
void h_8_cpu_8080_device::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
// default io access to h8bus
map(0x0000, 0xff).rw(FUNC(h_8_cpu_8080_device::bus_io_r), FUNC(h_8_cpu_8080_device::bus_io_w));
}
// ROM definition
ROM_START( h8 )
ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASEFF )
// H17 fdc bios - needed by bios2&3 this is on a separate card, keeping it documented here until that
// card is implemented.
//ROM_LOAD( "2716_444-19_h17.rom", 0x1800, 0x0800, CRC(26e80ae3) SHA1(0c0ee95d7cb1a760f924769e10c0db1678f2435c))
ROM_SYSTEM_BIOS(0, "bios0", "Standard")
ROMX_LOAD( "2708_444-13_pam8.rom", 0x0000, 0x0400, CRC(e0745513) SHA1(0e170077b6086be4e5cd10c17e012c0647688c39), ROM_BIOS(0) )
ROM_SYSTEM_BIOS(1, "bios1", "Alternate")
ROMX_LOAD( "2708_444-13_pam8go.rom", 0x0000, 0x0400, CRC(9dbad129) SHA1(72421102b881706877f50537625fc2ab0b507752), ROM_BIOS(1) )
ROM_SYSTEM_BIOS(2, "bios2", "Disk OS")
ROMX_LOAD( "2716_444-13_pam8at.rom", 0x0000, 0x0800, CRC(fd95ddc1) SHA1(eb1f272439877239f745521139402f654e5403af), ROM_BIOS(2) )
ROM_SYSTEM_BIOS(3, "bios3", "Disk OS Alt")
ROMX_LOAD( "2732_444-70_xcon8.rom", 0x0000, 0x1000, CRC(b04368f4) SHA1(965244277a3a8039a987e4c3593b52196e39b7e7), ROM_BIOS(3) )
// this one runs off into the weeds, because it is for the HA-8-6 Z-80 replacement CPU card, keeping it documented here, until
// that card is implemented.
// ROM_SYSTEM_BIOS(4, "bios4", "not working")
// ROMX_LOAD( "2732_444-140_pam37.rom", 0x0000, 0x1000, CRC(53a540db) SHA1(90082d02ffb1d27e8172b11fff465bd24343486e), ROM_BIOS(4) )
ROM_END
static INPUT_PORTS_START( cpu_8080_jumpers )
PORT_START("CONFIG")
PORT_CONFNAME(0x01, 0x00, "Allow INT1 signal on BH Bus - Jumper B1-B2")
PORT_CONFSETTING( 0x00, DEF_STR( No ))
PORT_CONFSETTING( 0x01, DEF_STR( Yes ))
PORT_CONFNAME(0x02, 0x00, "Allow INT2 signal on BH Bus - Jumper C1-C2")
PORT_CONFSETTING( 0x00, DEF_STR( No ))
PORT_CONFSETTING( 0x02, DEF_STR( Yes ))
INPUT_PORTS_END
ioport_constructor h_8_cpu_8080_device::device_input_ports() const
{
return INPUT_PORTS_NAME(cpu_8080_jumpers);
}
const tiny_rom_entry *h_8_cpu_8080_device::device_rom_region() const
{
return ROM_NAME(h8);
}
void h_8_cpu_8080_device::device_start()
{
save_item(NAME(m_m1_state));
save_item(NAME(m_p201_int1));
save_item(NAME(m_p201_int2));
save_item(NAME(m_bus_int1));
save_item(NAME(m_bus_int2));
h8bus().space(AS_PROGRAM).specific(m_mem);
h8bus().space(AS_IO).specific(m_io);
h8bus().set_clock(m_maincpu->clock());
}
void h_8_cpu_8080_device::device_reset()
{
m_m1_state = false;
m_p201_int1 = false;
m_p201_int2 = false;
m_bus_int1 = false;
m_bus_int2 = false;
ioport_value const config(m_config->read());
m_allow_bus_int1 = bool(BIT(config, 0));
m_allow_bus_int2 = bool(BIT(config, 1));
}
void h_8_cpu_8080_device::device_add_mconfig(machine_config &config)
{
constexpr XTAL H8_CLOCK = XTAL(18'432'000) / 9; // 2.048 MHz
I8080(config, m_maincpu, H8_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &h_8_cpu_8080_device::mem_map);
m_maincpu->set_addrmap(AS_IO, &h_8_cpu_8080_device::io_map);
m_maincpu->out_status_func().set(FUNC(h_8_cpu_8080_device::h8_status_callback));
m_maincpu->out_inte_func().set(FUNC(h_8_cpu_8080_device::h8_inte_callback));
m_maincpu->set_irq_acknowledge_callback(m_intr_socket, FUNC(heath_intr_socket::irq_callback));
HEATH_INTR_SOCKET(config, m_intr_socket, intr_ctrl_options, nullptr);
m_intr_socket->irq_line_cb().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
m_intr_socket->set_default_option("original");
m_intr_socket->set_fixed(true);
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(H8BUS_CPU_8080, device_h8bus_card_interface, h_8_cpu_8080_device, "h8_cpu_8080", "Heath 8080A CPU board");
+12
View File
@@ -0,0 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
#ifndef MAME_BUS_HEATHZENITH_H8_CPU8080_H
#define MAME_BUS_HEATHZENITH_H8_CPU8080_H
#pragma once
#include "h8bus.h"
DECLARE_DEVICE_TYPE(H8BUS_CPU_8080, device_h8bus_card_interface)
#endif // MAME_BUS_HEATHZENITH_H8_CPU8080_H
@@ -0,0 +1,351 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
Heathkit H8 Front Panel card
****************************************************************************/
#include "emu.h"
#include "front_panel.h"
#include "machine/timer.h"
#include "sound/beep.h"
#include "speaker.h"
#include "h8_fp.lh"
#define LOG_PORT_W (1U << 1)
#define LOG_PORT_R (1U << 2)
#define LOG_SS (1U << 3)
//#define VERBOSE (LOG_SS)
#include "logmacro.h"
#define LOGPORTW(...) LOGMASKED(LOG_PORT_W, __VA_ARGS__)
#define LOGPORTR(...) LOGMASKED(LOG_PORT_R, __VA_ARGS__)
#define LOGSS(...) LOGMASKED(LOG_SS, __VA_ARGS__)
#ifdef _MSC_VER
#define FUNCNAME __func__
#else
#define FUNCNAME __PRETTY_FUNCTION__
#endif
class front_panel_device : public device_t, public device_h8bus_card_interface, public device_p201_p1_card_interface
{
public:
front_panel_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
virtual void m1_w(int state) override;
virtual void p201_inte_w(int state) override;
DECLARE_INPUT_CHANGED_MEMBER(button_0);
protected:
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
u8 portf0_r();
void portf0_w(u8 data);
void portf1_w(u8 data);
TIMER_DEVICE_CALLBACK_MEMBER(h8_irq_pulse);
bool m_installed;
u8 m_digit;
u8 m_segment;
u8 m_int_en;
bool m_ic108a;
bool m_ic108b;
bool m_allow_int1;
bool m_allow_int2;
required_device<beep_device> m_beep;
required_ioport_array<2> m_io_keyboard;
output_finder<16> m_digits;
output_finder<> m_mon_led;
output_finder<> m_pwr_led;
output_finder<> m_ion_led;
output_finder<> m_run_led;
};
front_panel_device::front_panel_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, H8BUS_FRONT_PANEL, tag, owner, 0)
, device_h8bus_card_interface(mconfig, *this)
, device_p201_p1_card_interface(*this, tag)
, m_beep(*this, "beeper")
, m_io_keyboard(*this, "X%u", 0U)
, m_digits(*this, "digit%u", 0U)
, m_mon_led(*this, "mon_led")
, m_pwr_led(*this, "pwr_led")
, m_ion_led(*this, "ion_led")
, m_run_led(*this, "run_led")
{
}
void front_panel_device::m1_w(int state)
{
// operate the RUN LED
m_run_led = !state;
// For Single Instruction(SI) mode, there are 2 D flipflops, ic108a and ic108b. Both are held in
// set mode while not in SI mode. The data for ic108a is /INTE and ic108a Q is connected to data on
// ic108b. Both use /M1 for the clock. When the system is in SI mode, an int20 will trigger after
// after 2 M1 cycles, to pause the running program.
if (m_allow_int2)
{
LOGSS("%s: m_int_en: %d, state: %d\n", FUNCNAME, m_int_en, state);
if (state)
{
m_ic108b = !m_ic108a;
m_ic108a = !m_int_en;
if (m_ic108b)
{
m_p201_int2(ASSERT_LINE);
}
}
}
}
void front_panel_device::p201_inte_w(int state)
{
// Operate the ION LED
m_ion_led = !state;
m_int_en = bool(state);
}
u8 front_panel_device::portf0_r()
{
u8 data = 0xff;
// reads the keyboard
u8 keyin = m_io_keyboard[0]->read() ^ 0xff;
if (keyin)
{
for (int i = 1; i < 8; i++)
{
if (BIT(keyin, i))
{
data &= ~(i << 1);
}
}
data &= 0xfe;
}
keyin = m_io_keyboard[1]->read() ^ 0xff;
if (keyin)
{
for (int i = 1; i < 8; i++)
{
if (BIT(keyin, i))
{
data &= ~(i << 5);
}
}
data &= 0xef;
}
LOGPORTR("%s: val: 0x%02x\n", FUNCNAME, data);
return data;
}
void front_panel_device::portf0_w(u8 data)
{
// bit description
// ----------------------
// d0-d3 digit selected
// d4 inhibit int20
// d5 mon led
// d6 allow int10
// d7 beeper on
LOGPORTW("%s: val: 0x%02x\n", FUNCNAME, data);
// writes to this port always turn off int10
m_p201_int1(CLEAR_LINE);
m_digit = data & 0xf;
if (m_digit)
{
m_digits[m_digit] = m_segment;
}
m_mon_led = !BIT(data, 5);
m_beep->set_state(!BIT(data, 7));
m_allow_int1 = BIT(data, 6);
// Setup Single Instruction interrupt
bool old_allow_int2 = m_allow_int2;
m_allow_int2 = bool(!BIT(data, 4));
if (old_allow_int2 != m_allow_int2)
{
LOGSS("%s: value changed: oldval: %d, allow_int2: %d\n", FUNCNAME, old_allow_int2, m_allow_int2);
if (!m_allow_int2)
{
m_ic108a = true;
m_ic108b = false;
m_p201_int2(CLEAR_LINE);
}
}
}
void front_panel_device::portf1_w(u8 data)
{
// bit segment
// --------------
// d7 dot
// d6 f
// d5 e
// d4 d
// d3 c
// d2 b
// d1 a
// d0 g
LOGPORTW("%s: val: 0x%02x\n", FUNCNAME, data);
m_segment = bitswap<8>(data, 7, 0, 6, 5, 4, 3, 2, 1) ^ 0xff;
if (m_digit)
{
m_digits[m_digit] = m_segment;
}
}
// Input ports
static INPUT_PORTS_START( h8 )
PORT_START("X0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(front_panel_device::button_0), 0)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("1 SP") PORT_CODE(KEYCODE_1) PORT_CHAR('1')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("2 AF") PORT_CODE(KEYCODE_2) PORT_CHAR('2')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("3 BC") PORT_CODE(KEYCODE_3) PORT_CHAR('3')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("4 DE GO") PORT_CODE(KEYCODE_4) PORT_CHAR('4')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("5 HL IN") PORT_CODE(KEYCODE_5) PORT_CHAR('5')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("6 PC OUT") PORT_CODE(KEYCODE_6) PORT_CHAR('6')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("7 SI") PORT_CODE(KEYCODE_7) PORT_CHAR('7')
PORT_START("X1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("8 LOAD") PORT_CODE(KEYCODE_8) PORT_CHAR('8')
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("9 DUMP") PORT_CODE(KEYCODE_9) PORT_CHAR('9')
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("+") PORT_CODE(KEYCODE_UP) PORT_CHAR('^')
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("-") PORT_CODE(KEYCODE_DOWN) PORT_CHAR('V')
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("* CANCEL") PORT_CODE(KEYCODE_ESC) PORT_CHAR('Q')
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("/ ALTER RST") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=')
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("# MEM RTM") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(". REG") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
INPUT_PORTS_END
INPUT_CHANGED_MEMBER(front_panel_device::button_0)
{
if (newval)
{
u8 data = m_io_keyboard[1]->read() ^ 0xff;
if (BIT(data, 5))
{
m_p201_reset(ASSERT_LINE);
}
else if (BIT(data, 6))
{
m_p201_int1(ASSERT_LINE);
}
else
{
m_p201_reset(CLEAR_LINE);
m_p201_int1(CLEAR_LINE);
}
}
}
void front_panel_device::device_start()
{
m_digits.resolve();
m_mon_led.resolve();
m_pwr_led.resolve();
m_ion_led.resolve();
m_run_led.resolve();
m_installed = false;
m_digit = 0;
m_segment = 0;
save_item(NAME(m_installed));
save_item(NAME(m_digit));
save_item(NAME(m_segment));
save_item(NAME(m_ic108a));
save_item(NAME(m_ic108b));
save_item(NAME(m_int_en));
save_item(NAME(m_allow_int1));
save_item(NAME(m_allow_int2));
}
void front_panel_device::device_reset()
{
m_allow_int1 = true;
m_allow_int2 = false;
m_int_en = false;
m_ic108a = true;
m_ic108b = false;
// Note: 0 means on and 1 means off
m_pwr_led = 0;
m_run_led = 1;
m_ion_led = 1;
m_mon_led = 1;
if (!m_installed)
{
h8bus().space(AS_IO).install_readwrite_handler(0xf0, 0xf0,
read8smo_delegate(*this, FUNC(front_panel_device::portf0_r)),
write8smo_delegate(*this, FUNC(front_panel_device::portf0_w)));
h8bus().space(AS_IO).install_write_handler(0xf1, 0xf1,
write8smo_delegate(*this, FUNC(front_panel_device::portf1_w)));
m_installed = true;
}
}
void front_panel_device::device_add_mconfig(machine_config &config)
{
config.set_default_layout(layout_h8_fp);
SPEAKER(config, "mono").front_center();
BEEP(config, m_beep, 1000).add_route(ALL_OUTPUTS, "mono", 1.00);
TIMER(config, "h8_timer").configure_periodic(FUNC(front_panel_device::h8_irq_pulse), attotime::from_msec(2));
}
ioport_constructor front_panel_device::device_input_ports() const
{
return INPUT_PORTS_NAME(h8);
}
TIMER_DEVICE_CALLBACK_MEMBER(front_panel_device::h8_irq_pulse)
{
if (m_allow_int1)
{
m_p201_int1(ASSERT_LINE);
}
}
DEFINE_DEVICE_TYPE_PRIVATE(H8BUS_FRONT_PANEL, device_h8bus_card_interface, front_panel_device, "h8_fp", "Heath H-8 Front Panel");
@@ -0,0 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
#ifndef MAME_BUS_HEATHZENITH_H8_FRONT_PANEL_H
#define MAME_BUS_HEATHZENITH_H8_FRONT_PANEL_H
#pragma once
#include "h8bus.h"
DECLARE_DEVICE_TYPE(H8BUS_FRONT_PANEL, device_h8bus_card_interface)
#endif // MAME_BUS_HEATHZENITH_H8_FRONT_PANEL_H
+338
View File
@@ -0,0 +1,338 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
h8bus.cpp - Heath/Zenith H-8 bus
Also known as the "Benton Harbor Bus" BHBus based on city where the
corporate headquarters were located.
***************************************************************************/
#include "emu.h"
#include "h8bus.h"
#define LOG_INIT (1U << 1) // Shows register setup
//#define VERBOSE (LOG_INIT)
#include "logmacro.h"
#define LOGINIT(...) LOGMASKED(LOG_INIT, __VA_ARGS__)
#ifdef _MSC_VER
#define FUNCNAME __func__
#else
#define FUNCNAME __PRETTY_FUNCTION__
#endif
device_h8bus_card_interface::device_h8bus_card_interface(const machine_config &mconfig, device_t &device) :
device_interface(device, "h8bus"),
m_h8bus(nullptr)
{
}
device_h8bus_card_interface::~device_h8bus_card_interface()
{
}
void device_h8bus_card_interface::interface_pre_start()
{
if (!m_h8bus)
{
throw device_missing_dependencies();
}
}
device_p201_p1_card_interface::device_p201_p1_card_interface(device_t &device, const char *tag)
: device_interface(device, tag)
, m_p201_reset(*this)
, m_p201_int1(*this)
, m_p201_int2(*this)
{
}
device_p201_p1_card_interface::~device_p201_p1_card_interface()
{
}
device_p201_p2_card_interface::device_p201_p2_card_interface(device_t &device, const char *tag)
: device_interface(device, tag)
, m_p201_inte(*this)
{
}
device_p201_p2_card_interface::~device_p201_p2_card_interface()
{
}
DEFINE_DEVICE_TYPE(H8BUS_SLOT, h8bus_slot_device, "h8bus_slot", "Heath H-8 slot")
h8bus_slot_device::h8bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: h8bus_slot_device(mconfig, H8BUS_SLOT, tag, owner, clock)
{
}
h8bus_slot_device::h8bus_slot_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_single_card_slot_interface(mconfig, *this)
, m_h8bus(*this, finder_base::DUMMY_TAG)
, m_h8bus_slottag(nullptr)
{
}
void h8bus_slot_device::device_start()
{
}
void h8bus_slot_device::device_resolve_objects()
{
device_h8bus_card_interface *dev = get_card_device();
if (dev)
{
dev->set_h8bus_tag(m_h8bus.target(), m_h8bus_slottag);
unsigned index = m_h8bus->add_h8bus_card(*dev);
dev->set_index(index);
}
}
DEFINE_DEVICE_TYPE(H8BUS, h8bus_device, "h8bus", "Heathkit H8 bus (Benton Harbor Bus)")
h8bus_device::h8bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: h8bus_device(mconfig, H8BUS, tag, owner, clock)
{
}
h8bus_device::h8bus_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)
, m_mem_config("mem", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor(FUNC(h8bus_device::mem_map), this))
, m_io_config("io", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(h8bus_device::io_map), this))
{
}
h8bus_device::~h8bus_device()
{
}
void h8bus_device::device_start()
{
}
void h8bus_device::device_reset()
{
m_int1_slot_states = 0;
m_int2_slot_states = 0;
m_int3_slot_states = 0;
m_int4_slot_states = 0;
m_int5_slot_states = 0;
m_int6_slot_states = 0;
m_int7_slot_states = 0;
m_reset_slot_states = 0;
m_hold_slot_states = 0;
m_m1_slot_states = 0;
}
void h8bus_device::mem_map(address_map &map)
{
map.unmap_value_high();
}
void h8bus_device::io_map(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
}
device_memory_interface::space_config_vector h8bus_device::memory_space_config() const
{
return space_config_vector { std::make_pair(AS_PROGRAM, &m_mem_config), std::make_pair(AS_IO, &m_io_config) };
}
u8 h8bus_device::add_h8bus_card(device_h8bus_card_interface &card)
{
m_device_list.emplace_back(card);
int index = m_device_list.size() - 1;
if (index > 31)
{
// ensure index is in range.
index = 31;
}
LOGINIT("%s: added card to index: %d, tag: %s\n", FUNCNAME, index, card.m_h8bus_slottag);
return index;
}
bool h8bus_device::update_line_states(u32 &states, unsigned index, int state)
{
bool const changed(bool(state) != bool(BIT(states, index)));
if (changed)
{
int old_state = states ? 1 : 0;
if (state)
{
states |= (1 << index);
}
else
{
states &= ~(1 << index);
}
int new_state = states ? 1 : 0;
return (old_state != new_state);
}
return false;
}
void h8bus_device::set_int1_line(unsigned index, int state)
{
bool const changed = update_line_states(m_int1_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.int1_w(m_int1_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_int2_line(unsigned index, int state)
{
bool const changed = update_line_states(m_int2_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.int2_w(m_int2_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_int3_line(unsigned index, int state)
{
bool const changed = update_line_states(m_int3_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.int3_w(m_int3_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_int4_line(unsigned index, int state)
{
bool const changed = update_line_states(m_int4_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.int4_w(m_int4_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_int5_line(unsigned index, int state)
{
bool const changed = update_line_states(m_int5_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.int5_w(m_int5_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_int6_line(unsigned index, int state)
{
bool const changed = update_line_states(m_int6_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.int6_w(m_int6_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_int7_line(unsigned index, int state)
{
bool const changed = update_line_states(m_int7_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.int7_w(m_int7_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_reset_line(unsigned index, int state)
{
bool const changed = update_line_states(m_reset_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.reset_w(m_reset_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_hold_line(unsigned index, int state)
{
bool const changed = update_line_states(m_hold_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.hold_w(m_hold_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_m1_line(unsigned index, int state)
{
bool const changed = update_line_states(m_m1_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.m1_w(m_m1_slot_states ? 1 : 0);
}
}
}
void h8bus_device::set_disable_rom_line(unsigned index, int state)
{
bool const changed = update_line_states(m_disable_rom_slot_states, index, state);
if (changed)
{
for (device_h8bus_card_interface &entry : m_device_list)
{
entry.rom_disable_w(m_disable_rom_slot_states ? 1 : 0);
}
}
}
+391
View File
@@ -0,0 +1,391 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/*********************************************************************
Heathkit H8 expansion slot
Also referred to as Benton Harbor Bus.
**********************************************************************
Slot Cards
--------------------------------------------------------
P1 Reserved for control/front panel board
P2 Reserved for CPU board
P3 - P9 Available
P10 Reserved for Expansion connector/HA-8-8 Extended Configuration Option
pin P1 - P10
--------------------------------
49 ------- +8V
48 ------- +8V
47 ------- +18V
46 ------- /ROM DISABLE
45 ------- /A15
44 ------- /A14
43 ------- /A13
42 ------- /A12
41 ------- /A11
40 ------- /A10
39 ------- /A9
38 ------- /A8
37 ------- /A7
36 ------- /A6
35 ------- /A5
34 ------- /A4
33 ------- /A3
32 ------- /A2
31 ------- /A1
30 ------- /A0
29 ------- /RESET
28 ------- MEMR
27 ------- /HOLD *
26 ------- I/O R
25 ------- HLDA *
24 ------- GND *
23 ------- MEMW
22 ------- O2
21 ------- I/O W
20 ------- RDYIN *
19 ------- M1
18 ------- GND *
17 ------- /D7
16 ------- /D6
15 ------- /D5
14 ------- /D4
13 ------- /D3
12 ------- /D2
11 ------- /D1
10 ------- /D0
9 ------- /INT2 *
8 ------- /INT1 *
7 ------- /INT7
6 ------- /INT6
5 ------- /INT5
4 ------- /INT4
3 ------- /INT3
2 ------- -18V
1 ------- GND
0 ------- GND
Notes:
* - Heath Company reserves the right to change these pin designations.
Signal Pin Direction Description
(wrt CPU board)
--------------------------------------------------------
A0-A15 30-45 Output Address bus
D0-D7 10-17 Input/Output Data bus
HOLD 27 Input Hold - request CPU hold state
HLDA 25 Output Hold Acknowledge - CPU has gone into hold status, and Address bus and
Data bus are in high impedance state
I/O R 26 Output I/O Read
I/O W 21 Output I/O Write
INT1-INT2 8-9 Input Interrupt 1-2 (10, 20)
INT3-INT7 3-7 Input Interrupt 3-7 (30, 40, 50, 60, 70)
M1 19 Output Machine cycle 1 - CPU fetch cycle of the first byte of an instruction
MEMR 28 Output Memory Read
MEMW 23 Output Memory Write
ϕ2 22 Output Phase 2 clock
RDYIN 20 Input Ready Input - Asynchronous wait request to the clock generator, generates
the synchronous READY signal.
RESET 29 Input Reset - holds CPU in reset, also resets the INTE and HLDA flip-flops
ROM DISABLE 46 Input ROM Disable - Disable the on-board ROM
+18 V 47 +18 V Unregulated
+8 V 48,49 +8 V Unregulated
-18 V 2 -18 V Unregulated
GND 0,1 Ground
CPU GND 18,24 CPU Ground
***************************************************************************
P201 Cable
Between P1 and P2 is a cable labeled P201 in the schematics. This connects
the Front Panel(P1) card to the CPU board(P2), providing dedicated signal lines
between the two boards.
Signal Pin Direction Description
--------------------------------------------------------
GND 1 Ground
/INT2 (20) 2 P1 -> P2 Interrupt 20
/INTE 3 P2 -> P1 Interrupts enabled.
/INT1 (10) 4 P1 -> P2 Interrupt 10
/RESIN 5 P1 -> P2 Reset in, allowed keypad to initiate a reset of the computer
***************************************************************************/
#ifndef MAME_BUS_HEATHZENITH_H8_H8BUS_H
#define MAME_BUS_HEATHZENITH_H8_H8BUS_H
#pragma once
#include <functional>
#include <utility>
#include <vector>
class h8bus_device;
class device_h8bus_card_interface : public device_interface
{
friend class h8bus_device;
public:
virtual ~device_h8bus_card_interface();
// signals from the Bus
virtual void int1_w(int state) {}
virtual void int2_w(int state) {}
virtual void int3_w(int state) {}
virtual void int4_w(int state) {}
virtual void int5_w(int state) {}
virtual void int6_w(int state) {}
virtual void int7_w(int state) {}
virtual void m1_w(int state) {}
virtual void reset_w(int state) {}
virtual void hold_w(int state) {}
virtual void rom_disable_w(int state) {}
void set_h8bus_tag(h8bus_device *h8bus, const char *slottag) { m_h8bus = h8bus; m_h8bus_slottag = slottag; }
void set_index(u8 index) { m_index = index; }
protected:
device_h8bus_card_interface(const machine_config &mconfig, device_t &device);
virtual void interface_pre_start() override;
void set_slot_int1(int state);
void set_slot_int2(int state);
void set_slot_int3(int state);
void set_slot_int4(int state);
void set_slot_int5(int state);
void set_slot_int6(int state);
void set_slot_int7(int state);
void set_slot_reset(int state);
void set_slot_hold(int state);
void set_slot_rom_disable(int state);
void set_slot_m1(int state);
h8bus_device &h8bus() { assert(m_h8bus); return *m_h8bus; }
const char *m_h8bus_slottag;
u8 m_index;
private:
h8bus_device *m_h8bus;
};
class device_p201_p1_card_interface : public device_interface
{
public:
virtual ~device_p201_p1_card_interface();
auto p201_reset_cb() { return m_p201_reset.bind(); }
auto p201_int1_cb() { return m_p201_int1.bind(); }
auto p201_int2_cb() { return m_p201_int2.bind(); }
virtual void p201_inte_w(int state) {};
protected:
device_p201_p1_card_interface(device_t &device, const char *tag);
devcb_write_line m_p201_reset;
devcb_write_line m_p201_int1;
devcb_write_line m_p201_int2;
};
class device_p201_p2_card_interface : public device_interface
{
public:
virtual ~device_p201_p2_card_interface();
auto p201_inte_cb() { return m_p201_inte.bind(); }
virtual void p201_reset_w(int state) {};
virtual void p201_int1_w(int state) {};
virtual void p201_int2_w(int state) {};
protected:
device_p201_p2_card_interface(device_t &device, const char *tag);
devcb_write_line m_p201_inte;
};
class h8bus_slot_device : public device_t, public device_single_card_slot_interface<device_h8bus_card_interface>
{
public:
template <typename T, typename U>
h8bus_slot_device(const machine_config &mconfig, T &&tag, device_t *owner, const char *sltag, U &&opts, const char *dflt)
: h8bus_slot_device(mconfig, tag, owner, (uint32_t) 0)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_h8bus_slot(std::forward<T>(sltag), tag);
}
h8bus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
template <typename T>
void set_h8bus_slot(T &&tag, const char *slottag)
{
m_h8bus.set_tag(std::forward<T>(tag));
m_h8bus_slottag = slottag;
}
protected:
h8bus_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual void device_resolve_objects() override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
required_device<h8bus_device> m_h8bus;
const char *m_h8bus_slottag;
};
DECLARE_DEVICE_TYPE(H8BUS_SLOT, h8bus_slot_device)
class h8bus_device : public device_t, public device_memory_interface
{
friend class h8bus_slot_device;
friend class device_h8bus_card_interface;
public:
h8bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~h8bus_device();
protected:
h8bus_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// device_memory_interface overrides
virtual space_config_vector memory_space_config() const override;
u8 add_h8bus_card(device_h8bus_card_interface &card);
void set_int1_line(unsigned index, int state);
void set_int2_line(unsigned index, int state);
void set_int3_line(unsigned index, int state);
void set_int4_line(unsigned index, int state);
void set_int5_line(unsigned index, int state);
void set_int6_line(unsigned index, int state);
void set_int7_line(unsigned index, int state);
void set_reset_line(unsigned index, int state);
void set_hold_line(unsigned index, int state);
void set_disable_rom_line(unsigned index, int state);
void set_m1_line(unsigned index, int state);
void set_p201_inte(int state);
void set_p201_reset(int state);
void set_p201_int1(int state);
void set_p201_int2(int state);
bool update_line_states(u32 &states, unsigned index, int state);
void mem_map(address_map &map);
void io_map(address_map &map);
private:
u32 m_int1_slot_states;
u32 m_int2_slot_states;
u32 m_int3_slot_states;
u32 m_int4_slot_states;
u32 m_int5_slot_states;
u32 m_int6_slot_states;
u32 m_int7_slot_states;
u32 m_reset_slot_states;
u32 m_hold_slot_states;
u32 m_disable_rom_slot_states;
u32 m_m1_slot_states;
address_space_config const m_mem_config;
address_space_config const m_io_config;
std::vector<std::reference_wrapper<device_h8bus_card_interface>> m_device_list;
};
inline void device_h8bus_card_interface::set_slot_int1(int state)
{
h8bus().set_int1_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_int2(int state)
{
h8bus().set_int2_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_int3(int state)
{
h8bus().set_int3_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_int4(int state)
{
h8bus().set_int4_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_int5(int state)
{
h8bus().set_int5_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_int6(int state)
{
h8bus().set_int6_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_int7(int state)
{
h8bus().set_int7_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_m1(int state)
{
h8bus().set_m1_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_reset(int state)
{
h8bus().set_reset_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_hold(int state)
{
h8bus().set_hold_line(m_index, state);
}
inline void device_h8bus_card_interface::set_slot_rom_disable(int state)
{
h8bus().set_disable_rom_line(m_index, state);
}
DECLARE_DEVICE_TYPE(H8BUS, h8bus_device)
#endif // MAME_BUS_HEATHZENITH_H8_H8BUS_H
+92
View File
@@ -0,0 +1,92 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
Heathkit H-8-1 4k/8k Static RAM board
****************************************************************************/
#include "emu.h"
#include "h_8_1.h"
namespace {
class h_8_1_device : public device_t, public device_h8bus_card_interface
{
public:
h_8_1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
protected:
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
bool m_installed;
memory_share_creator<u8> m_ram;
required_ioport m_jumpers;
required_ioport m_config;
};
h_8_1_device::h_8_1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, H8BUS_H_8_1, tag, owner, 0)
, device_h8bus_card_interface(mconfig, *this)
, m_ram(*this, "ram", 0x2000U, ENDIANNESS_LITTLE)
, m_jumpers(*this, "JUMPERS")
, m_config(*this, "CONFIG")
{
}
void h_8_1_device::device_start()
{
m_installed = false;
save_item(NAME(m_installed));
}
void h_8_1_device::device_reset()
{
if (!m_installed)
{
ioport_value const jumpers(m_jumpers->read());
ioport_value const config(m_config->read());
u16 base_addr = (jumpers & 0x07) << 13;
u16 top_addr = base_addr + (BIT(config, 0) ? 0x1fff : 0x0fff);
h8bus().space(AS_PROGRAM).install_ram(base_addr, top_addr, m_ram);
m_installed = true;
}
}
static INPUT_PORTS_START( h_8_1_jumpers )
PORT_START("JUMPERS")
PORT_CONFNAME(0x07, 0x01, "Memory base address" )
PORT_CONFSETTING( 0x00, "0k")
PORT_CONFSETTING( 0x01, "8k")
PORT_CONFSETTING( 0x02, "16k")
PORT_CONFSETTING( 0x03, "24k")
PORT_CONFSETTING( 0x04, "32k")
PORT_CONFSETTING( 0x05, "40k")
PORT_CONFSETTING( 0x06, "48k")
PORT_CONFSETTING( 0x07, "56k")
PORT_START("CONFIG")
PORT_CONFNAME(0x01, 0x01, "Memory installed")
PORT_CONFSETTING( 0x00, "4k")
PORT_CONFSETTING( 0x01, "8k")
INPUT_PORTS_END
ioport_constructor h_8_1_device::device_input_ports() const
{
return INPUT_PORTS_NAME(h_8_1_jumpers);
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(H8BUS_H_8_1, device_h8bus_card_interface, h_8_1_device, "h8_h_8_1", "Heath H-8-1 8k Static RAM");
+12
View File
@@ -0,0 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
#ifndef MAME_BUS_HEATHZENITH_H8_H_8_1_H
#define MAME_BUS_HEATHZENITH_H8_H_8_1_H
#pragma once
#include "h8bus.h"
DECLARE_DEVICE_TYPE(H8BUS_H_8_1, device_h8bus_card_interface)
#endif // MAME_BUS_HEATHZENITH_H8_H_8_1_H
+239
View File
@@ -0,0 +1,239 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
Heathkit H-8-5 Serial I/O and Cassette Interface
****************************************************************************/
#include "emu.h"
#include "h_8_5.h"
#include "imagedev/cassette.h"
#include "machine/clock.h"
#include "machine/i8251.h"
#include "machine/timer.h"
#include "bus/rs232/rs232.h"
#include "formats/h8_cas.h"
#include "speaker.h"
#define LOG_LINES (1U << 1)
#define LOG_CASS (1U << 2)
#define LOG_FUNC (1U << 3)
#define VERBOSE (0)
#include "logmacro.h"
#define LOGLINES(...) LOGMASKED(LOG_LINES, __VA_ARGS__)
#define LOGCASS(...) LOGMASKED(LOG_CASS, __VA_ARGS__)
#define LOGFUNC(...) LOGMASKED(LOG_FUNC, __VA_ARGS__)
#ifdef _MSC_VER
#define FUNCNAME __func__
#else
#define FUNCNAME __PRETTY_FUNCTION__
#endif
namespace {
class h_8_5_device : public device_t, public device_h8bus_card_interface
{
public:
h_8_5_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
protected:
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
void uart_rts(u8 data);
void uart_tx_empty(u8 data);
void irq_callback(int state);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_r);
TIMER_DEVICE_CALLBACK_MEMBER(kansas_w);
required_device<i8251_device> m_uart;
required_device<i8251_device> m_console;
required_device<cassette_image_device> m_cass_player;
required_device<cassette_image_device> m_cass_recorder;
bool m_installed;
u8 m_cass_data[4];
bool m_cassbit;
bool m_cassold;
};
h_8_5_device::h_8_5_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, H8BUS_H_8_5, tag, owner, 0)
, device_h8bus_card_interface(mconfig, *this)
, m_uart(*this, "uart")
, m_console(*this, "console")
, m_cass_player(*this, "cassette_player")
, m_cass_recorder(*this, "cassette_recorder")
{
}
TIMER_DEVICE_CALLBACK_MEMBER(h_8_5_device::kansas_w)
{
m_cass_data[3]++;
if (m_cassbit != m_cassold)
{
LOGCASS("%s: m_cassbit changed : %d\n", FUNCNAME, m_cassbit);
m_cass_data[3] = 0;
m_cassold = m_cassbit;
}
LOGCASS("%s: m_cassbit: %d\n", FUNCNAME, m_cassbit);
// 2400Hz -> 0
// 1200Hz -> 1
const int bit_pos = m_cassbit ? 0 : 1;
m_cass_recorder->output(BIT(m_cass_data[3], bit_pos) ? -1.0 : +1.0);
}
TIMER_DEVICE_CALLBACK_MEMBER(h_8_5_device::kansas_r)
{
// cassette - turn 1200/2400Hz to a bit
m_cass_data[1]++;
u8 cass_ws = (m_cass_player->input() > +0.03) ? 1 : 0;
LOGCASS("%s: cass_ws: %d\n", FUNCNAME, cass_ws);
if (cass_ws != m_cass_data[0])
{
LOGCASS("%s: cass_ws has changed value\n", FUNCNAME);
m_cass_data[0] = cass_ws;
m_uart->write_rxd((m_cass_data[1] < 12) ? 1 : 0);
m_cass_data[1] = 0;
}
}
void h_8_5_device::uart_rts(u8 data)
{
LOGLINES("%s: data: %d\n", FUNCNAME, data);
m_cass_player->change_state(bool(data) ? CASSETTE_STOPPED : CASSETTE_PLAY, CASSETTE_MASK_UISTATE);
}
void h_8_5_device::uart_tx_empty(u8 data)
{
LOGLINES("%s: data: %d\n", FUNCNAME, data);
m_cass_recorder->change_state(bool(data) ? CASSETTE_STOPPED : CASSETTE_RECORD, CASSETTE_MASK_UISTATE);
}
void h_8_5_device::irq_callback(int state)
{
LOGFUNC("%s: state: %d\n", FUNCNAME, state);
set_slot_int3(state);
}
void h_8_5_device::device_start()
{
m_installed = false;
save_item(NAME(m_installed));
save_item(NAME(m_cass_data));
save_item(NAME(m_cassbit));
save_item(NAME(m_cassold));
}
void h_8_5_device::device_reset()
{
LOGFUNC("%s\n", FUNCNAME);
if (!m_installed)
{
h8bus().space(AS_IO).install_readwrite_handler(0xf8, 0xf9,
read8sm_delegate(m_uart, FUNC(i8251_device::read)),
write8sm_delegate(m_uart, FUNC(i8251_device::write)));
h8bus().space(AS_IO).install_readwrite_handler(0xfa, 0xfb,
read8sm_delegate(m_console, FUNC(i8251_device::read)),
write8sm_delegate(m_console, FUNC(i8251_device::write)));
m_installed = true;
}
// cassette
m_cassbit = 1;
m_cassold = 0;
m_cass_data[0] = 0;
m_cass_data[1] = 0;
m_cass_data[2] = 0;
m_cass_data[3] = 0;
m_uart->write_cts(0);
m_uart->write_dsr(0);
m_uart->write_rxd(0);
}
// The usual baud rate is 600. The H8 supported baud rates from 110 to
// 9600. You can change the baud rate if it is changed here and in the
// other places that specify 600 baud.
static DEVICE_INPUT_DEFAULTS_START(terminal)
DEVICE_INPUT_DEFAULTS("RS232_RXBAUD", 0xff, RS232_BAUD_600)
DEVICE_INPUT_DEFAULTS("RS232_TXBAUD", 0xff, RS232_BAUD_600)
DEVICE_INPUT_DEFAULTS("RS232_DATABITS", 0xff, RS232_DATABITS_8)
DEVICE_INPUT_DEFAULTS("RS232_PARITY", 0xff, RS232_PARITY_NONE)
DEVICE_INPUT_DEFAULTS("RS232_STOPBITS", 0xff, RS232_STOPBITS_1)
DEVICE_INPUT_DEFAULTS_END
void h_8_5_device::device_add_mconfig(machine_config &config)
{
I8251(config, m_uart, 0);
m_uart->txd_handler().set([this] (bool state) { m_cassbit = state; });
m_uart->rts_handler().set(FUNC(h_8_5_device::uart_rts));
m_uart->txempty_handler().set(FUNC(h_8_5_device::uart_tx_empty));
clock_device &cassette_clock(CLOCK(config, "cassette_clock", 4800));
cassette_clock.signal_handler().set(m_uart, FUNC(i8251_device::write_txc));
cassette_clock.signal_handler().append(m_uart, FUNC(i8251_device::write_rxc));
I8251(config, m_console, 0);
m_console->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
m_console->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts));
m_console->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr));
// The RxRdy pin on the 8251 USART is normally jumpered to generate a level 3 i/o interrupt.
m_console->rxrdy_handler().set(FUNC(h_8_5_device::irq_callback));
// Console UART clock is 16X the baud rate.
clock_device &console_clock(CLOCK(config, "console_clock", 600*16));
console_clock.signal_handler().set(m_console, FUNC(i8251_device::write_txc));
console_clock.signal_handler().append(m_console, FUNC(i8251_device::write_rxc));
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(m_console, FUNC(i8251_device::write_rxd));
rs232.cts_handler().set(m_console, FUNC(i8251_device::write_cts));
rs232.dsr_handler().set(m_console, FUNC(i8251_device::write_dsr));
rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
SPEAKER(config, "mono").front_right();
CASSETTE(config, m_cass_player);
m_cass_player->set_formats(h8_cassette_formats);
m_cass_player->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
m_cass_player->add_route(ALL_OUTPUTS, "mono", 0.15);
m_cass_player->set_interface("h8_cass_player");
CASSETTE(config, m_cass_recorder);
m_cass_recorder->set_formats(h8_cassette_formats);
m_cass_recorder->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
m_cass_recorder->add_route(ALL_OUTPUTS, "mono", 0.15);
m_cass_recorder->set_interface("h8_cass_recorder");
TIMER(config, "kansas_w").configure_periodic(FUNC(h_8_5_device::kansas_w), attotime::from_hz(4800));
TIMER(config, "kansas_r").configure_periodic(FUNC(h_8_5_device::kansas_r), attotime::from_hz(40000));
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(H8BUS_H_8_5, device_h8bus_card_interface, h_8_5_device, "h8_h_8_5", "Heath H-8-5 Serial/Casette Card");
+12
View File
@@ -0,0 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
#ifndef MAME_BUS_HEATHZENITH_H8_H_8_5_H
#define MAME_BUS_HEATHZENITH_H8_H_8_5_H
#pragma once
#include "h8bus.h"
DECLARE_DEVICE_TYPE(H8BUS_H_8_5, device_h8bus_card_interface)
#endif // MAME_BUS_HEATHZENITH_H8_H_8_5_H
+258
View File
@@ -0,0 +1,258 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
/***************************************************************************
Heathkit WH-8-64 32k/64k Dynamic RAM board
****************************************************************************/
#include "emu.h"
#include "wh_8_64.h"
#include <vector>
#include <algorithm>
#define LOG_SW (1U << 1) // Shows register setup
//#define VERBOSE (LOG_SW)
#include "logmacro.h"
#define LOGSW(...) LOGMASKED(LOG_SW, __VA_ARGS__)
#ifdef _MSC_VER
#define FUNCNAME __func__
#else
#define FUNCNAME __PRETTY_FUNCTION__
#endif
namespace {
class wh_8_64_device : public device_t, public device_h8bus_card_interface
{
public:
wh_8_64_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
protected:
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
std::vector<int> get_addr(u8 sw) ATTR_COLD;
void install_mem_bank(u8 bank) ATTR_COLD;
bool m_installed;
memory_share_array_creator<u8, 8> m_ram;
required_ioport_array<4> m_sw;
required_ioport m_config;
};
wh_8_64_device::wh_8_64_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, H8BUS_WH_8_64, tag, owner, 0)
, device_h8bus_card_interface(mconfig, *this)
, m_ram(*this, "rambank%u", 0U, 0x2000U, ENDIANNESS_LITTLE)
, m_sw(*this, "SW%u", 1U)
, m_config(*this, "CONFIG")
{
}
void wh_8_64_device::device_start()
{
m_installed = false;
save_item(NAME(m_installed));
}
void wh_8_64_device::device_reset()
{
if (!m_installed)
{
ioport_value const config(m_config->read());
for (int i = 0; i < 4; i++)
{
if (BIT(config, i))
{
install_mem_bank(i);
}
}
m_installed = true;
}
}
std::vector<int> wh_8_64_device::get_addr(u8 sw)
{
std::vector<int> result;
u8 sw_value = m_sw[sw]->read();
for (int i = 0; i < 8; i++)
{
if (BIT(sw_value, i))
{
result.push_back(i * 0x2000);
}
}
return result;
}
void wh_8_64_device::install_mem_bank(u8 bank)
{
std::vector<int> addresses = get_addr(3 - bank);
// each switch defines where to start each 8k block of the
// 16k bank. Per manual only 2 should be set. Ensure setting
// a max of 2 blocks are defined even if it is just selecting
// the first 2.
int num_addresses = std::min((int) addresses.size(), 2);
int block = bank << 1;
for (int i = 0; i < num_addresses; i++)
{
int addr = addresses[i];
LOGSW("Installing block %d at 0x%04x\n", block, addr);
h8bus().space(AS_PROGRAM).install_ram(addr, addr + 0x1fff, m_ram[block++]);
}
}
static INPUT_PORTS_START( wh_8_64 )
PORT_START("SW1")
// TODO: Properly map the last 8k, needs an HA-8-6 Z80 CPU or HA-8-8 Extended
// Configuration board to handle the ROM/RAM swap. Only one switch is set to 1
// on SW1.
PORT_DIPNAME( 0x01, 0x00, "Bank 3 - Address Block 0k - 8k") PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, "Bank 3 - Address Block 8k - 16k") PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x00, "Bank 3 - Address Block 16k - 24k") PORT_DIPLOCATION("SW1:3")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "Bank 3 - Address Block 24k - 32k") PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, "Bank 3 - Address Block 32k - 40k") PORT_DIPLOCATION("SW1:5")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Bank 3 - Address Block 40k - 48k") PORT_DIPLOCATION("SW1:6")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, "Bank 3 - Address Block 48k - 56k") PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, "Bank 3 - Address Block 56k - 64k") PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("SW2")
PORT_DIPNAME( 0x01, 0x00, "Bank 2 - Address Block 0k - 8k") PORT_DIPLOCATION("SW2:1")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, "Bank 2 - Address Block 8k - 16k") PORT_DIPLOCATION("SW2:2")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x00, "Bank 2 - Address Block 16k - 24k") PORT_DIPLOCATION("SW2:3")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "Bank 2 - Address Block 24k - 32k") PORT_DIPLOCATION("SW2:4")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, "Bank 2 - Address Block 32k - 40k") PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, "Bank 2 - Address Block 40k - 48k") PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, "Bank 2 - Address Block 48k - 56k") PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, "Bank 2 - Address Block 56k - 64k") PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("SW3")
PORT_DIPNAME( 0x01, 0x00, "Bank 1 - Address Block 0k - 8k") PORT_DIPLOCATION("SW3:1")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, "Bank 1 - Address Block 8k - 16k") PORT_DIPLOCATION("SW3:2")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x00, "Bank 1 - Address Block 16k - 24k") PORT_DIPLOCATION("SW3:3")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x08, "Bank 1 - Address Block 24k - 32k") PORT_DIPLOCATION("SW3:4")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x10, "Bank 1 - Address Block 32k - 40k") PORT_DIPLOCATION("SW3:5")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Bank 1 - Address Block 40k - 48k") PORT_DIPLOCATION("SW3:6")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, "Bank 1 - Address Block 48k - 56k") PORT_DIPLOCATION("SW3:7")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, "Bank 1 - Address Block 56k - 64k") PORT_DIPLOCATION("SW3:8")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("SW4")
PORT_DIPNAME( 0x01, 0x00, "Bank 0 - Address Block 0k - 8k") PORT_DIPLOCATION("SW4:1")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, "Bank 0 - Address Block 8k - 16k") PORT_DIPLOCATION("SW4:2")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x04, "Bank 0 - Address Block 16k - 24k") PORT_DIPLOCATION("SW4:3")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, "Bank 0 - Address Block 24k - 32k") PORT_DIPLOCATION("SW4:4")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, "Bank 0 - Address Block 32k - 40k") PORT_DIPLOCATION("SW4:5")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x00, "Bank 0 - Address Block 40k - 48k") PORT_DIPLOCATION("SW4:6")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x00, "Bank 0 - Address Block 48k - 56k") PORT_DIPLOCATION("SW4:7")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x00, "Bank 0 - Address Block 56k - 64k") PORT_DIPLOCATION("SW4:8")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("CONFIG")
PORT_CONFNAME(0x01, 0x01, "Memory Bank 0 Present")
PORT_CONFSETTING( 0x00, DEF_STR( No ))
PORT_CONFSETTING( 0x01, DEF_STR( Yes ))
PORT_CONFNAME(0x02, 0x02, "Memory Bank 1 Present")
PORT_CONFSETTING( 0x00, DEF_STR( No ))
PORT_CONFSETTING( 0x02, DEF_STR( Yes ))
PORT_CONFNAME(0x04, 0x04, "Memory Bank 2 Present")
PORT_CONFSETTING( 0x00, DEF_STR( No ))
PORT_CONFSETTING( 0x04, DEF_STR( Yes ))
PORT_CONFNAME(0x08, 0x08, "Memory Bank 3 Present")
PORT_CONFSETTING( 0x00, DEF_STR( No ))
PORT_CONFSETTING( 0x08, DEF_STR( Yes ))
INPUT_PORTS_END
ioport_constructor wh_8_64_device::device_input_ports() const
{
return INPUT_PORTS_NAME(wh_8_64);
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(H8BUS_WH_8_64, device_h8bus_card_interface, wh_8_64_device, "wh8_h_8_64", "Heath WH-8-64 64k Dynamic RAM");
+12
View File
@@ -0,0 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Mark Garlanger
#ifndef MAME_BUS_HEATHZENITH_H8_WH_8_64_H
#define MAME_BUS_HEATHZENITH_H8_WH_8_64_H
#pragma once
#include "h8bus.h"
DECLARE_DEVICE_TYPE(H8BUS_WH_8_64, device_h8bus_card_interface)
#endif // MAME_BUS_HEATHZENITH_H8_WH_8_64_H
+2 -2
View File
@@ -189,7 +189,7 @@ h89bus::addr_ranges device_heath_io_decoder_interface::scan_io_decoder_rom(u8 se
}
else if (found)
{
ranges.push_back(std::make_pair(first, last));
ranges.emplace_back(first, last);
found = false;
}
}
@@ -197,7 +197,7 @@ h89bus::addr_ranges device_heath_io_decoder_interface::scan_io_decoder_rom(u8 se
// make sure to include any ranges that extend to the end.
if (found)
{
ranges.push_back(std::make_pair(first, last));
ranges.emplace_back(first, last);
}
return ranges;
+36 -1
View File
@@ -262,7 +262,42 @@ ROM_END
ROM_START(msmt070)
ROM_REGION(0x80, "idprom", 0)
ROM_LOAD32_BYTE("msmt070b.bin", 0x0, 0x20, CRC(ad11a4e6) SHA1(e620cd37a1e36d2c548b7783ece336428ec75b0e))
ROM_LOAD32_BYTE("mprgy920f_9305070_82s123.u71", 0x00, 0x20, CRC(4fec770c) SHA1(25bfb863336315975568f137e7e76bdc8101ab02))
ROM_REGION(0x2e5, "plds", 0)
ROM_LOAD("y230_0b30_4120_gal22v10.u107", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y231_0b30_5030_pal16v8.u109", 0x000, 0x117, NO_DUMP)
ROM_LOAD("y232_0a30_5040_pal16v8.u124", 0x000, 0x117, NO_DUMP)
ROM_LOAD("y233_0a30_4130_gal22v10.u126", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y234_0a30_5040_pal16v8.u95", 0x000, 0x117, NO_DUMP)
ROM_LOAD("y235_0a30_4190_pal20v8.u130", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y236_0a30_5040_pal16v8.u131", 0x000, 0x117, NO_DUMP)
ROM_LOAD("y237_0c30_4150_pal22v10.u157", 0x000, 0x2e5, NO_DUMP) // Same label as U158
ROM_LOAD("y237_0c30_4150_pal22v10.u158", 0x000, 0x2e5, NO_DUMP) // Same label as U157
ROM_LOAD("y237_0c30_4191_pal22v10.u140", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y237_0c30_4130_pal22v10.u137", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y241_0b30_4140_pal22v10.u165", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y242_0b30_4140_pal22v10.u63", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y243_0b30_4150_pal22v10.u66", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y244_0b30_4140_pal22v10.u67", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y245_0a30_5040_pal16v8.u90", 0x000, 0x117, NO_DUMP)
ROM_LOAD("y246_0b30_4160_gal20v8.u106", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y247_0a30_5040_pal16v8.u91", 0x000, 0x117, NO_DUMP)
ROM_LOAD("y248_0b30_4151_gal20v8.u7", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y249_0b30_4200_gal20v8.u11", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y250_0a30_4200_pal16v8.u98", 0x000, 0x117, NO_DUMP)
ROM_LOAD("y251_0a30_4200_gal20v8.u40", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y252_0a30_4160_gal20v8.u82", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y253_0a30_421_gal22v10.u117", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y254_0a30_421_gal22v10.u118", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y255_0a30_4161_gal20v8.u132", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y256_0a30_4160_gal22v10.u112", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y257_0a30_4160_gal22v10.u78", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y258_0a30_4161_gal20v8.u81", 0x000, 0x157, NO_DUMP)
ROM_LOAD("y259_0a30_4161_gal22v10.u74", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y260_0a30_4160_gal20v8.u75", 0x000, 0x157, NO_DUMP)
ROM_LOAD("x261_0a30_5272_gal22v10.u12", 0x000, 0x2e5, NO_DUMP)
ROM_LOAD("y262_0b30_4161_gal22v10.u13", 0x000, 0x2e5, NO_DUMP)
ROM_END
ROM_START(msmt071)
+2 -2
View File
@@ -146,10 +146,10 @@ static INPUT_PORTS_START( babyblue2 )
PORT_DIPNAME(0x40, 0x40, "RAM Bank I" ) PORT_DIPLOCATION( "SW3:1" )
PORT_DIPSETTING( 0x00, "Enabled" )
PORT_DIPSETTING( 0x40, "Disabled" )
PORT_DIPNAME(0x20, 0x40, "RAM Bank II" ) PORT_DIPLOCATION( "SW3:2" )
PORT_DIPNAME(0x20, 0x20, "RAM Bank II" ) PORT_DIPLOCATION( "SW3:2" )
PORT_DIPSETTING( 0x00, "Enabled" )
PORT_DIPSETTING( 0x20, "Disabled" )
PORT_DIPNAME(0x10, 0x40, "RAM Bank III" ) PORT_DIPLOCATION( "SW3:3" )
PORT_DIPNAME(0x10, 0x10, "RAM Bank III" ) PORT_DIPLOCATION( "SW3:3" )
PORT_DIPSETTING( 0x00, "Enabled" )
PORT_DIPSETTING( 0x10, "Disabled" )
+22 -55
View File
@@ -111,12 +111,14 @@ void pc_isa8_cards(device_slot_interface &device)
device.option_add("cga_cportiii", ISA8_CGA_CPORTIII);
device.option_add("aga", ISA8_AGA);
device.option_add("aga_pc200", ISA8_AGA_PC200);
device.option_add("wyse700", ISA8_WYSE700);
device.option_add("ega", ISA8_EGA);
device.option_add("pgc", ISA8_PGC);
device.option_add("vga", ISA8_VGA);
device.option_add("wd90c90_jk", ISA8_WD90C90_JK);
device.option_add("num9rev",ISA8_NUM_9_REV);
device.option_add("com", ISA8_COM);
device.option_add("comat", ISA8_COM_AT);
device.option_add("fdc", ISA8_FDC_SUPERIO);
device.option_add("fdc_xt", ISA8_FDC_XT);
device.option_add("fdc_at", ISA8_FDC_AT);
@@ -156,55 +158,17 @@ void pc_isa8_cards(device_slot_interface &device)
device.option_add("acb2072", ACB2072);
device.option_add("3xtwin", ISA8_3XTWIN);
device.option_add("opus108pm", ISA8_OPUS108PM);
device.option_add("ibm_speech", ISA8_IBM_SPEECH);
}
void pc_isa16_cards(device_slot_interface &device)
{
// 8-bit
device.option_add("mda", ISA8_MDA);
device.option_add("cga", ISA8_CGA);
device.option_add("cga_cportiii", ISA8_CGA_CPORTIII);
device.option_add("wyse700", ISA8_WYSE700);
device.option_add("ega", ISA8_EGA);
device.option_add("pgc", ISA8_PGC);
device.option_add("vga", ISA8_VGA);
device.option_add("wd90c90_jk", ISA8_WD90C90_JK);
device.option_add("num9rev",ISA8_NUM_9_REV);
device.option_add("com", ISA8_COM);
device.option_add("comat", ISA8_COM_AT);
device.option_add("fdc", ISA8_FDC_AT);
device.option_add("fdc344", ISA8_FDC344);
device.option_add("fdcmag", ISA8_FDCMAG);
device.option_add("hdc", ISA8_HDC);
device.option_add("side116", ISA8_SIDE116);
device.option_add("adlib", ISA8_ADLIB);
device.option_add("hercules", ISA8_HERCULES);
device.option_add("gblaster", ISA8_GAME_BLASTER);
device.option_add("sblaster1_0", ISA8_SOUND_BLASTER_1_0);
device.option_add("sblaster1_5", ISA8_SOUND_BLASTER_1_5);
device.option_add("stereo_fx", ISA8_STEREO_FX);
device.option_add("ssi2001", ISA8_SSI2001);
device.option_add("ne1000", NE1000);
device.option_add("3c503", EL2_3C503);
device.option_add("mpu401", ISA8_MPU401);
device.option_add("pcmidi", ISA8_PCMIDI);
device.option_add("lpt", ISA8_LPT);
device.option_add("ibm_mfc", ISA8_IBM_MFC);
device.option_add("fdcsmc", ISA8_FDC_SMC);
device.option_add("dectalk", ISA8_DECTALK);
device.option_add("prose4k1", ISA8_PROSE4001);
device.option_add("pds", ISA8_PDS);
device.option_add("lba_enhancer", ISA8_LBA_ENHANCER);
device.option_add("chessmdr", ISA8_CHESSMDR);
device.option_add("chessmsr", ISA8_CHESSMSR);
device.option_add("finalchs", ISA8_FINALCHS);
device.option_add("epc_mda", ISA8_EPC_MDA);
device.option_add("epc_twib", ISA8_EIS_TWIB);
device.option_add("babyblue2", ISA8_BABYBLUE2);
device.option_add("acb2072", ACB2072);
device.option_add("3xtwin", ISA8_3XTWIN);
device.option_add("opus108pm", ISA8_OPUS108PM);
device.option_add("ibm_speech", ISA8_IBM_SPEECH);
// any 8-bit card also works in a 16-bit slot
pc_isa8_cards(device);
device.option_replace("fdc", ISA8_FDC_AT);
device.option_remove("fdc_at");
device.option_add("fdc_superio", ISA8_FDC_SUPERIO);
// 16-bit
device.option_add("ide", ISA16_IDE);
device.option_add("ne2000", NE2000);
@@ -213,13 +177,11 @@ void pc_isa16_cards(device_slot_interface &device)
device.option_add("aha1542c", AHA1542C);
device.option_add("aha1542cf", AHA1542CF);
device.option_add("aha1542cp", AHA1542CP);
device.option_add("aha1740", AHA1740); // actually an EISA card
device.option_add("aha1742a", AHA1742A); // actually an EISA card
device.option_add("gus",ISA16_GUS);
device.option_add("gus", ISA16_GUS);
device.option_add("sblaster_16", ISA16_SOUND_BLASTER_16);
device.option_add("svga_s3", ISA16_SVGA_S3);
device.option_add("svga_dm",ISA16_SVGA_CIRRUS);
device.option_add("clgd542x",ISA16_SVGA_CIRRUS_GD542X);
device.option_add("svga_dm", ISA16_SVGA_CIRRUS);
device.option_add("clgd542x", ISA16_SVGA_CIRRUS_GD542X);
device.option_add("gfxultra", ISA16_VGA_GFXULTRA);
device.option_add("gfxultrap", ISA16_SVGA_GFXULTRAPRO);
device.option_add("tvga9000", ISA16_SVGA_TVGA9000);
@@ -253,12 +215,17 @@ void pc_isa16_cards(device_slot_interface &device)
device.option_add("ultra12f", ULTRA12F);
device.option_add("ultra12f32", ULTRA12F32);
device.option_add("ultra14f", ULTRA14F);
device.option_add("ultra24f", ULTRA24F); // actually an EISA card
device.option_add("dc320b", TEKRAM_DC320B); // actually an EISA card
device.option_add("dc320e", TEKRAM_DC320E); // actually an EISA card
device.option_add("dc820", TEKRAM_DC820); // actually an EISA card
device.option_add("dc820b", TEKRAM_DC820B); // actually an EISA card
device.option_add("omti8621", ISA16_OMTI8621);
device.option_add("lrk331", LRK331);
device.option_add("hpblp", HPBLP);
// EISA cards
// TODO: move to own block
device.option_add("aha1740", AHA1740);
device.option_add("aha1742a", AHA1742A);
device.option_add("ultra24f", ULTRA24F);
device.option_add("dc320b", TEKRAM_DC320B);
device.option_add("dc320e", TEKRAM_DC320E);
device.option_add("dc820", TEKRAM_DC820);
device.option_add("dc820b", TEKRAM_DC820B);
}
File diff suppressed because it is too large. Load diff
+3 -130
View File
@@ -6,136 +6,9 @@
#pragma once
#include "isa.h"
#include "machine/pc_lpt.h"
#include "video/mc6845.h"
#include "emupal.h"
#include "screen.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> isa8_mda_device
class isa8_mda_device : public device_t,
public device_isa8_card_interface
{
public:
friend class isa8_hercules_device;
// construction/destruction
isa8_mda_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual uint8_t io_read(offs_t offset);
virtual void io_write(offs_t offset, uint8_t data);
virtual uint8_t status_r();
virtual void mode_control_w(uint8_t data);
void hsync_changed(int state);
void vsync_changed(int state);
virtual MC6845_UPDATE_ROW( crtc_update_row );
protected:
isa8_mda_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 ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
required_device<mc6845_device> m_crtc;
optional_device<pc_lpt_device> m_lpt;
private:
void pc_cpu_line(int state);
MC6845_UPDATE_ROW( mda_text_inten_update_row );
MC6845_UPDATE_ROW( mda_text_blink_update_row );
public:
int m_framecnt;
uint8_t m_mode_control;
int m_update_row_type;
uint8_t *m_chr_gen;
uint8_t m_vsync;
uint8_t m_hsync;
std::vector<uint8_t> m_videoram;
uint8_t m_pixel;
required_device<palette_device> m_palette;
};
// device type definition
DECLARE_DEVICE_TYPE(ISA8_MDA, isa8_mda_device)
// ======================> isa8_hercules_device
class isa8_hercules_device :
public isa8_mda_device
{
public:
// construction/destruction
isa8_hercules_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual uint8_t io_read(offs_t offset) override;
virtual void io_write(offs_t offset, uint8_t data) override;
virtual uint8_t status_r() override;
virtual void mode_control_w(uint8_t data) override;
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
private:
virtual MC6845_UPDATE_ROW( crtc_update_row ) override;
MC6845_UPDATE_ROW( hercules_gfx_update_row );
uint8_t m_configuration_switch; //hercules
};
// device type definition
DECLARE_DEVICE_TYPE(ISA8_HERCULES, isa8_hercules_device)
// ======================> isa8_ec1840_0002_device
class isa8_ec1840_0002_device :
public isa8_mda_device
{
public:
// construction/destruction
isa8_ec1840_0002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
private:
virtual void mode_control_w(uint8_t data) override;
virtual MC6845_UPDATE_ROW( crtc_update_row ) override;
MC6845_UPDATE_ROW( mda_lowres_text_inten_update_row );
MC6845_UPDATE_ROW( mda_lowres_text_blink_update_row );
std::unique_ptr<uint8_t[]> m_soft_chr_gen;
};
// device type definition
DECLARE_DEVICE_TYPE(ISA8_EC1840_0002, isa8_ec1840_0002_device)
DECLARE_DEVICE_TYPE(ISA8_MDA, device_isa8_card_interface)
DECLARE_DEVICE_TYPE(ISA8_HERCULES, device_isa8_card_interface)
DECLARE_DEVICE_TYPE(ISA8_EC1840_0002, device_isa8_card_interface)
#endif // MAME_BUS_ISA_MDA_H
+1 -1
View File
@@ -233,7 +233,7 @@ static INPUT_PORTS_START( omti_port )
PORT_DIPSETTING( 0x01, "Enabled" )
PORT_DIPNAME( 0x02, 0x00, "BIOS base")
PORT_DIPSETTING( 0x00, "C8000h" )
PORT_DIPSETTING( 0x01, "CA000h" )
PORT_DIPSETTING( 0x02, "CA000h" )
INPUT_PORTS_END
void omti8621_device::device_add_mconfig(machine_config &config)
+196 -70
View File
@@ -93,17 +93,18 @@ void isa16_pvga1a_device::device_add_mconfig(machine_config &config)
void isa16_pvga1a_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(pvga1a_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(pvga1a_vga_device::io_map));
}
void isa16_pvga1a_device::device_start()
{
set_isa_device();
}
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_pvga1a_device::io_isa_map);
void isa16_pvga1a_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_pvga1a_device::remap(int space_id, offs_t start, offs_t end)
@@ -114,7 +115,7 @@ void isa16_pvga1a_device::remap(int space_id, offs_t start, offs_t end)
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
}
else if (space_id == AS_IO)
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_pvga1a_device::io_isa_map);
m_isa->install_device(0x0000, 0xffff, *this, &isa16_pvga1a_device::io_isa_map);
}
/******************
@@ -184,19 +185,32 @@ void isa16_pvga1a_jk_device::device_add_mconfig(machine_config &config)
void isa16_pvga1a_jk_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(pvga1a_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(pvga1a_vga_device::io_map));
}
void isa16_pvga1a_jk_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_pvga1a_jk_device::io_isa_map);
}
void isa16_pvga1a_jk_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_pvga1a_jk_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_w)));
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
}
else if (space_id == AS_IO)
m_isa->install_device(0x0000, 0xffff, *this, &isa16_pvga1a_jk_device::io_isa_map);
}
/******************
*
* WD90C90-JK
@@ -236,19 +250,32 @@ void isa8_wd90c90_jk_device::device_add_mconfig(machine_config &config)
void isa8_wd90c90_jk_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(pvga1a_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(pvga1a_vga_device::io_map));
}
void isa8_wd90c90_jk_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa8_wd90c90_jk_device::io_isa_map);
}
void isa8_wd90c90_jk_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa8_wd90c90_jk_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(pvga1a_vga_device::mem_w)));
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
}
else if (space_id == AS_IO)
m_isa->install_device(0x0000, 0xffff, *this, &isa8_wd90c90_jk_device::io_isa_map);
}
/******************
*
* WD90C00-JK
@@ -294,32 +321,51 @@ void isa16_wd90c00_jk_device::device_add_mconfig(machine_config &config)
void isa16_wd90c00_jk_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(wd90c00_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(wd90c00_vga_device::io_map));
}
void isa16_wd90c00_jk_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c00_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c00_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c00_jk_device::io_isa_map);
}
void isa16_wd90c00_jk_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_wd90c00_jk_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c00_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c00_vga_device::mem_w)));
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
}
else if (space_id == AS_IO)
m_isa->install_device(0x0000, 0xffff, *this, &isa16_wd90c00_jk_device::io_isa_map);
}
/******************
*
* WD90C11-LR
*
*****************/
isa16_wd90c11_lr_device::isa16_wd90c11_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, ISA16_WD90C11_LR, tag, owner, clock),
device_isa16_card_interface(mconfig, *this),
m_vga(*this, "vga")
isa16_wd90c11_lr_device::isa16_wd90c11_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: isa16_wd90c11_lr_device(mconfig, ISA16_WD90C11_LR, tag, owner, clock)
{
}
isa16_wd90c11_lr_device::isa16_wd90c11_lr_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_isa16_card_interface(mconfig, *this)
, m_vga(*this, "vga")
{
}
ROM_START( wd90c11_lr )
ROM_REGION(0x8000,"vga_rom", ROMREGION_ERASE00)
// Octek PVGA1C - Version LR - WDC Paradise 90C11A
@@ -342,23 +388,40 @@ void isa16_wd90c11_lr_device::device_add_mconfig(machine_config &config)
m_vga->set_screen("screen");
// 512KB (+ option for 1MB? Verify with interlace)
m_vga->set_vram_size(0x100000);
// required by megapc and teradrive for color
m_vga->read_cnf15_callback().set_constant(1);
m_vga->cnf_write_ddr_callback().set_constant(0x7f);
}
void isa16_wd90c11_lr_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(wd90c11a_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(wd90c11a_vga_device::io_map));
map(0x46e8, 0x46e8).w(m_vga, FUNC(wd90c11a_vga_device::mode_setup_w));
}
void isa16_wd90c11_lr_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c11a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c11a_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c11_lr_device::io_isa_map);
}
void isa16_wd90c11_lr_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_wd90c11_lr_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c11a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c11a_vga_device::mem_w)));
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
}
else if (space_id == AS_IO)
m_isa->install_device(0x0000, 0xffff, *this, &isa16_wd90c11_lr_device::io_isa_map);
}
/******************
*
* WD90C30-LR
@@ -405,19 +468,32 @@ void isa16_wd90c30_lr_device::device_add_mconfig(machine_config &config)
void isa16_wd90c30_lr_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(wd90c30_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(wd90c30_vga_device::io_map));
}
void isa16_wd90c30_lr_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c30_lr_device::io_isa_map);
}
void isa16_wd90c30_lr_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_wd90c30_lr_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_w)));
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
}
else if (space_id == AS_IO)
m_isa->install_device(0x0000, 0xffff, *this, &isa16_wd90c30_lr_device::io_isa_map);
}
/******************
*
* WD90C31-LR
@@ -457,18 +533,19 @@ void isa16_wd90c31_lr_device::device_add_mconfig(machine_config &config)
void isa16_wd90c31_lr_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(wd90c31_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(wd90c31_vga_device::io_map));
map(0x23c0, 0x23c7).m(m_vga, FUNC(wd90c31_vga_device::ext_io_map));
}
void isa16_wd90c31_lr_device::device_start()
{
set_isa_device();
}
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31_lr_device::io_isa_map);
m_isa->install_device(0x23c0, 0x23c7, *m_vga, &wd90c31_vga_device::ext_io_map);
void isa16_wd90c31_lr_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_wd90c31_lr_device::remap(int space_id, offs_t start, offs_t end)
@@ -481,8 +558,7 @@ void isa16_wd90c31_lr_device::remap(int space_id, offs_t start, offs_t end)
}
else if (space_id == AS_IO)
{
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31_lr_device::io_isa_map);
m_isa->install_device(0x23c0, 0x23c7, *m_vga, &wd90c31_vga_device::ext_io_map);
m_isa->install_device(0x0000, 0xffff, *this, &isa16_wd90c31_lr_device::io_isa_map);
}
}
@@ -528,20 +604,36 @@ void isa16_wd90c31a_lr_device::device_add_mconfig(machine_config &config)
void isa16_wd90c31a_lr_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(wd90c31_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(wd90c31_vga_device::io_map));
map(0x23c0, 0x23c7).m(m_vga, FUNC(wd90c31_vga_device::ext_io_map));
}
void isa16_wd90c31a_lr_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31a_lr_device::io_isa_map);
m_isa->install_device(0x23c0, 0x23c7, *m_vga, &wd90c31_vga_device::ext_io_map);
}
void isa16_wd90c31a_lr_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_wd90c31a_lr_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_w)));
}
else if (space_id == AS_IO)
{
m_isa->install_device(0x0000, 0xffff, *this, &isa16_wd90c31a_lr_device::io_isa_map);
}
}
/******************
*
* WD90C31A-ZS
@@ -580,20 +672,36 @@ void isa16_wd90c31a_zs_device::device_add_mconfig(machine_config &config)
void isa16_wd90c31a_zs_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(wd90c31_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(wd90c31_vga_device::io_map));
map(0x23c0, 0x23c7).m(m_vga, FUNC(wd90c31_vga_device::ext_io_map));
}
void isa16_wd90c31a_zs_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31a_zs_device::io_isa_map);
m_isa->install_device(0x23c0, 0x23c7, *m_vga, &wd90c31_vga_device::ext_io_map);
}
void isa16_wd90c31a_zs_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_wd90c31a_zs_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c31_vga_device::mem_w)));
}
else if (space_id == AS_IO)
{
m_isa->install_device(0x0000, 0xffff, *this, &isa16_wd90c31a_zs_device::io_isa_map);
}
}
/******************
*
* WD90C33-ZZ
@@ -633,17 +741,35 @@ void isa16_wd90c33_zz_device::device_add_mconfig(machine_config &config)
void isa16_wd90c33_zz_device::io_isa_map(address_map &map)
{
map(0x00, 0x2f).m(m_vga, FUNC(wd90c33_vga_device::io_map));
map(0x03b0, 0x03df).m(m_vga, FUNC(wd90c33_vga_device::io_map));
map(0x23c0, 0x23c7).m(m_vga, FUNC(wd90c33_vga_device::ext_io_map));
map(0x23d0, 0x23d3).m(m_vga, FUNC(wd90c33_vga_device::localbus_if_map));
// NOTE: ct486 BIOS setup will drop in MDA without explicit setup mode
map(0x46e8, 0x46e8).w(m_vga, FUNC(wd90c33_vga_device::mode_setup_w));
}
void isa16_wd90c33_zz_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c33_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c33_vga_device::mem_w)));
m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c33_zz_device::io_isa_map);
m_isa->install_device(0x23c0, 0x23cf, *m_vga, &wd90c33_vga_device::ext_io_map);
m_isa->install_device(0x23d0, 0x23d3, *m_vga, &wd90c33_vga_device::localbus_if_map);
}
void isa16_wd90c33_zz_device::device_reset()
{
remap(AS_PROGRAM, 0, 0xfffff);
remap(AS_IO, 0, 0xffff);
}
void isa16_wd90c33_zz_device::remap(int space_id, offs_t start, offs_t end)
{
if (space_id == AS_PROGRAM)
{
m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom");
m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c33_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c33_vga_device::mem_w)));
}
else if (space_id == AS_IO)
{
m_isa->install_device(0x0000, 0xffff, *this, &isa16_wd90c33_zz_device::io_isa_map);
}
}
+27 -4
View File
@@ -21,22 +21,24 @@ public:
// construction/destruction
isa16_pvga1a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual void remap(int space_id, offs_t start, offs_t end) override;
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
required_device<pvga1a_vga_device> m_vga;
};
// TODO: exists in isa8 format too
class isa16_pvga1a_jk_device :
public device_t,
public device_isa16_card_interface
@@ -48,11 +50,14 @@ public:
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -70,11 +75,14 @@ public:
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -95,11 +103,14 @@ public:
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -115,13 +126,17 @@ public:
isa16_wd90c11_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
isa16_wd90c11_lr_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 ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -139,11 +154,13 @@ public:
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -158,16 +175,16 @@ public:
// construction/destruction
isa16_wd90c31_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual void remap(int space_id, offs_t start, offs_t end) override;
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -185,11 +202,13 @@ public:
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -207,11 +226,13 @@ public:
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
@@ -229,11 +250,13 @@ public:
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void remap(int space_id, offs_t start, offs_t end) override;
void io_isa_map(address_map &map) ATTR_COLD;
private:
+440
View File
@@ -0,0 +1,440 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/***************************************************************************
Informer 8048-based compact keyboards
These serial keyboards feature compact 7-row layouts and output raw
scan codes, and contain a bare minimum of support ICs. All MCU revisions
appear to support multiple layouts; the keyboard type is determined by
the jumpering of T0, T1 and 2 matrix positions.
***************************************************************************/
#include "emu.h"
#include "informer_kbd.h"
#include "cpu/mcs48/mcs48.h"
#include "sound/spkrdev.h"
#include "speaker.h"
namespace {
class informer_kbd_device : public device_t, public device_keytronic_interface
{
protected:
informer_kbd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device_t implementation
virtual void device_start() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
// device_keytronic_interface implementation
virtual void ser_in_w(int state) override;
u8 bus_r();
void p2_w(u8 data);
required_device<mcs48_cpu_device> m_mcu;
required_device<speaker_sound_device> m_speaker;
required_ioport_array<13> m_keys;
};
class informer_207_100_kbd_device : public informer_kbd_device
{
public:
// device type constructor
informer_207_100_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0U);
protected:
// device_t implementation
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
};
class informer_213_kbd_device : public informer_kbd_device
{
public:
// device type constructor
informer_213_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0U);
protected:
// device_t implementation
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
};
informer_kbd_device::informer_kbd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, type, tag, owner, clock)
, device_keytronic_interface(mconfig, *this)
, m_mcu(*this, "mcu")
, m_speaker(*this, "speaker")
, m_keys(*this, "KEYS%u", 0U)
{
}
informer_207_100_kbd_device::informer_207_100_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: informer_kbd_device(mconfig, INFORMER_207_100_KBD, tag, owner, clock)
{
}
informer_213_kbd_device::informer_213_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: informer_kbd_device(mconfig, INFORMER_213_KBD, tag, owner, clock)
{
}
void informer_kbd_device::device_start()
{
}
void informer_kbd_device::ser_in_w(int state)
{
m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
}
u8 informer_kbd_device::bus_r()
{
u16 strobe = m_mcu->p1_r() | m_mcu->p2_r() << 8;
u8 ret = 0xff;
for (int i = 0; i < 13; i++)
if (!BIT(strobe, i))
ret &= m_keys[i]->read();
return ret;
}
void informer_kbd_device::p2_w(u8 data)
{
ser_out_w(BIT(data, 7));
m_speaker->level_w(BIT(data, 6));
}
static INPUT_PORTS_START(informer_207_100_kbd)
PORT_START("KEYS0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03) PORT_CODE(KEYCODE_C)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06) PORT_CODE(KEYCODE_F)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14) PORT_CODE(KEYCODE_T)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 % (Set Up A/B/C)") PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF4 (Discn)") PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CODE(KEYCODE_F4)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) PORT_CODE(KEYCODE_4_PAD)
PORT_START("KEYS1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) PORT_CODE(KEYCODE_V)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) PORT_CODE(KEYCODE_G)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19) PORT_CODE(KEYCODE_Y)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 ^ (Toggle)") PORT_CHAR('6') PORT_CHAR('^') PORT_CHAR(0x1e) PORT_CODE(KEYCODE_6)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) PORT_CODE(KEYCODE_MINUS_PAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) PORT_CODE(KEYCODE_5_PAD)
PORT_START("KEYS2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) PORT_CODE(KEYCODE_B)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H (Back Space)") PORT_CHAR('h') PORT_CHAR('H') PORT_CHAR(0x08) PORT_CODE(KEYCODE_H)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15) PORT_CODE(KEYCODE_U)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 & (Tx Speed)") PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(COMMA_PAD)) PORT_CODE(KEYCODE_PLUS_PAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) PORT_CODE(KEYCODE_6_PAD)
PORT_START("KEYS3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CHAR(0x0d) PORT_CODE(KEYCODE_ENTER)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) PORT_CODE(KEYCODE_N)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CHAR('j') PORT_CHAR('J') PORT_CODE(KEYCODE_J)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CHAR('i') PORT_CHAR('I') PORT_CODE(KEYCODE_I)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 * (Rx Speed)") PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CODE(KEYCODE_DEL_PAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) PORT_CODE(KEYCODE_7_PAD)
PORT_START("KEYS4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_DEL)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CHAR('m') PORT_CHAR('M') PORT_CODE(KEYCODE_M)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b) PORT_CODE(KEYCODE_K)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f) PORT_CODE(KEYCODE_O)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) PORT_CODE(KEYCODE_8_PAD)
PORT_START("KEYS5")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x0c) PORT_CODE(KEYCODE_L)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) PORT_CODE(KEYCODE_P)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0 ) (Reset)") PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) PORT_CODE(KEYCODE_9_PAD)
PORT_START("KEYS6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad Enter (Print)") PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) PORT_CODE(KEYCODE_ENTER_PAD)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('.') PORT_CHAR('>') PORT_CODE(KEYCODE_STOP)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
PORT_START("KEYS7")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Break (Here Is)") PORT_CODE(KEYCODE_NUMLOCK)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('/') PORT_CHAR('?') PORT_CODE(KEYCODE_SLASH)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c) PORT_CODE(KEYCODE_BACKSLASH)
PORT_START("KEYS8")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(0x0a) PORT_CODE(KEYCODE_RALT)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("No Scroll") PORT_CODE(KEYCODE_LCONTROL)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11) PORT_CODE(KEYCODE_Q)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!') PORT_CODE(KEYCODE_1)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CHAR(0x09) PORT_CODE(KEYCODE_TAB)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc (Setup)") PORT_CHAR(0x1b) PORT_CODE(KEYCODE_ESC)
PORT_START("KEYS9")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01) PORT_CODE(KEYCODE_A)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) PORT_CODE(KEYCODE_W)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 @ (Toggle Tab)") PORT_CHAR('2') PORT_CHAR('@') PORT_CHAR(0x00) PORT_CODE(KEYCODE_2)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF1 (Dial 1)") PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CODE(KEYCODE_F1)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
PORT_START("KEYS10")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) PORT_CODE(KEYCODE_Z)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x13) PORT_CODE(KEYCODE_S)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05) PORT_CODE(KEYCODE_E)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 # £ (Clear Tabs)") PORT_CHAR('3') PORT_CHAR('#', U'£') PORT_CODE(KEYCODE_3)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF2 (Dial 2)") PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CODE(KEYCODE_F2)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) PORT_CODE(KEYCODE_2_PAD)
PORT_START("KEYS11")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) PORT_CODE(KEYCODE_X)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x04) PORT_CODE(KEYCODE_D)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12) PORT_CODE(KEYCODE_R)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 $ (Line/Local)") PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF3 (Dial 3)") PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CODE(KEYCODE_F3)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) PORT_CODE(KEYCODE_3_PAD)
PORT_START("KEYS12")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_CAPSLOCK)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT)) PORT_CODE(KEYCODE_RSHIFT)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_LALT)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) // read at startup
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) // read at startup
PORT_START("JUMPERS")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) // read at startup
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED) // read at startup
INPUT_PORTS_END
static INPUT_PORTS_START(informer_213_kbd)
PORT_START("KEYS0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03) PORT_CODE(KEYCODE_C)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06) PORT_CODE(KEYCODE_F)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14) PORT_CODE(KEYCODE_T)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('5') PORT_CHAR('%') PORT_CODE(KEYCODE_5)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Erase EOF (Erase Input)") PORT_CODE(KEYCODE_END)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF5 PF17") PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_CHAR(UCHAR_MAMEKEY(F17)) PORT_CODE(KEYCODE_F5)
PORT_START("KEYS1")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) PORT_CODE(KEYCODE_V)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) PORT_CODE(KEYCODE_G)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19) PORT_CODE(KEYCODE_Y)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CHAR('6') PORT_CHAR('^', U'¬') PORT_CHAR(0x1e) PORT_CODE(KEYCODE_6)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_TILDE)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF6 PF18") PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_CHAR(UCHAR_MAMEKEY(F18)) PORT_CODE(KEYCODE_F6)
PORT_START("KEYS2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) PORT_CODE(KEYCODE_B)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CHAR('h') PORT_CHAR('H') /*PORT_CHAR(0x08)*/ PORT_CODE(KEYCODE_H)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15) PORT_CODE(KEYCODE_U)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("{ }") PORT_CHAR('{') PORT_CHAR('}') PORT_CHAR(0x1d) PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF7 PF19") PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_CHAR(UCHAR_MAMEKEY(F19)) PORT_CODE(KEYCODE_F7)
PORT_START("KEYS3")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter (Set-Up)") PORT_CODE(KEYCODE_ENTER)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) PORT_CODE(KEYCODE_N)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR(0x0a) PORT_CODE(KEYCODE_J)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CHAR('i') PORT_CHAR('I') /*PORT_CHAR(0x09)*/ PORT_CODE(KEYCODE_I)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('8') PORT_CHAR('*') PORT_CODE(KEYCODE_8)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF8 PF20") PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_CHAR(UCHAR_MAMEKEY(F20)) PORT_CODE(KEYCODE_F8)
PORT_START("KEYS4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("New Line") PORT_CODE(KEYCODE_RCONTROL) // ↵
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x0d) PORT_CODE(KEYCODE_M)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b) PORT_CODE(KEYCODE_K)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0f) PORT_CODE(KEYCODE_O)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('9') PORT_CHAR('(') PORT_CODE(KEYCODE_9)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CHAR('\\') PORT_CHAR('|', U'¦') PORT_CHAR(0x1c) PORT_CODE(KEYCODE_BACKSLASH)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF9 PF21") PORT_CHAR(UCHAR_MAMEKEY(F9)) /*PORT_CHAR(UCHAR_MAMEKEY(F21))*/ PORT_CODE(KEYCODE_F9)
PORT_START("KEYS5")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Cursor \u2192 (\u21a0)") PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CODE(KEYCODE_RIGHT) // → (↠)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(',') PORT_CHAR('<') PORT_CODE(KEYCODE_COMMA)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x0c) PORT_CODE(KEYCODE_L)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) PORT_CODE(KEYCODE_P)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Insert Dup (PA1)") PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_CODE(KEYCODE_INSERT) // â
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF10 PF22") PORT_CHAR(UCHAR_MAMEKEY(F10)) /*PORT_CHAR(UCHAR_MAMEKEY(F22))*/ PORT_CODE(KEYCODE_F10)
PORT_START("KEYS6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Cursor \u2193") PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CODE(KEYCODE_DOWN) // ↓
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". >") PORT_CHAR('.') PORT_CHAR('>') PORT_CHAR(0x1d) PORT_CODE(KEYCODE_STOP)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(';') PORT_CHAR(':') PORT_CODE(KEYCODE_COLON)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[ ] (Esc)") PORT_CHAR('[', U'¢') PORT_CHAR(']' /*IBM mode: '!'*/) PORT_CHAR(0x1b) PORT_CODE(KEYCODE_OPENBRACE)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') /*PORT_CHAR(0x1f)*/ PORT_CODE(KEYCODE_MINUS)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Delete Field Mark (PA2)") PORT_CHAR(UCHAR_MAMEKEY(DEL)) PORT_CODE(KEYCODE_DEL)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF11 PF23 (Discn)") PORT_CHAR(UCHAR_MAMEKEY(F11)) /*PORT_CHAR(UCHAR_MAMEKEY(F23))*/ PORT_CODE(KEYCODE_F11)
PORT_START("KEYS7")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keyclick (Test)") PORT_CODE(KEYCODE_NUMLOCK)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CHAR('/') PORT_CHAR('?') PORT_CHAR(0x1f) PORT_CODE(KEYCODE_SLASH)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Backspace (Home)") PORT_CHAR(0x08) PORT_CHAR() PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_CODE(KEYCODE_BACKSPACE) // ⇤
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Cursor \u2190 (\u219e)") PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CODE(KEYCODE_LEFT) // ← (↞)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"Cursor \u2191") PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CODE(KEYCODE_UP) // ↑
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF12 PF24 (Dial)") PORT_CHAR(UCHAR_MAMEKEY(F12)) /*PORT_CHAR(UCHAR_MAMEKEY(F24))*/ PORT_CODE(KEYCODE_F12)
PORT_START("KEYS8")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CHAR(0x09) PORT_CODE(KEYCODE_CAPSLOCK) // ⇥
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_LCONTROL)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x11) PORT_CODE(KEYCODE_Q)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('1') PORT_CHAR('!' /*IBM mode: '|'*/) PORT_CODE(KEYCODE_1)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Attn PA3 (Sys Req)") PORT_CODE(KEYCODE_ESC)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF1 PF13") PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR(UCHAR_MAMEKEY(F13)) PORT_CODE(KEYCODE_F1)
PORT_START("KEYS9")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_NAME("Spacebar") PORT_CODE(KEYCODE_SPACE) // "the only unmarked key on the keyboard"
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01) PORT_CODE(KEYCODE_A)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) PORT_CODE(KEYCODE_W)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 @") PORT_CHAR('2') PORT_CHAR('@') PORT_CHAR(0x00) PORT_CODE(KEYCODE_2)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Cursr Sel (Clear)") PORT_CODE(KEYCODE_PGUP)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF2 PF14") PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHAR(UCHAR_MAMEKEY(F14)) PORT_CODE(KEYCODE_F2)
PORT_START("KEYS10")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) PORT_CODE(KEYCODE_Z)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x13) PORT_CODE(KEYCODE_S)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05) PORT_CODE(KEYCODE_E)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('3') PORT_CHAR('#') PORT_CODE(KEYCODE_3)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Cursr Blink (Alt Cursr)") PORT_CODE(KEYCODE_PGDN)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF3 PF15") PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CHAR(UCHAR_MAMEKEY(F15)) PORT_CODE(KEYCODE_F3)
PORT_START("KEYS11")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) PORT_CODE(KEYCODE_X)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x04) PORT_CODE(KEYCODE_D)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x12) PORT_CODE(KEYCODE_R)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('4') PORT_CHAR('$') PORT_CODE(KEYCODE_4)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Print (Ident)") PORT_CHAR(UCHAR_MAMEKEY(PRTSCR)) PORT_CODE(KEYCODE_PRTSCR)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("PF4 PF16") PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_CHAR(UCHAR_MAMEKEY(F16)) PORT_CODE(KEYCODE_F4)
PORT_START("KEYS12")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CHAR(UCHAR_SHIFT_2) PORT_CODE(KEYCODE_RALT)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT)) PORT_CODE(KEYCODE_RSHIFT)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_CODE(KEYCODE_LALT)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_SHIFT_1) PORT_CODE(KEYCODE_LSHIFT)
PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED) // read at startup
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) // read at startup
PORT_START("JUMPERS")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) // read at startup
PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_UNUSED) // read at startup
INPUT_PORTS_END
ioport_constructor informer_207_100_kbd_device::device_input_ports() const
{
return INPUT_PORTS_NAME(informer_207_100_kbd);
}
ioport_constructor informer_213_kbd_device::device_input_ports() const
{
return INPUT_PORTS_NAME(informer_213_kbd);
}
void informer_kbd_device::device_add_mconfig(machine_config &config)
{
I8048(config, m_mcu, 6_MHz_XTAL);
m_mcu->bus_in_cb().set(FUNC(informer_207_100_kbd_device::bus_r));
m_mcu->p2_out_cb().set(FUNC(informer_207_100_kbd_device::p2_w));
m_mcu->t0_in_cb().set_ioport("JUMPERS").bit(0);
m_mcu->t1_in_cb().set_ioport("JUMPERS").bit(1);
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(0, "mono", 1.00);
}
void informer_207_100_kbd_device::device_add_mconfig(machine_config &config)
{
informer_kbd_device::device_add_mconfig(config);
m_mcu->set_clock(5'760'000); // XTAL unreadable; clock chosen to give correct baud rate (6 MHz does not work here)
}
ROM_START(informer_207_100_kbd)
ROM_REGION(0x400, "mcu", 0)
ROM_LOAD("79499-001_version6.bin", 0x000, 0x400, CRC(aad1ed7b) SHA1(f3e5e7d9138abede70e97026f4b2e52e0df6ea31))
ROM_END
ROM_START(informer_213_kbd)
ROM_REGION(0x400, "mcu", 0)
ROM_LOAD("79499-006_v1.3.bin", 0x000, 0x400, CRC(abc4459e) SHA1(0fea01984959c8d8b7884ffca40bef402c9b99b8))
ROM_END
const tiny_rom_entry *informer_207_100_kbd_device::device_rom_region() const
{
return ROM_NAME(informer_207_100_kbd);
}
const tiny_rom_entry *informer_213_kbd_device::device_rom_region() const
{
return ROM_NAME(informer_213_kbd);
}
} // anonymous namespace
// device type definitions
DEFINE_DEVICE_TYPE_PRIVATE(INFORMER_207_100_KBD, device_keytronic_interface, informer_207_100_kbd_device, "in207100kbd", "Informer 207/100 Keyboard")
DEFINE_DEVICE_TYPE_PRIVATE(INFORMER_213_KBD, device_keytronic_interface, informer_213_kbd_device, "in213kbd", "Informer 213 Keyboard")
+21
View File
@@ -0,0 +1,21 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/***************************************************************************
Informer 8048-based compact keyboards
***************************************************************************/
#ifndef MAME_BUS_KEYTRONIC_INFORMER_KBD_H
#define MAME_BUS_KEYTRONIC_INFORMER_KBD_H
#pragma once
#include "keytronic.h"
// device type declarations
DECLARE_DEVICE_TYPE(INFORMER_207_100_KBD, device_keytronic_interface)
DECLARE_DEVICE_TYPE(INFORMER_213_KBD, device_keytronic_interface)
#endif // MAME_BUS_KEYTRONIC_INFORMER_KBD_H
@@ -11,6 +11,8 @@
#include "emu.h"
#include "kay_kbd.h"
#include "cpu/mcs48/mcs48.h"
#include "sound/spkrdev.h"
#include "speaker.h"
#define LOG_TXD (1U << 1)
@@ -110,14 +112,47 @@ MCU, but we don't have a dump for it.
*/
DEFINE_DEVICE_TYPE(KAYPRO_10_KEYBOARD, kaypro_10_keyboard_device, "kaypro10kbd", "Kaypro 10 Keyboard")
namespace {
class kaypro_10_keyboard_device : public device_t, public device_keytronic_interface
{
public:
kaypro_10_keyboard_device(
machine_config const &mconfig,
char const *tag,
device_t *owner,
std::uint32_t clock = 0);
protected:
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
virtual void ser_in_w(int state) override { m_txd = state ? 1U : 0U; }
uint8_t p1_r();
uint8_t p2_r();
void p2_w(uint8_t data);
int t1_r();
uint8_t bus_r();
void bus_w(uint8_t data);
private:
required_device<i8049_device> m_mcu;
required_device<speaker_sound_device> m_bell;
required_ioport_array<16> m_matrix;
required_ioport m_modifiers;
output_finder<> m_led_caps_lock;
std::uint8_t m_txd;
std::uint8_t m_bus;
};
ROM_START(kaypro_10_keyboard)
ROM_REGION(0x0800, "mcu", 0)
ROM_LOAD("m5l8049.bin", 0x0000, 0x0800, CRC(dc772f80) SHA1(aa7cd3f476466203294675d56098dff45952b9b0))
ROM_LOAD("3-z0300-08049.bin", 0x0000, 0x0800, CRC(dc772f80) SHA1(aa7cd3f476466203294675d56098dff45952b9b0)) // NEC D8049; identical dump also extracted from M5L8049
ROM_END
INPUT_PORTS_START(kaypro_keyboard_typewriter)
@@ -324,8 +359,6 @@ INPUT_PORTS_END
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
INPUT_PORTS_END
} // anonymous namespace
kaypro_10_keyboard_device::kaypro_10_keyboard_device(
machine_config const &mconfig,
@@ -333,12 +366,12 @@ kaypro_10_keyboard_device::kaypro_10_keyboard_device(
device_t *owner,
std::uint32_t clock)
: device_t(mconfig, KAYPRO_10_KEYBOARD, tag, owner, clock)
, device_keytronic_interface(mconfig, *this)
, m_mcu(*this, "mcu")
, m_bell(*this, "bell")
, m_matrix(*this, "ROW.%X", 0)
, m_modifiers(*this, "MOD")
, m_led_caps_lock(*this, "led_caps_lock")
, m_rxd_cb(*this)
, m_txd(1U)
, m_bus(0U)
{
@@ -407,7 +440,7 @@ void kaypro_10_keyboard_device::p2_w(uint8_t data)
}
m_bell->level_w(BIT(data, 5));
m_rxd_cb(BIT(data, 7));
ser_out_w(BIT(data, 7));
}
int kaypro_10_keyboard_device::t1_r()
@@ -426,3 +459,8 @@ void kaypro_10_keyboard_device::bus_w(uint8_t data)
m_led_caps_lock = BIT(data, 4);
m_bus = data;
}
} // anonymous namespace
DEFINE_DEVICE_TYPE_PRIVATE(KAYPRO_10_KEYBOARD, device_keytronic_interface, kaypro_10_keyboard_device, "kaypro10kbd", "Kaypro 10 Keyboard")
+12
View File
@@ -0,0 +1,12 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
#ifndef MAME_BUS_KEYTRONIC_KAY_KBD_H
#define MAME_BUS_KEYTRONIC_KAY_KBD_H
#pragma once
#include "keytronic.h"
DECLARE_DEVICE_TYPE(KAYPRO_10_KEYBOARD, device_keytronic_interface)
#endif // MAME_BUS_KEYTRONIC_KAY_KBD_H
+91
View File
@@ -0,0 +1,91 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/***************************************************************************
Generic Keytronic serial keyboard connector
Although Key Tronic Corporation produced many keyboards with varied and
incompatible OEM interfaces, their most common interface uses
full-duplex TTL-level (possibly inverted) serial communications at
300 baud, with 8 data bits and no parity. These keyboards normally
include buzzers to generate keyclicks when enabled and beeps when
requested, and often feature programmable LEDs as well.
Some of these keyboards send ASCII codes, while others send matrix scan
codes to be decoded by the host. Systems that support multiple
non-ASCII keyboard types can distinguish these by the ID bytes they
send back in response to the 0x10 command.
***************************************************************************/
#include "emu.h"
#include "bus/keytronic/keytronic.h"
//**************************************************************************
// KEYBOARD CONNECTOR DEVICE
//**************************************************************************
DEFINE_DEVICE_TYPE(KEYTRONIC_CONNECTOR, keytronic_connector_device, "keytronic_connector", "Keytronic serial keyboard connector")
keytronic_connector_device::keytronic_connector_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, KEYTRONIC_CONNECTOR, tag, owner, clock)
, device_single_card_slot_interface<device_keytronic_interface>(mconfig, *this)
, m_ser_out_callback(*this)
, m_kbd(nullptr)
{
}
void keytronic_connector_device::device_config_complete()
{
m_kbd = get_card_device();
}
void keytronic_connector_device::device_start()
{
}
//**************************************************************************
// KEYTRONIC KEYBOARD INTERFACE
//**************************************************************************
device_keytronic_interface::device_keytronic_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "keytronic")
, m_port(device, DEVICE_SELF_OWNER)
{
}
device_keytronic_interface::~device_keytronic_interface()
{
}
//**************************************************************************
// KEYBOARD OPTIONS
//**************************************************************************
#include "informer_kbd.h"
#include "kay_kbd.h"
#include "keytronic_l2207.h"
void ascii_terminal_keyboards(device_slot_interface &device)
{
device.option_add("l2207", KEYTRONIC_L2207);
}
void informer_207_100_keyboards(device_slot_interface &device)
{
device.option_add("in207100", INFORMER_207_100_KBD); // I207DEC
device.option_add("in213", INFORMER_213_KBD); // I207IBM
device.option_add("l2207", KEYTRONIC_L2207); // DEC 203 (doesn't work reliably on 207/100 except with clear NVRAM)
}
void informer_213_keyboards(device_slot_interface &device)
{
device.option_add("in213", INFORMER_213_KBD);
}
void kaypro_keyboards(device_slot_interface &device)
{
device.option_add("kayproii", KAYPROII_KEYBOARD);
device.option_add("kaypro10", KAYPRO_10_KEYBOARD);
}
+102
View File
@@ -0,0 +1,102 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/***************************************************************************
Generic Keytronic serial keyboard connector
***************************************************************************/
#ifndef MAME_BUS_KEYTRONIC_KEYTRONIC_H
#define MAME_BUS_KEYTRONIC_KEYTRONIC_H
#pragma once
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// forward declaration
class device_keytronic_interface;
// ======================> keytronic_connector_device
class keytronic_connector_device : public device_t, public device_single_card_slot_interface<device_keytronic_interface>
{
friend class device_keytronic_interface;
public:
// construction/destruction
keytronic_connector_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
template <typename T>
keytronic_connector_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *dflt)
: keytronic_connector_device(mconfig, tag, owner, 0U)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
}
// callback configuration
auto ser_out_callback() { return m_ser_out_callback.bind(); }
// serial line input
inline void ser_in_w(int state);
protected:
// device_t implementation
virtual void device_config_complete() override;
virtual void device_start() override ATTR_COLD;
// called from keyboard
void ser_out_w(int state) { m_ser_out_callback(state); }
private:
// user callback
devcb_write_line m_ser_out_callback;
// selected keyboard
device_keytronic_interface *m_kbd;
};
// ======================> device_keytronic_interface
class device_keytronic_interface : public device_interface
{
friend class keytronic_connector_device;
protected:
// construction/destruction
device_keytronic_interface(const machine_config &mconfig, device_t &device);
virtual ~device_keytronic_interface();
void ser_out_w(int state) { m_port->ser_out_w(state); }
virtual void ser_in_w(int state) = 0;
private:
// parent port
required_device<keytronic_connector_device> m_port;
};
// type definition
DECLARE_DEVICE_TYPE(KEYTRONIC_CONNECTOR, keytronic_connector_device)
// supported keyboards
void ascii_terminal_keyboards(device_slot_interface &device);
void informer_207_100_keyboards(device_slot_interface &device);
void informer_213_keyboards(device_slot_interface &device);
void kaypro_keyboards(device_slot_interface &device);
//**************************************************************************
// INLINE FUNCTIONS
//**************************************************************************
void keytronic_connector_device::ser_in_w(int state)
{
if (m_kbd != nullptr)
m_kbd->ser_in_w(state);
}
#endif // MAME_BUS_KEYTRONIC_KEYTRONIC_H
@@ -4,8 +4,8 @@
Keytronic L2207 83-key keyboard
This was sold by Keytronic as a generic VT100-lookalike ASCII
keyboard. Its normal configuration communicates via 300 baud
This was sold by Key Tronic Corp. as a generic VT100-lookalike
ASCII keyboard. Its normal configuration communicates via 300 baud
asynchronous TTL-level serial, but populating a few additional
components and using an alternate connector gives it a parallel
interface for outputs. The PCB additionally supports a "minimum"
@@ -44,8 +44,7 @@
Several other codes (A0-A5, D4, D6, F0, F5) are assigned to
9 additional switches which are not normally populated. The
presently dumped firmware also sends AA in response to the
undocumented test command below.
presently dumped firmware also sends AA as its ID byte.
List of commands (delivered through serial input):
@@ -55,7 +54,7 @@
- - - - - - 1 0 Short beep
- - - - - 1 0 0 Long beep
- - - - 1 0 0 0 Key click off
- - - 1 0 0 0 0 Test? (undocumented)
- - - 1 0 0 0 0 Keyboard ID (undocumented)
- - - 0 0 0 0 0 Key click on
An alternate version of this keyboard, whose solder side is
@@ -63,29 +62,116 @@
keytops and a different EPROM but is otherwise identical in layout
and functionality.
The Kaypro II 76-key detachable keyboard is practically identical
to L2207 (the firmware is identical), but with no LEDs installed
and seven keys removed.
**********************************************************************/
#include "emu.h"
#include "keytronic_l2207.h"
#include "cpu/mcs48/mcs48.h"
#include "sound/spkrdev.h"
#include "speaker.h"
DEFINE_DEVICE_TYPE(KEYTRONIC_L2207, keytronic_l2207_device, "keytronic_l2207", "Keytronic L2207 serial keyboard")
keytronic_l2207_device::keytronic_l2207_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, KEYTRONIC_L2207, tag, owner, clock)
namespace {
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> keytronic_l2207_device
class keytronic_l2207_device : public device_t, public device_keytronic_interface
{
public:
// device type constructor
keytronic_l2207_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0U);
static constexpr feature_type imperfect_features() { return feature::SOUND; }
protected:
keytronic_l2207_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device_t implementation
virtual void device_resolve_objects() override ATTR_COLD;
virtual void device_start() override ATTR_COLD;
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
// device_keytronics_interface implementation
virtual void ser_in_w(int state) override;
// MCU handlers
u8 led_latch_r();
u8 p1_r();
void p2_w(u8 data);
// address maps
void prog_map(address_map &map) ATTR_COLD;
void ext_map(address_map &map) ATTR_COLD;
// object finders
required_device<mcs48_cpu_device> m_mcu;
required_device<speaker_sound_device> m_beeper;
required_ioport_array<12> m_keys;
output_finder<8> m_leds;
output_finder<> m_all_caps;
// internal state
u8 m_p1_in;
u8 m_p2_out;
bool m_beeper_latch;
};
// ======================> kayproii_keyboard_device
class kayproii_keyboard_device : public keytronic_l2207_device
{
public:
// device type constructor
kayproii_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0U);
protected:
// device_t implementation
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
};
//**************************************************************************
// DEVICE IMPLEMENTATION
//**************************************************************************
keytronic_l2207_device::keytronic_l2207_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, type, tag, owner, clock)
, device_keytronic_interface(mconfig, *this)
, m_mcu(*this, "mcu")
, m_beeper(*this, "beeper")
, m_keys(*this, "KEYS%d", 0U)
, m_leds(*this, "kbd_led%d", 1U)
, m_all_caps(*this, "all_caps")
, m_ser_out_callback(*this)
, m_p1_in(0xff)
, m_p2_out(0)
, m_beeper_latch(false)
{
}
keytronic_l2207_device::keytronic_l2207_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: keytronic_l2207_device(mconfig, KEYTRONIC_L2207, tag, owner, clock)
{
}
kayproii_keyboard_device::kayproii_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: keytronic_l2207_device(mconfig, KAYPROII_KEYBOARD, tag, owner, clock)
{
}
void keytronic_l2207_device::device_resolve_objects()
{
m_leds.resolve();
@@ -130,7 +216,7 @@ u8 keytronic_l2207_device::p1_r()
void keytronic_l2207_device::p2_w(u8 data)
{
if (BIT(data, 5) != BIT(m_p2_out, 5))
m_ser_out_callback(BIT(data, 5));
ser_out_w(BIT(data, 5));
if (!BIT(data, 4))
m_p1_in = 0xff;
@@ -180,7 +266,7 @@ static INPUT_PORTS_START(keytronic_l2207)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KEYS2")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('2') PORT_CHAR('@') PORT_CODE(KEYCODE_2)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 @") PORT_CHAR('2') PORT_CHAR('@') PORT_CHAR(0x00) PORT_CODE(KEYCODE_2)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"3 # £") PORT_CHAR('3') PORT_CHAR('#', 0x00a3) PORT_CODE(KEYCODE_3)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) PORT_CODE(KEYCODE_W)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05) PORT_CODE(KEYCODE_E)
@@ -200,7 +286,7 @@ static INPUT_PORTS_START(keytronic_l2207)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) PORT_CODE(KEYCODE_V)
PORT_START("KEYS4")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('6') PORT_CHAR('^') PORT_CODE(KEYCODE_6)
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CHAR('6') PORT_CHAR('^') PORT_CHAR(0x1e) PORT_CODE(KEYCODE_6)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('7') PORT_CHAR('&') PORT_CODE(KEYCODE_7)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CHAR('y') PORT_CHAR('y') PORT_CHAR(0x19) PORT_CODE(KEYCODE_Y)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CHAR('u') PORT_CHAR('u') PORT_CHAR(0x15) PORT_CODE(KEYCODE_U)
@@ -221,7 +307,7 @@ static INPUT_PORTS_START(keytronic_l2207)
PORT_START("KEYS6")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('0') PORT_CHAR(')') PORT_CODE(KEYCODE_0)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('-') PORT_CHAR('_') PORT_CODE(KEYCODE_MINUS)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- _") PORT_CHAR('-') PORT_CHAR('_') PORT_CHAR(0x1f) PORT_CODE(KEYCODE_MINUS)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) PORT_CODE(KEYCODE_P)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('[') PORT_CHAR('{') PORT_CODE(KEYCODE_OPENBRACE)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\'') PORT_CHAR('"') PORT_CODE(KEYCODE_QUOTE)
@@ -232,9 +318,9 @@ static INPUT_PORTS_START(keytronic_l2207)
PORT_START("KEYS7")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('=') PORT_CHAR('+') PORT_CODE(KEYCODE_EQUALS)
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('`') PORT_CHAR('~') PORT_CODE(KEYCODE_BACKSLASH)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(']') PORT_CHAR('}') PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("] }") PORT_CHAR(']') PORT_CHAR('}') PORT_CHAR(0x1d) PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR('\\') PORT_CHAR('|') PORT_CODE(KEYCODE_PGUP)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c) PORT_CODE(KEYCODE_PGUP)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) PORT_CODE(KEYCODE_1_PAD)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) PORT_CODE(KEYCODE_0_PAD)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Line Feed") PORT_CHAR(0x0a) PORT_CODE(KEYCODE_PGDN)
@@ -275,11 +361,37 @@ static INPUT_PORTS_START(keytronic_l2207)
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CHAR(' ') PORT_CODE(KEYCODE_SPACE)
INPUT_PORTS_END
static INPUT_PORTS_START(kayproii_keyboard)
PORT_INCLUDE(keytronic_l2207)
PORT_MODIFY("KEYS0")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_MODIFY("KEYS1")
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_MODIFY("KEYS8")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_MODIFY("KEYS9")
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_MODIFY("KEYS10")
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
ioport_constructor keytronic_l2207_device::device_input_ports() const
{
return INPUT_PORTS_NAME(keytronic_l2207);
}
ioport_constructor kayproii_keyboard_device::device_input_ports() const
{
return INPUT_PORTS_NAME(kayproii_keyboard);
}
void keytronic_l2207_device::device_add_mconfig(machine_config &config)
{
I8035(config, m_mcu, 3.579545_MHz_XTAL); // P8035HL + 48-00300-010 XTAL
@@ -296,6 +408,21 @@ void keytronic_l2207_device::device_add_mconfig(machine_config &config)
SPEAKER_SOUND(config, m_beeper).add_route(ALL_OUTPUTS, "mono", 0.5);
}
void kayproii_keyboard_device::device_add_mconfig(machine_config &config)
{
I8048(config, m_mcu, 3.579545_MHz_XTAL);
m_mcu->set_addrmap(AS_IO, &kayproii_keyboard_device::ext_map);
m_mcu->p1_in_cb().set(FUNC(kayproii_keyboard_device::p1_r));
m_mcu->p2_out_cb().set(FUNC(kayproii_keyboard_device::p2_w));
m_mcu->t0_in_cb().set_constant(1);
m_mcu->t1_in_cb().set_constant(0);
m_mcu->bus_out_cb().set_nop();
m_mcu->prog_out_cb().set_nop();
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_beeper).add_route(ALL_OUTPUTS, "mono", 0.5);
}
ROM_START(keytronic_l2207)
ROM_REGION(0x800, "eprom", 0)
ROM_SYSTEM_BIOS(0, "a65_02207", "A65-02207-051/2510") // from Wicat System 150
@@ -305,7 +432,23 @@ ROM_START(keytronic_l2207)
ROMX_LOAD("key_05__162092859__8-23-82.bin", 0x000, 0x800, CRC(970b11a3) SHA1(a1c9c505eb3ccf132307b2ac0e04b0326f50621e), ROM_BIOS(1)) // MM2716Q
ROM_END
ROM_START(kayproii_keyboard)
ROM_REGION(0x400, "mcu", 0)
ROM_LOAD("kaypro_ii-ins8048.bin", 0x000, 0x400, CRC(f65e1ca5) SHA1(7919385fe8badbb610b793a3f5e4077982094aaa))
ROM_END
const tiny_rom_entry *keytronic_l2207_device::device_rom_region() const
{
return ROM_NAME(keytronic_l2207);
}
const tiny_rom_entry *kayproii_keyboard_device::device_rom_region() const
{
return ROM_NAME(kayproii_keyboard);
}
} // anonymous namespace
// device type definitions
DEFINE_DEVICE_TYPE_PRIVATE(KEYTRONIC_L2207, device_keytronic_interface, keytronic_l2207_device, "keytronic_l2207", "Keytronic L2207 serial keyboard")
DEFINE_DEVICE_TYPE_PRIVATE(KAYPROII_KEYBOARD, device_keytronic_interface, kayproii_keyboard_device, "kayproiikbd", "Kaypro II Keyboard")
@@ -0,0 +1,20 @@
// license:BSD-3-Clause
// copyright-holders:AJR
/**********************************************************************
Keytronic L2207 83-key keyboard
**********************************************************************/
#ifndef MAME_BUS_KEYTRONIC_KEYTRONIC_L2207_H
#define MAME_BUS_KEYTRONIC_KEYTRONIC_L2207_H
#pragma once
#include "keytronic.h"
// device type declaration
DECLARE_DEVICE_TYPE(KEYTRONIC_L2207, device_keytronic_interface)
DECLARE_DEVICE_TYPE(KAYPROII_KEYBOARD, device_keytronic_interface)
#endif // MAME_BUS_KEYTRONIC_KEYTRONIC_L2207_H
Loaded 100 of 521 files, more files were not shown because too many files have changed in this diff. Show more