mirror of
https://github.com/holub/mame
synced 2025-04-16 21:44:32 +03:00
Add floppy support to NEC PC-8001 (#8532)
New clones marked as NOT_WORKING -------------------------------- PC-8001mkIISR [anonymous] * Generate a new pc8001_flop.xml list, based off Neo Kobe dumps; * Move several items from pc8801_flop.xml to the new pc8001_flop.xml; * Generate new lists for pc8001mk2_flop.xml and pc8001mk2sr_flop.xml; * Hook aforementioned lists where they belongs ( i.e. N-Basic list is now shared between pc8801.cpp and pc8001.cpp, N80 list belongs to pc8001mk2 and pc8001mk2sr, N80SR list belongs to pc8001mk2sr alone) * upd3301.cpp: fix scrolling glitch when unthrottled * pc8001.cpp: fix machine configs inheritance * pc8001.cpp: constexpr the XTALs * pc8001.cpp: allow to enter into N80 BASIC mode for mk2 machines * Ported pc80s31k to device interface, and hooked it up to pc8001 * Fix validation errors * Misc documentation updates * uPD3301.cpp: implement bulk of attribute fields * upd3301: fix olyboss compile and crashing, add rvv signal * upd3301.cpp: fix last value of attribute row (7narabe), fix graphic mode when in width 40 (15puzzle) * upd3301.cpp: consider an attribute end of 0 equal to max size, fixes starfire * upd3301.cpp: rvv is definitely a global reverse rather than acting on palette for PC8001, document flgworld attribute weirdness (double somersault) * pc8001_flop.xml: QA selected SW * pc80s31k.cpp: split into PC80S31 (2d) and PC80S31K (2d/2dd/2hd) devices, rearrange disk bioses * pc8801.cpp: inherit pc80s31k device and kill off FDC legacy code * pc80s31k.cpp: documentation updates * pc8001_flop: move Magic Copy and a alt versions of ay1 and 4d house in here * pc98.xml: move daivacal from PC88 since it really belongs here * pc8801_flop.xml: major QA testing on suspicious floppy activities * pc8801.cpp: remove logging of High [TV]RAM * pc8801_flop.xml: fix rogue extra comment closing * pc80s31k.cpp: mailbox the PPI ports, fix barbatus booting; pc80s31k.cpp: allow filemst to boot, and add note about its unemulated extended HW; * upd3301.cpp: convert AT1/AT0/SC to an aggregate variable * upd3301.cpp: convert attribute fetch to be a client delegate * pc8001.cpp: move some shared functions to pc8001_base_state * pc8001.cpp: add DMA functions * pc8001.cpp: add extension setter for 24KHz mode (which will be used by PC-8801 once implementation is merged) * pc8801_flop.xml: fix description duplicate * Bulk replace pc8*_flop.xml capitalized Alt into lowercase * pc80s31k.cpp: add space.unmap() for terminal_count_r, reorder headers, make constructor trampoline protected * Standardize Daiva titles across XMLs * pc8801_cass.xml: revert of software name t[ape] postfixes * pc8801_flop.xml: more identification of N/V1 BASIC SWs
This commit is contained in:
parent
e2331a7eed
commit
ec33fac7c7
@ -86,12 +86,12 @@ Titles, serial #s, publishers and release dates taken from:
|
||||
|
||||
<!-- the alt set with crcs 21fc2e80 and 22ecff45 only differs for d77 headers, but data in the disks are identical -->
|
||||
<software name="daiva" supported="no">
|
||||
<description>Daiva - Active Simulation War</description>
|
||||
<description>Daiva Story 2: Memory in Durga</description>
|
||||
<year>1987</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="serial" value="TEM-74"/>
|
||||
<info name="release" value="198702xx"/>
|
||||
<info name="alt_title" value="ディーヴァ"/>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー2·ドゥルガーの記憶"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="daiva_a.d77" size="348848" crc="80e45da2" sha1="576741ef1cf5f4821634414bfe4ffa4904e4904a"/>
|
||||
|
@ -398,11 +398,11 @@ Xyzolog - Electric Software
|
||||
</software>
|
||||
|
||||
<software name="daiva4">
|
||||
<description>Daiva Story 4 - Asura's Bloodfeud (Jpn)</description>
|
||||
<description>Daiva Story 4: Asura's Bloodfeud (Jpn)</description>
|
||||
<year>1987</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="serial" value="TEX-75" />
|
||||
<info name="alt_title" value="ディーヴァ アスラの血流" />
|
||||
<info name="alt_title" value="ディーヴァ ストーリー4·アスラの血流" />
|
||||
<part name="cart" interface="msx_cart">
|
||||
<feature name="pcb" value="TA6228" />
|
||||
<feature name="slot" value="ascii8" />
|
||||
|
@ -6790,9 +6790,10 @@ The following floppies came with the machines.
|
||||
</software>
|
||||
|
||||
<software name="daiva4">
|
||||
<description>Daiva Story 4 - Asura's Bloodfeud (Jpn)</description>
|
||||
<description>Daiva Story 4: Asura's Bloodfeud (Jpn)</description>
|
||||
<year>19??</year>
|
||||
<publisher><cart2disk hack></publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー4·アスラの血流" />
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
<dataarea name="flop" size="737280">
|
||||
<rom name="daiva story 4 - asura's bloodfeud (1987)(t&e soft)(jp).dsk" size="737280" crc="bce30044" sha1="8a772f4be8258746655b9502df0d0e08a15279ea" offset="0" />
|
||||
@ -6801,9 +6802,10 @@ The following floppies came with the machines.
|
||||
</software>
|
||||
|
||||
<software name="daiva4b" cloneof="daiva4">
|
||||
<description>Daiva Story 4 - Asura's Bloodfeud (Jpn, Alt 2)</description>
|
||||
<description>Daiva Story 4: Asura's Bloodfeud (Jpn, Alt 2)</description>
|
||||
<year>19??</year>
|
||||
<publisher><cart2disk hack></publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー4·アスラの血流" />
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
<dataarea name="flop" size="737280">
|
||||
<rom name="daiva story 4 - asura's bloodfeud (1987)(t&e soft)(jp)[a2].dsk" size="737280" crc="a4af31f2" sha1="805d2d7e924604414bbebcda74d4e94701a24b38" offset="0" />
|
||||
@ -6812,9 +6814,10 @@ The following floppies came with the machines.
|
||||
</software>
|
||||
|
||||
<software name="daiva4a" cloneof="daiva4">
|
||||
<description>Daiva Story 4 - Asura's Bloodfeud (Jpn, Alt)</description>
|
||||
<description>Daiva Story 4: Asura's Bloodfeud (Jpn, Alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher><cart2disk hack></publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー4·アスラの血流" />
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
<dataarea name="flop" size="737280">
|
||||
<rom name="daiva story 4 - asura's bloodfeud (1987)(t&e soft)(jp)[a].dsk" size="737280" crc="f6007ab5" sha1="e717247b6558f1d7cd450cef138af736811fe45d" offset="0" />
|
||||
|
@ -2110,9 +2110,10 @@ The following floppies came with the machines.
|
||||
</software>
|
||||
|
||||
<software name="daiva5">
|
||||
<description>Daiva Story V - The Cup of Soma (Jpn)</description>
|
||||
<description>Daiva Story 5: The Cup of Soma (Jpn)</description>
|
||||
<year>1987</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー5·ソーマの杯" />
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
<dataarea name="flop" size="737280">
|
||||
<rom name="daiva story 5 - the cup of soma (1987)(t&e soft)(jp).dsk" size="737280" crc="c55c9b66" sha1="c68acf155b1245dd341641fb0ebcfcd90a3cf16c"/>
|
||||
@ -2121,9 +2122,10 @@ The following floppies came with the machines.
|
||||
</software>
|
||||
|
||||
<software name="daiva5a" cloneof="daiva5">
|
||||
<description>Daiva Story V - The Cup of Soma (Jpn, Alt)</description>
|
||||
<description>Daiva Story 5: The Cup of Soma (Jpn, Alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー5·ソーマの杯" />
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
<dataarea name="flop" size="737280">
|
||||
<rom name="daiva story 5 - the cup of soma (1987)(t&e soft)(jp)[a].dsk" size="737280" crc="458c3e5a" sha1="bc4cfc1872463fdf5d1c273bc2234f552705cc0c"/>
|
||||
@ -2132,9 +2134,10 @@ The following floppies came with the machines.
|
||||
</software>
|
||||
|
||||
<software name="daiva5b" cloneof="daiva5">
|
||||
<description>Daiva Story V - The Cup of Soma (Jpn, Alt 2)</description>
|
||||
<description>Daiva Story 5: The Cup of Soma (Jpn, Alt 2)</description>
|
||||
<year>1987</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー5·ソーマの杯" />
|
||||
<part name="flop1" interface="floppy_3_5">
|
||||
<dataarea name="flop" size="737280">
|
||||
<rom name="daiva story 5 - the cup of soma (1987)(t&e soft)(jp)[a2].dsk" size="737280" crc="ea46013d" sha1="41137570dce216a7c136f532c2aab3fe5526b795"/>
|
||||
|
@ -7867,12 +7867,12 @@ license:CC0
|
||||
</software>
|
||||
|
||||
<software name="daiva">
|
||||
<description>Daiva - Imperial of Nirsartia (Jpn)</description>
|
||||
<description>Daiva Story 6: Imperial of Nirsartia (Jpn)</description>
|
||||
<year>1986</year>
|
||||
<publisher>Toemiland</publisher>
|
||||
<info name="serial" value="TFS-DV"/>
|
||||
<info name="release" value="19861205"/>
|
||||
<info name="alt_title" value="ディーヴァ ナーサティアの玉座"/>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー6·ナーサティアの玉座"/>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="uxrom" />
|
||||
<feature name="pcb" value="HVC-UNROM" />
|
||||
@ -68908,9 +68908,10 @@ Also notice that VRAM & WRAM are probably incorrect for some of these sets, at t
|
||||
</software>
|
||||
|
||||
<software name="daivah" cloneof="daiva">
|
||||
<description>Daiva - Imperial of Nirsartia (FMG pirate)</description>
|
||||
<description>Daiva Story 6: Imperial of Nirsartia (FMG pirate)</description>
|
||||
<year>1987</year>
|
||||
<publisher>FMG</publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー6·ナーサティアの玉座"/>
|
||||
<part name="cart" interface="nes_cart">
|
||||
<feature name="slot" value="uxrom" />
|
||||
<feature name="pcb" value="NES-UNROM" />
|
||||
|
3293
hash/pc8001_flop.xml
Normal file
3293
hash/pc8001_flop.xml
Normal file
File diff suppressed because it is too large
Load Diff
161
hash/pc8001mk2_flop.xml
Normal file
161
hash/pc8001mk2_flop.xml
Normal file
@ -0,0 +1,161 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<!--
|
||||
license:CC0
|
||||
-->
|
||||
<softwarelist name="pc8001mk2_flop" description="NEC PC-8001mkII (N80 BASIC) disk images">
|
||||
<!--
|
||||
|
||||
Known list of SW released for the system (all cassette releases?):
|
||||
kanji name, romaji name, manufacturer, release date in %MMM %YY format, notes
|
||||
スターフリート, Star Fleet, Tecno Soft, May 83,
|
||||
PCジャンmkII, PC-Jong! mkII, Compaq, Sep 83, (Adds color to regular PC-Jong)
|
||||
Bon Bon, Bon Bon, Compaq, Aug 83, Aug 83,
|
||||
モンスターハウス, Monster House, Compaq, Jul 83,
|
||||
四次元の家, 4 Dimension House, Prosumer, Nov 83,
|
||||
(these are unconfirmed if being specifically for PC-8001mkII or works on vanilla PC-8001 too)
|
||||
クイズダービー, Quiz Derby, Takara, Dec 83, (based off the TBS show)
|
||||
タンクトップ, Tank Top, Magical Zoo, Dec 83,
|
||||
グラフィック雀球, <Graphic Mahjong?> , ストラッドフォード, Dec 83, (description clearly claims to be a mahjong)
|
||||
|
||||
-->
|
||||
|
||||
|
||||
<software name="cranstonmk2">
|
||||
<description>Cranston Manor</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<!-- TODO: "run MK2" ? -->
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="344496">
|
||||
<rom name="cranston manor (mkii) (disk 1) {run mk2}.d88" size="344496" crc="cae808d0" sha1="27a3f9d322217fb6f9c00c8056bc9a79419e484c"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop2" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="cranston manor (mkii) (disk 2).d88" size="348848" crc="e1f04287" sha1="1fb1f14763b97058bc19c6bc18bb075f99baee85"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="ulyssesmk2">
|
||||
<description>Ulysses and the Golden Fleece</description>
|
||||
<year>1983</year>
|
||||
<publisher>スタークラフト (Starcraft)</publisher>
|
||||
<info name="alt_title" value="ユリシーズ"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="344496">
|
||||
<rom name="ulysses (mkii) (disk 1).d88" size="344496" crc="c8cda3c8" sha1="3afe306f81b0a031ac3847567951cd3ec70f9dbd"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop2" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="ulysses (mkii) (disk 2).d88" size="348848" crc="afc8ea36" sha1="a80ad911aeaea4bc6f903d87ce8d66abdcfc318f"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Collections -->
|
||||
|
||||
<software name="gamepc">
|
||||
<description>Game-PC (Collection)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="31424">
|
||||
<rom name="[os] game-pc (mkii).d88" size="31424" crc="a2f5c72e" sha1="702734c1f92f7a765db2b49a1a67215ff9ba662d"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Operating Systems -->
|
||||
|
||||
<software name="n80diskb">
|
||||
<description>N80 Disk BASIC</description>
|
||||
<year>1983</year>
|
||||
<publisher>NEC / Microsoft</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848"> <!-- Data CRC16: 18249 -->
|
||||
<rom name="n-basic.d88" size="348848" crc="0ed0a4c8" sha1="2e80b0b4fc38eb1f81fd27f6828249c764091a55"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="n80diska" cloneof="n80diskb">
|
||||
<description>N80 Disk BASIC (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848"> <!-- Data CRC16: 34301 -->
|
||||
<rom name="n80 basic (1983)(microsoft - nec).d88" size="348848" crc="ff9416a4" sha1="3321c6a723545ef7f413a372683a1e40ef7ea4ef"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="pc80sys">
|
||||
<description>PC-8001mkII System Disk</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348832"> <!-- Data CRC16: 51389 -->
|
||||
<rom name="pc-8001mkii system disk.d88" size="348832" crc="3fc9a80e" sha1="8e65e5b7376799553bbc3ae41223b36c7e807cee"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- TODO: alt of above? -->
|
||||
<software name="n80mkii">
|
||||
<description>N80 BASIC system disk</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="[os] n80 basic system disk (pc-8001mkii).d88" size="348848" crc="ff9416a4" sha1="3321c6a723545ef7f413a372683a1e40ef7ea4ef"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="n80mkiia" cloneof="n80mkii">
|
||||
<description>N80 BASIC system disk (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="[os] n80 basic system disk (pc-8001mkii) [alt 1].d88" size="348848" crc="452088aa" sha1="991dad9039b17ff3b1c5c234e47c96f1068cce53"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Utilities -->
|
||||
|
||||
<software name="n80n88">
|
||||
<description>N80 and N88 Disk BASIC Utility Collection</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348304">
|
||||
<rom name="[utility] n80 and n88 disk basic utility collection (disk 1 - n mode).d88" size="348304" crc="ab1128ca" sha1="83bc1d6db510553be4aeec800209e3bb529a2fb0"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop2" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="[utility] n80 and n88 disk basic utility collection (disk 2 - n88 mode #1).d88" size="348848" crc="8b8a9f73" sha1="0296440ad00804a559027a61e099410565d8eff4"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop3" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="[utility] n80 and n88 disk basic utility collection (disk 3 - n88 mode #2).d88" size="348848" crc="156e257a" sha1="d525cc3ccc6684841608dd4d4aa4c435948fa691"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop4" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="[utility] n80 and n88 disk basic utility collection (disk 4 - n80 mode).d88" size="348848" crc="9a05a7e4" sha1="746947ebb38e28304cd431927a33cfd4d95370b2"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop5" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="591408">
|
||||
<rom name="[utility] n80 and n88 disk basic utility collection (disk 5).d88" size="591408" crc="08c6485e" sha1="7277009da28f955651896d6a779988910f08478e"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</softwarelist>
|
89
hash/pc8001mk2sr_flop.xml
Normal file
89
hash/pc8001mk2sr_flop.xml
Normal file
@ -0,0 +1,89 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
|
||||
<!--
|
||||
license:CC0
|
||||
-->
|
||||
<softwarelist name="pc8001mk2sr_flop" description="NEC PC-8001mkIISR (N80SR BASIC) disk images">
|
||||
<!--
|
||||
|
||||
TODO:
|
||||
- PC8001mk2SR was known running on the equivalent V1(L) BASIC of the bigger PC88 brother.
|
||||
It's pretty much assured that anything marked as "needs V1 BASIC" in pc8801_flop.xml
|
||||
actually belongs here (needs verification once we can boot this).
|
||||
|
||||
Known list of SW released for the system:
|
||||
kanji name, romaji name, manufacturer, release date in %MMM %YY format, notes
|
||||
EGGY, Eggy, Bothtec, Jul 85, (cassette only?)
|
||||
らぷてっく, Laptick, dB-Soft, Feb 86, (floppy)
|
||||
パックランド, Pac-Land, Enix, Oct 85, (cassette/floppy)
|
||||
始皇帝, Shikotei, dB-Soft, Aug 86, (floppy)
|
||||
(*) Are all of those working on PC-8801V1 mode as well?
|
||||
|
||||
-->
|
||||
|
||||
<!-- Games -->
|
||||
|
||||
<software name="mappysr">
|
||||
<description>Mappy (mkIISR)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="353200">
|
||||
<rom name="mappy (mkiisr).d88" size="353200" crc="0152ccd0" sha1="e000b25a2ec4232fd2c62c4bf427270715977e3c"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="xanadusr">
|
||||
<description>Xanadu (mkIISR)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="418960">
|
||||
<rom name="xanadu (mkiisr) (disk a).d88" size="418960" crc="00e5127b" sha1="bbc366072a338deb48da8b460912bf9241689e3e"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop2" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="415840">
|
||||
<rom name="xanadu (mkiisr) (disk b).d88" size="415840" crc="b64f896a" sha1="2138091d56e3d9f6f3ff20df57eebf8552f488d8"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Operating Systems -->
|
||||
|
||||
<software name="n80srbas">
|
||||
<description>N80SR BASIC system disk (PC-8037SR)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="353200">
|
||||
<rom name="[os] n80sr basic system disk (pc-8037sr) (pc-8001mkiisr).d88" size="353200" crc="68cf9f52" sha1="298f01130e5d79e058f650975086bc8902da63db"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Compilations -->
|
||||
|
||||
<!-- TODO: verify this, each disk seems standalone (and Disk 2 is mkII not mkIISR) -->
|
||||
<software name="pc8001mk">
|
||||
<description>PC-8001mkIISR Game Pack (Compilation)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="[compilation] pc-8001mkiisr game pack (disk 1).d88" size="348848" crc="4711b6c0" sha1="31c406799d0f5fd13b9ea22010b93254fbf1ad61"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop2" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="353200">
|
||||
<rom name="[compilation] pc-8001mkiisr game pack (disk 2).d88" size="353200" crc="ac5ccf8b" sha1="85e739e6124704b3e96e6e815ad0d9a25270b258"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
<part name="flop3" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="[compilation] pc-8001mkiisr game pack (disk 3).d88" size="348848" crc="cb8fef04" sha1="137cd4a7956e86434c22cf59e52c62262ccf5f55"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
</softwarelist>
|
@ -4,6 +4,61 @@
|
||||
license:CC0
|
||||
|
||||
NOTE: This list is here only to document available dumps and it's not used (yet) by MAME!
|
||||
|
||||
TODO:
|
||||
- Verify which games actually needs to be moved to separate pc8001[mk2[sr]]_cass.xml lists
|
||||
once cassette support works for either system;
|
||||
|
||||
Known undumped N-Basic games (excluding stuff already in pc8001_flop.xml except for collection disks):
|
||||
kanji name, romaji name, manufacturer, release date in %MMM %YY format, notes
|
||||
ヘッドオン パート2, Head-On Part 2, Compaq, 不明, (*) (made by Geimu Kyoujin)
|
||||
スペースマウス, Space Mouse, Compaq, Oct 81, (, (*) (made by Geimu Kyoujin)
|
||||
ルナシティSOS, Lunar City SOS, Compaq, Apr 81, (*) (made by Geimu Kyoujin)
|
||||
パラシュート, Parachute, Compaq, Jul 82, (Published on マイコンゲームの本3, made by 今風太氏)
|
||||
マリンベルト, Marine Belt, Compaq, Jul 82, (*) (made by 今風太氏)
|
||||
チェックP, Check.P, Compaq, Jul 82, (Published on マイコンゲームの本3, made by 今風太氏)
|
||||
スペースシップ, Space Ship, Compaq, Apr 82, (Published on マイコンゲームの本2, made by 今風太氏)
|
||||
サブマリン, Sub-Marine, Compaq, Apr 82, (Published on マイコンゲームの本2, made by 今風太氏, not to be confused with "SUBMLIN" games in flop.xml)
|
||||
スペーストリップ, Space Trip, Compaq, Feb 82, (*) (made by TOTO氏, any relationship with "Space Trip 2"?)
|
||||
ジャックタイガー, Jack Tiger, Compaq, ??? 82,
|
||||
パックマン3, Puck Man 3, Compaq, Jul 82, (Published on マイコンゲームの本3, made by Y.K氏)
|
||||
スーパー インベーダー, Super Invaders, Tsukumo, 不明,
|
||||
スペースインベーダー, Space Invaders, 不明, 不明, (made by T.K氏)
|
||||
クレイジー クライマー, Crazy Climber, Compaq, Dec 81, (*) (made by S.I氏)
|
||||
スターウォーズ帝国の逆襲ゲーム, Star Wars: The Empire Strikes Back, Compaq, Dec 80, (*)
|
||||
グラフィック QIX, Graphic QIX, Compaq, Jul 82, (Published on マイコンゲームの本3, made by Y.S氏)
|
||||
カーボーイ ゲーム, Cowboy Game, Compaq, Apr 82, (Published on マイコンゲームの本2, made by H.N氏)
|
||||
カーレース, Car Race, Tsukumo, 不明,
|
||||
スーパースペースウォー, Super Space War, Tsukumo,
|
||||
アーマーバルーン, Armor Balloon, Apollo Technica, (Made by M.U氏, Mispelled as "Armer?")
|
||||
ムービング ブロック, Moving Block, Tsukumo, 不明,
|
||||
ドッグ ファイト, Dog Fight, 不明, 不明, (Made by NODA氏)
|
||||
ビリヤード, Billiards, 不明, 不明,
|
||||
スターファイアー, Star Fire, SystemSoft, 不明,
|
||||
バリアアタック, Barrier Attack, Micomsoft, 不明, (Made by A.N氏 K.M氏 M.I氏 )
|
||||
スターダストナイト, Stardust Night, ASCII, 不明, (Made by J.H氏)
|
||||
ドラゴンメイズ, Dragon Maze, ASCII, 不明, (Made by NAC氏)
|
||||
ザ・ナイトボンバー, The Night Bomber, なし, 不明, (Published on PiO Magazine)
|
||||
マリンウォー, Marine War, なし, Jan 85 (Made by DARTH VADER氏)
|
||||
ワープエイリアン, Warp Alien, なし, Jun 84 (Published on PiO Magazine, made by K.O氏)
|
||||
バクテリアランド, Bacteria Land, なし, Jun 85 (Published on PiO Magazine, made by 復活のPC氏 / GANBARE8001氏)
|
||||
エイリアンプラネット, Alien Planet, Compaq, 不明, (Published on PiO Magazine, made by Micro ORB氏)
|
||||
3Dバトルメイズ, 3D-Battle Maze, なし, (Published on PiO Magazine, made by Y.S氏)
|
||||
ベガースネーク, Begger Snake, Compaq, Jun 82 (*, made by H.A氏)
|
||||
ウォーミィ, Wormy, なし, なし (Published on PiO Magazine, made by Y.H氏)
|
||||
ファントムⅣ, Phantom IV, Compaq, Dec 82, (Published on マイコンゲームの本4, made by K.S氏)
|
||||
BURN紫の炎, BURN Murasaki no Honoo, Compaq, Apr 82, (Published on マイコンゲームの本2, made by A.K氏)
|
||||
サーキット, Circuit, Compaq, Sep 82, (*)
|
||||
スーパーモンスター, Super Monster, Compaq, Jul 82, (Published on マイコンゲームの本3, made by Y.N氏)
|
||||
オセロ, Othello, Compaq, Apr 82, (Published on マイコンゲームの本2, made by Y.I氏)
|
||||
THE悟空 , The Goku, Compaq, Dec 82, (Published on マイコンゲームの本4, made by H.N氏)
|
||||
リアルタイムアニメーションツール, Real Time Animation Tool, Compaq, 不明, (*)
|
||||
ランダムウォーカー, Random Walker, Ample Software, 不明, (also on PC8801, made by Mr SASA)
|
||||
キックバル, Kick Ball, なし, なし, (Published on PiO Magazine, also on disk? made by TROPICAL氏)
|
||||
|
||||
(*) Published on I/O Magazine
|
||||
(**) マイコンゲームの本# is "Microcomputer Game" mag published by Kohgakusha
|
||||
|
||||
-->
|
||||
<softwarelist name="pc8801_cass" description="NEC PC-8801 cassettes">
|
||||
|
||||
@ -39,7 +94,7 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
|
||||
|
||||
<!-- these might be 2-sided cassettes (i.e. we should merge some parts) -->
|
||||
<!-- for 8001SR? -->
|
||||
<software name="blckonyx">
|
||||
<software name="blckonyxmk2">
|
||||
<description>The Black Onyx</description>
|
||||
<year>1984</year>
|
||||
<publisher>B·P·S (Bullet-Proof Software)</publisher>
|
||||
@ -213,7 +268,7 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="cosmomut">
|
||||
<software name="cosmomu">
|
||||
<description>Cosmo Mutar</description>
|
||||
<year>1984</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
@ -514,7 +569,7 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="holein1">
|
||||
<software name="holein1t">
|
||||
<description>Hole in One</description>
|
||||
<year>1985</year>
|
||||
<publisher>HAL研究所 (HAL Kenkyuujo)</publisher>
|
||||
@ -865,7 +920,7 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="pacman">
|
||||
<software name="pacmant">
|
||||
<description>Pacman</description>
|
||||
<year>1983</year>
|
||||
<publisher>電波新聞社 (Dempa Shinbunsha)</publisher>
|
||||
@ -1263,7 +1318,7 @@ NOTE: This list is here only to document available dumps and it's not used (yet)
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="4dhouse">
|
||||
<software name="4dhouset">
|
||||
<description>Yojigen no Ie - 4 Dimension House</description>
|
||||
<year>1983</year>
|
||||
<publisher>プロシューマー (Prosumer)</publisher>
|
||||
|
4597
hash/pc8801_flop.xml
4597
hash/pc8801_flop.xml
File diff suppressed because it is too large
Load Diff
@ -13174,10 +13174,10 @@ TODO:
|
||||
|
||||
<!-- Can't run the game, it asks for the system disk even when it's inserted -->
|
||||
<software name="daiva" supported="no">
|
||||
<description>Daiva - Kari-Yuga no Kouki</description>
|
||||
<description>Daiva Story 7: Light of Kari Yuga</description>
|
||||
<year>1987</year>
|
||||
<publisher>ティーアンドイーソフト (T&E Soft)</publisher>
|
||||
<info name="alt_title" value="ディーヴァ カリ・ユガの光輝" />
|
||||
<info name="alt_title" value="ディーヴァ ストーリー7·カリ・ユガの光輝" />
|
||||
<info name="release" value="198706xx" />
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<feature name="part_id" value="System Disk"/>
|
||||
@ -13193,11 +13193,12 @@ TODO:
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Can't run the game, it asks for the system disk even when it's inserted -->
|
||||
<software name="daivaa" cloneof="daiva" supported="no">
|
||||
<description>Daiva - Kari-Yuga no Kouki (Alt Format)</description>
|
||||
<description>Daiva Story 7: Light of Kari Yuga (Alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>ティーアンドイーソフト (T&E Soft)</publisher>
|
||||
<info name="alt_title" value="ディーヴァ カリ・ユガの光輝" />
|
||||
<info name="alt_title" value="ディーヴァ ストーリー7·カリ・ユガの光輝" />
|
||||
<info name="release" value="198706xx" />
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<feature name="part_id" value="Disk 1"/>
|
||||
@ -13213,6 +13214,28 @@ TODO:
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<!-- Can't run the game, it asks for the system disk even when it's inserted -->
|
||||
<software name="daivacal" cloneof="daiva" supported="no">
|
||||
<description>Daiva Story 7: Light of Kari Yuga (Alt 2)</description>
|
||||
<year>1987</year>
|
||||
<publisher>ティーアンドイーソフト (T&E Soft)</publisher>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー7·カリ・ユガの光輝" />
|
||||
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<feature name="part_id" value="Disk A?" />
|
||||
<dataarea name="flop" size="1281968">
|
||||
<rom name="daiva cali-yuga no mitsuteru a.d88" size="1281968" crc="065203c4" sha1="0755a9e2c0bd29844c4dc127c9b40ac53ff7bf32"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
|
||||
<part name="flop2" interface="floppy_5_25">
|
||||
<feature name="part_id" value="Disk B?" />
|
||||
<dataarea name="flop" size="1281968">
|
||||
<rom name="daiva cali-yuga no mitsuteru b.d88" size="1281968" crc="481ae19e" sha1="05df1d3732ef4c91f87e65f9fd689a2e39da8be8"/>
|
||||
</dataarea>
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="daiyugen">
|
||||
<description>Daiyuugen</description>
|
||||
<year>1991</year>
|
||||
|
110
hash/x1_flop.xml
110
hash/x1_flop.xml
@ -439,7 +439,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="crimsona" cloneof="crimson">
|
||||
<description>Crimson (Alt Disk 1)</description>
|
||||
<description>Crimson (alt Disk 1)</description>
|
||||
<year>1988</year>
|
||||
<publisher>ブラザー工業 (Brother Kougyou)</publisher>
|
||||
<info name="release" value="198804xx"/>
|
||||
@ -511,7 +511,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="daisenra" cloneof="daisenr">
|
||||
<description>Daisenryaku X1 (Alt)</description>
|
||||
<description>Daisenryaku X1 (alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>システムソフト (System Soft)</publisher>
|
||||
<info name="release" value="198702xx"/>
|
||||
@ -524,11 +524,11 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="daiva">
|
||||
<description>Daiva</description>
|
||||
<description>Daiva Story 3: Trial of Nirvana</description>
|
||||
<year>1987</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198703xx"/>
|
||||
<info name="alt_title" value="ディーヴァ"/>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー3·ニルヴァーナの試練"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348848">
|
||||
<rom name="daiva1.d88" size="348848" crc="9a4c6b41" sha1="e57e772e89dbafce891c6f14dbb4747eb9ade59a"/>
|
||||
@ -542,11 +542,11 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="daivaa" cloneof="daiva">
|
||||
<description>Daiva (Alt)</description>
|
||||
<description>Daiva Story 3: Trial of Nirvana (alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198703xx"/>
|
||||
<info name="alt_title" value="ディーヴァ"/>
|
||||
<info name="alt_title" value="ディーヴァ ストーリー3·ニルヴァーナの試練"/>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
<dataarea name="flop" size="348304">
|
||||
<rom name="daivaa1.d88" size="348304" crc="dfe64250" sha1="e3e2bc53ad128bfd42b41184d0fa616335328fcd"/>
|
||||
@ -604,7 +604,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="megamitb" cloneof="megamit">
|
||||
<description>Digital Devil Monogatari - Megami Tensei (Alt Disk 1)</description>
|
||||
<description>Digital Devil Monogatari - Megami Tensei (alt Disk 1)</description>
|
||||
<year>1987</year>
|
||||
<publisher>日本テレネット (Nihon Telenet)</publisher>
|
||||
<info name="release" value="198705xx"/>
|
||||
@ -622,7 +622,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="megamita" cloneof="megamit">
|
||||
<description>Digital Devil Monogatari - Megami Tensei (Alt)</description>
|
||||
<description>Digital Devil Monogatari - Megami Tensei (alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>日本テレネット (Nihon Telenet)</publisher>
|
||||
<info name="release" value="198705xx"/>
|
||||
@ -750,7 +750,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="fzonea" cloneof="fzone">
|
||||
<description>Final Zone (Alt)</description>
|
||||
<description>Final Zone (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>日本テレネット (Nihon Telenet)</publisher>
|
||||
<info name="release" value="198611xx"/>
|
||||
@ -911,7 +911,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="gradiusa" cloneof="gradius">
|
||||
<description>Gradius (Alt)</description>
|
||||
<description>Gradius (alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>コナミ (Konami)</publisher>
|
||||
<info name="release" value="198702xx"/>
|
||||
@ -924,7 +924,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="gradiusb" cloneof="gradius">
|
||||
<description>Gradius (Alt 2)</description>
|
||||
<description>Gradius (alt 2)</description>
|
||||
<year>1987</year>
|
||||
<publisher>コナミ (Konami)</publisher>
|
||||
<info name="release" value="198702xx"/>
|
||||
@ -1024,7 +1024,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="hfoxa" cloneof="hfox">
|
||||
<description>Hurry Fox X1 (Alt)</description>
|
||||
<description>Hurry Fox X1 (alt)</description>
|
||||
<year>1985</year>
|
||||
<publisher>マイクロキャビン (Micro Cabin)</publisher>
|
||||
<info name="release" value="198507xx"/>
|
||||
@ -1068,7 +1068,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="hydlidea" cloneof="hydlide">
|
||||
<description>Hydlide (Alt)</description>
|
||||
<description>Hydlide (alt)</description>
|
||||
<year>1985</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198506xx"/>
|
||||
@ -1099,7 +1099,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="hydlide2a" cloneof="hydlide2">
|
||||
<description>Hydlide II - Shine of Darkness (Alt)</description>
|
||||
<description>Hydlide II - Shine of Darkness (alt)</description>
|
||||
<year>1985</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198512xx"/>
|
||||
@ -1117,7 +1117,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="hydlide2b" cloneof="hydlide2">
|
||||
<description>Hydlide II - Shine of Darkness (Alt 2)</description>
|
||||
<description>Hydlide II - Shine of Darkness (alt 2)</description>
|
||||
<year>1985</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198512xx"/>
|
||||
@ -1158,7 +1158,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="hydlide3a" cloneof="hydlide3">
|
||||
<description>Hydlide 3 - The Space Memories (Alt)</description>
|
||||
<description>Hydlide 3 - The Space Memories (alt)</description>
|
||||
<year>1988</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198807xx"/>
|
||||
@ -1182,7 +1182,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
|
||||
<!-- is this correct? it mixes hydlide 1 and 3 -->
|
||||
<software name="hydlide3b" cloneof="hydlide3">
|
||||
<description>Hydlide 3 - The Space Memories (Alt 2)</description>
|
||||
<description>Hydlide 3 - The Space Memories (alt 2)</description>
|
||||
<year>1988</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198807xx"/>
|
||||
@ -1333,7 +1333,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="kugyokuda" cloneof="kugyokud">
|
||||
<description>Kugyokuden (Alt)</description>
|
||||
<description>Kugyokuden (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>テクノソフト (Techno Soft)</publisher>
|
||||
<info name="release" value="198612xx"/>
|
||||
@ -1547,7 +1547,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="mulea" cloneof="mule">
|
||||
<description>M.U.L.E. (Alt)</description>
|
||||
<description>M.U.L.E. (alt)</description>
|
||||
<year>1988</year>
|
||||
<publisher>B·P·S (Bullet-Proof Software)</publisher>
|
||||
<info name="release" value="198808xx"/>
|
||||
@ -1598,7 +1598,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="maiduma" cloneof="maidum">
|
||||
<description>Maidum (Alt)</description>
|
||||
<description>Maidum (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>NCS</publisher>
|
||||
<info name="release" value="198612xx"/>
|
||||
@ -1939,7 +1939,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="ojibinbma" cloneof="ojibinbm">
|
||||
<description>Ouji Binbin Monogatari (Alt)</description>
|
||||
<description>Ouji Binbin Monogatari (alt)</description>
|
||||
<year>1988</year>
|
||||
<publisher>イーストキューブ (East Cube)</publisher>
|
||||
<info name="release" value="198801xx"/>
|
||||
@ -1957,7 +1957,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="ojibinbmb" cloneof="ojibinbm">
|
||||
<description>Ouji Binbin Monogatari (Alt 2)</description>
|
||||
<description>Ouji Binbin Monogatari (alt 2)</description>
|
||||
<year>1988</year>
|
||||
<publisher>イーストキューブ (East Cube)</publisher>
|
||||
<info name="release" value="198801xx"/>
|
||||
@ -2001,7 +2001,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="outroyda" cloneof="outroyd">
|
||||
<description>Outroyd (Alt)</description>
|
||||
<description>Outroyd (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>ストラットフォードC.C.C. (Stratford)</publisher>
|
||||
<info name="release" value="198606xx"/>
|
||||
@ -2193,7 +2193,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="romanciaa" cloneof="romancia">
|
||||
<description>Romancia (Alt)</description>
|
||||
<description>Romancia (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>日本ファルコム (Nihon Falcom)</publisher>
|
||||
<info name="release" value="198611xx"/>
|
||||
@ -2290,7 +2290,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="seijodena" cloneof="seijoden">
|
||||
<description>Seijo Densetsu (Alt)</description>
|
||||
<description>Seijo Densetsu (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>コスモスコンピュータ (Cosmos Computer)</publisher>
|
||||
<info name="release" value="198609xx"/>
|
||||
@ -2316,7 +2316,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="seijopana" cloneof="seijopan">
|
||||
<description>Seijo Panic (Alt)</description>
|
||||
<description>Seijo Panic (alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>コスモスコンピュータ (Cosmos Computer)</publisher>
|
||||
<info name="release" value="198702xx"/>
|
||||
@ -2342,7 +2342,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="shanghaia" cloneof="shanghai">
|
||||
<description>Shanghai (Alt)</description>
|
||||
<description>Shanghai (alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>システムソフト (System Soft)</publisher>
|
||||
<info name="release" value="198710xx"/>
|
||||
@ -2456,7 +2456,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="sorcera" cloneof="sorcer">
|
||||
<description>Sorcerian (Alt?)</description>
|
||||
<description>Sorcerian (alt?)</description>
|
||||
<year>1988</year>
|
||||
<publisher>日本ファルコム (Nihon Falcom)</publisher>
|
||||
<!-- Turbo only -->
|
||||
@ -2690,7 +2690,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="sorcerutila" cloneof="sorcer">
|
||||
<description>Sorcerian Utility Disk Vol.1 (Alt)</description>
|
||||
<description>Sorcerian Utility Disk Vol.1 (alt)</description>
|
||||
<year>1988</year>
|
||||
<publisher>日本ファルコム (Nihon Falcom)</publisher>
|
||||
<!-- Turbo only -->
|
||||
@ -2733,7 +2733,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="sharriera" cloneof="sharrier">
|
||||
<description>Space Harrier (Alt)</description>
|
||||
<description>Space Harrier (alt)</description>
|
||||
<year>1988</year>
|
||||
<publisher>電波新聞社 (Dempa Shinbunsha)</publisher>
|
||||
<info name="release" value="198808xx"/>
|
||||
@ -2838,7 +2838,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="slaydocka" cloneof="slaydock">
|
||||
<description>Super Laydock - Mission Striker (Alt)</description>
|
||||
<description>Super Laydock - Mission Striker (alt)</description>
|
||||
<year>1988</year>
|
||||
<publisher>T&E Soft</publisher>
|
||||
<info name="release" value="198801xx"/>
|
||||
@ -2886,7 +2886,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="smbspa" cloneof="smbsp">
|
||||
<description>Super Mario Bros. Special (Alt)</description>
|
||||
<description>Super Mario Bros. Special (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>ハドソン (Hudson Soft)</publisher>
|
||||
<!-- Turbo only -->
|
||||
@ -3124,7 +3124,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="ultima4a" cloneof="ultima4">
|
||||
<description>Ultima IV - Quest of the Avatar (Alt)</description>
|
||||
<description>Ultima IV - Quest of the Avatar (alt)</description>
|
||||
<year>1987</year>
|
||||
<publisher>ポニカ (PonyCa)</publisher>
|
||||
<info name="release" value="198710xx"/>
|
||||
@ -3203,7 +3203,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
<rom name="zzz-unk-wib_usr.d88" size="414992" crc="61bd9a53" sha1="a0e65a7fd206e71e3025dcb1bcd63947914f33f0"/>
|
||||
-->
|
||||
<software name="wibarma" cloneof="wibarm">
|
||||
<description>Wibarm (Alt)</description>
|
||||
<description>Wibarm (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>アルシスソフト (Arsys Soft)</publisher>
|
||||
<info name="release" value="198609xx"/>
|
||||
@ -3328,7 +3328,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="woodypoca" cloneof="woodypoc">
|
||||
<description>Woody Poco (Alt)</description>
|
||||
<description>Woody Poco (alt)</description>
|
||||
<year>1986</year>
|
||||
<publisher>デービーソフト (dB-Soft)</publisher>
|
||||
<info name="release" value="198612xx"/>
|
||||
@ -3341,7 +3341,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="woodypocb" cloneof="woodypoc">
|
||||
<description>Woody Poco (Alt 2)</description>
|
||||
<description>Woody Poco (alt 2)</description>
|
||||
<year>1986</year>
|
||||
<publisher>デービーソフト (dB-Soft)</publisher>
|
||||
<info name="release" value="198612xx"/>
|
||||
@ -3564,7 +3564,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="marsa" cloneof="mars">
|
||||
<description>The Curse of Mars (Alt)</description>
|
||||
<description>The Curse of Mars (alt)</description>
|
||||
<year>1988?</year>
|
||||
<publisher>電波新聞社 (Dempa Shinbunsha)</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -3575,7 +3575,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="marsb" cloneof="mars">
|
||||
<description>The Curse of Mars (Alt 2?)</description>
|
||||
<description>The Curse of Mars (alt 2?)</description>
|
||||
<year>1988?</year>
|
||||
<publisher>電波新聞社 (Dempa Shinbunsha)</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -3638,7 +3638,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="dialidea" cloneof="dialide">
|
||||
<description>Dialide (Alt?)</description>
|
||||
<description>Dialide (alt?)</description>
|
||||
<year>1989?</year>
|
||||
<publisher>CATsoft</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -3868,7 +3868,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="lovechasa" cloneof="lovechas">
|
||||
<description>Love Chaser (Alt)</description>
|
||||
<description>Love Chaser (alt)</description>
|
||||
<year>1987?</year>
|
||||
<publisher>チャンピオンソフト (Champion Soft)</publisher>
|
||||
<info name="alt_title" value="ラブチェイサー"/>
|
||||
@ -3897,7 +3897,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="marvelsa" cloneof="marvels">
|
||||
<description>Marvelous (Alt)</description>
|
||||
<description>Marvelous (alt)</description>
|
||||
<year>1986?</year>
|
||||
<publisher>データウエスト (Data West)</publisher>
|
||||
<info name="alt_title" value="マーベラス"/>
|
||||
@ -3909,7 +3909,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="marvelsb" cloneof="marvels">
|
||||
<description>Marvelous (Alt 2)</description>
|
||||
<description>Marvelous (alt 2)</description>
|
||||
<year>1986?</year>
|
||||
<publisher>データウエスト (Data West)</publisher>
|
||||
<info name="alt_title" value="マーベラス"/>
|
||||
@ -3944,7 +3944,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="newtypea" cloneof="newtype">
|
||||
<description>Newtype X-1 (Alt)</description>
|
||||
<description>Newtype X-1 (alt)</description>
|
||||
<year>1986?</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -4030,7 +4030,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="saziria" cloneof="saziri">
|
||||
<description>Sa・Zi・Ri (Alt)</description>
|
||||
<description>Sa・Zi・Ri (alt)</description>
|
||||
<year>1988?</year>
|
||||
<publisher>日本テレネット (Nihon Telenet)</publisher>
|
||||
<info name="alt_title" value="紫醜羅"/>
|
||||
@ -4103,7 +4103,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="vipa" cloneof="vip">
|
||||
<description>V.I.P. - Visual Instrument Player (Alt)</description>
|
||||
<description>V.I.P. - Visual Instrument Player (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher>Kamiya</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -4119,7 +4119,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="vipb" cloneof="vip">
|
||||
<description>V.I.P. - Visual Instrument Player (Alt 2)</description>
|
||||
<description>V.I.P. - Visual Instrument Player (alt 2)</description>
|
||||
<year>19??</year>
|
||||
<publisher>Kamiya</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -4130,7 +4130,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="vipc" cloneof="vip" supported="no">
|
||||
<description>V.I.P. - Visual Instrument Player (Alt 3?)</description>
|
||||
<description>V.I.P. - Visual Instrument Player (alt 3?)</description>
|
||||
<year>19??</year>
|
||||
<publisher>Kamiya</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -4175,7 +4175,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="xeviousa" cloneof="xevious">
|
||||
<description>Xevious (Alt)</description>
|
||||
<description>Xevious (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher>電波新聞社 (Dempa Shinbunsha)</publisher>
|
||||
<info name="alt_title" value="ゼビウス"/>
|
||||
@ -5225,7 +5225,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="x1demoa" supported="no">
|
||||
<description>X1 Demo (Alt)</description>
|
||||
<description>X1 Demo (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -5258,7 +5258,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="x1gdemoa">
|
||||
<description>X1g Demo (Alt)</description>
|
||||
<description>X1g Demo (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -5326,7 +5326,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="turbobasa" cloneof="turbobas">
|
||||
<description>Turbo BASIC CZ-8FB02 (Alt)</description>
|
||||
<description>Turbo BASIC CZ-8FB02 (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher>シャープ (Sharp)</publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -5392,7 +5392,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="swordosa" cloneof="swordos">
|
||||
<description>Sword-OS (Alt)?</description>
|
||||
<description>Sword-OS (alt)?</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -5414,7 +5414,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
</software>
|
||||
|
||||
<software name="jodanosa" cloneof="jodanos">
|
||||
<description>Jodan-OS (Alt?)</description>
|
||||
<description>Jodan-OS (alt?)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -5459,7 +5459,7 @@ Plus, some games crash MESS at exit (e.g. some sorcer disks or some arcus disks)
|
||||
|
||||
<!-- This was a spare "ExtraHyper_Game.d88" file, which is not bootable. Investigate what is it! -->
|
||||
<software name="extrahypa" cloneof="extrahyp">
|
||||
<description>Extra Hyper (Alt Data?)</description>
|
||||
<description>Extra Hyper (alt Data?)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
@ -6225,7 +6225,7 @@ From GAME1-25_List.txt:
|
||||
</software>
|
||||
|
||||
<software name="gameea" cloneof="gamee">
|
||||
<description>Game E (Alt)</description>
|
||||
<description>Game E (alt)</description>
|
||||
<year>19??</year>
|
||||
<publisher><unknown></publisher>
|
||||
<part name="flop1" interface="floppy_5_25">
|
||||
|
@ -3110,6 +3110,8 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/pc8401a.cpp",
|
||||
MAME_DIR .. "src/mame/includes/pc8401a.h",
|
||||
MAME_DIR .. "src/mame/video/pc8401a.cpp",
|
||||
MAME_DIR .. "src/mame/machine/pc80s31k.cpp",
|
||||
MAME_DIR .. "src/mame/machine/pc80s31k.h",
|
||||
MAME_DIR .. "src/mame/drivers/pc8001.cpp",
|
||||
MAME_DIR .. "src/mame/includes/pc8001.h",
|
||||
MAME_DIR .. "src/mame/drivers/pc8801.cpp",
|
||||
|
@ -1,5 +1,5 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Curt Coder
|
||||
// copyright-holders:Curt Coder, Angelo Salese
|
||||
/**********************************************************************
|
||||
|
||||
NEC uPD3301 Programmable CRT Controller emulation
|
||||
@ -10,12 +10,20 @@
|
||||
|
||||
TODO:
|
||||
|
||||
- attributes
|
||||
- N interrupt
|
||||
- pinpoint how much of pc8001/pc8801 drawing functions should actually be inherited
|
||||
here;
|
||||
- N interrupt (special control character)
|
||||
- light pen
|
||||
- reset counters
|
||||
- proper DMA timing (now the whole screen is transferred at the end of the frame,
|
||||
accurate timing requires CCLK timer which kills performance)
|
||||
- DMA burst mode;
|
||||
- cleanup: variable namings should be more verbose
|
||||
(i.e. not be a single letter like m_y, m_z, m_b ...);
|
||||
- sorcerml (pc8801) has buggy DMA burst mode, causing an underrun (hence a status U interrupt);
|
||||
- jettermi (pc8801) expects to colorize its underlying 400 b&w mode by masking with the
|
||||
text color attributes here;
|
||||
- xak2 (pc8801) throws text garbage on legacy renderer (verify);
|
||||
|
||||
*/
|
||||
|
||||
@ -77,33 +85,35 @@ DEFINE_DEVICE_TYPE(UPD3301, upd3301_device, "upd3301", "NEC uPD3301")
|
||||
// upd3301_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
upd3301_device::upd3301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
|
||||
device_t(mconfig, UPD3301, tag, owner, clock),
|
||||
device_video_interface(mconfig, *this),
|
||||
m_write_int(*this),
|
||||
m_write_drq(*this),
|
||||
m_write_hrtc(*this),
|
||||
m_write_vrtc(*this),
|
||||
m_display_cb(*this),
|
||||
m_width(0),
|
||||
m_status(0),
|
||||
m_param_count(0),
|
||||
m_data_fifo_pos(0),
|
||||
m_attr_fifo_pos(0),
|
||||
m_input_fifo(0),
|
||||
m_me(0),
|
||||
m_h(80),
|
||||
m_l(20),
|
||||
m_r(10),
|
||||
m_v(6),
|
||||
m_z(32),
|
||||
m_attr_blink(0),
|
||||
m_attr_frame(0),
|
||||
m_cm(0),
|
||||
m_cx(0),
|
||||
m_cy(0),
|
||||
m_cursor_blink(0),
|
||||
m_cursor_frame(0)
|
||||
upd3301_device::upd3301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, UPD3301, tag, owner, clock)
|
||||
, device_video_interface(mconfig, *this)
|
||||
, m_write_int(*this)
|
||||
, m_write_drq(*this)
|
||||
, m_write_hrtc(*this)
|
||||
, m_write_vrtc(*this)
|
||||
, m_write_rvv(*this)
|
||||
, m_display_cb(*this)
|
||||
, m_attr_fetch_cb(*this)
|
||||
, m_width(0)
|
||||
, m_status(0)
|
||||
, m_param_count(0)
|
||||
, m_data_fifo_pos(0)
|
||||
, m_attr_fifo_pos(0)
|
||||
, m_input_fifo(0)
|
||||
, m_me(0)
|
||||
, m_h(80)
|
||||
, m_l(20)
|
||||
, m_r(10)
|
||||
, m_v(6)
|
||||
, m_z(32)
|
||||
, m_attr_blink(0)
|
||||
, m_attr_frame(0)
|
||||
, m_cm(0)
|
||||
, m_cx(0)
|
||||
, m_cy(0)
|
||||
, m_cursor_blink(0)
|
||||
, m_cursor_frame(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -120,7 +130,9 @@ void upd3301_device::device_start()
|
||||
m_write_int.resolve_safe();
|
||||
m_write_hrtc.resolve_safe();
|
||||
m_write_vrtc.resolve_safe();
|
||||
m_write_rvv.resolve();
|
||||
m_display_cb.resolve();
|
||||
m_attr_fetch_cb.resolve();
|
||||
|
||||
// allocate timers
|
||||
m_hrtc_timer = timer_alloc(TIMER_HRTC);
|
||||
@ -148,9 +160,7 @@ void upd3301_device::device_start()
|
||||
save_item(NAME(m_r));
|
||||
save_item(NAME(m_v));
|
||||
save_item(NAME(m_z));
|
||||
save_item(NAME(m_at1));
|
||||
save_item(NAME(m_at0));
|
||||
save_item(NAME(m_sc));
|
||||
save_item(NAME(m_gfx_mode));
|
||||
save_item(NAME(m_attr));
|
||||
save_item(NAME(m_attr_blink));
|
||||
save_item(NAME(m_attr_frame));
|
||||
@ -161,6 +171,7 @@ void upd3301_device::device_start()
|
||||
save_item(NAME(m_cursor_frame));
|
||||
save_item(NAME(m_data_fifo));
|
||||
save_item(NAME(m_attr_fifo));
|
||||
save_item(NAME(m_reverse_display));
|
||||
}
|
||||
|
||||
|
||||
@ -173,6 +184,10 @@ void upd3301_device::device_reset()
|
||||
set_interrupt(0);
|
||||
set_drq(0);
|
||||
|
||||
m_cm = 0;
|
||||
m_b = 48;
|
||||
m_reverse_display = false;
|
||||
|
||||
recompute_parameters();
|
||||
}
|
||||
|
||||
@ -191,40 +206,68 @@ void upd3301_device::device_clock_changed()
|
||||
// device_timer - handle timer events
|
||||
//-------------------------------------------------
|
||||
|
||||
// this snipped was inside screen_update fn
|
||||
// bad idea: it causes all sort of desync glitches when emulation unthrottles
|
||||
// TODO: verify if FIFO clear-out happens on vblank-in or -out
|
||||
inline void upd3301_device::reset_fifo_vrtc()
|
||||
{
|
||||
m_y = 0;
|
||||
m_data_fifo_pos = 0;
|
||||
m_attr_fifo_pos = 0;
|
||||
|
||||
m_cursor_frame++;
|
||||
|
||||
if (m_cursor_frame == m_b)
|
||||
{
|
||||
m_cursor_frame = 0;
|
||||
m_cursor_blink = !m_cursor_blink;
|
||||
}
|
||||
|
||||
m_attr_frame++;
|
||||
if (m_attr_frame == (m_b << 1))
|
||||
{
|
||||
m_attr_frame = 0;
|
||||
m_attr_blink = !m_attr_blink;
|
||||
}
|
||||
}
|
||||
|
||||
void upd3301_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case TIMER_HRTC:
|
||||
LOG("UPD3301 HRTC: %u\n", param);
|
||||
case TIMER_HRTC:
|
||||
LOG("UPD3301 HRTC: %u\n", param);
|
||||
|
||||
m_write_hrtc(param);
|
||||
m_hrtc = param;
|
||||
m_write_hrtc(param);
|
||||
m_hrtc = param;
|
||||
|
||||
update_hrtc_timer(param);
|
||||
break;
|
||||
|
||||
case TIMER_VRTC:
|
||||
LOG("UPD3301 VRTC: %u\n", param);
|
||||
|
||||
m_write_vrtc(param);
|
||||
m_vrtc = param;
|
||||
|
||||
update_vrtc_timer(param);
|
||||
if(!(m_status & STATUS_VE))
|
||||
update_hrtc_timer(param);
|
||||
break;
|
||||
|
||||
if (param && !m_me)
|
||||
{
|
||||
m_status |= STATUS_E;
|
||||
set_interrupt(1);
|
||||
}
|
||||
else if(!param)
|
||||
set_drq(1);
|
||||
break;
|
||||
case TIMER_VRTC:
|
||||
LOG("UPD3301 VRTC: %u\n", param);
|
||||
|
||||
case TIMER_DRQ:
|
||||
break;
|
||||
m_write_vrtc(param);
|
||||
m_vrtc = param;
|
||||
|
||||
update_vrtc_timer(param);
|
||||
if(!(m_status & STATUS_VE))
|
||||
break;
|
||||
|
||||
if(!param)
|
||||
reset_fifo_vrtc();
|
||||
|
||||
if (param && !m_me)
|
||||
{
|
||||
m_status |= STATUS_E;
|
||||
set_interrupt(1);
|
||||
}
|
||||
else if(!param)
|
||||
set_drq(1);
|
||||
break;
|
||||
|
||||
case TIMER_DRQ:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -239,13 +282,16 @@ uint8_t upd3301_device::read(offs_t offset)
|
||||
|
||||
switch (offset & 0x01)
|
||||
{
|
||||
case 0: // data
|
||||
break;
|
||||
case 0: // data
|
||||
// TODO: light pen
|
||||
if (!machine().side_effects_disabled())
|
||||
popmessage("light pen reading");
|
||||
break;
|
||||
|
||||
case 1: // status
|
||||
data = m_status;
|
||||
m_status &= ~(STATUS_LP | STATUS_E |STATUS_N | STATUS_U);
|
||||
break;
|
||||
case 1: // status
|
||||
data = m_status;
|
||||
m_status &= ~(STATUS_LP | STATUS_E |STATUS_N | STATUS_U);
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
@ -260,135 +306,185 @@ void upd3301_device::write(offs_t offset, uint8_t data)
|
||||
{
|
||||
switch (offset & 0x01)
|
||||
{
|
||||
case 0: // data
|
||||
switch (m_mode)
|
||||
{
|
||||
case MODE_RESET:
|
||||
switch (m_param_count)
|
||||
case 0: // data
|
||||
switch (m_mode)
|
||||
{
|
||||
case 0:
|
||||
m_dma_mode = BIT(data, 7);
|
||||
m_h = (data & 0x7f) + 2;
|
||||
LOG("UPD3301 DMA Mode: %s\n", m_dma_mode ? "character" : "burst");
|
||||
LOG("UPD3301 H: %u\n", m_h);
|
||||
case MODE_RESET:
|
||||
switch (m_param_count)
|
||||
{
|
||||
case 0:
|
||||
m_dma_mode = BIT(data, 7);
|
||||
// number of characters per line -2
|
||||
// TODO: doesn't seem to like anything beyond 80
|
||||
m_h = (data & 0x7f) + 2;
|
||||
if (m_h > 80)
|
||||
popmessage("Illegal width set %d", m_h);
|
||||
LOG("UPD3301 DMA Mode: %s\n", m_dma_mode ? "character" : "burst");
|
||||
LOG("UPD3301 H: %u\n", m_h);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
// cursor/attribute blink rate
|
||||
m_b = ((data >> 6) + 1) * 16;
|
||||
// number of lines displayed -1
|
||||
// (or in other words, tilemap y size)
|
||||
m_l = (data & 0x3f) + 1;
|
||||
LOG("UPD3301 B: %u\n", m_b);
|
||||
LOG("UPD3301 L: %u\n", m_l);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
// skip line (pseudo-interlace?)
|
||||
m_s = BIT(data, 7);
|
||||
if (m_s)
|
||||
popmessage("skip line enable");
|
||||
// cursor mode
|
||||
// (00) not blinking underline cursor
|
||||
// (01) blinking underline cursor
|
||||
// (10) not blinking solid cursor
|
||||
// (11) blinking solid cursor
|
||||
// NB: there must be at least 14 lines per char to make underline valid
|
||||
m_c = (data >> 5) & 0x03;
|
||||
if (m_c != 3)
|
||||
popmessage("cursor mode %02x", m_c);
|
||||
// Number of lines per character -1
|
||||
m_r = (data & 0x1f) + 1;
|
||||
LOG("UPD3301 S: %u\n", m_s);
|
||||
LOG("UPD3301 C: %u\n", m_c);
|
||||
LOG("UPD3301 R: %u\n", m_r);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
// vblank lines -1 (1 to 8)
|
||||
m_v = (data >> 5) + 1;
|
||||
// hblank width -2 (6 to 33)
|
||||
m_z = (data & 0x1f) + 2;
|
||||
LOG("UPD3301 V: %u\n", m_v);
|
||||
LOG("UPD3301 Z: %u\n", m_z);
|
||||
recompute_parameters();
|
||||
break;
|
||||
|
||||
case 4:
|
||||
// AT|SC
|
||||
// (00|0) transparent b&w with special control character
|
||||
// (00|1) no attributes, no special control
|
||||
// (01|0) transparent color
|
||||
// (10|0) non-transparent b&w, special control
|
||||
// (10|1) non-transparent b&w, no special control
|
||||
// any other setting are invalid
|
||||
//m_at1 = BIT(data, 7);
|
||||
//m_at0 = BIT(data, 6);
|
||||
//m_sc = BIT(data, 5);
|
||||
m_gfx_mode = (data & 0xe0) >> 5;
|
||||
if (m_gfx_mode & 0x5)
|
||||
popmessage("attr mode %02x", m_gfx_mode);
|
||||
// Max number of attributes per line -1
|
||||
// can't be higher than 20
|
||||
m_attr = std::min((data & 0x1f) + 1, 20);
|
||||
LOG("UPD3301 AT1: %u AT0: %u SC: %u\n", BIT(data, 7), BIT(data, 6), BIT(data, 5));
|
||||
LOG("UPD3301 ATTR: %u\n", m_attr);
|
||||
|
||||
m_mode = MODE_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
m_param_count++;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
m_b = ((data >> 6) + 1) * 16;
|
||||
m_l = (data & 0x3f) + 1;
|
||||
LOG("UPD3301 B: %u\n", m_b);
|
||||
LOG("UPD3301 L: %u\n", m_l);
|
||||
case MODE_LOAD_CURSOR_POSITION:
|
||||
switch (m_param_count)
|
||||
{
|
||||
case 0:
|
||||
m_cx = data & 0x7f;
|
||||
LOG("UPD3301 CX: %u\n", m_cx);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
m_cy = data & 0x3f;
|
||||
LOG("UPD3301 CY: %u\n", m_cy);
|
||||
|
||||
m_mode = MODE_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
m_param_count++;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
m_s = BIT(data, 7);
|
||||
m_c = (data >> 4) & 0x03;
|
||||
m_r = (data & 0x1f) + 1;
|
||||
LOG("UPD3301 S: %u\n", m_s);
|
||||
LOG("UPD3301 C: %u\n", m_c);
|
||||
LOG("UPD3301 R: %u\n", m_r);
|
||||
default:
|
||||
LOG("UPD3301 Invalid Parameter Byte %02x!\n", data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // command
|
||||
m_mode = MODE_NONE;
|
||||
m_param_count = 0;
|
||||
|
||||
switch (data & 0xe0)
|
||||
{
|
||||
case COMMAND_RESET:
|
||||
LOG("UPD3301 Reset\n");
|
||||
m_mode = MODE_RESET;
|
||||
// TODO: this also disables external display such as Graphic VRAM in PC-8801
|
||||
set_display(0);
|
||||
set_interrupt(0);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
m_v = (data >> 5) + 1;
|
||||
m_z = (data & 0x1f) + 2;
|
||||
LOG("UPD3301 V: %u\n", m_v);
|
||||
LOG("UPD3301 Z: %u\n", m_z);
|
||||
recompute_parameters();
|
||||
break;
|
||||
|
||||
case 4:
|
||||
m_at1 = BIT(data, 7);
|
||||
m_at0 = BIT(data, 6);
|
||||
m_sc = BIT(data, 5);
|
||||
m_attr = (data & 0x1f) + 1;
|
||||
LOG("UPD3301 AT1: %u\n", m_at1);
|
||||
LOG("UPD3301 AT0: %u\n", m_at0);
|
||||
LOG("UPD3301 SC: %u\n", m_sc);
|
||||
LOG("UPD3301 ATTR: %u\n", m_attr);
|
||||
|
||||
m_mode = MODE_NONE;
|
||||
case COMMAND_START_DISPLAY:
|
||||
{
|
||||
LOG("UPD3301 Start Display\n");
|
||||
bool new_rvv = bool(BIT(data, 0));
|
||||
// misscmd (pc8001) enables this
|
||||
if (m_reverse_display != new_rvv)
|
||||
{
|
||||
m_reverse_display = new_rvv;
|
||||
if (!m_write_rvv.isnull())
|
||||
m_write_rvv(m_reverse_display);
|
||||
else if (m_reverse_display == true)
|
||||
logerror("%s: reverse display enabled (warning)\n", machine().describe_context());
|
||||
}
|
||||
set_display(1);
|
||||
reset_counters();
|
||||
break;
|
||||
}
|
||||
|
||||
m_param_count++;
|
||||
break;
|
||||
|
||||
case MODE_LOAD_CURSOR_POSITION:
|
||||
switch (m_param_count)
|
||||
{
|
||||
case 0:
|
||||
m_cx = data & 0x7f;
|
||||
LOG("UPD3301 CX: %u\n", m_cx);
|
||||
case COMMAND_SET_INTERRUPT_MASK:
|
||||
LOG("UPD3301 Set Interrupt Mask\n");
|
||||
// vblank irq mask
|
||||
m_me = BIT(data, 0);
|
||||
// special control character irq mask
|
||||
m_mn = BIT(data, 1);
|
||||
// TODO: writing a negated bit 0 makes status bit 7 to be held high?
|
||||
LOG("UPD3301 ME: %u\n", m_me);
|
||||
LOG("UPD3301 MN: %u\n", m_mn);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
m_cy = data & 0x3f;
|
||||
LOG("UPD3301 CY: %u\n", m_cy);
|
||||
case COMMAND_READ_LIGHT_PEN:
|
||||
LOG("UPD3301 Read Light Pen\n");
|
||||
// TODO: similar to cursor parameters except on read
|
||||
// (plus an HR to bit 7 param [0])
|
||||
m_mode = MODE_READ_LIGHT_PEN;
|
||||
break;
|
||||
|
||||
m_mode = MODE_NONE;
|
||||
case COMMAND_LOAD_CURSOR_POSITION:
|
||||
LOG("UPD3301 Load Cursor Position\n");
|
||||
m_mode = MODE_LOAD_CURSOR_POSITION;
|
||||
// (1) show cursor (0) disable cursor
|
||||
m_cm = BIT(data, 0);
|
||||
LOG("UPD3301 CM: %u\n", m_cm);
|
||||
break;
|
||||
|
||||
case COMMAND_RESET_INTERRUPT:
|
||||
LOG("UPD3301 Reset Interrupt\n");
|
||||
set_interrupt(0);
|
||||
break;
|
||||
|
||||
case COMMAND_RESET_COUNTERS:
|
||||
LOG("UPD3301 Reset Counters\n");
|
||||
m_mode = MODE_RESET_COUNTERS;
|
||||
reset_counters();
|
||||
break;
|
||||
}
|
||||
|
||||
m_param_count++;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG("UPD3301 Invalid Parameter Byte %02x!\n", data);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // command
|
||||
m_mode = MODE_NONE;
|
||||
m_param_count = 0;
|
||||
|
||||
switch (data & 0xe0)
|
||||
{
|
||||
case COMMAND_RESET:
|
||||
LOG("UPD3301 Reset\n");
|
||||
m_mode = MODE_RESET;
|
||||
set_display(0);
|
||||
set_interrupt(0);
|
||||
break;
|
||||
|
||||
case COMMAND_START_DISPLAY:
|
||||
LOG("UPD3301 Start Display\n");
|
||||
set_display(1);
|
||||
reset_counters();
|
||||
break;
|
||||
|
||||
case COMMAND_SET_INTERRUPT_MASK:
|
||||
LOG("UPD3301 Set Interrupt Mask\n");
|
||||
m_me = BIT(data, 0);
|
||||
m_mn = BIT(data, 1);
|
||||
LOG("UPD3301 ME: %u\n", m_me);
|
||||
LOG("UPD3301 MN: %u\n", m_mn);
|
||||
break;
|
||||
|
||||
case COMMAND_READ_LIGHT_PEN:
|
||||
LOG("UPD3301 Read Light Pen\n");
|
||||
m_mode = MODE_READ_LIGHT_PEN;
|
||||
break;
|
||||
|
||||
case COMMAND_LOAD_CURSOR_POSITION:
|
||||
LOG("UPD3301 Load Cursor Position\n");
|
||||
m_mode = MODE_LOAD_CURSOR_POSITION;
|
||||
m_cm = BIT(data, 0);
|
||||
LOG("UPD3301 CM: %u\n", m_cm);
|
||||
break;
|
||||
|
||||
case COMMAND_RESET_INTERRUPT:
|
||||
LOG("UPD3301 Reset Interrupt\n");
|
||||
set_interrupt(0);
|
||||
break;
|
||||
|
||||
case COMMAND_RESET_COUNTERS:
|
||||
LOG("UPD3301 Reset Counters\n");
|
||||
m_mode = MODE_RESET_COUNTERS;
|
||||
reset_counters();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -406,17 +502,23 @@ void upd3301_device::dack_w(uint8_t data)
|
||||
|
||||
if (m_data_fifo_pos < m_h)
|
||||
{
|
||||
m_data_fifo[m_data_fifo_pos][m_input_fifo] = data;
|
||||
m_data_fifo[m_input_fifo][m_data_fifo_pos] = data;
|
||||
m_data_fifo_pos++;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_attr_fifo[m_attr_fifo_pos][m_input_fifo] = data;
|
||||
m_attr_fifo[m_input_fifo][m_attr_fifo_pos] = data;
|
||||
m_attr_fifo_pos++;
|
||||
}
|
||||
|
||||
if ((m_data_fifo_pos == m_h) && (m_attr_fifo_pos == (m_attr << 1)))
|
||||
{
|
||||
const u8 attr_max_size = 80;
|
||||
// first attribute start is always overwritten with a 0
|
||||
m_attr_fifo[m_input_fifo][0] = 0;
|
||||
// last parameter always extends up to the end of the row
|
||||
// (7narabe (pc8001) fills last row value with white when exausting available slots)
|
||||
m_attr_fifo[m_input_fifo][40] = attr_max_size;
|
||||
m_input_fifo = !m_input_fifo;
|
||||
|
||||
m_data_fifo_pos = 0;
|
||||
@ -466,23 +568,70 @@ int upd3301_device::vrtc_r()
|
||||
// draw_scanline -
|
||||
//-------------------------------------------------
|
||||
|
||||
UPD3301_FETCH_ATTRIBUTE( upd3301_device::default_attr_fetch )
|
||||
{
|
||||
const u8 attr_max_size = 80;
|
||||
std::array<u16, attr_max_size> attr_extend_info;
|
||||
|
||||
// TODO: uPD3301 may actually fetch in LIFO order
|
||||
for (int ex = 0; ex < attr_fifo_size; ex+=2)
|
||||
{
|
||||
u8 attr_start = std::min(attr_row[ex], attr_max_size);
|
||||
u8 attr_value = attr_row[ex+1];
|
||||
u8 attr_end = std::min(attr_row[ex+2], attr_max_size);
|
||||
// if the target is == 0 then just consider max size instead
|
||||
// (starfire (pc8001) wants this otherwise will black screen on gameplay)
|
||||
if (attr_end == 0)
|
||||
attr_end = attr_max_size;
|
||||
|
||||
//printf("%04x %d %d [%02x]\n", ex, attr_start, attr_end, attr_value);
|
||||
|
||||
for (int i = attr_start; i < attr_end; i++)
|
||||
attr_extend_info[i] = attr_value;
|
||||
|
||||
if (attr_end == attr_max_size)
|
||||
break;
|
||||
}
|
||||
|
||||
return attr_extend_info;
|
||||
}
|
||||
|
||||
void upd3301_device::draw_scanline()
|
||||
{
|
||||
// Olympia Boss never bothers in writing a correct attribute table for rows on resident OS,
|
||||
// it just extends the full attribute RAM with a start: 0 end: 0xff value: 0.
|
||||
// According to doc notes anything beyond width 80 is puked by the CRTC, therefore we clamp.
|
||||
const u8 attr_max_size = 80;
|
||||
const std::array<u8, 41> attr_fifo = m_attr_fifo[!m_input_fifo];
|
||||
|
||||
// expose attribute handling to our client
|
||||
// PC-8801 schematics definitely shows extra TTL connections for handling its "8 to 16-bit" attribute conversion.
|
||||
// It also practically needs to read the attribute mapping for various extra side-effects such as colorized 400 line 1bpp
|
||||
// cfr. "その他 / other" section at http://mydocuments.g2.xrea.com/html/p8/vraminfo.html
|
||||
std::array<u16, attr_max_size> extend_attr = m_attr_fetch_cb(attr_fifo, m_gfx_mode, m_y, m_attr << 1, m_h);
|
||||
|
||||
for (int lc = 0; lc < m_r; lc++)
|
||||
{
|
||||
bool is_lowestline = lc == m_r - 1;
|
||||
for (int sx = 0; sx < m_h; sx++)
|
||||
{
|
||||
int y = m_y + lc;
|
||||
uint8_t cc = m_data_fifo[sx][!m_input_fifo];
|
||||
int hlgt = 0; // TODO
|
||||
int rvv = 0; // TODO
|
||||
int vsp = 0; // TODO
|
||||
int sl0 = 0; // TODO
|
||||
int sl12 = 0; // TODO
|
||||
uint8_t cc = m_data_fifo[!m_input_fifo][sx];
|
||||
int csr = m_cm && m_cursor_blink && ((y / m_r) == m_cy) && (sx == m_cx);
|
||||
int gpa = 0; // TODO
|
||||
|
||||
m_display_cb(m_bitmap, y, sx, cc, lc, hlgt, rvv, vsp, sl0, sl12, csr, gpa);
|
||||
// datasheet mentions these but I find zero unambiguous information for PC-8001/PC-8801, i.e.:
|
||||
// - "highlight" should be attribute blinking?
|
||||
// - is "gpa" actually NEC-ese for attr bus?
|
||||
// - is sl0 / sl12 NEC names for upper/lower line?
|
||||
// int hlgt = 0;
|
||||
// int rvv = 0;
|
||||
// int vsp = 0;
|
||||
// int sl0 = 0;
|
||||
// int sl12 = 0;
|
||||
// int gpa = 0;
|
||||
|
||||
// m_display_cb(m_bitmap, y, sx, cc, lc, hlgt, rvv, vsp, sl0, sl12, csr, gpa);
|
||||
m_display_cb(m_bitmap, y, sx, cc, lc, csr, m_attr_blink, extend_attr[sx], m_gfx_mode, is_lowestline);
|
||||
}
|
||||
}
|
||||
|
||||
@ -496,33 +645,13 @@ void upd3301_device::draw_scanline()
|
||||
|
||||
uint32_t upd3301_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
if (m_status & STATUS_VE)
|
||||
{
|
||||
m_y = 0;
|
||||
m_data_fifo_pos = 0;
|
||||
m_attr_fifo_pos = 0;
|
||||
bitmap.fill(rgb_t(0x00,0x00,0x00), cliprect);
|
||||
|
||||
m_cursor_frame++;
|
||||
if (!(m_status & STATUS_VE))
|
||||
return 0;
|
||||
|
||||
if (m_cursor_frame == m_b)
|
||||
{
|
||||
m_cursor_frame = 0;
|
||||
m_cursor_blink = !m_cursor_blink;
|
||||
}
|
||||
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
|
||||
|
||||
m_attr_frame++;
|
||||
|
||||
if (m_attr_frame == (m_b << 1))
|
||||
{
|
||||
m_attr_frame = 0;
|
||||
m_attr_blink = !m_attr_blink;
|
||||
}
|
||||
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
|
||||
}
|
||||
else
|
||||
{
|
||||
bitmap.fill(rgb_t(0x00,0x00,0x00), cliprect);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Curt Coder
|
||||
// copyright-holders:Curt Coder, Angelo Salese
|
||||
/**********************************************************************
|
||||
|
||||
NEC uPD3301 Programmable CRT Controller emulation
|
||||
@ -40,8 +40,10 @@
|
||||
// INTERFACE CONFIGURATION MACROS
|
||||
//**************************************************************************
|
||||
|
||||
#define UPD3301_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int sx, uint8_t cc, uint8_t lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)
|
||||
//#define UPD3301_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int sx, uint8_t cc, uint8_t lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)
|
||||
#define UPD3301_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int sx, uint8_t cc, uint8_t lc, int csr, bool attr_blink_on, u16 attr, u8 gfx_mode, bool is_lowestline)
|
||||
|
||||
#define UPD3301_FETCH_ATTRIBUTE(_name) std::array<u16, 80> _name(const std::array<u8, 41> attr_row, u8 gfx_mode, int y, u8 attr_fifo_size, u8 row_size)
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
@ -54,18 +56,24 @@ class upd3301_device : public device_t,
|
||||
public device_video_interface
|
||||
{
|
||||
public:
|
||||
typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int sx, uint8_t cc, uint8_t lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)> draw_character_delegate;
|
||||
// typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int sx, uint8_t cc, uint8_t lc, int hlgt, int rvv, int vsp, int sl0, int sl12, int csr, int gpa)> draw_character_delegate;
|
||||
typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int sx, uint8_t cc, uint8_t lc, int csr, bool attr_blink_on, u16 attr, u8 gfx_mode, bool is_lowerline)> draw_character_delegate;
|
||||
typedef device_delegate<std::array<u16, 80> (const std::array<u8, 41> attr_row, u8 gfx_mode, int y, u8 attr_fifo_size, u8 row_size)> fetch_attribute_delegate;
|
||||
|
||||
// construction/destruction
|
||||
upd3301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
void set_character_width(int value) { m_width = value; }
|
||||
template <typename... T> void set_display_callback(T &&... args) { m_display_cb.set(std::forward<T>(args)...); }
|
||||
template <typename... T> void set_attribute_fetch_callback(T &&... args) { m_attr_fetch_cb.set(std::forward<T>(args)...); }
|
||||
|
||||
UPD3301_FETCH_ATTRIBUTE( default_attr_fetch );
|
||||
|
||||
auto drq_wr_callback() { return m_write_drq.bind(); }
|
||||
auto int_wr_callback() { return m_write_int.bind(); }
|
||||
auto hrtc_wr_callback() { return m_write_hrtc.bind(); }
|
||||
auto vrtc_wr_callback() { return m_write_vrtc.bind(); }
|
||||
auto rvv_wr_callback() { return m_write_rvv.bind(); }
|
||||
|
||||
uint8_t read(offs_t offset);
|
||||
void write(offs_t offset, uint8_t data);
|
||||
@ -100,13 +108,16 @@ private:
|
||||
void recompute_parameters();
|
||||
|
||||
void draw_scanline();
|
||||
inline void reset_fifo_vrtc();
|
||||
|
||||
devcb_write_line m_write_int;
|
||||
devcb_write_line m_write_drq;
|
||||
devcb_write_line m_write_hrtc;
|
||||
devcb_write_line m_write_vrtc;
|
||||
devcb_write_line m_write_rvv;
|
||||
|
||||
draw_character_delegate m_display_cb;
|
||||
fetch_attribute_delegate m_attr_fetch_cb;
|
||||
int m_width;
|
||||
|
||||
// screen drawing
|
||||
@ -121,8 +132,8 @@ private:
|
||||
int m_param_count; // parameter count
|
||||
|
||||
// FIFOs
|
||||
uint8_t m_data_fifo[80][2]; // row data FIFO
|
||||
uint8_t m_attr_fifo[40][2]; // attribute FIFO
|
||||
u8 m_data_fifo[2][80]; // row data FIFO
|
||||
std::array<std::array<u8, 40+1>, 2> m_attr_fifo; // attribute FIFO (+1 for extending to end of row)
|
||||
int m_data_fifo_pos; // row data FIFO position
|
||||
int m_attr_fifo_pos; // attribute FIFO position
|
||||
int m_input_fifo; // which FIFO is in input mode
|
||||
@ -143,9 +154,10 @@ private:
|
||||
int m_z; // horizontal blanking width
|
||||
|
||||
// attributes
|
||||
int m_at1; //
|
||||
int m_at0; //
|
||||
int m_sc; //
|
||||
// int m_at1; //
|
||||
// int m_at0; //
|
||||
// int m_sc; //
|
||||
u8 m_gfx_mode; // AT1 + AT0 + SC
|
||||
int m_attr; // attributes per row
|
||||
int m_attr_blink; // attribute blink
|
||||
int m_attr_frame; // attribute blink frame counter
|
||||
@ -157,6 +169,9 @@ private:
|
||||
int m_cursor_blink; // cursor blink
|
||||
int m_cursor_frame; // cursor blink frame counter
|
||||
|
||||
// misc
|
||||
bool m_reverse_display;
|
||||
|
||||
// timers
|
||||
emu_timer *m_hrtc_timer;
|
||||
emu_timer *m_vrtc_timer;
|
||||
|
@ -172,7 +172,7 @@ void olyboss_state::olyboss_io(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map.unmap_value_high();
|
||||
map(0x0, 0x8).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write));
|
||||
map(0x00, 0x08).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write));
|
||||
map(0x10, 0x11).m(m_fdc, FUNC(upd765a_device::map));
|
||||
//map(0x20, 0x20) //beeper?
|
||||
map(0x30, 0x30).rw(m_uic, FUNC(am9519_device::data_r), FUNC(am9519_device::data_w));
|
||||
@ -269,8 +269,8 @@ UPD3301_DRAW_CHARACTER_MEMBER( olyboss_state::olyboss_display_pixels )
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
int color = BIT(data, 7) ^ rvv;
|
||||
bitmap.pix(y, (sx * 8) + i) = color?0xffffff:0;
|
||||
int color = BIT(data, 7);
|
||||
bitmap.pix(y, (sx * 8) + i) = color ? 0xffffff : 0;
|
||||
data <<= 1;
|
||||
}
|
||||
}
|
||||
@ -458,6 +458,7 @@ void olyboss_state::olybossd(machine_config &config)
|
||||
UPD3301(config, m_crtc, XTAL(14'318'181));
|
||||
m_crtc->set_character_width(8);
|
||||
m_crtc->set_display_callback(FUNC(olyboss_state::olyboss_display_pixels));
|
||||
m_crtc->set_attribute_fetch_callback(m_crtc, FUNC(upd3301_device::default_attr_fetch));
|
||||
m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
|
||||
m_crtc->int_wr_callback().set(m_uic, FUNC(am9519_device::ireq0_w)).invert();
|
||||
m_crtc->set_screen(SCREEN_TAG);
|
||||
|
@ -1,5 +1,5 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Curt Coder
|
||||
// copyright-holders:Curt Coder, Angelo Salese
|
||||
/*
|
||||
|
||||
http://www2.odn.ne.jp/~haf09260/Pc80/EnrPc.htm
|
||||
@ -12,14 +12,28 @@
|
||||
|
||||
TODO:
|
||||
|
||||
- uPD3301 attributes
|
||||
- PCG1000
|
||||
- Intel 8251
|
||||
- cassette
|
||||
- floppy
|
||||
- PC-8011
|
||||
- PC-8021
|
||||
- PC-8031
|
||||
- uPD3301 attributes;
|
||||
- PCG-1000;
|
||||
- Intel 8251;
|
||||
- cassette;
|
||||
- dip-switches;
|
||||
- PC-8011 (expansion unit)
|
||||
- PC-8021;
|
||||
- PC-8031 (mini disk unit, in progress)
|
||||
- pc8001mk2sr: verify how much needs to be ported from pc8801.cpp code
|
||||
(Has 3 bitplane GVRAM like PC-8801 V1 mode);
|
||||
- waitstates & DMA penalty (some games are suspciously fast);
|
||||
- buzzer has pretty ugly aliasing in places;
|
||||
|
||||
Notes:
|
||||
- pc8001 v1.01 / v1.02 sports a buggy readout of the expansion ROM at PC=17a1:
|
||||
It expects an header read of 0x41-0x42 at offset $6000-6001, but second read at
|
||||
PC=0x17aa is just a comparison to $6000 == 0x42, which is impossible at that point
|
||||
unless external aid is given. This has been fixed in v1.10;
|
||||
- Color Magical (pc8001gp:flop5 option 7) transfers two 8 color screens at
|
||||
even/odd frame intervals, effectively boosting the number of available colors to 27.
|
||||
This trick is kinda flickery even on real HW, no wonder it looks ugly in MAME,
|
||||
can it be improved?
|
||||
|
||||
*/
|
||||
|
||||
@ -28,6 +42,150 @@
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
|
||||
WRITE_LINE_MEMBER( pc8001_base_state::crtc_reverse_w )
|
||||
{
|
||||
// rvv acts as a global flip for reverse attribute meaning
|
||||
// (does not act on underlying palette)
|
||||
// TODO: what happens if RVV changes mid-frame?
|
||||
// I suspect monitor resync more likely than rasters.
|
||||
m_screen_reverse = state;
|
||||
}
|
||||
|
||||
UPD3301_FETCH_ATTRIBUTE( pc8001_base_state::attr_fetch )
|
||||
{
|
||||
const u8 attr_max_size = 80;
|
||||
const bool is_color_mode = gfx_mode == 0x2;
|
||||
std::array<u16, attr_max_size> attr_extend_info = m_crtc->default_attr_fetch(attr_row, gfx_mode, y, attr_fifo_size, row_size);
|
||||
|
||||
// further extend the attributes if we are in color mode
|
||||
if (is_color_mode)
|
||||
{
|
||||
// TODO: defaults
|
||||
// flgworld (pc8001) gameplay sets up:
|
||||
// - 0x00 0x00 0x02 0x88 on playfield
|
||||
// \- (wanting the default from the first defined color)
|
||||
// - 0x00 0x00 0x00 0x48 0x12 0x88 for first row
|
||||
// \- (Expecting "FLAG WORLD" wording to be red while the "P"s in green wtf)
|
||||
// undermon (pc8001) instruction screen sets up:
|
||||
// - 0x00 0x00 0x06 0xb8
|
||||
// \- (expecting blue fill up to 0x06)
|
||||
u8 attr_color = 0xe8;
|
||||
u8 attr_decoration = 0x00;
|
||||
|
||||
for (int ex = 0; ex < row_size; ex++)
|
||||
{
|
||||
u16 cur_attr = attr_extend_info[ex];
|
||||
if (BIT(cur_attr, 3))
|
||||
attr_color = cur_attr;
|
||||
else
|
||||
attr_decoration = cur_attr;
|
||||
attr_extend_info[ex] = (attr_color << 8) | attr_decoration;
|
||||
}
|
||||
}
|
||||
|
||||
return attr_extend_info;
|
||||
}
|
||||
|
||||
UPD3301_DRAW_CHARACTER_MEMBER( pc8001_base_state::draw_text )
|
||||
{
|
||||
// punt if we are in width 40 (discarded on this end)
|
||||
if (sx % 2 && !m_width80)
|
||||
return;
|
||||
|
||||
const bool is_color_mode = gfx_mode == 0x2;
|
||||
u8 tile;
|
||||
const u8 tile_width = m_width80 ? 8 : 16;
|
||||
const u8 dot_width = (m_width80 ^ 1) + 1;
|
||||
const u8 y_double = m_screen_is_24KHz ? 2 : 1;
|
||||
const u8 y_height = y_double * 8;
|
||||
|
||||
bool semigfx_tile, reverse, attr_blink, secret;
|
||||
bool upperline, lowerline;
|
||||
u8 color;
|
||||
|
||||
if (is_color_mode)
|
||||
{
|
||||
color = (attr & 0xe000) >> 13;
|
||||
semigfx_tile = bool(BIT(attr, 12));
|
||||
// bit 7 is used by 2001spc and many others, no effect?
|
||||
}
|
||||
else
|
||||
{
|
||||
color = 7;
|
||||
semigfx_tile = bool(BIT(attr, 7));
|
||||
}
|
||||
|
||||
lowerline = bool(BIT(attr, 5));
|
||||
upperline = bool(BIT(attr, 4));
|
||||
reverse = bool(BIT(attr, 2));
|
||||
attr_blink = bool(BIT(attr, 1));
|
||||
secret = bool(BIT(attr, 0));
|
||||
|
||||
if (semigfx_tile)
|
||||
tile = cc;
|
||||
else
|
||||
{
|
||||
if (lc > y_height - 1)
|
||||
tile = 0;
|
||||
else
|
||||
tile = m_cgrom->base()[(cc << 3) | (lc >> (y_double-1))];
|
||||
}
|
||||
|
||||
// secret blacks out every tile connections,
|
||||
// has lower priority over blinking and other attribute decorations
|
||||
if (secret)
|
||||
tile = 0;
|
||||
|
||||
if (csr)
|
||||
tile ^= 0xff;
|
||||
else if (attr_blink_on && attr_blink)
|
||||
tile = 0;
|
||||
|
||||
// upper/lower line aren't affected by secret and blinking, only reverse
|
||||
// TODO: should downshift chars by one
|
||||
if (lc == 0 && upperline)
|
||||
tile = 0xff;
|
||||
|
||||
if (is_lowestline && lowerline)
|
||||
tile = 0xff;
|
||||
|
||||
if (reverse ^ m_screen_reverse)
|
||||
tile ^= 0xff;
|
||||
|
||||
// if (m_width80)
|
||||
{
|
||||
u8 pen;
|
||||
|
||||
for (int xi = 0; xi < tile_width; xi += dot_width)
|
||||
{
|
||||
int res_x = (sx * 8) + xi;
|
||||
if (semigfx_tile)
|
||||
{
|
||||
u8 mask = (xi & (4 << (dot_width - 1))) ? 0x10 : 0x01;
|
||||
mask <<= (lc & (0x3 << y_double)) >> y_double;
|
||||
pen = tile & mask;
|
||||
}
|
||||
else
|
||||
{
|
||||
pen = tile;
|
||||
pen = (pen >> (7 - (xi >> (dot_width - 1)))) & 1;
|
||||
}
|
||||
|
||||
for (int di = 0; di < dot_width; di++)
|
||||
bitmap.pix(y, res_x + di) = m_crtc_palette->pen(pen ? color : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t pc8001_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
bitmap.fill(0, cliprect);
|
||||
// TODO: superimposing
|
||||
// TODO: merging with previous frame for Color Magical (is it driver area?)
|
||||
m_crtc->screen_update(screen, bitmap, cliprect);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Read/Write Handlers */
|
||||
|
||||
void pc8001_state::port10_w(uint8_t data)
|
||||
@ -57,7 +215,7 @@ void pc8001_state::port10_w(uint8_t data)
|
||||
m_cent_data_out->write(data);
|
||||
}
|
||||
|
||||
void pc8001_state::port30_w(uint8_t data)
|
||||
void pc8001_base_state::port30_w(uint8_t data)
|
||||
{
|
||||
/*
|
||||
|
||||
@ -79,9 +237,8 @@ void pc8001_state::port30_w(uint8_t data)
|
||||
|
||||
/* color mode */
|
||||
m_color = BIT(data, 1);
|
||||
|
||||
/* cassette motor */
|
||||
m_cassette->change_state(BIT(data,3) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
|
||||
|
||||
m_cassette->change_state(BIT(data, 3) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
|
||||
}
|
||||
|
||||
void pc8001mk2_state::port31_w(uint8_t data)
|
||||
@ -100,6 +257,7 @@ void pc8001mk2_state::port31_w(uint8_t data)
|
||||
7 background color
|
||||
|
||||
*/
|
||||
membank("bank2")->set_entry(data & 1);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( pc8001_state::write_centronics_busy )
|
||||
@ -129,12 +287,13 @@ uint8_t pc8001_state::port40_r()
|
||||
|
||||
*/
|
||||
|
||||
uint8_t data = 0x08;
|
||||
uint8_t data = 0x00;
|
||||
|
||||
data |= m_centronics_busy;
|
||||
data |= m_centronics_ack << 1;
|
||||
data |= m_rtc->data_out_r() << 4;
|
||||
data |= m_crtc->vrtc_r() << 5;
|
||||
// TODO: enable line from pc80s31k (bit 3, active_low)
|
||||
|
||||
return data;
|
||||
}
|
||||
@ -158,15 +317,15 @@ void pc8001_state::port40_w(uint8_t data)
|
||||
|
||||
m_centronics->write_strobe(BIT(data, 0));
|
||||
|
||||
m_rtc->clk_w(BIT(data, 2));
|
||||
m_rtc->stb_w(BIT(data, 1));
|
||||
m_rtc->clk_w(BIT(data, 2));
|
||||
|
||||
m_beep->set_state(BIT(data, 5));
|
||||
}
|
||||
|
||||
/* Memory Maps */
|
||||
|
||||
void pc8001_state::pc8001_mem(address_map &map)
|
||||
void pc8001_state::pc8001_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x5fff).bankrw("bank1");
|
||||
map(0x6000, 0x7fff).bankrw("bank2");
|
||||
@ -217,10 +376,10 @@ void pc8001_state::pc8001_io(address_map &map)
|
||||
// map(0xe6, 0xe6).w(FUNC(pc8001_state::irq_mask_w));
|
||||
// map(0xe7, 0xe7).w(FUNC(pc8001_state::pc8012_memory_mode_w));
|
||||
// map(0xe8, 0xfb) unused
|
||||
map(0xfc, 0xff).rw(I8255A_TAG, FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
map(0xfc, 0xff).m(m_pc80s31, FUNC(pc80s31_device::host_map));
|
||||
}
|
||||
|
||||
void pc8001mk2_state::pc8001mk2_mem(address_map &map)
|
||||
void pc8001mk2_state::pc8001mk2_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x5fff).bankrw("bank1");
|
||||
map(0x6000, 0x7fff).bankrw("bank2");
|
||||
@ -231,8 +390,8 @@ void pc8001mk2_state::pc8001mk2_mem(address_map &map)
|
||||
void pc8001mk2_state::pc8001mk2_io(address_map &map)
|
||||
{
|
||||
pc8001_io(map);
|
||||
map(0x30, 0x30).w(FUNC(pc8001mk2_state::port30_w));
|
||||
map(0x31, 0x31).w(FUNC(pc8001mk2_state::port31_w));
|
||||
map(0x30, 0x30).portr("DSW1").w(FUNC(pc8001mk2_state::port30_w));
|
||||
map(0x31, 0x31).portr("DSW2").w(FUNC(pc8001mk2_state::port31_w));
|
||||
// map(0x5c, 0x5c).w(FUNC(pc8001mk2_state::gram_on_w));
|
||||
// map(0x5f, 0x5f).w(FUNC(pc8001mk2_state::gram_off_w));
|
||||
// map(0xe8, 0xe8) kanji_address_lo_w, kanji_data_lo_r
|
||||
@ -250,6 +409,40 @@ void pc8001mk2_state::pc8001mk2_io(address_map &map)
|
||||
// map(0xfb, 0xfb) DMA type 5 inch FDC data register
|
||||
}
|
||||
|
||||
void pc8001mk2sr_state::port33_w(u8 data)
|
||||
{
|
||||
// TODO: needs progressive flush
|
||||
#ifdef UNUSED_FUNCTION
|
||||
if (data & 0x80)
|
||||
{
|
||||
membank("bank1")->set_entry(2);
|
||||
membank("bank2")->set_entry(2 | (m_n80sr_bank & 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
membank("bank1")->set_entry(0);
|
||||
membank("bank2")->set_entry(0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
u8 pc8001mk2sr_state::port71_r()
|
||||
{
|
||||
return m_n80sr_bank;
|
||||
}
|
||||
|
||||
void pc8001mk2sr_state::port71_w(u8 data)
|
||||
{
|
||||
m_n80sr_bank = data;
|
||||
}
|
||||
|
||||
void pc8001mk2sr_state::pc8001mk2sr_io(address_map &map)
|
||||
{
|
||||
pc8001mk2_io(map);
|
||||
map(0x33, 0x33).w(FUNC(pc8001mk2sr_state::port33_w));
|
||||
map(0x71, 0x71).rw(FUNC(pc8001mk2sr_state::port71_r), FUNC(pc8001mk2sr_state::port71_w));
|
||||
}
|
||||
|
||||
/* Input Ports */
|
||||
|
||||
static INPUT_PORTS_START( pc8001 )
|
||||
@ -353,60 +546,84 @@ static INPUT_PORTS_START( pc8001 )
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(27)
|
||||
|
||||
PORT_START("DSW1")
|
||||
// PORT_START("DSW1")
|
||||
INPUT_PORTS_END
|
||||
|
||||
/* uPD3301 Interface */
|
||||
static INPUT_PORTS_START( pc8001mk2 )
|
||||
PORT_INCLUDE( pc8001 )
|
||||
|
||||
static const rgb_t PALETTE_PC8001[] =
|
||||
{
|
||||
rgb_t::black(),
|
||||
rgb_t(0x00, 0x00, 0xff),
|
||||
rgb_t(0xff, 0x00, 0x00),
|
||||
rgb_t(0xff, 0x00, 0xff),
|
||||
rgb_t(0x00, 0xff, 0x00),
|
||||
rgb_t(0x00, 0xff, 0xff),
|
||||
rgb_t(0xff, 0xff, 0x00),
|
||||
rgb_t::white()
|
||||
};
|
||||
PORT_START("DSW1")
|
||||
PORT_DIPNAME( 0x01, 0x00, "Boot Mode" )
|
||||
PORT_DIPSETTING( 0x00, "N-BASIC" )
|
||||
PORT_DIPSETTING( 0x01, "N80-BASIC" )
|
||||
PORT_DIPNAME( 0x02, 0x02, "DSW1" )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
|
||||
UPD3301_DRAW_CHARACTER_MEMBER( pc8001_state::pc8001_display_pixels )
|
||||
{
|
||||
uint8_t data = m_char_rom->base()[(cc << 3) | lc];
|
||||
PORT_START("DSW2")
|
||||
PORT_DIPNAME( 0x01, 0x01, "DSW2" )
|
||||
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
|
||||
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
if (lc >= 8) return;
|
||||
if (csr) data = 0xff;
|
||||
static INPUT_PORTS_START( pc8001mk2sr )
|
||||
PORT_INCLUDE( pc8001mk2 )
|
||||
|
||||
if (m_width80)
|
||||
{
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
int color = BIT(data, 7) ^ rvv;
|
||||
|
||||
bitmap.pix(y, (sx * 8) + i) = PALETTE_PC8001[color ? 7 : 0];
|
||||
|
||||
data <<= 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sx % 2) return;
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
int color = BIT(data, 7) ^ rvv;
|
||||
|
||||
bitmap.pix(y, (sx/2 * 16) + (i * 2)) = PALETTE_PC8001[color ? 7 : 0];
|
||||
bitmap.pix(y, (sx/2 * 16) + (i * 2) + 1) = PALETTE_PC8001[color ? 7 : 0];
|
||||
|
||||
data <<= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
PORT_MODIFY("DSW1")
|
||||
// This is really a tri-state dip on front panel
|
||||
// BIOS just expects bit 1 to be off for SR mode
|
||||
PORT_DIPNAME( 0x03, 0x02, "Boot Mode" )
|
||||
PORT_DIPSETTING( 0x00, "N80SR-BASIC (duplicate)")
|
||||
PORT_DIPSETTING( 0x01, "N80SR-BASIC" )
|
||||
PORT_DIPSETTING( 0x02, "N-BASIC" )
|
||||
PORT_DIPSETTING( 0x03, "N80-BASIC" )
|
||||
PORT_DIPNAME( 0x04, 0x04, "DSW1" )
|
||||
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
|
||||
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
|
||||
INPUT_PORTS_END
|
||||
|
||||
/* 8257 Interface */
|
||||
|
||||
WRITE_LINE_MEMBER( pc8001_state::hrq_w )
|
||||
WRITE_LINE_MEMBER( pc8001_base_state::hrq_w )
|
||||
{
|
||||
/* HACK - this should be connected to the BUSREQ line of Z80 */
|
||||
m_maincpu->set_input_line(INPUT_LINE_HALT, state);
|
||||
@ -415,7 +632,7 @@ WRITE_LINE_MEMBER( pc8001_state::hrq_w )
|
||||
m_dma->hlda_w(state);
|
||||
}
|
||||
|
||||
uint8_t pc8001_state::dma_mem_r(offs_t offset)
|
||||
uint8_t pc8001_base_state::dma_mem_r(offs_t offset)
|
||||
{
|
||||
address_space &program = m_maincpu->space(AS_PROGRAM);
|
||||
|
||||
@ -424,6 +641,14 @@ uint8_t pc8001_state::dma_mem_r(offs_t offset)
|
||||
|
||||
/* Machine Initialization */
|
||||
|
||||
void pc8001_base_state::machine_start()
|
||||
{
|
||||
save_item(NAME(m_width80));
|
||||
save_item(NAME(m_color));
|
||||
save_item(NAME(m_screen_reverse));
|
||||
save_item(NAME(m_screen_is_24KHz));
|
||||
}
|
||||
|
||||
void pc8001_state::machine_start()
|
||||
{
|
||||
address_space &program = m_maincpu->space(AS_PROGRAM);
|
||||
@ -441,6 +666,7 @@ void pc8001_state::machine_start()
|
||||
membank("bank1")->configure_entry(1, m_rom->base());
|
||||
program.install_read_bank(0x0000, 0x5fff, membank("bank1"));
|
||||
program.unmap_write(0x0000, 0x5fff);
|
||||
membank("bank2")->configure_entry(1, m_rom->base() + 0x6000);
|
||||
|
||||
switch (m_ram->size())
|
||||
{
|
||||
@ -464,55 +690,81 @@ void pc8001_state::machine_start()
|
||||
program.install_readwrite_bank(0x0000, 0x5fff, membank("bank1"));
|
||||
program.install_readwrite_bank(0x6000, 0xbfff, membank("bank2"));
|
||||
program.install_readwrite_bank(0x8000, 0xffff, membank("bank3"));
|
||||
membank("bank2")->set_entry(0);
|
||||
// membank("bank2")->set_entry(0);
|
||||
break;
|
||||
}
|
||||
|
||||
// PC8001 is 15KHz only
|
||||
set_screen_frequency(false);
|
||||
}
|
||||
|
||||
void pc8001_state::machine_reset()
|
||||
{
|
||||
membank("bank1")->set_entry(1);
|
||||
membank("bank2")->set_entry(1);
|
||||
membank("bank3")->set_entry(0);
|
||||
}
|
||||
|
||||
/* register for state saving */
|
||||
save_item(NAME(m_width80));
|
||||
save_item(NAME(m_color));
|
||||
void pc8001mk2sr_state::machine_start()
|
||||
{
|
||||
pc8001_state::machine_start();
|
||||
|
||||
membank("bank1")->configure_entry(2, m_n80sr_rom->base());
|
||||
membank("bank2")->configure_entry(2, m_n80sr_rom->base() + 0x6000);
|
||||
membank("bank2")->configure_entry(3, m_n80sr_rom->base() + 0x8000);
|
||||
|
||||
save_item(NAME(m_n80sr_bank));
|
||||
}
|
||||
|
||||
void pc8001mk2sr_state::machine_reset()
|
||||
{
|
||||
pc8001_state::machine_reset();
|
||||
|
||||
//membank("bank1")->set_entry(2);
|
||||
//membank("bank2")->set_entry(2);
|
||||
}
|
||||
|
||||
/* Machine Drivers */
|
||||
|
||||
void pc8001_state::pc8001(machine_config &config)
|
||||
{
|
||||
constexpr XTAL MASTER_CLOCK = XTAL(4'000'000);
|
||||
constexpr XTAL VIDEO_CLOCK = XTAL(14'318'181);
|
||||
|
||||
/* basic machine hardware */
|
||||
Z80(config, m_maincpu, XTAL(4'000'000));
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pc8001_state::pc8001_mem);
|
||||
Z80(config, m_maincpu, MASTER_CLOCK);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pc8001_state::pc8001_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &pc8001_state::pc8001_io);
|
||||
|
||||
PC80S31(config, m_pc80s31, MASTER_CLOCK);
|
||||
config.set_perfect_quantum(m_maincpu);
|
||||
config.set_perfect_quantum("pc80s31:fdc_cpu");
|
||||
|
||||
/* video hardware */
|
||||
screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
|
||||
screen.set_refresh_hz(60);
|
||||
screen.set_screen_update(UPD3301_TAG, FUNC(upd3301_device::screen_update));
|
||||
screen.set_size(640, 220);
|
||||
screen.set_visarea(0, 640-1, 0, 200-1);
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_raw(VIDEO_CLOCK, 896, 0, 640, 260, 0, 200);
|
||||
m_screen->set_screen_update(FUNC(pc8001_state::screen_update));
|
||||
// m_screen->set_palette(m_crtc_palette);
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
BEEP(config, m_beep, 2000).add_route(ALL_OUTPUTS, "mono", 0.25);
|
||||
PALETTE(config, m_crtc_palette, palette_device::BRG_3BIT);
|
||||
|
||||
/* devices */
|
||||
I8251(config, I8251_TAG, 0);
|
||||
UPD3301(config, m_crtc, VIDEO_CLOCK);
|
||||
m_crtc->set_character_width(8);
|
||||
m_crtc->set_display_callback(FUNC(pc8001_state::draw_text));
|
||||
m_crtc->set_attribute_fetch_callback(FUNC(pc8001_state::attr_fetch));
|
||||
m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
|
||||
m_crtc->rvv_wr_callback().set(FUNC(pc8001_state::crtc_reverse_w));
|
||||
m_crtc->set_screen(m_screen);
|
||||
|
||||
I8255A(config, I8255A_TAG, 0);
|
||||
|
||||
I8257(config, m_dma, XTAL(4'000'000));
|
||||
I8257(config, m_dma, MASTER_CLOCK);
|
||||
m_dma->out_hrq_cb().set(FUNC(pc8001_state::hrq_w));
|
||||
m_dma->in_memr_cb().set(FUNC(pc8001_state::dma_mem_r));
|
||||
m_dma->out_iow_cb<2>().set(m_crtc, FUNC(upd3301_device::dack_w));
|
||||
|
||||
UPD1990A(config, m_rtc);
|
||||
/* devices */
|
||||
I8251(config, I8251_TAG, 0);
|
||||
|
||||
UPD3301(config, m_crtc, XTAL(14'318'181));
|
||||
m_crtc->set_character_width(8);
|
||||
m_crtc->set_display_callback(FUNC(pc8001_state::pc8001_display_pixels));
|
||||
m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
|
||||
m_crtc->set_screen(SCREEN_TAG);
|
||||
UPD1990A(config, m_rtc);
|
||||
|
||||
CENTRONICS(config, m_centronics, centronics_devices, "printer");
|
||||
m_centronics->ack_handler().set(FUNC(pc8001_state::write_centronics_ack));
|
||||
@ -526,84 +778,91 @@ void pc8001_state::pc8001(machine_config &config)
|
||||
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
|
||||
|
||||
RAM(config, RAM_TAG).set_default_size("16K").set_extra_options("32K,64K");
|
||||
|
||||
SOFTWARE_LIST(config, "disk_n_list").set_original("pc8001_flop");
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
// TODO: unknown clock, is it really a beeper?
|
||||
BEEP(config, m_beep, 2400).add_route(ALL_OUTPUTS, "mono", 0.25);
|
||||
}
|
||||
|
||||
void pc8001mk2_state::pc8001mk2(machine_config &config)
|
||||
{
|
||||
/* basic machine hardware */
|
||||
Z80(config, m_maincpu, XTAL(4'000'000));
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pc8001mk2_state::pc8001mk2_mem);
|
||||
pc8001(config);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &pc8001mk2_state::pc8001mk2_map);
|
||||
m_maincpu->set_addrmap(AS_IO, &pc8001mk2_state::pc8001mk2_io);
|
||||
|
||||
/* video hardware */
|
||||
screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
|
||||
screen.set_refresh_hz(60);
|
||||
screen.set_screen_update(UPD3301_TAG, FUNC(upd3301_device::screen_update));
|
||||
screen.set_size(640, 220);
|
||||
screen.set_visarea(0, 640-1, 0, 200-1);
|
||||
// TODO: video HW has extra GVRAM setup
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
BEEP(config, m_beep, 2000).add_route(ALL_OUTPUTS, "mono", 0.25);
|
||||
RAM(config.replace(), RAM_TAG).set_default_size("64K");
|
||||
|
||||
/* devices */
|
||||
I8251(config, I8251_TAG, 0);
|
||||
SOFTWARE_LIST(config, "disk_n80_list").set_original("pc8001mk2_flop");
|
||||
}
|
||||
|
||||
I8255A(config, I8255A_TAG, 0);
|
||||
void pc8001mk2sr_state::pc8001mk2sr(machine_config &config)
|
||||
{
|
||||
pc8001mk2(config);
|
||||
m_maincpu->set_addrmap(AS_IO, &pc8001mk2sr_state::pc8001mk2sr_io);
|
||||
|
||||
I8257(config, m_dma, XTAL(4'000'000));
|
||||
m_dma->out_hrq_cb().set(FUNC(pc8001_state::hrq_w));
|
||||
m_dma->in_memr_cb().set(FUNC(pc8001_state::dma_mem_r));
|
||||
m_dma->out_iow_cb<2>().set(m_crtc, FUNC(upd3301_device::dack_w));
|
||||
// TODO: mods for SR mode support
|
||||
|
||||
UPD1990A(config, m_rtc);
|
||||
|
||||
UPD3301(config, m_crtc, XTAL(14'318'181));
|
||||
m_crtc->set_character_width(8);
|
||||
m_crtc->set_display_callback(FUNC(pc8001_state::pc8001_display_pixels));
|
||||
m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
|
||||
m_crtc->set_screen(SCREEN_TAG);
|
||||
|
||||
CENTRONICS(config, m_centronics, centronics_devices, "printer");
|
||||
|
||||
OUTPUT_LATCH(config, m_cent_data_out);
|
||||
m_centronics->set_output_latch(*m_cent_data_out);
|
||||
|
||||
CASSETTE(config, m_cassette);
|
||||
m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
|
||||
m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
|
||||
|
||||
RAM(config, RAM_TAG).set_default_size("64K");
|
||||
SOFTWARE_LIST(config, "disk_n80sr_list").set_original("pc8001mk2sr_flop");
|
||||
}
|
||||
|
||||
/* ROMs */
|
||||
|
||||
ROM_START( pc8001 )
|
||||
ROM_REGION( 0x6000, Z80_TAG, 0 )
|
||||
ROM_REGION( 0x8000, Z80_TAG, ROMREGION_ERASEFF )
|
||||
// PCB pictures shows divided by 3 ROMs (and 4th socket unpopulated)
|
||||
ROM_SYSTEM_BIOS( 0, "v101", "N-BASIC v1.01" )
|
||||
ROMX_LOAD( "n80v101.rom", 0x00000, 0x6000, CRC(a2cc9f22) SHA1(6d2d838de7fea20ddf6601660d0525d5b17bf8a3), ROM_BIOS(0) )
|
||||
ROMX_LOAD( "n80v101.rom", 0x00000, 0x6000, BAD_DUMP CRC(a2cc9f22) SHA1(6d2d838de7fea20ddf6601660d0525d5b17bf8a3), ROM_BIOS(0) )
|
||||
ROM_SYSTEM_BIOS( 1, "v102", "N-BASIC v1.02" )
|
||||
ROMX_LOAD( "n80v102.rom", 0x00000, 0x6000, CRC(ed01ca3f) SHA1(b34a98941499d5baf79e7c0e5578b81dbede4a58), ROM_BIOS(1) )
|
||||
ROMX_LOAD( "n80v102.rom", 0x00000, 0x6000, BAD_DUMP CRC(ed01ca3f) SHA1(b34a98941499d5baf79e7c0e5578b81dbede4a58), ROM_BIOS(1) )
|
||||
ROM_SYSTEM_BIOS( 2, "v110", "N-BASIC v1.10" )
|
||||
ROMX_LOAD( "n80v110.rom", 0x00000, 0x6000, CRC(1e02d93f) SHA1(4603cdb7a3833e7feb257b29d8052c872369e713), ROM_BIOS(2) )
|
||||
ROMX_LOAD( "n80v110.rom", 0x00000, 0x6000, BAD_DUMP CRC(1e02d93f) SHA1(4603cdb7a3833e7feb257b29d8052c872369e713), ROM_BIOS(2) )
|
||||
|
||||
ROM_REGION( 0x800, UPD3301_TAG, 0)
|
||||
ROM_REGION( 0x800, CGROM_TAG, 0)
|
||||
ROM_LOAD( "font.rom", 0x000, 0x800, CRC(56653188) SHA1(84b90f69671d4b72e8f219e1fe7cd667e976cf7f) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( pc8001mk2 )
|
||||
ROM_REGION( 0x8000, Z80_TAG, 0 )
|
||||
ROM_LOAD( "n80_2.rom", 0x00000, 0x8000, CRC(03cce7b6) SHA1(c12d34e42021110930fed45a8af98db52136f1fb) )
|
||||
// N-BASIC v1.3
|
||||
// N80-BASIC v1.0
|
||||
ROM_LOAD( "n80_2.rom", 0x0000, 0x8000, CRC(03cce7b6) SHA1(c12d34e42021110930fed45a8af98db52136f1fb) )
|
||||
|
||||
ROM_REGION( 0x800, UPD3301_TAG, 0)
|
||||
ROM_REGION( 0x800, CGROM_TAG, 0)
|
||||
ROM_LOAD( "font.rom", 0x0000, 0x0800, CRC(56653188) SHA1(84b90f69671d4b72e8f219e1fe7cd667e976cf7f) )
|
||||
|
||||
ROM_REGION( 0x20000, "kanji", 0)
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_END
|
||||
|
||||
ROM_START( pc8001mk2sr )
|
||||
ROM_REGION( 0x8000, Z80_TAG, 0 )
|
||||
// N-BASIC v1.6
|
||||
// N80-BASIC v1.2
|
||||
ROM_LOAD( "n80_2sr.rom", 0x0000, 0x8000, CRC(dcb71282) SHA1(e8db5dc5eae11da14e48656d324874e59f2e3844) )
|
||||
|
||||
ROM_REGION (0x10000, N80SR_ROM_TAG, ROMREGION_ERASEFF )
|
||||
// N80SR-BASIC v1.0
|
||||
ROM_LOAD( "n80_3.rom", 0x0000, 0xa000, BAD_DUMP CRC(d99ef247) SHA1(9bfa5009d703cd31caa734d932d2a847d74cbfa6) )
|
||||
|
||||
ROM_REGION( 0x2000, CGROM_TAG, 0)
|
||||
ROM_LOAD( "font80sr.rom", 0x000000, 0x001000, CRC(784c0b17) SHA1(565dc8e5e46b1633cb434d12b4d8b3a662546b33) )
|
||||
ROM_LOAD( "fonthira.rom", 0x001000, 0x000800, CRC(fe7059d5) SHA1(10c5f85adcce540cbd0a11352e2c38a84c989a26) )
|
||||
ROM_LOAD( "fontkata.rom", 0x001800, 0x000800, CRC(56653188) SHA1(84b90f69671d4b72e8f219e1fe7cd667e976cf7f) )
|
||||
|
||||
ROM_REGION( 0x20000, "kanji", 0)
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_END
|
||||
|
||||
/* System Drivers */
|
||||
|
||||
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
|
||||
COMP( 1979, pc8001, 0, 0, pc8001, pc8001, pc8001_state, empty_init, "NEC", "PC-8001", MACHINE_NOT_WORKING )
|
||||
COMP( 1983, pc8001mk2, pc8001, 0, pc8001mk2, pc8001, pc8001mk2_state, empty_init, "NEC", "PC-8001mkII", MACHINE_NOT_WORKING )
|
||||
// 1978?, pc8001g, Wirewrapped prototype version
|
||||
COMP( 1979, pc8001, 0, 0, pc8001, pc8001, pc8001_state, empty_init, "NEC", "PC-8001", MACHINE_NOT_WORKING )
|
||||
// 1981 pc8001a, US version of PC-8001 with Greek alphabet instead of Kana
|
||||
COMP( 1983, pc8001mk2, pc8001, 0, pc8001mk2, pc8001mk2, pc8001mk2_state, empty_init, "NEC", "PC-8001mkII", MACHINE_NOT_WORKING )
|
||||
COMP( 1985, pc8001mk2sr, pc8001, 0, pc8001mk2sr, pc8001mk2sr, pc8001mk2sr_state, empty_init, "NEC", "PC-8001mkIISR", MACHINE_NOT_WORKING )
|
||||
|
@ -25,29 +25,17 @@
|
||||
probably others (does bus have an actual codename or just "PC-8801 bus"?);
|
||||
- below notes states that plain PC-8801 doesn't have a disk CPU, but the BIOS clearly checks
|
||||
the floppy ports. Wrong info or check for external board anyway?
|
||||
- fix "jumps" in mouse support pointer (noticeable in Balance of Power);
|
||||
- fix "jumps" in PC-8872 mouse pointer (noticeable in balpower);
|
||||
|
||||
per-game specific TODO:
|
||||
- 100yen Soft 8 Revival Special: tight loop with vblank bit, but vblank irq takes too much time to execute its code;
|
||||
- 177: gameplay is too fast (parent pc8801 only);
|
||||
- 1942: missing sound, enables a masked irq;
|
||||
- Acro Jet: hangs waiting for an irq (floppy issue);
|
||||
- Arcus: doesn't surpass Wolf Team logo;
|
||||
- Advanced Fantasian: garbage during gameplay (floppy?)
|
||||
- American Success: reads the light pen?
|
||||
- Attacker: resets after a bunch of animation frames;
|
||||
- Balance of Power: uses the SIO port for something ...
|
||||
per-game specific TODO (move to XML):
|
||||
- Belloncho Shintai Kensa: hangs
|
||||
- Bishoujo Baseball Gakuen: checks ym2608 after intro screen;
|
||||
- The Black Onyx: writes a katakana msg: "sono kata ha koko ni orimasen" then doesn't show up anything. (Needs user disk?)
|
||||
- Boukenshatachi: dies after the intro.
|
||||
- Campaign Ban Daisenryaku 2: Hangs at title screen?
|
||||
- Carigraph: inputs doesn't work?
|
||||
- Can Can Bunny: bitmap artifacts on intro, caused by a fancy usage of the attribute vram;
|
||||
- Can Can Bunny: no sound (regression);
|
||||
- Can Can Bunny Superior: black screen during the intro
|
||||
- Chou Bishoujo Densetsu CROQUIS: accesses ports 0xa0-0xa3 and 0xc2-0xc3
|
||||
- Combat: mono gfx mode enabled, but I don't see any noticeable quirk?
|
||||
- Cranston Manor (actually N88-Basic demo): no sound
|
||||
- Datenshi Kyouko: gfx garbage on the right edge?
|
||||
- Final Crisis: sound stuck with OPNA?
|
||||
@ -56,10 +44,7 @@
|
||||
- Gaudi - Barcelona no Kaze: fails PCM loading
|
||||
- GeGeGe no Kitarou: title screen text/bitmap contrast is pretty ugly (BTANB?);
|
||||
- Grobda: palette is ugly (parent pc8801 only);
|
||||
- Makaimura: after losing a life the game doesn't work properly anymore, copy protection?
|
||||
- Music Collection Vol. 2 - Final Fantasy Tokushuu: sound irq dies pretty soon
|
||||
- N-BASIC: cursor doesn't show up;
|
||||
- The Return of Ishtar: z80 exception after entering the name.
|
||||
- Star Cruiser: bad kanji data?
|
||||
- Star Cruiser: reads at i/o 0x8e?
|
||||
- Wanderers from Ys: user data disk looks screwed? It loads with everything as maximum as per now ...
|
||||
@ -120,11 +105,6 @@
|
||||
- Fruit Panic
|
||||
- FSD Sample Ongaku Shuu Vol. 1-7
|
||||
- Gaia no Kiba (Disk I/O error at 150)
|
||||
- Gaiflame
|
||||
- Gambler Jiko Chuushin ha
|
||||
- Gambler Jiko Chuushin ha 2
|
||||
- Gambler Jiko Chuushin ha 3
|
||||
- Gambler Jiko Chuushin ha 3 (demo)
|
||||
- Gambler Jiko Chuushin ha Mahjong Puzzle Collection
|
||||
- Gambler Jiko Chuushin ha Mahjong Puzzle Collection (demo)
|
||||
* Game Music Library
|
||||
@ -142,14 +122,12 @@
|
||||
* MakaiMura (attempts to r/w the sio ports, but it's clearly crashed)
|
||||
* Mugen Senshi Valis (at Telenet logo, it also appears to have a nasty copy protection when taking a specific item (untested))
|
||||
- Mr. Pro Yakyuu
|
||||
- Panorama Toh
|
||||
- PC-8034 (app)
|
||||
- PC-8037SR (app)
|
||||
- P1 (app)
|
||||
- Pattern Editor 88 (app)
|
||||
- Super Shunbo II (app) (Load error)
|
||||
- Super TII (app)
|
||||
* The Return of Ishtar
|
||||
- Tobira wo Akete (random crashes in parent pc8801 only)
|
||||
|
||||
list of games that doesn't like i8214_irq_level == 5 in sound irq
|
||||
@ -360,6 +338,8 @@ void pc8801_state::draw_bitmap_3bpp(bitmap_ind16 &bitmap,const rectangle &clipre
|
||||
|
||||
void pc8801_state::draw_bitmap_1bpp(bitmap_ind16 &bitmap,const rectangle &cliprect)
|
||||
{
|
||||
// TODO: jettermi really masks the color attribute from 3301
|
||||
// (we currently draw it in b&w, should be colorized)
|
||||
uint32_t count = 0;
|
||||
uint8_t color = (m_gfx_ctrl & 1) ? 7 & ((m_layer_mask ^ 0xe) >> 1) : 7;
|
||||
uint8_t is_cursor = 0;
|
||||
@ -675,7 +655,7 @@ void pc8801_state::pc8801_alu_w(offs_t offset, uint8_t data)
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
logic_op = (m_alu_ctrl1 & (0x11 << i)) >> i;
|
||||
|
||||
|
||||
switch(logic_op)
|
||||
{
|
||||
case 0x00: { m_gvram[i*0x4000 + offset] &= ~data; } break;
|
||||
@ -803,9 +783,7 @@ uint8_t pc8801_state::pc8801_mem_r(offs_t offset)
|
||||
|
||||
window_offset = (offset & 0x3ff) + (m_window_offset_bank << 8);
|
||||
|
||||
if(((window_offset & 0xf000) == 0xf000) && (m_misc_ctrl & 0x10))
|
||||
printf("Read from 0xf000 - 0xffff window offset\n"); //accessed by Castle Excellent, no noticeable quirk
|
||||
|
||||
// castlex and imenes accesses this
|
||||
if(((window_offset & 0xf000) == 0xf000) && (m_misc_ctrl & 0x10))
|
||||
return pc8801_high_wram_r(window_offset & 0xfff);
|
||||
|
||||
@ -864,9 +842,9 @@ void pc8801_state::pc8801_mem_w(offs_t offset, uint8_t data)
|
||||
|
||||
window_offset = (offset & 0x3ff) + (m_window_offset_bank << 8);
|
||||
|
||||
if(((window_offset & 0xf000) == 0xf000) && (m_misc_ctrl & 0x10))
|
||||
printf("Write to 0xf000 - 0xffff window offset\n"); //accessed by Castle Excellent, no noticeable quirk
|
||||
|
||||
// castlex and imenes accesses this
|
||||
// TODO: high TVRAM even
|
||||
// (uPD3301 reads from this instead of the regular work RAM)
|
||||
if(((window_offset & 0xf000) == 0xf000) && (m_misc_ctrl & 0x10))
|
||||
pc8801_high_wram_w(window_offset & 0xfff,data);
|
||||
else
|
||||
@ -1117,6 +1095,20 @@ void pc8801_state::pc8801_window_bank_inc_w(uint8_t data)
|
||||
m_window_offset_bank&=0xff;
|
||||
}
|
||||
|
||||
/*
|
||||
* I/O Port $32 (R/W)
|
||||
*
|
||||
* x--- ---- sound irq mask (0) irq enabled (1) irq masked
|
||||
* -x-- ---- Graphic VRAM access mode (0) independent access mode (1) ALU mode
|
||||
* --x- ---- analog (1) / digital (0) palette select
|
||||
* ---x ---- high speed RAM select (for TVRAM) (1) main RAM bank (0) dedicated Text RAM
|
||||
* ---- xx-- Screen output mode
|
||||
* ---- 00-- TV / video mode
|
||||
* ---- 01-- None (as in disabling the screen entirely?)
|
||||
* ---- 10-- Analog RGB mode
|
||||
* ---- 11-- Optional mode
|
||||
* ---- --xx internal EROM selection
|
||||
*/
|
||||
uint8_t pc8801_state::pc8801_misc_ctrl_r()
|
||||
{
|
||||
return m_misc_ctrl;
|
||||
@ -1124,11 +1116,6 @@ uint8_t pc8801_state::pc8801_misc_ctrl_r()
|
||||
|
||||
void pc8801_state::pc8801_misc_ctrl_w(uint8_t data)
|
||||
{
|
||||
/*
|
||||
x--- ---- sound irq mask, active low
|
||||
--x- ---- analog (1) / digital (0) palette select
|
||||
*/
|
||||
|
||||
m_misc_ctrl = data;
|
||||
|
||||
#if USE_PROPER_I8214
|
||||
@ -1182,6 +1169,7 @@ void pc8801_state::pc8801_palram_w(offs_t offset, uint8_t data)
|
||||
// TODO: What happens to the palette contents when the analog/digital palette mode changes?
|
||||
// Preserve content? Translation? Undefined?
|
||||
m_palette->set_pen_color(offset, pal3bit(m_palram[offset].r), pal3bit(m_palram[offset].g), pal3bit(m_palram[offset].b));
|
||||
// TODO: at least analog mode can do rasters
|
||||
}
|
||||
|
||||
void pc8801_state::pc8801_layer_masking_w(uint8_t data)
|
||||
@ -1472,7 +1460,7 @@ uint8_t pc8801_state::pc8801_sound_board_r(offs_t offset)
|
||||
void pc8801_state::pc8801_sound_board_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if(m_has_opna)
|
||||
m_opna->write(offset,data);
|
||||
m_opna->write(offset, data);
|
||||
else if((offset & 2) == 0)
|
||||
m_opn->write(offset, data);
|
||||
}
|
||||
@ -1590,95 +1578,7 @@ void pc8801_state::pc8801_io(address_map &map)
|
||||
// map(0xf3, 0xf3).noprw(); /* DMA floppy (unknown) */
|
||||
// map(0xf4, 0xf7).noprw(); /* DMA 5'floppy (may be not released) */
|
||||
// map(0xf8, 0xfb).noprw(); /* DMA 8'floppy (unknown) */
|
||||
map(0xfc, 0xff).rw("d8255_master", FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
}
|
||||
|
||||
uint8_t pc8801_state::cpu_8255_c_r()
|
||||
{
|
||||
// machine().scheduler().synchronize(); // force resync
|
||||
|
||||
return m_i8255_1_pc >> 4;
|
||||
}
|
||||
|
||||
void pc8801_state::cpu_8255_c_w(uint8_t data)
|
||||
{
|
||||
// machine().scheduler().synchronize(); // force resync
|
||||
|
||||
m_i8255_0_pc = data;
|
||||
}
|
||||
|
||||
|
||||
uint8_t pc8801_state::fdc_8255_c_r()
|
||||
{
|
||||
// machine().scheduler().synchronize(); // force resync
|
||||
|
||||
return m_i8255_0_pc >> 4;
|
||||
}
|
||||
|
||||
void pc8801_state::fdc_8255_c_w(uint8_t data)
|
||||
{
|
||||
// machine().scheduler().synchronize(); // force resync
|
||||
|
||||
m_i8255_1_pc = data;
|
||||
}
|
||||
|
||||
void pc8801_state::pc8801fdc_mem(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).rom();
|
||||
map(0x4000, 0x7fff).ram();
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(pc8801_state::pc8801fd_upd765_tc_to_zero)
|
||||
{
|
||||
// TODO: holein1 explictly reads TC port at PC=504e followed by an HALT opcode, failing to boot
|
||||
// is this gonna unbreak HALT state too?
|
||||
m_fdc->tc_w(false);
|
||||
}
|
||||
|
||||
void pc8801_state::upd765_mc_w(uint8_t data)
|
||||
{
|
||||
m_fdd[0]->get_device()->mon_w(!(data & 1));
|
||||
m_fdd[1]->get_device()->mon_w(!(data & 2));
|
||||
}
|
||||
|
||||
uint8_t pc8801_state::upd765_tc_r()
|
||||
{
|
||||
//printf("%04x 1\n",m_fdccpu->pc());
|
||||
|
||||
if (!machine().side_effects_disabled())
|
||||
{
|
||||
m_fdc->tc_w(true);
|
||||
//TODO: I'm not convinced that this works correctly with current hook-up ... 1000 usec is needed by Aploon, a bigger value breaks Alpha.
|
||||
//OTOH, 50 seems more than enough for the new upd...
|
||||
machine().scheduler().timer_set(attotime::from_usec(50), timer_expired_delegate(FUNC(pc8801_state::pc8801fd_upd765_tc_to_zero),this));
|
||||
}
|
||||
return 0xff; // value is meaningless
|
||||
}
|
||||
|
||||
void pc8801_state::fdc_irq_vector_w(uint8_t data)
|
||||
{
|
||||
popmessage("Write to FDC IRQ vector I/O %02x, contact MESSdev\n",data);
|
||||
m_fdc_irq_opcode = data;
|
||||
}
|
||||
|
||||
void pc8801_state::fdc_drive_mode_w(uint8_t data)
|
||||
{
|
||||
logerror("FDC drive mode %02x\n", data);
|
||||
m_fdd[0]->get_device()->set_rpm(data & 0x01 ? 360 : 300);
|
||||
m_fdd[1]->get_device()->set_rpm(data & 0x02 ? 360 : 300);
|
||||
|
||||
m_fdc->set_rate(data & 0x20 ? 500000 : 250000);
|
||||
}
|
||||
|
||||
void pc8801_state::pc8801fdc_io(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map(0xf0, 0xf0).w(FUNC(pc8801_state::fdc_irq_vector_w)); // Interrupt Opcode Port
|
||||
map(0xf4, 0xf4).w(FUNC(pc8801_state::fdc_drive_mode_w)); // Drive mode, 2d, 2dd, 2hd
|
||||
map(0xf7, 0xf7).nopw(); // printer port output
|
||||
map(0xf8, 0xf8).rw(FUNC(pc8801_state::upd765_tc_r), FUNC(pc8801_state::upd765_mc_w)); // (R) Terminal Count Port (W) Motor Control Port
|
||||
map(0xfa, 0xfb).m(m_fdc, FUNC(upd765a_device::map));
|
||||
map(0xfc, 0xff).rw("d8255_slave", FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
map(0xfc, 0xff).m(m_pc80s31, FUNC(pc80s31_device::host_map));
|
||||
}
|
||||
|
||||
void pc8801_state::opna_map(address_map &map)
|
||||
@ -2005,12 +1905,6 @@ static GFXDECODE_START( gfx_pc8801 )
|
||||
GFXDECODE_ENTRY( "kanji", 0, kanji_layout, 0, 8 )
|
||||
GFXDECODE_END
|
||||
|
||||
/* Floppy Configuration */
|
||||
|
||||
static void pc88_floppies(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("525hd", FLOPPY_525_HD);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* Cassette Configuration */
|
||||
@ -2164,10 +2058,6 @@ INTERRUPT_GEN_MEMBER(pc8801_state::pc8801_vrtc_irq)
|
||||
|
||||
void pc8801_state::machine_start()
|
||||
{
|
||||
m_fdd[0]->get_device()->set_rpm(300);
|
||||
m_fdd[1]->get_device()->set_rpm(300);
|
||||
m_fdc->set_rate(250000);
|
||||
|
||||
m_rtc->cs_w(1);
|
||||
m_rtc->oe_w(1);
|
||||
|
||||
@ -2203,11 +2093,8 @@ void pc8801_state::machine_reset()
|
||||
|
||||
// pc8801_dynamic_res_change(machine());
|
||||
|
||||
m_fdc_irq_opcode = 0; //TODO: copied from PC-88VA, could be wrong here ... should be 0x7f ld a,a in the latter case
|
||||
m_mouse.phase = 0;
|
||||
|
||||
m_fdccpu->set_input_line_vector(0, 0); // Z80
|
||||
|
||||
{
|
||||
m_txt_color = 2;
|
||||
}
|
||||
@ -2277,7 +2164,8 @@ MACHINE_RESET_MEMBER(pc8801_state,pc8801_clock_speed)
|
||||
m_clock_setting = ioport("CFG")->read() & 0x80;
|
||||
|
||||
m_maincpu->set_unscaled_clock(m_clock_setting ? XTAL(4'000'000) : XTAL(8'000'000));
|
||||
m_fdccpu->set_unscaled_clock(m_clock_setting ? XTAL(4'000'000) : XTAL(8'000'000)); // correct?
|
||||
// TODO: FDC board shouldn't be connected to the clock setting, verify
|
||||
// m_fdccpu->set_unscaled_clock(m_clock_setting ? XTAL(4'000'000) : XTAL(8'000'000));
|
||||
m_baudrate_val = 0;
|
||||
}
|
||||
|
||||
@ -2348,28 +2236,11 @@ void pc8801_state::pc8801(machine_config &config)
|
||||
m_maincpu->set_vblank_int("screen", FUNC(pc8801_state::pc8801_vrtc_irq));
|
||||
m_maincpu->set_irq_acknowledge_callback(FUNC(pc8801_state::pc8801_irq_callback));
|
||||
|
||||
/* sub CPU(5 inch floppy drive) */
|
||||
Z80(config, m_fdccpu, MASTER_CLOCK); /* 4 MHz */
|
||||
m_fdccpu->set_addrmap(AS_PROGRAM, &pc8801_state::pc8801fdc_mem);
|
||||
m_fdccpu->set_addrmap(AS_IO, &pc8801_state::pc8801fdc_io);
|
||||
|
||||
//config.set_maximum_quantum(attotime::from_hz(300000));
|
||||
PC80S31(config, m_pc80s31, MASTER_CLOCK);
|
||||
config.set_perfect_quantum(m_maincpu);
|
||||
config.set_perfect_quantum("pc80s31:fdc_cpu");
|
||||
|
||||
i8255_device &d8255_master(I8255(config, "d8255_master"));
|
||||
d8255_master.in_pa_callback().set("d8255_slave", FUNC(i8255_device::pb_r));
|
||||
d8255_master.in_pb_callback().set("d8255_slave", FUNC(i8255_device::pa_r));
|
||||
d8255_master.in_pc_callback().set(FUNC(pc8801_state::cpu_8255_c_r));
|
||||
d8255_master.out_pc_callback().set(FUNC(pc8801_state::cpu_8255_c_w));
|
||||
|
||||
i8255_device &d8255_slave(I8255(config, "d8255_slave"));
|
||||
d8255_slave.in_pa_callback().set("d8255_master", FUNC(i8255_device::pb_r));
|
||||
d8255_slave.in_pb_callback().set("d8255_master", FUNC(i8255_device::pa_r));
|
||||
d8255_slave.in_pc_callback().set(FUNC(pc8801_state::fdc_8255_c_r));
|
||||
d8255_slave.out_pc_callback().set(FUNC(pc8801_state::fdc_8255_c_w));
|
||||
|
||||
UPD765A(config, m_fdc, 8'000'000, true, true);
|
||||
m_fdc->intrq_wr_callback().set_inputline(m_fdccpu, INPUT_LINE_IRQ0);
|
||||
// config.set_maximum_quantum(attotime::from_hz(MASTER_CLOCK/1024));
|
||||
|
||||
#if USE_PROPER_I8214
|
||||
I8214(config, I8214_TAG, MASTER_CLOCK);
|
||||
@ -2386,9 +2257,8 @@ void pc8801_state::pc8801(machine_config &config)
|
||||
i8251.txd_handler().set(FUNC(pc8801_state::txdata_callback));
|
||||
i8251.rts_handler().set(FUNC(pc8801_state::rxrdy_w));
|
||||
|
||||
FLOPPY_CONNECTOR(config, "upd765:0", pc88_floppies, "525hd", floppy_image_device::default_mfm_floppy_formats);
|
||||
FLOPPY_CONNECTOR(config, "upd765:1", pc88_floppies, "525hd", floppy_image_device::default_mfm_floppy_formats);
|
||||
SOFTWARE_LIST(config, "disk_list").set_original("pc8801_flop");
|
||||
SOFTWARE_LIST(config, "disk_n88_list").set_original("pc8801_flop");
|
||||
SOFTWARE_LIST(config, "disk_n_list").set_original("pc8001_flop");
|
||||
|
||||
/* video hardware */
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
@ -2431,21 +2301,27 @@ void pc8801_state::pc8801(machine_config &config)
|
||||
TIMER(config, "rtc_timer").configure_periodic(FUNC(pc8801_state::pc8801_rtc_irq), attotime::from_hz(600));
|
||||
}
|
||||
|
||||
void pc8801_state::pc8801fh(machine_config &config)
|
||||
void pc8801_state::pc8801mk2mr(machine_config &config)
|
||||
{
|
||||
pc8801(config);
|
||||
PC80S31K(config.replace(), m_pc80s31, MASTER_CLOCK);
|
||||
}
|
||||
|
||||
void pc8801_state::pc8801fh(machine_config &config)
|
||||
{
|
||||
pc8801mk2mr(config);
|
||||
MCFG_MACHINE_RESET_OVERRIDE(pc8801_state, pc8801_clock_speed )
|
||||
}
|
||||
|
||||
void pc8801_state::pc8801ma(machine_config &config)
|
||||
{
|
||||
pc8801(config);
|
||||
pc8801fh(config);
|
||||
MCFG_MACHINE_RESET_OVERRIDE(pc8801_state, pc8801_dic )
|
||||
}
|
||||
|
||||
void pc8801_state::pc8801mc(machine_config &config)
|
||||
{
|
||||
pc8801(config);
|
||||
pc8801ma(config);
|
||||
MCFG_MACHINE_RESET_OVERRIDE(pc8801_state, pc8801_cdrom )
|
||||
}
|
||||
|
||||
@ -2457,9 +2333,6 @@ ROM_START( pc8801 )
|
||||
ROM_LOAD( "n88.rom", 0x0000, 0x8000, CRC(ffd68be0) SHA1(3518193b8207bdebf22c1380c2db8c554baff329) )
|
||||
ROM_LOAD( "n88_0.rom", 0x8000, 0x2000, CRC(61984bab) SHA1(d1ae642aed4f0584eeb81ff50180db694e5101d4) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "disk.rom", 0x0000, 0x0800, CRC(2158d307) SHA1(bb7103a0818850a039c67ff666a31ce49a8d516f) )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", ROMREGION_ERASEFF)
|
||||
ROM_LOAD_OPTIONAL( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
|
||||
@ -2477,9 +2350,6 @@ ROM_START( pc8801mk2 )
|
||||
ROM_LOAD( "m2_n88.rom", 0x0000, 0x8000, CRC(f35169eb) SHA1(ef1f067f819781d9fb2713836d195866f0f81501) )
|
||||
ROM_LOAD( "m2_n88_0.rom", 0x8000, 0x2000, CRC(5eb7a8d0) SHA1(95a70af83b0637a5a0f05e31fb0452bb2cb68055) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "disk.rom", 0x0000, 0x0800, CRC(2158d307) SHA1(bb7103a0818850a039c67ff666a31ce49a8d516f) )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", ROMREGION_ERASEFF)
|
||||
ROM_LOAD_OPTIONAL( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
|
||||
@ -2498,13 +2368,6 @@ ROM_START( pc8801mk2sr )
|
||||
ROM_LOAD( "n88_2.rom", 0xc000, 0x2000, CRC(af2b6efa) SHA1(b7c8bcea219b77d9cc3ee0efafe343cc307425d1) )
|
||||
ROM_LOAD( "n88_3.rom", 0xe000, 0x2000, CRC(7713c519) SHA1(efce0b51cab9f0da6cf68507757f1245a2867a72) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "disk.rom", 0x0000, 0x0800, CRC(2158d307) SHA1(bb7103a0818850a039c67ff666a31ce49a8d516f) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0)
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_LOAD( "kanji2.rom", 0x20000, 0x20000, CRC(154803cc) SHA1(7e6591cd465cbb35d6d3446c5a83b46d30fafe95) ) // it should not be here
|
||||
@ -2524,13 +2387,6 @@ ROM_START( pc8801mk2fr )
|
||||
ROM_LOAD( "m2fr_n88_2.rom", 0xc000, 0x2000, CRC(98c3a7b2) SHA1(fc4980762d3caa56964d0ae583424756f511d186) )
|
||||
ROM_LOAD( "m2fr_n88_3.rom", 0xe000, 0x2000, CRC(0ca08abd) SHA1(a5a42d0b7caa84c3bc6e337c9f37874d82f9c14b) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "m2fr_disk.rom", 0x0000, 0x0800, CRC(2163b304) SHA1(80da2dee49d4307f00895a129a5cfeff00cf5321) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0)
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
|
||||
@ -2549,13 +2405,6 @@ ROM_START( pc8801mk2mr )
|
||||
ROM_LOAD( "m2mr_n88_2.rom", 0xc000, 0x2000, CRC(11176e0b) SHA1(f13f14f3d62df61498a23f7eb624e1a646caea45) )
|
||||
ROM_LOAD( "m2mr_n88_3.rom", 0xe000, 0x2000, CRC(0ca08abd) SHA1(a5a42d0b7caa84c3bc6e337c9f37874d82f9c14b) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "m2mr_disk.rom", 0x0000, 0x2000, CRC(2447516b) SHA1(1492116f15c426f9796dc2bb6fcccf2656c0ca75) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0)
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_LOAD( "m2mr_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
|
||||
@ -2575,13 +2424,6 @@ ROM_START( pc8801mh )
|
||||
ROM_LOAD( "mh_n88_2.rom", 0xc000, 0x2000, CRC(6aa6b6d8) SHA1(2a077ab444a4fd1470cafb06fd3a0f45420c39cc) )
|
||||
ROM_LOAD( "mh_n88_3.rom", 0xe000, 0x2000, CRC(692cbcd8) SHA1(af452aed79b072c4d17985830b7c5dca64d4b412) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "mh_disk.rom", 0x0000, 0x2000, CRC(a222ecf0) SHA1(79e9c0786a14142f7a83690bf41fb4f60c5c1004) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0)
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_LOAD( "mh_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
|
||||
@ -2601,13 +2443,6 @@ ROM_START( pc8801fa )
|
||||
ROM_LOAD( "fa_n88_2.rom", 0xc000, 0x2000, CRC(6aee9a4e) SHA1(e94278682ef9e9bbb82201f72c50382748dcea2a) )
|
||||
ROM_LOAD( "fa_n88_3.rom", 0xe000, 0x2000, CRC(692cbcd8) SHA1(af452aed79b072c4d17985830b7c5dca64d4b412) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "fa_disk.rom", 0x0000, 0x0800, CRC(2163b304) SHA1(80da2dee49d4307f00895a129a5cfeff00cf5321) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0 )
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_LOAD( "fa_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
|
||||
@ -2627,13 +2462,6 @@ ROM_START( pc8801ma ) // newer floppy BIOS and Jisyo (dictionary) ROM
|
||||
ROM_LOAD( "ma_n88_2.rom", 0xc000, 0x2000, CRC(6aee9a4e) SHA1(e94278682ef9e9bbb82201f72c50382748dcea2a) )
|
||||
ROM_LOAD( "ma_n88_3.rom", 0xe000, 0x2000, CRC(692cbcd8) SHA1(af452aed79b072c4d17985830b7c5dca64d4b412) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "ma_disk.rom", 0x0000, 0x2000, CRC(a222ecf0) SHA1(79e9c0786a14142f7a83690bf41fb4f60c5c1004) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0 )
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_LOAD( "ma_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
|
||||
@ -2657,13 +2485,6 @@ ROM_START( pc8801ma2 )
|
||||
ROM_LOAD( "ma2_n88_2.rom", 0xc000, 0x2000, CRC(1d6277b6) SHA1(dd9c3e50169b75bb707ef648f20d352e6a8bcfe4) )
|
||||
ROM_LOAD( "ma2_n88_3.rom", 0xe000, 0x2000, CRC(692cbcd8) SHA1(af452aed79b072c4d17985830b7c5dca64d4b412) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "ma2_disk.rom", 0x0000, 0x2000, CRC(a222ecf0) SHA1(79e9c0786a14142f7a83690bf41fb4f60c5c1004) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0)
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_LOAD( "ma2_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
|
||||
@ -2686,16 +2507,9 @@ ROM_START( pc8801mc )
|
||||
ROM_LOAD( "mc_n88_2.rom", 0xc000, 0x2000, CRC(1d6277b6) SHA1(dd9c3e50169b75bb707ef648f20d352e6a8bcfe4) )
|
||||
ROM_LOAD( "mc_n88_3.rom", 0xe000, 0x2000, CRC(692cbcd8) SHA1(af452aed79b072c4d17985830b7c5dca64d4b412) )
|
||||
|
||||
ROM_REGION( 0x10000, "fdccpu", 0)
|
||||
ROM_LOAD( "mc_disk.rom", 0x0000, 0x2000, CRC(a222ecf0) SHA1(79e9c0786a14142f7a83690bf41fb4f60c5c1004) )
|
||||
|
||||
ROM_REGION( 0x10000, "cdrom", 0 )
|
||||
ROM_LOAD( "cdbios.rom", 0x0000, 0x10000, CRC(5c230221) SHA1(6394a8a23f44ea35fcfc3e974cf940bc8f84d62a) )
|
||||
|
||||
/* No idea of the proper size: it has never been dumped */
|
||||
ROM_REGION( 0x2000, "audiocpu", 0)
|
||||
ROM_LOAD( "soundbios.rom", 0x0000, 0x2000, NO_DUMP )
|
||||
|
||||
ROM_REGION( 0x40000, "kanji", 0 )
|
||||
ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
|
||||
ROM_LOAD( "mc_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
|
||||
@ -2716,15 +2530,15 @@ COMP( 1983, pc8801mk2, pc8801, 0, pc8801, pc88sr, pc8801_state, empt
|
||||
COMP( 1985, pc8801mk2sr, pc8801, 0, pc8801, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801mkIISR", MACHINE_NOT_WORKING )
|
||||
//COMP( 1985, pc8801mk2tr, pc8801, 0, pc8801, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801mkIITR", MACHINE_NOT_WORKING )
|
||||
COMP( 1985, pc8801mk2fr, pc8801, 0, pc8801, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801mkIIFR", MACHINE_NOT_WORKING )
|
||||
COMP( 1985, pc8801mk2mr, pc8801, 0, pc8801, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801mkIIMR", MACHINE_NOT_WORKING )
|
||||
COMP( 1985, pc8801mk2mr, pc8801, 0, pc8801mk2mr, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801mkIIMR", MACHINE_NOT_WORKING )
|
||||
|
||||
//COMP( 1986, pc8801fh, 0, 0, pc8801, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801FH", MACHINE_NOT_WORKING )
|
||||
//COMP( 1986, pc8801fh, 0, 0, pc8801mk2fr, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801FH", MACHINE_NOT_WORKING )
|
||||
COMP( 1986, pc8801mh, pc8801, 0, pc8801fh, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801MH", MACHINE_NOT_WORKING )
|
||||
COMP( 1987, pc8801fa, pc8801, 0, pc8801fh, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801FA", MACHINE_NOT_WORKING )
|
||||
COMP( 1987, pc8801ma, pc8801, 0, pc8801ma, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801MA", MACHINE_NOT_WORKING )
|
||||
//COMP( 1988, pc8801fe, pc8801, 0, pc8801, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801FE", MACHINE_NOT_WORKING )
|
||||
//COMP( 1988, pc8801fe, pc8801, 0, pc8801fa, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801FE", MACHINE_NOT_WORKING )
|
||||
COMP( 1988, pc8801ma2, pc8801, 0, pc8801ma, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801MA2", MACHINE_NOT_WORKING )
|
||||
//COMP( 1989, pc8801fe2, pc8801, 0, pc8801, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801FE2", MACHINE_NOT_WORKING )
|
||||
//COMP( 1989, pc8801fe2, pc8801, 0, pc8801fa, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801FE2", MACHINE_NOT_WORKING )
|
||||
COMP( 1989, pc8801mc, pc8801, 0, pc8801mc, pc88sr, pc8801_state, empty_init, "NEC", "PC-8801MC", MACHINE_NOT_WORKING )
|
||||
|
||||
//COMP( 1989, pc98do, 0, 0, pc88va, pc88sr, pc8801_state, empty_init, "NEC", "PC-98DO", MACHINE_NOT_WORKING )
|
||||
|
@ -13,7 +13,7 @@
|
||||
- What exact kind of garbage happens if you try to enable both direct and palette color
|
||||
modes to a graphic layer?
|
||||
- unemulated upd71071 demand mode;
|
||||
- What is exactly supposed to be a "bus slot"?
|
||||
- What is exactly supposed to be a "bus slot"? Does it have an official name?
|
||||
- fdc "intelligent mode" has 0x7f as irq vector ... 0x7f is ld a,a and it IS NOT correctly
|
||||
hooked up by the current z80 core
|
||||
- PC-88VA stock version has two bogus opcodes. One is at 0xf0b15, another at 0xf0b31.
|
||||
|
@ -1,11 +1,11 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Curt Coder
|
||||
// copyright-holders:Curt Coder, Angelo Salese
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef MAME_INCLUDES_PC8001_H
|
||||
#define MAME_INCLUDES_PC8001_H
|
||||
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "imagedev/cassette.h"
|
||||
#include "machine/buffer.h"
|
||||
@ -15,86 +15,151 @@
|
||||
#include "machine/i8251.h"
|
||||
#include "machine/ram.h"
|
||||
#include "machine/upd1990a.h"
|
||||
#include "machine/pc80s31k.h"
|
||||
#include "sound/beep.h"
|
||||
#include "video/upd3301.h"
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
|
||||
#define Z80_TAG "z80"
|
||||
#define N80SR_ROM_TAG "n80sr_rom"
|
||||
#define I8251_TAG "i8251"
|
||||
#define I8255A_TAG "i8255"
|
||||
#define I8257_TAG "i8257"
|
||||
#define UPD1990A_TAG "upd1990a"
|
||||
#define UPD3301_TAG "upd3301"
|
||||
#define CGROM_TAG "cgrom"
|
||||
#define CENTRONICS_TAG "centronics"
|
||||
#define SCREEN_TAG "screen"
|
||||
|
||||
class pc8001_state : public driver_device
|
||||
class pc8001_base_state : public driver_device
|
||||
{
|
||||
public:
|
||||
pc8001_base_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, Z80_TAG)
|
||||
, m_crtc(*this, UPD3301_TAG)
|
||||
, m_crtc_palette(*this, "crtc_palette")
|
||||
, m_dma(*this, I8257_TAG)
|
||||
, m_cassette(*this, "cassette")
|
||||
, m_cgrom(*this, CGROM_TAG)
|
||||
{}
|
||||
|
||||
protected:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<upd3301_device> m_crtc;
|
||||
required_device<palette_device> m_crtc_palette;
|
||||
required_device<i8257_device> m_dma;
|
||||
required_device<cassette_image_device> m_cassette;
|
||||
required_memory_region m_cgrom;
|
||||
|
||||
void port30_w(u8 data);
|
||||
virtual void machine_start() override;
|
||||
void set_screen_frequency(bool is_24KHz) { m_screen_is_24KHz = is_24KHz; };
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER( crtc_reverse_w );
|
||||
UPD3301_DRAW_CHARACTER_MEMBER( draw_text );
|
||||
UPD3301_FETCH_ATTRIBUTE( attr_fetch );
|
||||
DECLARE_WRITE_LINE_MEMBER( hrq_w );
|
||||
uint8_t dma_mem_r(offs_t offset);
|
||||
|
||||
private:
|
||||
bool m_screen_reverse;
|
||||
bool m_screen_is_24KHz;
|
||||
|
||||
/* video state */
|
||||
int m_width80;
|
||||
int m_color;
|
||||
};
|
||||
|
||||
class pc8001_state : public pc8001_base_state
|
||||
{
|
||||
public:
|
||||
pc8001_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, Z80_TAG),
|
||||
m_rtc(*this, UPD1990A_TAG),
|
||||
m_dma(*this, I8257_TAG),
|
||||
m_crtc(*this, UPD3301_TAG),
|
||||
m_cassette(*this, "cassette"),
|
||||
m_centronics(*this, CENTRONICS_TAG),
|
||||
m_cent_data_out(*this, "cent_data_out"),
|
||||
m_beep(*this, "beeper"),
|
||||
m_ram(*this, RAM_TAG),
|
||||
m_rom(*this, Z80_TAG),
|
||||
m_char_rom(*this, UPD3301_TAG)
|
||||
: pc8001_base_state(mconfig, type, tag)
|
||||
, m_pc80s31(*this, "pc80s31")
|
||||
, m_rtc(*this, UPD1990A_TAG)
|
||||
, m_screen(*this, "screen")
|
||||
, m_centronics(*this, CENTRONICS_TAG)
|
||||
, m_cent_data_out(*this, "cent_data_out")
|
||||
, m_beep(*this, "beeper")
|
||||
, m_ram(*this, RAM_TAG)
|
||||
, m_rom(*this, Z80_TAG)
|
||||
{ }
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
void pc8001(machine_config &config);
|
||||
|
||||
protected:
|
||||
void pc8001_io(address_map &map);
|
||||
void pc8001_map(address_map &map);
|
||||
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
required_device<pc80s31_device> m_pc80s31;
|
||||
required_device<upd1990a_device> m_rtc;
|
||||
required_device<i8257_device> m_dma;
|
||||
required_device<upd3301_device> m_crtc;
|
||||
required_device<cassette_image_device> m_cassette;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<centronics_device> m_centronics;
|
||||
required_device<output_latch_device> m_cent_data_out;
|
||||
required_device<beep_device> m_beep;
|
||||
required_device<ram_device> m_ram;
|
||||
required_memory_region m_rom;
|
||||
required_memory_region m_char_rom;
|
||||
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
void port10_w(uint8_t data);
|
||||
void port30_w(uint8_t data);
|
||||
uint8_t port40_r();
|
||||
void port40_w(uint8_t data);
|
||||
DECLARE_WRITE_LINE_MEMBER( hrq_w );
|
||||
uint8_t dma_mem_r(offs_t offset);
|
||||
|
||||
/* video state */
|
||||
int m_width80;
|
||||
int m_color;
|
||||
|
||||
int m_centronics_busy;
|
||||
int m_centronics_ack;
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
|
||||
DECLARE_WRITE_LINE_MEMBER(write_centronics_ack);
|
||||
UPD3301_DRAW_CHARACTER_MEMBER( pc8001_display_pixels );
|
||||
void pc8001(machine_config &config);
|
||||
void pc8001_io(address_map &map);
|
||||
void pc8001_mem(address_map &map);
|
||||
};
|
||||
|
||||
class pc8001mk2_state : public pc8001_state
|
||||
{
|
||||
public:
|
||||
pc8001mk2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: pc8001_state(mconfig, type, tag),
|
||||
m_kanji_rom(*this, "kanji")
|
||||
: pc8001_state(mconfig, type, tag)
|
||||
, m_kanji_rom(*this, "kanji")
|
||||
, m_dsw(*this, "DSW%d", 1U)
|
||||
{ }
|
||||
|
||||
required_memory_region m_kanji_rom;
|
||||
|
||||
void port31_w(uint8_t data);
|
||||
void pc8001mk2(machine_config &config);
|
||||
|
||||
protected:
|
||||
void pc8001mk2_io(address_map &map);
|
||||
void pc8001mk2_mem(address_map &map);
|
||||
void pc8001mk2_map(address_map &map);
|
||||
|
||||
required_memory_region m_kanji_rom;
|
||||
required_ioport_array<2> m_dsw;
|
||||
private:
|
||||
void port31_w(uint8_t data);
|
||||
};
|
||||
|
||||
class pc8001mk2sr_state : public pc8001mk2_state
|
||||
{
|
||||
public:
|
||||
pc8001mk2sr_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: pc8001mk2_state(mconfig, type, tag)
|
||||
, m_n80sr_rom(*this, N80SR_ROM_TAG)
|
||||
{ }
|
||||
|
||||
void pc8001mk2sr(machine_config &config);
|
||||
|
||||
private:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
void pc8001mk2sr_io(address_map &map);
|
||||
|
||||
required_memory_region m_n80sr_rom;
|
||||
|
||||
void port33_w(u8 data);
|
||||
u8 port71_r();
|
||||
void port71_w(u8 data);
|
||||
|
||||
u8 m_n80sr_bank;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -5,12 +5,12 @@
|
||||
PC-8801 (c) 1981 NEC
|
||||
|
||||
********************************************************************************************/
|
||||
|
||||
#ifndef MAME_INCLUDES_PC8801_H
|
||||
#define MAME_INCLUDES_PC8801_H
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "bus/centronics/ctronics.h"
|
||||
#include "imagedev/cassette.h"
|
||||
@ -20,7 +20,7 @@
|
||||
#include "machine/i8255.h"
|
||||
#include "machine/timer.h"
|
||||
#include "machine/upd1990a.h"
|
||||
#include "machine/upd765.h"
|
||||
#include "machine/pc80s31k.h"
|
||||
#include "sound/beep.h"
|
||||
#include "sound/ymopn.h"
|
||||
#include "emupal.h"
|
||||
@ -41,9 +41,7 @@ public:
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_screen(*this, "screen")
|
||||
, m_fdccpu(*this, "fdccpu")
|
||||
, m_fdc(*this, "upd765")
|
||||
, m_fdd(*this, "upd765:%u", 0U)
|
||||
, m_pc80s31(*this, "pc80s31")
|
||||
, m_pic(*this, I8214_TAG)
|
||||
, m_rtc(*this, UPD1990A_TAG)
|
||||
, m_cassette(*this, "cassette")
|
||||
@ -53,16 +51,28 @@ public:
|
||||
, m_palette(*this, "palette")
|
||||
{ }
|
||||
|
||||
void pc8801mc(machine_config &config);
|
||||
void pc8801fh(machine_config &config);
|
||||
void pc8801(machine_config &config);
|
||||
void pc8801mk2mr(machine_config &config);
|
||||
void pc8801fh(machine_config &config);
|
||||
void pc8801ma(machine_config &config);
|
||||
void pc8801mc(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void video_start() override;
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<pc80s31_device> m_pc80s31;
|
||||
optional_device<i8214_device> m_pic;
|
||||
required_device<upd1990a_device> m_rtc;
|
||||
required_device<cassette_image_device> m_cassette;
|
||||
required_device<beep_device> m_beeper;
|
||||
required_device<ym2608_device> m_opna;
|
||||
required_device<ym2203_device> m_opn;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
private:
|
||||
struct crtc_t
|
||||
{
|
||||
@ -78,19 +88,6 @@ private:
|
||||
attotime time;
|
||||
};
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<cpu_device> m_fdccpu;
|
||||
required_device<upd765a_device> m_fdc;
|
||||
required_device_array<floppy_connector, 2> m_fdd;
|
||||
optional_device<i8214_device> m_pic;
|
||||
required_device<upd1990a_device> m_rtc;
|
||||
required_device<cassette_image_device> m_cassette;
|
||||
required_device<beep_device> m_beeper;
|
||||
required_device<ym2608_device> m_opna;
|
||||
required_device<ym2203_device> m_opn;
|
||||
required_device<palette_device> m_palette;
|
||||
|
||||
std::unique_ptr<uint8_t[]> m_work_ram;
|
||||
std::unique_ptr<uint8_t[]> m_hi_work_ram;
|
||||
std::unique_ptr<uint8_t[]> m_ext_work_ram;
|
||||
|
460
src/mame/machine/pc80s31k.cpp
Normal file
460
src/mame/machine/pc80s31k.cpp
Normal file
@ -0,0 +1,460 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Angelo Salese, Olivier Galibert
|
||||
/**************************************************************************************************
|
||||
|
||||
NEC PC-80S31(K) Mini Disk Unit
|
||||
|
||||
Z80 + μPD765 + PPI that connects in cross with an host PPI
|
||||
|
||||
"Mini" as compared to the PC-8881 8-inch floppy I/F
|
||||
|
||||
Design is decidedly derived from Epson TF-20 and friends,
|
||||
cfr. devices/bus/epson_sio/tf20.cpp
|
||||
|
||||
TODO:
|
||||
- What's PC-80S32? Is it the 88VA version or a different beast?
|
||||
- PC=0x7dd reads from FDC bit 3 in ST3 (twosid_r fn),
|
||||
expecting a bit 3 high for all the PC8001 games otherwise keeps looping and eventually dies.
|
||||
Are those incorrectly identified as 2DD? Hacked to work for now;
|
||||
- set_input_line_vector fn doesn't work properly when issued from a device_reset,
|
||||
we currently just implement the irq_callback instead;
|
||||
- Bus option;
|
||||
- Cascade mode, i.e. the CN2 connector used to accept a second disk unit for drive 2 & 3;
|
||||
- pc80s31k: verify that irq vector write (I/O port $f0) belongs here or just
|
||||
whatever PC88VA uses.
|
||||
- printer interface (used for debugging? 4-bit serial?)
|
||||
- Pinpoint what host I/O ports $f6, $f7 truly are
|
||||
(direct FDC access from this device or a different beast? cfr. play6lim with pc8001mk2)
|
||||
- filemst tries to access undocumented I/O port $09 at PC=5000:
|
||||
\- If that's 0 then it tries to read a vector at [0x8000];
|
||||
\- It then tries to read at memory [0xc0ff], set the value read in [0xf012];
|
||||
\- Expects that ROM [0x0000] is not equal to 0xc3;
|
||||
Bottom line: Is it trying to access some custom HW?
|
||||
|
||||
===================================================================================================
|
||||
|
||||
PCB (PC-80S31K)
|
||||
|
||||
===================================================================================================
|
||||
|
||||
|--------------------------------------|
|
||||
| P1 P2 P3 X1 |
|
||||
| |
|
||||
| CN2 |
|
||||
| B6102C022 |
|
||||
| FD1 FD2 (**) |
|
||||
| | | |
|
||||
| CN1 ------- D765AC D2364EC (*)|
|
||||
| (*)|
|
||||
| D8255AC-2 B6101C017 D780C-1 |
|
||||
| |
|
||||
|--------------------------------------|
|
||||
|
||||
PCB is marked PC-80S31KFDC NEC-14T
|
||||
P1, P2, P3 are power supplies (+5V, +12V, -5V for P1, lacks -5V for the other two)
|
||||
μPD2364EC is at position IC13, it's a 8192 size ROM. (***)
|
||||
(*) are μPD41416C
|
||||
(**) marked as JP, unpopulated x 3;
|
||||
μPB6101/2 are bipolar TTL gate arrays, presumably
|
||||
Cannot read marking of X1 (8 MHz?)
|
||||
|
||||
(***) Given this, we guess that PC80S31 is the 2D version while the 'K
|
||||
variant is the 2D/2DD/2HD version.
|
||||
|
||||
===================================================================================================
|
||||
|
||||
Command Protocol
|
||||
|
||||
===================================================================================================
|
||||
|
||||
Command & parameters are normally communicated from Host via port B
|
||||
(read on port A on FDC side)
|
||||
An RPi implementation can be seen at https://github.com/MinatsuT/RPi_PC-80S31
|
||||
|
||||
[0x00] Initialize
|
||||
[0x01] Write to disk
|
||||
%1 number of sectors
|
||||
%2 drive number
|
||||
%3 track number
|
||||
%4 sector number +1
|
||||
[0x02] Read from disk
|
||||
%1 number of sectors
|
||||
%2 drive number
|
||||
%3 track number
|
||||
%4 sector number +1
|
||||
[0x03] Send data to host
|
||||
[0x04] Copy data in-place
|
||||
%1 number of sectors
|
||||
%2 source drive
|
||||
%3 source track
|
||||
%4 source sector number +1
|
||||
%5 destination drive
|
||||
%6 destination track
|
||||
%7 destination sector number +1
|
||||
[0x05] Format
|
||||
%1 drive number
|
||||
[0x06] Send result status to Host
|
||||
x--- ---- I/O complete
|
||||
-x-- ---- has unread buffer
|
||||
---- ---x error occurred
|
||||
[0x07] Drive status
|
||||
[0x0b] Send memory data
|
||||
%1-%2 address start
|
||||
%3-%4 length
|
||||
[0x11] Fast write to disk
|
||||
%1 number of sectors
|
||||
%2 drive number
|
||||
%3 track number
|
||||
%4 sector number +1
|
||||
[0x12] Fast send data
|
||||
(picks up number of sector etc. from previous issued commands?)
|
||||
[0x14] Device status
|
||||
x--- ---- ESIG: error
|
||||
-x-- ---- WPDR: write protected
|
||||
--x- ---- RDY: ready
|
||||
---x ---- TRK0: track 0
|
||||
---- x--- DSDR: double sided drive
|
||||
---- -x-- HDDR: head
|
||||
---- --xx DS1, DS2: drive select
|
||||
(same as 765 ST3?)
|
||||
[0x17] Mode change
|
||||
%1 ---- xxxx mode select
|
||||
|
||||
FDC normally puts ST0-1-2 to RAM buffers $7f0d-f, CHRN data in $7f10-13
|
||||
|
||||
===================================================================================================
|
||||
|
||||
Port C
|
||||
Used as a communication protocol flags
|
||||
|
||||
===================================================================================================
|
||||
|
||||
Host side
|
||||
(swap 4-bit nibbles and r/w direction for FDC side, all bits are active high):
|
||||
x--- ---- (w) ATN AtenTioN:
|
||||
host sends a command to FDC, interrupts current one
|
||||
(looks unconnected the other way around?)
|
||||
-x-- ---- (w) DAC DAta aCcepted:
|
||||
host just picked up data from FDC
|
||||
--x- ---- (w) RFD Ready For Data:
|
||||
host requests data from FDC
|
||||
---x ---- (w) DAV DAta Valid:
|
||||
host outputs data to port B
|
||||
---- -x-- (r) DAC DAta aCcepted:
|
||||
FDC has accepted data from port B
|
||||
---- --x- (r) RFD Ready For Data:
|
||||
FDC requests data from host
|
||||
---- ---x (r) DAV DAta Valid:
|
||||
FDC has output data to port A
|
||||
|
||||
**************************************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "pc80s31k.h"
|
||||
|
||||
//#define VERBOSE 1
|
||||
#include "logmacro.h"
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
|
||||
// device type definition
|
||||
DEFINE_DEVICE_TYPE(PC80S31, pc80s31_device, "pc80s31", "NEC PC-80S31 Mini Disk Unit I/F")
|
||||
DEFINE_DEVICE_TYPE(PC80S31K, pc80s31k_device, "pc80s31k", "NEC PC-80S31K Mini Disk Unit I/F")
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// pc80s31_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
|
||||
pc80s31_device::pc80s31_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, m_fdc(*this, "fdc")
|
||||
, m_floppy(*this, "fdc:%u", 0U)
|
||||
, m_fdc_cpu(*this, "fdc_cpu")
|
||||
, m_fdc_rom(*this, "fdc_rom")
|
||||
, m_ppi_host(*this, "ppi_host")
|
||||
, m_ppi_fdc(*this, "ppi_fdc")
|
||||
, m_latch(*this, "latch_%u", 0U)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
pc80s31_device::pc80s31_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pc80s31_device(mconfig, PC80S31, tag, owner, clock)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ROM_START( pc80s31 )
|
||||
// TODO: exact identification of these
|
||||
ROM_REGION( 0x2000, "fdc_rom", ROMREGION_ERASEFF )
|
||||
ROM_SYSTEM_BIOS( 0, "disk", "disk BIOS" )
|
||||
ROMX_LOAD( "disk.rom", 0x0000, 0x0800, CRC(2158d307) SHA1(bb7103a0818850a039c67ff666a31ce49a8d516f), ROM_BIOS(0) )
|
||||
ROM_SYSTEM_BIOS( 1, "mk2fr", "mkIIFR disk BIOS" )
|
||||
ROMX_LOAD( "mk2fr_disk.rom", 0x0000, 0x0800, CRC(2163b304) SHA1(80da2dee49d4307f00895a129a5cfeff00cf5321), ROM_BIOS(1) )
|
||||
|
||||
ROM_FILL( 0x7df, 1, 0x00 )
|
||||
ROM_FILL( 0x7e0, 1, 0x00 )
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *pc80s31_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( pc80s31 );
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - device-specific machine
|
||||
// configuration addiitons
|
||||
//-------------------------------------------------
|
||||
|
||||
void pc80s31_device::host_map(address_map &map)
|
||||
{
|
||||
map(0, 3).rw(m_ppi_host, FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
}
|
||||
|
||||
void pc80s31_device::fdc_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).rom().region("fdc_rom", 0);
|
||||
map(0x4000, 0x7fff).ram();
|
||||
}
|
||||
|
||||
void pc80s31_device::fdc_io(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map.global_mask(0xff);
|
||||
// map(0x09, 0x09).r accessed by filemst (pc8801), cfr. notes
|
||||
|
||||
// map(0xf0, 0xf0).w(FUNC(pc8801_state::fdc_irq_vector_w)); // Interrupt Opcode Port
|
||||
// map(0xf4, 0xf4).w(FUNC(pc8801_state::fdc_drive_mode_w)); // Drive mode, 2d, 2dd, 2hd
|
||||
// map(0xf6, 0xf6).nopw(); // printer related
|
||||
map(0xf7, 0xf7).nopw(); // printer port output
|
||||
map(0xf8, 0xf8).rw(FUNC(pc80s31_device::terminal_count_r), FUNC(pc80s31_device::motor_control_w));
|
||||
map(0xfa, 0xfb).m(m_fdc, FUNC(upd765a_device::map));
|
||||
map(0xfc, 0xff).rw(m_ppi_fdc, FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
}
|
||||
|
||||
static void pc88_floppies(device_slot_interface &device)
|
||||
{
|
||||
// TODO: definitely not correct for base device
|
||||
device.option_add("525hd", FLOPPY_525_HD);
|
||||
}
|
||||
|
||||
IRQ_CALLBACK_MEMBER(pc80s31_device::irq_cb)
|
||||
{
|
||||
return m_irq_vector;
|
||||
}
|
||||
|
||||
void pc80s31_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
constexpr XTAL fdc_xtal = XTAL(4'000'000);
|
||||
Z80(config, m_fdc_cpu, fdc_xtal);
|
||||
m_fdc_cpu->set_addrmap(AS_PROGRAM, &pc80s31_device::fdc_map);
|
||||
m_fdc_cpu->set_addrmap(AS_IO, &pc80s31_device::fdc_io);
|
||||
m_fdc_cpu->set_irq_acknowledge_callback(FUNC(pc80s31_device::irq_cb));
|
||||
|
||||
UPD765A(config, m_fdc, XTAL(4'000'000), true, true);
|
||||
m_fdc->intrq_wr_callback().set_inputline(m_fdc_cpu, INPUT_LINE_IRQ0);
|
||||
|
||||
for (auto &floppy : m_floppy)
|
||||
{
|
||||
FLOPPY_CONNECTOR(config, floppy, pc88_floppies, "525hd", floppy_image_device::default_mfm_floppy_formats);
|
||||
floppy->enable_sound(true);
|
||||
}
|
||||
|
||||
for (auto &latch : m_latch)
|
||||
GENERIC_LATCH_8(config, latch);
|
||||
|
||||
I8255A(config, m_ppi_host);
|
||||
m_ppi_host->in_pa_callback().set(FUNC(pc80s31_device::latch_r<0>));
|
||||
m_ppi_host->out_pa_callback().set(FUNC(pc80s31_device::latch_w<1>));
|
||||
m_ppi_host->in_pb_callback().set(FUNC(pc80s31_device::latch_r<2>));
|
||||
m_ppi_host->out_pb_callback().set(FUNC(pc80s31_device::latch_w<3>));
|
||||
m_ppi_host->in_pc_callback().set(FUNC(pc80s31_device::latch_r<4>));
|
||||
m_ppi_host->out_pc_callback().set(FUNC(pc80s31_device::latch_w<5>));
|
||||
|
||||
// 8255AC-2
|
||||
I8255A(config, m_ppi_fdc);
|
||||
m_ppi_fdc->in_pa_callback().set(FUNC(pc80s31_device::latch_r<3>));
|
||||
m_ppi_fdc->out_pa_callback().set(FUNC(pc80s31_device::latch_w<2>));
|
||||
m_ppi_fdc->in_pb_callback().set(FUNC(pc80s31_device::latch_r<1>));
|
||||
m_ppi_fdc->out_pb_callback().set(FUNC(pc80s31_device::latch_w<0>));
|
||||
m_ppi_fdc->in_pc_callback().set(FUNC(pc80s31_device::latch_r<5>));
|
||||
m_ppi_fdc->out_pc_callback().set(FUNC(pc80s31_device::latch_w<4>));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_timer - device-specific timers
|
||||
//-------------------------------------------------
|
||||
|
||||
void pc80s31_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
assert(id == 0);
|
||||
|
||||
m_fdc->tc_w(false);
|
||||
|
||||
// several games tries to scan invalid IDs from their structures, if this hits then
|
||||
// it's possibly an attempt to scan a missing sector from the floppy structure.
|
||||
// cfr. acrojet: the third read data command issued tries to access a CHRN of (0, 0, 16, 256)
|
||||
// and checks at PC=500B if any of these status flags are satisfied:
|
||||
// ST0 & 0xdf
|
||||
// ST1 & 0xff
|
||||
// ST2 & 0x73
|
||||
// Data doesn't matter, it also seems to have some activity to the printer port
|
||||
// (debugging left on?)
|
||||
if ((u8)m_fdc_cpu->state_int(Z80_HALT) == 1)
|
||||
{
|
||||
logerror("%s: attempt to trigger TC while in HALT state (read ID copy protection warning)\n", machine().describe_context());
|
||||
// throw emu_fatalerror("copy protection hit");
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void pc80s31_device::device_start()
|
||||
{
|
||||
m_tc_zero_timer = timer_alloc(0);
|
||||
|
||||
save_item(NAME(m_irq_vector));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
|
||||
void pc80s31_device::device_reset()
|
||||
{
|
||||
m_floppy[0]->get_device()->set_rpm(300);
|
||||
m_floppy[1]->get_device()->set_rpm(300);
|
||||
m_fdc->set_rate(250000);
|
||||
|
||||
// TODO: doesn't seem to work for devices?
|
||||
m_fdc_cpu->set_input_line_vector(0, 0);
|
||||
m_irq_vector = 0;
|
||||
|
||||
m_tc_zero_timer->adjust(attotime::never);
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// READ/WRITE HANDLERS
|
||||
//**************************************************************************
|
||||
|
||||
// Comms are simple dual port connected in cross fashion.
|
||||
// Even at "perfect" interleave tho we need to mailbox the connections.
|
||||
// - barbatus will hang at Artec logo the first time around (works if you soft reset);
|
||||
template <unsigned N> u8 pc80s31_device::latch_r()
|
||||
{
|
||||
const int port_mask = N & 4 ? 0x0f : 0xff;
|
||||
// machine().scheduler().synchronize();
|
||||
return m_latch[N]->read() & port_mask;
|
||||
}
|
||||
|
||||
template <unsigned N> void pc80s31_device::latch_w(u8 data)
|
||||
{
|
||||
const int lower_nibble = N & 4;
|
||||
// machine().scheduler().synchronize();
|
||||
if (lower_nibble)
|
||||
{
|
||||
LOG("%s: %s port C write %02x (ATN=%d DAC=%d RFD=%d DAV=%d)\n"
|
||||
, N & 1 ? "host" : "fdc"
|
||||
, machine().describe_context()
|
||||
, data
|
||||
, BIT(data, 7)
|
||||
, BIT(data, 6)
|
||||
, BIT(data, 5)
|
||||
, BIT(data, 4)
|
||||
);
|
||||
}
|
||||
return m_latch[N]->write(data >> lower_nibble);
|
||||
}
|
||||
|
||||
u8 pc80s31_device::terminal_count_r(address_space &space)
|
||||
{
|
||||
if (!machine().side_effects_disabled())
|
||||
{
|
||||
m_fdc->tc_w(true);
|
||||
// TODO: accurate time of this going off
|
||||
m_tc_zero_timer->reset();
|
||||
m_tc_zero_timer->adjust(attotime::from_usec(50));
|
||||
}
|
||||
// value is meaningless (never readback)
|
||||
// TODO: verify this being 0xff or open bus
|
||||
return space.unmap();
|
||||
}
|
||||
|
||||
void pc80s31_device::motor_control_w(uint8_t data)
|
||||
{
|
||||
// FIXME: on pc80s31k device (particularly on later releases) this stays always on
|
||||
// babylon: just spins indefinitely at PC=6d8 (using the internal routines),
|
||||
// waiting for DAV or ATN being on. Never hits the port until a flag is issued.
|
||||
// prajator: on idle times it spins at PC=7060, waiting for ATN and keep issuing a 0xff here.
|
||||
// valis2: calls PC=7009 subroutine for idle, waits for ATN on.
|
||||
// It eventually writes a 0 here, not before an extremely long time
|
||||
// (~10000 frames!)
|
||||
m_floppy[0]->get_device()->mon_w(!(data & 1));
|
||||
m_floppy[1]->get_device()->mon_w(!(data & 2));
|
||||
|
||||
// TODO: according to docs a value of 0x07 enables precompensation to tracks 0-19, 0xf enables it on 20-39
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
//
|
||||
// PC80S31K device overrides
|
||||
//
|
||||
//**************************************************************************
|
||||
|
||||
pc80s31k_device::pc80s31k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: pc80s31_device(mconfig, PC80S31K, tag, owner, clock)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ROM_START( pc80s31k )
|
||||
// TODO: exact identification of these
|
||||
ROM_REGION( 0x2000, "fdc_rom", ROMREGION_ERASEFF )
|
||||
ROM_SYSTEM_BIOS( 0, "ma", "MA disk BIOS")
|
||||
ROMX_LOAD( "ma_disk.rom", 0x0000, 0x2000, CRC(a222ecf0) SHA1(79e9c0786a14142f7a83690bf41fb4f60c5c1004), ROM_BIOS(0) )
|
||||
ROM_SYSTEM_BIOS( 1, "mk2mr", "mkIIMR disk BIOS" )
|
||||
ROMX_LOAD( "m2mr_disk.rom", 0x0000, 0x2000, CRC(2447516b) SHA1(1492116f15c426f9796dc2bb6fcccf2656c0ca75), ROM_BIOS(1) )
|
||||
ROM_SYSTEM_BIOS( 2, "mh", "MH disk BIOS" )
|
||||
ROMX_LOAD( "mh_disk.rom", 0x0000, 0x2000, CRC(a222ecf0) SHA1(79e9c0786a14142f7a83690bf41fb4f60c5c1004), ROM_BIOS(2) )
|
||||
// TODO: this may belong to PC-80S32
|
||||
ROM_SYSTEM_BIOS( 3, "88va", "PC88VA disk BIOS")
|
||||
ROMX_LOAD( "vasubsys.rom", 0x0000, 0x2000, CRC(08962850) SHA1(a9375aa480f85e1422a0e1385acb0ea170c5c2e0), ROM_BIOS(3) )
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *pc80s31k_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( pc80s31k );
|
||||
}
|
||||
|
||||
void pc80s31k_device::drive_mode_w(uint8_t data)
|
||||
{
|
||||
// TODO: fix implementation
|
||||
// anything that isn't a 2D doesn't really set proper parameters in here
|
||||
logerror("FDC drive mode %02x\n", data);
|
||||
m_floppy[0]->get_device()->set_rpm(BIT(data, 0) ? 360 : 300);
|
||||
m_floppy[1]->get_device()->set_rpm(BIT(data, 1) ? 360 : 300);
|
||||
|
||||
m_fdc->set_rate(BIT(data, 5) ? 500000 : 250000);
|
||||
}
|
||||
|
||||
void pc80s31k_device::fdc_io(address_map &map)
|
||||
{
|
||||
pc80s31_device::fdc_io(map);
|
||||
|
||||
map(0xf0, 0xf0).lw8(NAME([this] (u8 data) { m_irq_vector = data; }));
|
||||
map(0xf4, 0xf4).w(FUNC(pc80s31k_device::drive_mode_w));
|
||||
}
|
86
src/mame/machine/pc80s31k.h
Normal file
86
src/mame/machine/pc80s31k.h
Normal file
@ -0,0 +1,86 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Angelo Salese
|
||||
/***************************************************************************
|
||||
|
||||
NEC PC-80S31K
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef MAME_MACHINE_PC80S31K_H
|
||||
#define MAME_MACHINE_PC80S31K_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "imagedev/floppy.h"
|
||||
#include "machine/gen_latch.h"
|
||||
#include "machine/i8255.h"
|
||||
#include "machine/upd765.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class pc80s31_device : public device_t
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
pc80s31_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
void host_map(address_map &map);
|
||||
|
||||
protected:
|
||||
pc80s31_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// device-level overrides
|
||||
//virtual void device_validity_check(validity_checker &valid) const override;
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||
|
||||
virtual void fdc_io(address_map &map);
|
||||
|
||||
required_device<upd765a_device> m_fdc;
|
||||
required_device_array<floppy_connector, 2> m_floppy;
|
||||
u8 m_irq_vector;
|
||||
|
||||
private:
|
||||
required_device<z80_device> m_fdc_cpu;
|
||||
required_memory_region m_fdc_rom;
|
||||
required_device<i8255_device> m_ppi_host;
|
||||
required_device<i8255_device> m_ppi_fdc;
|
||||
required_device_array<generic_latch_8_device, 6> m_latch;
|
||||
|
||||
void fdc_map(address_map &map);
|
||||
|
||||
template <unsigned N> u8 latch_r();
|
||||
template <unsigned N> void latch_w(u8 data);
|
||||
|
||||
u8 terminal_count_r(address_space &space);
|
||||
void motor_control_w(u8 data);
|
||||
|
||||
emu_timer *m_tc_zero_timer;
|
||||
|
||||
IRQ_CALLBACK_MEMBER(irq_cb);
|
||||
};
|
||||
|
||||
class pc80s31k_device : public pc80s31_device
|
||||
{
|
||||
public:
|
||||
pc80s31k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
protected:
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
virtual void fdc_io(address_map &map) override;
|
||||
|
||||
private:
|
||||
void drive_mode_w(u8 data);
|
||||
};
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(PC80S31, pc80s31_device)
|
||||
DECLARE_DEVICE_TYPE(PC80S31K, pc80s31k_device)
|
||||
|
||||
#endif // MAME_MACHINE_PC80S31K_H
|
@ -33855,8 +33855,9 @@ pc6001sr //
|
||||
pc6601 //
|
||||
|
||||
@source:pc8001.cpp
|
||||
pc8001 //
|
||||
pc8001mk2 //
|
||||
pc8001 // 1979
|
||||
pc8001mk2 // 1983
|
||||
pc8001mk2sr // 1985
|
||||
|
||||
@source:pc8401a.cpp
|
||||
pc8401a // roms needed
|
||||
|
Loading…
Reference in New Issue
Block a user