New machines marked as NOT_WORKING (#7904)

* pc9801.cpp: proper ipl ROM dump for pc486mu [flyingharuka]

* New machines marked as NOT_WORKING
----------------------------------
PC-386M [flyingharuka]

* New clones marked as NOT_WORKING
--------------------------------
PC-486SE [flyingharuka]
PC-9821Xa16 [flyingharuka]
PC-9821Ra20 (98MATE R) [flyingharuka]
PC-9821Ra333 [flyingharuka]

* pc9801.cpp: update QA

* pc9801.cpp: move several SW notes from main driver to XML

* pc9801.cpp: Make Epson machines to derive parent-clone relationship from pc486mu

* pc9801.cpp: Backport ROM bankswitch to pc486mu, making it to ERR:VR too, promote pc386m to parent romset since it definitely diverge

* pc88va.cpp: correct main CPU to V50;

* pc9801.cpp: rearrange system metadata, in prevision of actual state
machine splits;

* pc9801.cpp: fix mouse input when in absolute mode (prinmak2, tim, pentium)

* pc9801.cpp: improve mouse latch/delta readback, fix biblems2 regression

* pc9801.cpp: finalize QA notes

* pc98.xml: fix validation, add some extra QA notes

* pc9801.cpp: QA update over feedback by cracyc
This commit is contained in:
Angelo Salese 2021-04-19 10:13:18 +02:00 committed by GitHub
parent c037dfd822
commit 5c4ee0ec5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 749 additions and 305 deletions

File diff suppressed because it is too large Load Diff

View File

@ -2115,7 +2115,9 @@ license:CC0
</part> </part>
</software> </software>
<software name="fh2tag"> <!-- boot OK, no sound (tested -26 and -86 on 98RS, TBD: retest in 9821) -->
<!-- Has Tuned Heart demo (which also has no sound and hangs at first battle) -->
<software name="fh2tag" supported="partial">
<!-- <!--
Origin: redump.org Origin: redump.org
<rom name="Finish Hold 2 - Tag (Japan).cue" size="93" crc="7cf64221" md5="a2dc55a24539aab103701e08562253fe" sha1="8a49ecb6010ea76deb1bcc3c84a0cfc437de46e3"/> <rom name="Finish Hold 2 - Tag (Japan).cue" size="93" crc="7cf64221" md5="a2dc55a24539aab103701e08562253fe" sha1="8a49ecb6010ea76deb1bcc3c84a0cfc437de46e3"/>
@ -3936,7 +3938,9 @@ license:CC0
</part> </part>
</software> </software>
<software name="pnauts"> <!-- Can randomly lock up on prolonged sessions (1+ hours) -->
<!-- Most likely down to -86 misfired irq (stuck note) -->
<software name="pnauts" supported="partial">
<!-- <!--
Origin: redump.org Origin: redump.org
<rom name="Policenauts (Japan).cue" size="591" crc="33715417" md5="ae17a348af34b2f7bddd0695d976f61c" sha1="2e41266a1a1e82eaa6a2b85858aec7af8ad93e33"/> <rom name="Policenauts (Japan).cue" size="591" crc="33715417" md5="ae17a348af34b2f7bddd0695d976f61c" sha1="2e41266a1a1e82eaa6a2b85858aec7af8ad93e33"/>

View File

@ -2,7 +2,12 @@
// copyright-holders:Angelo Salese // copyright-holders:Angelo Salese
/********************************************************************** /**********************************************************************
CCBUS Slot interface for PC-98xx family C-bus slot interface for PC-98xx family
a.k.a. NEC version of the ISA bus.
TODO:
- stub interface, checkout what actually belongs here.
**********************************************************************/ **********************************************************************/
@ -15,7 +20,7 @@
// GLOBAL VARIABLES // GLOBAL VARIABLES
//************************************************************************** //**************************************************************************
DEFINE_DEVICE_TYPE(PC9801CBUS_SLOT, pc9801_slot_device, "pc9801_slot", "PC-9801 sound cbus slot") DEFINE_DEVICE_TYPE(PC9801CBUS_SLOT, pc9801_slot_device, "pc9801_slot", "PC-9801 C-bus slot")
@ -110,7 +115,7 @@ template<typename R, typename W> void pc9801_slot_device::install_io(offs_t star
m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0xffffffff); m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0xffffffff);
break; break;
default: default:
fatalerror("PC-9801-26: Bus width %d not supported\n", buswidth); fatalerror("PC-9801 C-bus: Bus width %d not supported\n", buswidth);
} }
} }

View File

@ -25,7 +25,9 @@
- QX-10 diagnostic test misses the zooming factor (external pin); - QX-10 diagnostic test misses the zooming factor (external pin);
- compis2 SAD address for bitmap is 0x20000 for whatever reason (presumably missing banking); - compis2 SAD address for bitmap is 0x20000 for whatever reason (presumably missing banking);
- A5105 has a FIFO bug with the RDAT, should be a lot larger when it scrolls up. - A5105 has a FIFO bug with the RDAT, should be a lot larger when it scrolls up.
The problem is that DMA-ing with RDAT/WDAT shouldn't be instant; Can be fixed with a DRDY mechanism for RDAT/WDAT;
- Some later SWs on PC-98 throws "Invalid command byte 05" (zettmj on Epson logo),
actual undocumented command to reset something?
- honor visible area - honor visible area
- wide mode (32-bit access) - wide mode (32-bit access)

View File

@ -10,18 +10,18 @@
Special thanks to Fujix for his documentation translation help Special thanks to Fujix for his documentation translation help
TODO: TODO:
- Does this system have one or two CPUs? I'm prone to think that the V30 does all the job
and then enters into z80 compatible mode for PC-8801 emulation.
- What exact kind of garbage happens if you try to enable both direct and palette color - What exact kind of garbage happens if you try to enable both direct and palette color
modes to a graphic layer? 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"?
- fdc "intelligent mode" has 0x7f as irq vector ... 0x7f is ld a,a and it IS NOT correctly - 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 hooked up by the current z80 core
- PC-88VA stock version has two bogus opcodes. One is at 0xf0b15, another at 0xf0b31. - PC-88VA stock version has two bogus opcodes. One is at 0xf0b15, another at 0xf0b31.
Making a patch for the latter makes the system to jump into a "DIP-Switch" display. Making a patch for the latter makes the system to jump into a "DIP-Switch" display.
bp f0b31,pc=0xf0b36,g bp f0b31,pc=0xf0b36,g
- unemulated upd71071 demand mode. Update: it never reaches latter with V30->V50 CPU switch fix;
- Fix floppy motor hook-up; - Fix floppy motor hook-up (floppy believes to be always in even if empty drive);
- Support for PC8801 compatible mode & PC80S31K (floppy interface);
********************************************************************************************/ ********************************************************************************************/
@ -1573,7 +1573,7 @@ void pc88va_state::dma_memw_cb(offs_t offset, uint8_t data)
void pc88va_state::pc88va(machine_config &config) void pc88va_state::pc88va(machine_config &config)
{ {
V30(config, m_maincpu, 8000000); /* 8 MHz */ V50(config, m_maincpu, 8000000); // μPD9002, aka V30 + μPD70008AC (for PC8801 compatibility mode)
m_maincpu->set_addrmap(AS_PROGRAM, &pc88va_state::pc88va_map); m_maincpu->set_addrmap(AS_PROGRAM, &pc88va_state::pc88va_map);
m_maincpu->set_addrmap(AS_IO, &pc88va_state::pc88va_io_map); m_maincpu->set_addrmap(AS_IO, &pc88va_state::pc88va_io_map);
m_maincpu->set_vblank_int("screen", FUNC(pc88va_state::pc88va_vrtc_irq)); m_maincpu->set_vblank_int("screen", FUNC(pc88va_state::pc88va_vrtc_irq));

View File

@ -1,126 +1,64 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders:Angelo Salese,Carl // copyright-holders:Angelo Salese,Carl
/*************************************************************************************************** /**************************************************************************************************
PC-9801 (c) 1981 NEC PC-9801 (c) 1981 NEC
driver by Angelo Salese driver by Angelo Salese
TODO: TODO:
- move sound bios ROMs into pc9801_26 / pc9801_86 devices - proper 8251 uart hook-up on keyboard;
- proper 8251 uart hook-up on keyboard
- SASI/SCSI support; - SASI/SCSI support;
- Write a PC80S31K device (also used on PC-8801 and PC-88VA, it's the FDC + Z80 sub-system); - Finish DIP-Switches support;
- Finish DIP-Switches support - text scrolling, upd52611 (cfr. clipping in edge & arcus2, madoum* too?);
- text scrolling - AGDC emulation, upd72120;
- GRCG+ - CMT support (-13/-36 cbus only, identify which models mounted it off the bat);
- rewrite using slot devices - Write a PC80S31K device for 2d type floppies
- some later SWs put "Invalid command byte 05" (Absolutely Mahjong on Epson logo) (also used on PC-8801 and PC-88VA, it's the FDC + Z80 sub-system);
- investigate on POR bit - Anything post-PC9801E/F/M should overwrite "speaker_device" to actually use a
- test 2dd more dac_bit_interface instead (cfr. DAC1BIT in SW list);
- clean-ups/split into devices. - clean-ups & split into separate devices and driver flavours;
- derive romsets by default options (cfr. 3.5 2HD floppies vs. default 5.25, 2D/2DD etc.);
- Remove kludge for POR bit in a20_ctrl_w fn;
- floppy sounds never silences when drive is idle (disabled for the time being);
TODO (PC-9801F)
- kanji port 0xa9 readback is broken for several games (balpower, lovelyho).
TODO (PC-9801RS): TODO (PC-9801RS):
- extra features; - several unemulated extra f/f features;
- keyboard shift doesn't seem to disable properly; - keyboard shift doesn't seem to disable properly (fixed by now?);
- Several games hangs with stuck note by misfired/not catched up -26 / -86 irq;
- clean-up duplicate code; - clean-up duplicate code;
TODO (PC-9821): TODO (PC-9821):
- fix CPU for some clones; - fix CPU for some clones;
- "cache error" - "cache error"
- undumped IDE ROM, kludged to work - undumped IDE ROM, kludged to work;
- Compatibility is untested;
TODO (PC-9821AS) TODO (PC-9821AS)
- IPL ROM banking contradicts greatly from the other machines; - IPL ROM banking contradicts greatly from the other machines;
TODO: (PC-486MU) TODO (PC-386M):
- Tries to read port C of i8255_sys (-> 0x35) at boot without setting up the control - "ERR:BR" at boot (BIOS loader error).
port. This causes a jump to invalid program area; Executes some code in text VRAM area (PC=$a006e), trying to setup a writeable RAM bank
- Dies on ARTIC check; (shadow RAM even?) to IPL window, I/O $c06 seems to be the control port for it;
- Presumably one ROM is undumped?
TODO: (PC-486SE/PC-486MU):
- Verify ROM bankswitch;
On PC-486SE sets up what is normally IPL bankswitch at PC=0xf5115, successive opcode
is a jmp 0xf8000, pretty unlikely it delays bankswitch so assume it reloads
the same bank.
- Fix POR/ROM bankswitch on soft resets.
- Eventually errors with a ERR:VR (GFX VRAM);
TODO: (PC-9821AP) TODO: (PC-9821AP)
- No way to exit the initial loop. Code looks broken/bad dump? - No way to exit the initial loop. Code looks broken, bad dump?
floppy issues TODO (* denotes actually fixed, to be moved into specific sheet) TODO: (PC-9821Xa16/PC-9821Ra20/PC-9821Ra333)
- 46okunen (DOS not booting / disk swap); - "MICON ERROR" at POST (generic HW fault, PCI?);
* ckrynn
- aishogi: (asserts upon loading, 3'5 image?)
- akitsuka: (works in PC-9801RS only)
* alice
* genghis
* arcshu
* arcus2
* artjigs1 / artjigs2 / artjigs3
* Atlantia (disk swap?)
- azusa108 (disk i/o error)
* bacta2
- btech (disk swap?)
- baycity
- beast (keeps reading command sense)
* beast2
* bellsave (disk swap? select B on config menu)
* biblems2 (at new game loading)
* birdywld
* Bokosuka Wars ===================================================================================================
* jangou2: floppy fails to load after the title screen;
- runners (size assert)
- Sorcerian (2dd image)
- Twilight Zone 3 (2dd image)
List of per-game TODO:
- 4dboxing: inputs are unresponsive;
- 4dboxing: crashes after user disk creation (regression);
- agumixsl: non-interlace mode doesn't resize graphics, has rectangle selection bugs (note: needs GDC = 5 MHz to boot);
- agenesis: fails loading, attempting to read IDE RAM switch port;
- alice: doesn't set bitmap interlace properly, can't do disk swaps via the File Manager;
- applecl1: can't pass hands apparently;
- arctic, fsmoon: Doesn't detect sound board (tied to 0x00ec ports);
- arcus2: has intro glitches;
- artjigs*: some text doesn't appear? Namely under the puzzles and when you clear one;
- atragon: HDD install disk swap doesn't work?
- asokokof: black screen with BGM, executes invalid opcode (previous note "waits at 0x225f6");
- arquelph: beeps out at initial sound check, no voice samples, extra sound board tested;
- akitsuka: could not setup "initial data" (regression);
- bandkun: can't install to HDD, has unemulated sound boards in settings (Roland MT-32 & D-10/D-110, Kawai MSB-98, Korg M1, MIDI);
- biblems2: initial GLODIA logo uses raster effects?
- bishohzx: Soft House logo uses pseudo-ROZ effect (?), no title screen graphics?
- bishotsu: beeps out before game (missing sound board?), doesn't draw some text?
- deflektr: no sound, moans about a DIP-SW setting during loading, has timing issues (keyboard being too fast on PC-9801RS);
- edge: has gfx glitch when intro scrolls to top-left;
- edge: user disk creation screen is offset?
- idolsaga: Moans with a "(program) ended. remove the floppy disk and turn off the power."
- karateka: no sound;
- lovelyho: Doesn't show kanjis in PC-9801F version (tries to read them thru the 0xa9 port);
- madoum1, madoum2, madoum3: doesn't display bitmap gfxs during gameplay;
- quarth: sound cuts off at title screen, doesn't work on 9801rs (bogus "corrupt .exe" detected);
- prinmak2, tim: cursor stays stuck when using mouse (works with keyboard);
- puyopuyo: beeps out when it's supposed to play samples, Not supposed to use ADPCM, is it a PIT issue?
- runners: wrong double height on the title screen;
- rusty: black stripes when scrolling;
- rusty: voice pitches are too slow (tested with -26 and -86);
- win211: EGC drawing issue (byte wide writes?)
- win31: doesn't boot at
per-game TODO (Dounjishi SW):
- Absolutely Mahjong: Transitions are too fast.
per-game TODO (PC-9821):
- Battle Skin Panic: gfx bugs at the Gainax logo, it crashes after it;
- Policenauts: CD-ROM drive not found;
Notes:
- annivers: GRPH (ALT) key cycles through different color schemes (normal, b&w, legacy);
- Animahjong V3 makes advantage of the possibility of installing 2 sound boards, where SFX and BGMs are played on separate chips.
- Apple Club 1/2 needs data disks to load properly;
- Beast Lord: needs a titan.fnt, in MS-DOS
- fhtag2: product key is 001J0283TA 100001
- To deprotect BASIC modules set 0xcd7 in ram to 0
========================================================================================
This series features a huge number of models released between 1982 and 1997. They This series features a huge number of models released between 1982 and 1997. They
were not IBM PC-compatible, but they had similar hardware (and software: in the were not IBM PC-compatible, but they had similar hardware (and software: in the
@ -302,6 +240,8 @@
For more info (e.g. optional hardware), see http://www.geocities.jp/retro_zzz/machines/nec/9801/mdl98cpu.html For more info (e.g. optional hardware), see http://www.geocities.jp/retro_zzz/machines/nec/9801/mdl98cpu.html
Epson Series
http://www.pc-9800.net/db_epson/desk_index.htm
PC-9821 Series PC-9821 Series
@ -312,7 +252,7 @@
PC-9821Es (1994) - aka 98FINE, desktop computer with integrated LCD, successor of the PC-98T PC-9821Es (1994) - aka 98FINE, desktop computer with integrated LCD, successor of the PC-98T
PC-9821X series (1994->1995) - aka 98MATE X, desktop computers, Pentium based PC-9821X series (1994->1995) - aka 98MATE X, desktop computers, Pentium based
PC-9821V series (1995) - aka 98MATE Valuestar, desktop computers, Pentium based PC-9821V series (1995) - aka 98MATE Valuestar, desktop computers, Pentium based
PC-9821S series (1995->2996) - aka 98Pro, tower computers, PentiumPro based PC-9821S series (1995->1996) - aka 98Pro, tower computers, PentiumPro based
PC-9821R series (1996->2000) - aka 98MATE R, desktop & tower & server computers, various CPU PC-9821R series (1996->2000) - aka 98MATE R, desktop & tower & server computers, various CPU
PC-9821C200 (1997) - aka CEREB, desktop computer, Pentium MMX based PC-9821C200 (1997) - aka CEREB, desktop computer, Pentium MMX based
PC-9821 Ne/Ns/Np/Nm (1993->1995) - aka 98NOTE, laptops, 486 based PC-9821 Ne/Ns/Np/Nm (1993->1995) - aka 98NOTE, laptops, 486 based
@ -387,7 +327,7 @@ Keyboard TX commands:
0x9d keyboard LED settings 0x9d keyboard LED settings
0x9f keyboard ID 0x9f keyboard ID
****************************************************************************************************/ **************************************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/pc9801.h" #include "includes/pc9801.h"
@ -984,10 +924,12 @@ void pc9801_state::pc9801rs_a0_w(offs_t offset, uint8_t data)
case 0x0e: m_analog16.b[m_analog16.pal_entry] = data & 0xf; break; case 0x0e: m_analog16.b[m_analog16.pal_entry] = data & 0xf; break;
} }
m_palette->set_pen_color((m_analog16.pal_entry)+0x10, m_palette->set_pen_color(
pal4bit(m_analog16.r[m_analog16.pal_entry]), m_analog16.pal_entry + 0x10,
pal4bit(m_analog16.g[m_analog16.pal_entry]), pal4bit(m_analog16.r[m_analog16.pal_entry]),
pal4bit(m_analog16.b[m_analog16.pal_entry])); pal4bit(m_analog16.g[m_analog16.pal_entry]),
pal4bit(m_analog16.b[m_analog16.pal_entry])
);
return; return;
} }
@ -1175,10 +1117,12 @@ void pc9801_state::pc9821_a0_w(offs_t offset, uint8_t data)
case 0x0e: m_analog256.b[m_analog256.pal_entry] = data & 0xff; break; case 0x0e: m_analog256.b[m_analog256.pal_entry] = data & 0xff; break;
} }
m_palette->set_pen_color((m_analog256.pal_entry)+0x20, m_palette->set_pen_color(
m_analog256.r[m_analog256.pal_entry], m_analog256.pal_entry + 0x20,
m_analog256.g[m_analog256.pal_entry], m_analog256.r[m_analog256.pal_entry],
m_analog256.b[m_analog256.pal_entry]); m_analog256.g[m_analog256.pal_entry],
m_analog256.b[m_analog256.pal_entry]
);
return; return;
} }
@ -1673,10 +1617,10 @@ static INPUT_PORTS_START( pc9801 )
PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("MOUSE_X") PORT_START("MOUSE_X")
PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_RESET PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30)
PORT_START("MOUSE_Y") PORT_START("MOUSE_Y")
PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_RESET PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30)
PORT_START("MOUSE_B") PORT_START("MOUSE_B")
PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT(0x0f, IP_ACTIVE_LOW, IPT_UNUSED )
@ -1938,20 +1882,45 @@ void pc9801_state::ppi_sys_portc_w(uint8_t data)
m_beeper->set_state(!(data & 0x08)); m_beeper->set_state(!(data & 0x08));
} }
/*
* Mouse 8255 I/F
*
* Port A:
* x--- ---- LEFT mouse button
* -x-- ---- MIDDLE mouse button
* \- Undocumented, most PC98 mice don't have it
* --x- ---- RIGHT mouse button
* ---? ---- <unused>
* ---- xxxx MD3-0 mouse direction latch
*
* Port C:
*
* x--- ---- HC Latch Mode (1=read latch, 0=read delta)
* \- on 0->1 transition reset delta
* -x-- ---- SXY Axis select (1=Y 0=X)
* --x- ---- SHL Read nibble select (1) upper (0) lower
* ---x ---- INT # (1) disable (0) enable
*
* Reading Port B and Port C low nibble are misc DIPSW selectors,
* their meaning diverges on XA/XL/RL classes vs. the rest.
*
*/
uint8_t pc9801_state::ppi_mouse_porta_r() uint8_t pc9801_state::ppi_mouse_porta_r()
{ {
uint8_t res; uint8_t res = ioport("MOUSE_B")->read() & 0xf0;
uint8_t isporthi; const uint8_t isporthi = ((m_mouse.control & 0x20) >> 5)*4;
const char *const mousenames[] = { "MOUSE_X", "MOUSE_Y" };
res = ioport("MOUSE_B")->read() & 0xf0; if ((m_mouse.control & 0x80) == 0)
isporthi = ((m_mouse.control & 0x20) >> 5)*4; {
if (m_mouse.control & 0x40)
if((m_mouse.control & 0x80) == 0) res |= (m_mouse.dy >> isporthi) & 0xf;
res |= ioport(mousenames[(m_mouse.control & 0x40) >> 6])->read() >> (isporthi) & 0xf; else
res |= (m_mouse.dx >> isporthi) & 0xf;
}
else else
{ {
if(m_mouse.control & 0x40) if (m_mouse.control & 0x40)
res |= (m_mouse.ly >> isporthi) & 0xf; res |= (m_mouse.ly >> isporthi) & 0xf;
else else
res |= (m_mouse.lx >> isporthi) & 0xf; res |= (m_mouse.lx >> isporthi) & 0xf;
@ -1973,10 +1942,24 @@ void pc9801_state::ppi_mouse_portb_w(uint8_t data)
void pc9801_state::ppi_mouse_portc_w(uint8_t data) void pc9801_state::ppi_mouse_portc_w(uint8_t data)
{ {
if((m_mouse.control & 0x80) == 0 && data & 0x80) // fsmoon: 0x00 -> 0x80 -> 0xa0 -> 0xc0 -> 0xf0
// (read latch as relative)
// prinmak2: 0x00 -> 0x20 -> 0x40 -> 0x60 -> 0x60
// (keeps reading "delta" but never reset it, absolute mode)
// biblems2: 0x0f -> 0x2f -> 0x4f -> 0x6f -> 0xef
// (latches a delta reset then reads delta diff, relative mode)
const u8 mouse_x = ioport("MOUSE_X")->read();
const u8 mouse_y = ioport("MOUSE_Y")->read();
m_mouse.dx = (mouse_x - m_mouse.prev_dx) & 0xff;
m_mouse.dy = (mouse_y - m_mouse.prev_dy) & 0xff;
if ((m_mouse.control & 0x80) == 0 && data & 0x80)
{ {
m_mouse.lx = ioport("MOUSE_X")->read(); m_mouse.lx = m_mouse.dx & 0xff;
m_mouse.ly = ioport("MOUSE_Y")->read(); m_mouse.ly = m_mouse.dy & 0xff;
m_mouse.prev_dx = mouse_x;
m_mouse.prev_dy = mouse_y;
} }
m_mouse.control = data; m_mouse.control = data;
@ -2135,6 +2118,7 @@ MACHINE_RESET_MEMBER(pc9801_state,pc9801_common)
m_mouse.control = 0xff; m_mouse.control = 0xff;
m_mouse.freq_reg = 0; m_mouse.freq_reg = 0;
m_mouse.freq_index = 0; m_mouse.freq_index = 0;
m_mouse.lx = m_mouse.ly = m_mouse.prev_dx = m_mouse.prev_dy = m_mouse.dx = m_mouse.dy = 0;
m_dma_autoinc[0] = m_dma_autoinc[1] = m_dma_autoinc[2] = m_dma_autoinc[3] = 0; m_dma_autoinc[0] = m_dma_autoinc[1] = m_dma_autoinc[2] = m_dma_autoinc[3] = 0;
memset(&m_egc, 0, sizeof(m_egc)); memset(&m_egc, 0, sizeof(m_egc));
} }
@ -2233,6 +2217,13 @@ void pc9801_state::pc9801_keyboard(machine_config &config)
m_keyb->irq_wr_callback().set(m_pic1, FUNC(pic8259_device::ir1_w)); m_keyb->irq_wr_callback().set(m_pic1, FUNC(pic8259_device::ir1_w));
} }
void pc9801_state::pc9801_pit_clock(machine_config &config, const XTAL clock)
{
m_pit8253->set_clk<0>(clock);
m_pit8253->set_clk<1>(clock);
m_pit8253->set_clk<2>(clock);
}
void pc9801_state::pc9801_mouse(machine_config &config) void pc9801_state::pc9801_mouse(machine_config &config)
{ {
i8255_device &ppi_mouse(I8255(config, "ppi8255_mouse")); i8255_device &ppi_mouse(I8255(config, "ppi8255_mouse"));
@ -2436,7 +2427,6 @@ void pc9801_state::pc9801(machine_config &config)
PALETTE(config, m_palette, FUNC(pc9801_state::pc9801_palette), 16); PALETTE(config, m_palette, FUNC(pc9801_state::pc9801_palette), 16);
} }
void pc9801_state::pc9801rs(machine_config &config) void pc9801_state::pc9801rs(machine_config &config)
{ {
I386SX(config, m_maincpu, MAIN_CLOCK_X1*8); // unknown clock. I386SX(config, m_maincpu, MAIN_CLOCK_X1*8); // unknown clock.
@ -2499,6 +2489,8 @@ void pc9801_state::pc9801bx2(machine_config &config)
MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9801bx2) MCFG_MACHINE_START_OVERRIDE(pc9801_state, pc9801bx2)
} }
// TODO: setter for DMAC clock should follow up whatever is the CPU clock
void pc9801_state::pc9821(machine_config &config) void pc9801_state::pc9821(machine_config &config)
{ {
pc9801rs(config); pc9801rs(config);
@ -2542,12 +2534,96 @@ void pc9801_state::pc9821ap2(machine_config &config)
void pc9801_state::pc9821v20(machine_config &config) void pc9801_state::pc9821v20(machine_config &config)
{ {
pc9821(config); pc9821(config);
PENTIUM(config.replace(), m_maincpu, 32000000); // unknown clock PENTIUM(config.replace(), m_maincpu, 32000000); // unknown clock, definitely not 32 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map); m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io); m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb)); m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
} }
void pc9801_state::pc9821xa16(machine_config &config)
{
pc9821(config);
PENTIUM(config.replace(), m_maincpu, 166000000); // Pentium P54C
m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
}
void pc9801_state::pc9821ra20(machine_config &config)
{
pc9821(config);
PENTIUM_PRO(config.replace(), m_maincpu, XTAL(200'000'000));
m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
}
void pc9801_state::pc9821ra333(machine_config &config)
{
pc9821(config);
const double xtal = 333000000;
PENTIUM2(config.replace(), m_maincpu, xtal); // actually a Celeron
m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
// 128KB CPU cache RAM
// Trident TGUI9682XGi + integrated 98 gfx card
// 3x cbus + 2x PCI slots
// 6GB HDD
// built-in ethernet 100BASE-TX/10BASE-T
}
// Epson clones
// TODO: definitely runs on their own state machine
// (verify if for instance they need EGC and what kind of FM board they needs up)
void pc9801_state::pc386m(machine_config &config)
{
pc9801rs(config);
// I386SX(config.replace(), m_maincpu, 16000000); // i386SX 16MHz, switchable to 10/6 MHz
// m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9801rs_map);
// m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9801rs_io);
// m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
// RAM: 640KB + 14.6MB max
// 2 3.5 floppy drives
// ...
}
void pc9801_state::pc486se(machine_config &config)
{
pc9821(config);
const XTAL xtal = XTAL(25'000'000);
I486(config.replace(), m_maincpu, xtal); // i486SX, switchable to 10/5 MHz, supports overdrive
m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821as_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
pc9801_pit_clock(config, xtal/8); // unknown, passes "ERR:TM" test
// RAM: 1.6 MB (!) + 17.6 max
// "dedicated internal memory slot x 1"
// "dedicated video board" slot
}
void pc9801_state::pc486mu(machine_config &config)
{
pc9821(config);
const XTAL xtal = XTAL(33'000'000);
I486(config.replace(), m_maincpu, xtal); // i486SX, switchable to I386DX 10MHz/5MHz, Pentium ODP compatible
m_maincpu->set_addrmap(AS_PROGRAM, &pc9801_state::pc9821_map);
m_maincpu->set_addrmap(AS_IO, &pc9801_state::pc9821as_io);
m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb));
pc9801_pit_clock(config, xtal/8); // unknown, passes "ERR:TM" test
// CL-GD5428
// RAM: 5.6 + 61.6MB max
// 2 x 3.5 floppy drives
}
/* took from "raw" memory dump, uncomment ROM_FILL if you want to play with it */ /* took from "raw" memory dump, uncomment ROM_FILL if you want to play with it */
#define LOAD_IDE_ROM \ #define LOAD_IDE_ROM \
ROM_REGION( 0x4000, "ide", ROMREGION_ERASEVAL(0xcb) ) \ ROM_REGION( 0x4000, "ide", ROMREGION_ERASEVAL(0xcb) ) \
@ -2649,7 +2725,7 @@ ROM_START( pc9801rs )
ROM_LOAD( "itf_rs.rom", 0x10000, 0x08000, CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) ) ROM_LOAD( "itf_rs.rom", 0x10000, 0x08000, CRC(c1815325) SHA1(a2fb11c000ed7c976520622cfb7940ed6ddc904e) )
ROM_LOAD( "bios_rs.rom", 0x18000, 0x18000, BAD_DUMP CRC(315d2703) SHA1(4f208d1dbb68373080d23bff5636bb6b71eb7565) ) ROM_LOAD( "bios_rs.rom", 0x18000, 0x18000, BAD_DUMP CRC(315d2703) SHA1(4f208d1dbb68373080d23bff5636bb6b71eb7565) )
/* following is an emulator memory dump, should be checked and nuked */ /* following is an emulator memory dump, should be checked and eventually nuked if nothing worth is there */
ROM_REGION( 0x100000, "memory", 0 ) ROM_REGION( 0x100000, "memory", 0 )
ROM_LOAD( "00000.rom", 0x00000, 0x8000, CRC(6e299128) SHA1(d0e7d016c005cdce53ea5ecac01c6f883b752b80) ) ROM_LOAD( "00000.rom", 0x00000, 0x8000, CRC(6e299128) SHA1(d0e7d016c005cdce53ea5ecac01c6f883b752b80) )
ROM_LOAD( "c0000.rom", 0xc0000, 0x8000, CRC(1b43eabd) SHA1(ca711c69165e1fa5be72993b9a7870ef6d485249) ) // 0xff everywhere ROM_LOAD( "c0000.rom", 0xc0000, 0x8000, CRC(1b43eabd) SHA1(ca711c69165e1fa5be72993b9a7870ef6d485249) ) // 0xff everywhere
@ -2669,7 +2745,7 @@ ROM_END
/* /*
BX2/U2 - 486SX - (should be 33, but "dumper" note says it's 25 MHz) BX2/U2 - 486SX - (should be 33, but "dumper" note says it's 25 MHz)
Yet another franken-dump done with a lame program, shrug Yet another franken-romset done with direct memory dump, shrug
*/ */
@ -2812,7 +2888,8 @@ ROM_START( pc9821ap2 )
ROM_SYSTEM_BIOS(1, "phd0102", "PHD0102") ROM_SYSTEM_BIOS(1, "phd0102", "PHD0102")
ROMX_LOAD( "phd0102.rom", 0x000000, 0x80000, CRC(3036774c) SHA1(59856a348f156adf5eca06326f967aca54ff871c), ROM_BIOS(1) ) ROMX_LOAD( "phd0102.rom", 0x000000, 0x80000, CRC(3036774c) SHA1(59856a348f156adf5eca06326f967aca54ff871c), ROM_BIOS(1) )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF ) // TODO: identify ROM banks ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
// TODO: identify ROM banks
ROM_COPY( "biosrom", 0x20000, 0x10000, 0x08000 ) ROM_COPY( "biosrom", 0x20000, 0x10000, 0x08000 )
ROM_COPY( "biosrom", 0x30000, 0x18000, 0x18000 ) ROM_COPY( "biosrom", 0x30000, 0x18000, 0x18000 )
@ -2840,33 +2917,17 @@ ROM_START( pc9821ne )
LOAD_IDE_ROM LOAD_IDE_ROM
ROM_END ROM_END
/*
Epson PC-486MU - 486 based, unknown clock
*/
ROM_START( pc486mu )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
ROM_LOAD( "bios_486mu.rom", 0x00000, 0x18000, BAD_DUMP CRC(57b5d701) SHA1(15029800842e93e07615b0fd91fb9f2bfe3e3c24))
ROM_RELOAD( 0x18000, 0x18000 ) // missing rom?
ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
/* /*
98MULTi Ce2 - 80486SX 25 98MULTi Ce2 - 80486SX 25
*/ */
ROM_START( pc9821ce2 ) ROM_START( pc9821ce2 )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF ) ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
ROM_LOAD( "itf_ce2.rom", 0x10000, 0x08000, CRC(273e9e88) SHA1(9bca7d5116788776ed0f297bccb4dfc485379b41) ) ROM_LOAD( "itf_ce2.rom", 0x10000, 0x008000, CRC(273e9e88) SHA1(9bca7d5116788776ed0f297bccb4dfc485379b41) )
ROM_LOAD( "bios_ce2.rom", 0x18000, 0x018000, BAD_DUMP CRC(76affd90) SHA1(910fae6763c0cd59b3957b6cde479c72e21f33c1) ) ROM_LOAD( "bios_ce2.rom", 0x18000, 0x018000, BAD_DUMP CRC(76affd90) SHA1(910fae6763c0cd59b3957b6cde479c72e21f33c1) )
ROM_REGION( 0x80000, "chargen", 0 ) ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_ce2.rom", 0x000000, 0x046800, CRC(d1c2702a) SHA1(e7781e9d35b6511d12631641d029ad2ba3f7daef) ) ROM_LOAD( "font_ce2.rom", 0x00000, 0x046800, BAD_DUMP CRC(d1c2702a) SHA1(e7781e9d35b6511d12631641d029ad2ba3f7daef) )
LOAD_KANJI_ROMS LOAD_KANJI_ROMS
LOAD_IDE_ROM LOAD_IDE_ROM
@ -2878,17 +2939,95 @@ ROM_END
ROM_START( pc9821xs ) ROM_START( pc9821xs )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF ) ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
ROM_LOAD( "itf.rom", 0x10000, 0x08000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) ) ROM_LOAD( "itf.rom", 0x10000, 0x008000, BAD_DUMP CRC(dd4c7bb8) SHA1(cf3aa193df2722899066246bccbed03f2e79a74a) )
ROM_LOAD( "bios_xs.rom", 0x18000, 0x018000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) ) ROM_LOAD( "bios_xs.rom", 0x18000, 0x018000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
ROM_REGION( 0x80000, "chargen", 0 ) ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_xs.rom", 0x000000, 0x046800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) ) ROM_LOAD( "font_xs.rom", 0x00000, 0x046800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) )
LOAD_KANJI_ROMS LOAD_KANJI_ROMS
LOAD_IDE_ROM LOAD_IDE_ROM
ROM_END ROM_END
/*
9821Xa16
Pentium P54C @ 166
32MB
3.5"2DD/2HDx1, 8xCD-ROM
CBus: 3 slots
*/
ROM_START( pc9821xa16 )
ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
ROM_LOAD( "pc-9821xa16_g8yewa_a1_wsg8b01_ab28f200b5-t.bin", 0x00000, 0x040000, CRC(f99c8ce2) SHA1(2bc328d2c496046f6f4f39b0637e90b713a63155) ) // SOP44
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
// TODO: all of the 256k space seems valid
ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
/*
pc-9821Ra20 (98MATE R)
Pentium Pro @ 200
32MB
3.5"2DD/2HDx1, 8xCD-ROM
CBus: 3 slots
*/
ROM_START( pc9821ra20 )
ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
ROM_LOAD( "g8wtp_a13_wtp8b01_ab28f200b5-t.bin", 0x00000, 0x040000, CRC(cd3acc5c) SHA1(746490d7f3d8d0e8df865315adaaae65f3fd0425) ) // SOP44
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
// TODO: all of the 256k space seems valid
ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
/*
pc-9821Ra333 (98MATE R)
Celeron @ 333
32MB, max 256 MB (ECC EDO RAM)
3.5x1, 24xCD-ROM
CBus: 3 slots, PCI: 2 slots
*/
ROM_START( pc9821ra333 )
ROM_REGION16_LE( 0x40000, "biosrom", ROMREGION_ERASEFF )
ROM_LOAD( "g8ykkw.bin", 0x00000, 0x040000, CRC(c605ef31) SHA1(3779aed757f21eb75093c1bfcbf18a232c198ee6) )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
// TODO: all of the 256k space seems valid
ROM_COPY( "biosrom", 0x28000, 0x00000, 0x18000 )
ROM_COPY( "biosrom", 0x00000, 0x18000, 0x18000 )
ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font.rom", 0x00000, 0x46800, BAD_DUMP CRC(a61c0649) SHA1(554b87377d176830d21bd03964dc71f8e98676b1) )
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
/* /*
98MATE VALUESTAR - Pentium based 98MATE VALUESTAR - Pentium based
*/ */
@ -2899,7 +3038,7 @@ ROM_START( pc9821v13 )
ROM_LOAD( "bios_v13.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) ) ROM_LOAD( "bios_v13.rom", 0x18000, 0x18000, BAD_DUMP CRC(0a682b93) SHA1(76a7360502fa0296ea93b4c537174610a834d367) )
ROM_REGION( 0x80000, "chargen", 0 ) ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_a.rom", 0x00000, 0x46800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) ) ROM_LOAD( "font_a.rom", 0x00000, 0x46800, BAD_DUMP CRC(c9a77d8f) SHA1(deb8563712eb2a634a157289838b95098ba0c7f2) )
LOAD_KANJI_ROMS LOAD_KANJI_ROMS
LOAD_IDE_ROM LOAD_IDE_ROM
@ -2915,13 +3054,91 @@ ROM_START( pc9821v20 )
ROM_LOAD( "bios_v20.rom", 0x18000, 0x18000, BAD_DUMP CRC(d5d1f13b) SHA1(bf44b5f4e138e036f1b848d6616fbd41b5549764) ) ROM_LOAD( "bios_v20.rom", 0x18000, 0x18000, BAD_DUMP CRC(d5d1f13b) SHA1(bf44b5f4e138e036f1b848d6616fbd41b5549764) )
ROM_REGION( 0x80000, "chargen", 0 ) ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_v20.rom", 0x000000, 0x046800, BAD_DUMP CRC(6244c4c0) SHA1(9513cac321e89b4edb067b30e9ecb1adae7e7be7) ) ROM_LOAD( "font_v20.rom", 0x00000, 0x046800, BAD_DUMP CRC(6244c4c0) SHA1(9513cac321e89b4edb067b30e9ecb1adae7e7be7) )
LOAD_KANJI_ROMS LOAD_KANJI_ROMS
LOAD_IDE_ROM LOAD_IDE_ROM
ROM_END ROM_END
/*
Epson PC-386M
i386SX-16 @ 16
1MB
3.5"2DD/2HDx2
CBus: 3slots
*/
ROM_START( pc386m )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
ROM_LOAD( "cwma-a02.bin", 0x10000, 0x08000, CRC(d2c357a4) SHA1(819c9a1fc92124a8d6a85339c74651add7efaf92) )
ROM_CONTINUE( 0x18000, 0x18000 )
ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
/*
Epson PC-486SE
i486SX @ 25 MHz
1.6 MB of conventional memory (???)
17.6 MB
CBus: 2slots
*/
ROM_START( pc486se )
ROM_REGION16_LE( 0x20000, "biosrom", ROMREGION_ERASEFF )
ROM_LOAD( "1699ma_cw99-a03.bin", 0x00000, 0x20000, CRC(f03df711) SHA1(88614746e01c7d3cff9f3b8ce0a598830a77d1dc) )
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
// this looks convoluted
ROM_COPY( "biosrom", 0x08000, 0x00000, 0x08000 ) // tests this area at PC=0xf5149
ROM_COPY( "biosrom", 0x00000, 0x10000, 0x08000 )
ROM_COPY( "biosrom", 0x10000, 0x08000, 0x08000 )
// ROM_FILL( 0x18000, 0x08000, 0x90) // untested by BIOS
ROM_COPY( "biosrom", 0x10000, 0x20000, 0x08000 ) // PC=f5113 bankswitch into same area, correct?
ROM_COPY( "biosrom", 0x18000, 0x28000, 0x08000 )
ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
/*
Epson PC-486MU
i486SX-33 @ 33
8MB RAM
3.5'2DD/2HDx2, 2xCD-ROM
CBus: 3 slots
*/
ROM_START( pc486mu )
ROM_REGION16_LE( 0x20000, "biosrom", ROMREGION_ERASEFF )
ROM_LOAD( "pc-486mu_hn27c1024.bin", 0x00000, 0x20000, CRC(113268e1) SHA1(2a630abc825b2808f9f8fb65c6cb1fb7e7f6c710))
// ROM_LOAD( "bios_486mu.rom", 0x00000, 0x18000, BAD_DUMP CRC(57b5d701) SHA1(15029800842e93e07615b0fd91fb9f2bfe3e3c24))
ROM_REGION16_LE( 0x30000, "ipl", ROMREGION_ERASEFF )
// backported from pc486se
ROM_COPY( "biosrom", 0x08000, 0x00000, 0x08000 )
ROM_COPY( "biosrom", 0x00000, 0x10000, 0x08000 )
ROM_COPY( "biosrom", 0x10000, 0x08000, 0x08000 )
// ROM_FILL( 0x18000, 0x08000, 0x90) // untested by BIOS
ROM_COPY( "biosrom", 0x10000, 0x20000, 0x08000 )
ROM_COPY( "biosrom", 0x18000, 0x28000, 0x08000 )
ROM_REGION( 0x80000, "chargen", 0 )
ROM_LOAD( "font_486mu.rom", 0x0000, 0x46800, BAD_DUMP CRC(456d9fc7) SHA1(78ba9960f135372825ab7244b5e4e73a810002ff))
LOAD_KANJI_ROMS
LOAD_IDE_ROM
ROM_END
void pc9801_state::init_pc9801_kanji() void pc9801_state::init_pc9801_kanji()
{ {
@ -3055,22 +3272,65 @@ void pc9801_state::init_pc9801vm_kanji()
} }
} }
/* Genuine dumps */ // For simpilicity's sake we arbitrarily group those with whatever romset came first historically.
COMP( 1983, pc9801f, 0, 0, pc9801, pc9801, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801F", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // This is also repeated in SW list reports: you'd have to use an "On RS class xxx" format to indicate a bug report
COMP( 1985, pc9801vm, pc9801ux, 0, pc9801vm, pc9801rs, pc9801_state, init_pc9801vm_kanji, "NEC", "PC-9801VM", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // specifically happening for a family group. This will be hopefully put into stone with driver splits at some point in future.
/* TODO: ANYTHING below there needs REDUMPING! */ // "vanilla" class (i86, E/F/M)
COMP( 1989, pc9801rs, 0, 0, pc9801rs, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801RS", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) //TODO: not sure about the exact model COMP( 1983, pc9801f, 0, 0, pc9801, pc9801, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801F", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // genuine dump
// N5200 (started as a vanilla PC-98 business line derivative, eventually diverged into its own thing and incorporated various Hyper 98 features. Runs proprietary PTOS)
// APC III (US version of either vanilla PC9801 or N5200, aimed at business market. Runs MS-DOS 2.11/3.xx or PC-UX)
// ...
// VM class (V30 and/or i286)
COMP( 1985, pc9801vm, pc9801ux, 0, pc9801vm, pc9801rs, pc9801_state, init_pc9801vm_kanji, "NEC", "PC-9801VM", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // genuine dump
COMP( 1985, pc9801vm11, pc9801ux, 0, pc9801vm, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801VM11", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) COMP( 1985, pc9801vm11, pc9801ux, 0, pc9801vm, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801VM11", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1987, pc9801ux, 0, 0, pc9801ux, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801UX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) COMP( 1987, pc9801ux, 0, 0, pc9801ux, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801UX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
// VX class (first model using an EGC)
// ...
// XA/XL class (1120 x 750 true color, nicknamed "High-reso")
// ...
// PC-H98 (Hyper 98, '90-'93 high end line with High-reso, proprietary NESA bus, E²GC)
// PC-H98T (LCD Hyper 98)
// SV-H98 (Later Hyper 98 revision, up to Pentium CPU)
// ...
// RS class (i386SX)
COMP( 1988, pc9801rx, pc9801rs, 0, pc9801rs, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801RX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) COMP( 1988, pc9801rx, pc9801rs, 0, pc9801rs, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801RX", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1989, pc9801rs, 0, 0, pc9801rs, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801RS", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
// FA class (i486SX)
COMP( 1993, pc9801bx2, pc9801rs, 0, pc9801bx2, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801BX2/U2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) COMP( 1993, pc9801bx2, pc9801rs, 0, pc9801bx2, pc9801rs, pc9801_state, init_pc9801_kanji, "NEC", "PC-9801BX2/U2", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1994, pc9821, 0, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) //TODO: not sure about the exact model
COMP( 1993, pc9821as, pc9821, 0, pc9821as, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // PC-98GS (Multimedia PC, exclusive video mode "Extended Screen Graphics", -73 sound board (a superset of later -86), superimposition)
COMP( 1993, pc9821ap2, pc9821, 0, pc9821ap2, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821AP2/U8W (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // ...
COMP( 1994, pc9821xs, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE Xs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1994, pc9821ce2, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MULTi Ce2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // Epson class
COMP( 1994, pc9821ne, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98NOTE)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) COMP( 1990, pc386m, 0, 0, pc386m, pc9801rs, pc9801_state, init_pc9801_kanji, "Epson", "PC-386M", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1994, pc486mu, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "Epson", "PC-486MU", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) COMP( 1994, pc486mu, 0, 0, pc486mu, pc9821, pc9801_state, init_pc9801_kanji, "Epson", "PC-486MU", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1998, pc9821v13, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE VALUESTAR 13)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) COMP( 1993, pc486se, pc486mu, 0, pc486se, pc9801rs, pc9801_state, init_pc9801_kanji, "Epson", "PC-486SE", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1998, pc9821v20, pc9821, 0, pc9821v20, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE VALUESTAR 20)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
// PC9821 class
// TODO: unknown real model of parent, given the BIOS rom size wrt the others it may be better suited as a "98Multi" or even a FA class?
// investigate by making genuine BIOS dumps to boot
COMP( 1994, pc9821, 0, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1993, pc9821as, pc9821, 0, pc9821as, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1993, pc9821ap2, pc9821, 0, pc9821ap2, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821AP2/U8W (98MATE A)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1994, pc9821xs, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE Xs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1994, pc9821ce2, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MULTi Ce2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1994, pc9821ne, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98NOTE)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1996, pc9821xa16, pc9821, 0, pc9821xa16, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821Xa16", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1996, pc9821ra20, pc9821, 0, pc9821ra20, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821Ra20 (98MATE R)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1998, pc9821ra333, pc9821, 0, pc9821ra333, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821Ra333 (98MATE R)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1998, pc9821v13, pc9821, 0, pc9821, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE VALUESTAR 13)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
COMP( 1998, pc9821v20, pc9821, 0, pc9821v20, pc9821, pc9801_state, init_pc9801_kanji, "NEC", "PC-9821 (98MATE VALUESTAR 20)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
// PC98DO (PC88+PC98, V33 + μPD70008AC)
// PC-98LT (laptop b&w LCD version V50, no upd7220, just one single bitmap layer)
// PC-98HA aka HANDY98 (portable b&w LCD version, V50, apparently compatible with LT)
// RC-9801 (portable (color?) LCD, i386SX, wireless 9600bps modem)
// PC-9801P (LCD with light pen)

View File

@ -11,7 +11,7 @@
#ifndef MAME_INCLUDES_PC88VA_H #ifndef MAME_INCLUDES_PC88VA_H
#define MAME_INCLUDES_PC88VA_H #define MAME_INCLUDES_PC88VA_H
#include "cpu/nec/nec.h" #include "cpu/nec/v5x.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "imagedev/floppy.h" #include "imagedev/floppy.h"
#include "machine/am9517a.h" #include "machine/am9517a.h"

View File

@ -113,15 +113,27 @@ public:
{ {
} }
void pc9821v20(machine_config &config);
void pc9801ux(machine_config &config);
void pc9801vm(machine_config &config);
void pc9801(machine_config &config); void pc9801(machine_config &config);
void pc9801bx2(machine_config &config);
void pc9801vm(machine_config &config);
void pc9801ux(machine_config &config);
void pc9801rs(machine_config &config); void pc9801rs(machine_config &config);
void pc9801bx2(machine_config &config);
void pc9821(machine_config &config); void pc9821(machine_config &config);
void pc9821as(machine_config &config); void pc9821as(machine_config &config);
void pc9821ap2(machine_config &config); void pc9821ap2(machine_config &config);
void pc9821xa16(machine_config &config);
void pc9821ra20(machine_config &config);
void pc9821ra333(machine_config &config);
void pc9821v20(machine_config &config);
void pc386m(machine_config &config);
void pc486mu(machine_config &config);
void pc486se(machine_config &config);
DECLARE_CUSTOM_INPUT_MEMBER(system_type_r); DECLARE_CUSTOM_INPUT_MEMBER(system_type_r);
void init_pc9801_kanji(); void init_pc9801_kanji();
void init_pc9801vm_kanji(); void init_pc9801vm_kanji();
@ -129,6 +141,14 @@ public:
protected: protected:
virtual void video_start() override; virtual void video_start() override;
void pc9801_keyboard(machine_config &config);
void pc9801_mouse(machine_config &config);
void pc9801_cbus(machine_config &config);
void pc9801_sasi(machine_config &config);
void pc9801_ide(machine_config &config);
void pc9801_common(machine_config &config);
void pc9801_pit_clock(machine_config &config, const XTAL clock);
private: private:
static void cdrom_headphones(device_t *device); static void cdrom_headphones(device_t *device);
@ -314,12 +334,6 @@ private:
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t a20_286(bool state); uint32_t a20_286(bool state);
void pc9801_keyboard(machine_config &config);
void pc9801_mouse(machine_config &config);
void pc9801_cbus(machine_config &config);
void pc9801_sasi(machine_config &config);
void pc9801_ide(machine_config &config);
void pc9801_common(machine_config &config);
void ipl_bank(address_map &map); void ipl_bank(address_map &map);
void pc9801_common_io(address_map &map); void pc9801_common_io(address_map &map);
void pc9801_io(address_map &map); void pc9801_io(address_map &map);
@ -370,8 +384,9 @@ private:
struct{ struct{
uint8_t control; uint8_t control;
uint8_t lx; uint8_t lx, ly;
uint8_t ly; uint8_t dx, dy;
uint8_t prev_dx, prev_dy;
uint8_t freq_reg; uint8_t freq_reg;
uint8_t freq_index; uint8_t freq_index;
}m_mouse; }m_mouse;

View File

@ -33624,21 +33624,26 @@ pc88va //
pc88va2 // pc88va2 //
@source:pc9801.cpp @source:pc9801.cpp
pc386m //
pc486mu // pc486mu //
pc486se // 1993
pc9801bx2 // 1993 pc9801bx2 // 1993
pc9801f // 1983 pc9801f // 1983
pc9801rs // 1989 pc9801rs // 1989
pc9801rx // 1988 pc9801rx // 1988
pc9801ux // 1987 pc9801ux // 1987
pc9801vm // 1985 pc9801vm // 1985
pc9801vm11 pc9801vm11 //
pc9821 // pc9821 //
pc9821ap2 // pc9821ap2 //
pc9821as // pc9821as //
pc9821ce2 // pc9821ce2 //
pc9821ne // pc9821ne //
pc9821ra20 //
pc9821ra333 //
pc9821v13 // pc9821v13 //
pc9821v20 // pc9821v20 //
pc9821xa16 //
pc9821xs // pc9821xs //
@source:pcat_dyn.cpp @source:pcat_dyn.cpp