nec/pc8801.cpp: promote machines to working status (#10685)

- video/upd3301.cpp: fix off by one attribute bugs happening for pc8801 N-88 Basic and several other entries;
- nec/pc8801.cpp: backported centronics hookup from pc8001, allows supporting Jast Sound thru Covox interface in some Jast entries;
- nec/pc8801.cpp: fix 1bpp graphic layer drawing when uPD3301 is not in color mode, fixes byoin regression;

Machines promoted to working
----------------------------
nec/pc8801.cpp: PC-8801mkIISR, PC-8801MH, PC-8801MA [Angelo Salese, Oliver Galibert, Carl]

Clones promoted to working
----------------------------
nec/pc8801.cpp: PC-8801mkIIFR, PC-8801mkIIMR, PC-8801FA, PC-8801MA2 [Angelo Salese, Oliver Galibert, Carl]

New working software list additions
-----------------------------------
pc8801_flop.xml: D' (cracked) [Neo Kobe], Donkey Kong 3 - Dai Gyakushuu [Game Preservation Society, Carl, Disk Blitz]

New NOT_WORKING software list additions
---------------------------------------
pc8801_flop.xml: D' (alt) [Neo Kobe]
This commit is contained in:
Angelo Salese 2022-12-19 17:15:33 +01:00 committed by GitHub
parent 2e531b9f25
commit d75885a767
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1447 additions and 811 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,10 @@
Covox Speech Thing
Notes:
- "Jast Sound" is very similar conceptually to a Covox Speech Thing.
https://www.generation-msx.nl/hardware/jast/jast-sound/1638/
***************************************************************************/
#include "emu.h"

View File

@ -13,6 +13,9 @@
(Modem board, full duplex 300bps);
\- NEC PC-8801-13
(Parallel I/F board);
\- NEC PC-8801-16
(extra μPD8086 CPU + 8253, 8255 and 8259 i/f, able to run MS-DOS 1.25,
requires extra ROMs for both sides);
\- NEC PC-8801-17 / -18
(VTR capture card "Video art board" / "Video digitizing unit", 16-bit color);
\- NEC PC-8801-21

View File

@ -10,8 +10,9 @@
TODO:
- pinpoint how much of pc8001/pc8801 drawing functions should actually be inherited
here;
- pinpoint and expose actual attribute pin meanings;
- verify if pc8001 / pc8801 attribute bit 3 extension is internal or
external to the chip;
- N interrupt (special control character);
- light pen;
- reset counters;
@ -22,9 +23,10 @@
- DMA underrun (sorcerml in pc8801?). Should throw a status U irq;
- cleanup: variable namings should be more verbose
(i.e. not be a single letter like m_y, m_z, m_b ...);
- 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);
- escapepr (pc8801_flop): should draw a semigfx mask over gameplay window but all the attribute
areas are 0, with only a single 0x50 0x18 setup at the very end of the VRAM,
is it expecting to chain from one frame to another or it's simply failing to setup it properly
earlier?
*/
@ -39,6 +41,7 @@
#define LOG_CRTC (1U << 4) // CRTC parameters
#define LOG_INT (1U << 5) // INT, VRTC and DRQ lines
#define LOG_HRTC (1U << 6) // HRTC (verbose)
#define LOG_STRIPS (1U << 7) // attribute row strips (verbose)
#define VERBOSE (LOG_WARN)
//#define VERBOSE (LOG_WARN|LOG_CMD)
@ -52,6 +55,7 @@
#define LOGCRTC(...) LOGMASKED(LOG_CRTC, __VA_ARGS__)
#define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__)
#define LOGHRTC(...) LOGMASKED(LOG_HRTC, __VA_ARGS__)
#define LOGSTRIPS(...) LOGMASKED(LOG_STRIPS, __VA_ARGS__)
//**************************************************************************
@ -538,8 +542,6 @@ void upd3301_device::dack_w(uint8_t data)
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;
@ -601,19 +603,39 @@ UPD3301_FETCH_ATTRIBUTE( upd3301_device::default_attr_fetch )
if (m_gfx_mode == 1)
return attr_extend_info;
// TODO: may actually fetch in LIFO order
// Some edge cases in pc8801 N88 Basic (status on bottom), jettermi and play6lim backs up this theory.
for (int ex = 0; ex < attr_fifo_size; ex+=2)
int row_offset = 0;
// if very first value is not a 0 then use next value as 0-[n] filler
// pc8801 examples:
// - N88 Basic (status on bottom)
// - jettermi
// - play6lim
// TODO: comsight uses an attr_row of 2 as first param when entering in code edit mode.
// Most likely a delay side effect with DMA that *shouldn't* pickup this branch.
if (attr_row[0] != 0)
{
// tdown (pc8801) unintentionally requires to clamp against max size while loading
// (fills TVRAM with floppy data)
u8 attr_end = std::min(attr_row[0], attr_max_size);
u8 attr_value = attr_row[1];
for (int i = 0; i < attr_end; i++)
attr_extend_info[i] = attr_value;
LOGSTRIPS("ex ----| start: 0 | end: %2u [%02x]\n", attr_end, attr_value);
row_offset = 2;
}
for (int ex = 0; ex < attr_fifo_size - row_offset; 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);
u8 attr_value = attr_row[ex + 1 + row_offset];
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);
LOGSTRIPS("ex %04x| start: %2u | end: %2u [%02x]%s\n", ex, attr_start, attr_end, attr_value, attr_start == attr_end ? " (ignored)" : "");
for (int i = attr_start; i < attr_end; i++)
attr_extend_info[i] = attr_value;
@ -727,6 +749,11 @@ bool upd3301_device::get_display_status()
return bool(m_status & STATUS_VE);
}
bool upd3301_device::is_gfx_color_mode()
{
return get_display_status() && (m_gfx_mode == 2);
}
void upd3301_device::set_display(int state)
{

View File

@ -82,6 +82,7 @@ public:
int hrtc_r();
int vrtc_r();
int lines_per_char() { return m_r; }
bool is_gfx_color_mode();
bool get_display_status();
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

View File

@ -123,6 +123,8 @@ UPD3301_DRAW_CHARACTER_MEMBER( pc8001_base_state::draw_text )
}
lowerline = bool(BIT(attr, 5));
// FIXME: ninjakmb (pc8801) sets 0x50 0x50 for all attribute strips
// bit 6 is undefined in the specs, is it for masking decoration(s)?
upperline = bool(BIT(attr, 4));
reverse = bool(BIT(attr, 2));
attr_blink = bool(BIT(attr, 1));
@ -198,7 +200,7 @@ uint32_t pc8001_state::screen_update( screen_device &screen, bitmap_rgb32 &bitma
/* Read/Write Handlers */
void pc8001_state::port10_w(uint8_t data)
void pc8001_base_state::port10_w(uint8_t data)
{
/*
@ -269,12 +271,12 @@ void pc8001mk2_state::port31_w(uint8_t data)
membank("bank2")->set_entry(data & 1);
}
WRITE_LINE_MEMBER( pc8001_state::write_centronics_busy )
WRITE_LINE_MEMBER( pc8001_base_state::write_centronics_busy )
{
m_centronics_busy = state;
}
WRITE_LINE_MEMBER( pc8001_state::write_centronics_ack )
WRITE_LINE_MEMBER( pc8001_base_state::write_centronics_ack )
{
m_centronics_ack = state;
}
@ -654,6 +656,10 @@ void pc8001_base_state::machine_start()
{
m_screen_reverse = false;
/* initialize RTC */
m_rtc->cs_w(1);
m_rtc->oe_w(1);
save_item(NAME(m_width80));
save_item(NAME(m_color));
save_item(NAME(m_screen_reverse));
@ -666,10 +672,6 @@ void pc8001_state::machine_start()
address_space &program = m_maincpu->space(AS_PROGRAM);
/* initialize RTC */
m_rtc->cs_w(1);
m_rtc->oe_w(1);
/* initialize DMA */
m_dma->ready_w(1);

View File

@ -36,6 +36,9 @@ 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_rtc(*this, UPD1990A_TAG)
, m_centronics(*this, CENTRONICS_TAG)
, m_cent_data_out(*this, "cent_data_out")
, m_crtc(*this, UPD3301_TAG)
, m_crtc_palette(*this, "crtc_palette")
, m_dma(*this, I8257_TAG)
@ -43,14 +46,24 @@ public:
, m_cgrom(*this, CGROM_TAG)
{}
// feature::PRINTER more to do with lacking specific PC-88 options
// cfr. -flop1 multipla:flop2 setprt.com
static constexpr feature_type unemulated_features() { return feature::TAPE | feature::PRINTER; }
protected:
required_device<cpu_device> m_maincpu;
required_device<upd1990a_device> m_rtc;
required_device<centronics_device> m_centronics;
required_device<output_latch_device> m_cent_data_out;
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 port10_w(uint8_t data);
void port30_w(u8 data);
virtual void machine_start() override;
void set_screen_frequency(bool is_24KHz) { m_screen_is_24KHz = is_24KHz; }
@ -62,6 +75,11 @@ protected:
DECLARE_WRITE_LINE_MEMBER( hrq_w );
virtual uint8_t dma_mem_r(offs_t offset);
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
DECLARE_WRITE_LINE_MEMBER(write_centronics_ack);
int m_centronics_busy = 0;
int m_centronics_ack = 0;
private:
bool m_screen_reverse = false;
bool m_screen_is_24KHz = false;
@ -78,10 +96,7 @@ public:
pc8001_state(const machine_config &mconfig, device_type type, const char *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)
@ -99,24 +114,14 @@ protected:
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<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;
private:
void port10_w(uint8_t data);
uint8_t port40_r();
void port40_w(uint8_t data);
int m_centronics_busy = 0;
int m_centronics_ack = 0;
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
DECLARE_WRITE_LINE_MEMBER(write_centronics_ack);
};
class pc8001mk2_state : public pc8001_state

View File

@ -152,7 +152,7 @@ UPD3301_FETCH_ATTRIBUTE( pc8801_state::attr_fetch )
const u8 attr_max_size = 80;
std::array<u16, attr_max_size> attr_extend_info = pc8001_base_state::attr_fetch(attr_row, gfx_mode, y, attr_fifo_size, row_size);
// In case we are in a b&w mode copy the attribute structure in an internal buffer for color processing.
// TBD if decoration attributes applies to bitmap as well (very likely)
// It's unknown at this time if decoration attributes applies to bitmap as well
if ((m_gfx_ctrl & 0x18) == 0x08 && gfx_mode == 2)
{
for (int ey = y; ey < y + m_crtc->lines_per_char(); ey ++)
@ -235,7 +235,7 @@ uint32_t pc8801_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap
if (!res)
return 0;
return m_crtc->get_display_status() ? (m_attr_info[y][x] >> 13) & 7 : 7;
return m_crtc->is_gfx_color_mode() ? (m_attr_info[y][x] >> 13) & 7 : 7;
});
}
else
@ -244,20 +244,25 @@ uint32_t pc8801_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap
// - p1demo2d expects to use CRTC palette on demonstration
// (white text that is set to black on previous title screen animation,
// that runs in 3bpp)
// - byoin set a transparent text layer (ASCII=0x20 / attribute = 0x80 0x00)
// but it's in gfx_mode = 0 (b&w) so it just draw white from here.
draw_bitmap(bitmap, cliprect, m_crtc_palette, [&](u32 bitmap_offset, int y, int x, int xi){
u8 res = 0;
// HW pick ups just the first two planes (R and B), G is unused for drawing purposes.
// Plane switch happens at half screen, VRAM areas 0x3e80-0x3fff is unused again.
// TODO: confirm that a 15 kHz monitor cannot work with this
// - jettermi just uses the other b&w mode;
// - casablan doesn't bother in changing resolution so only the upper part is drawn;
// - casablan/byoin doesn't bother in changing resolution so only the upper part is drawn.
// Update: real HW capture shows an ugly overlap with the two layers,
// implying that the second plane just latches on the same signals as the first,
// YAGNI unless found in concrete example.
int plane_offset = y >= 200 ? 384 : 0;
res |= ((m_gvram[bitmap_offset + plane_offset] >> xi) & 1);
if (!res)
return 0;
return m_crtc->get_display_status() ? (m_attr_info[y][x] >> 13) & 7 : 7;
return m_crtc->is_gfx_color_mode() ? (m_attr_info[y][x] >> 13) & 7 : 7;
});
}
}
@ -576,6 +581,8 @@ uint8_t pc8801_state::ext_rom_bank_r()
void pc8801_state::ext_rom_bank_w(uint8_t data)
{
// TODO: bits 1 to 3 written to at POST
// selection for EXP slot ROMs?
m_ext_rom_bank = data;
}
@ -627,16 +634,17 @@ void pc8801_state::port31_w(uint8_t data)
*/
uint8_t pc8801_state::port40_r()
{
// TODO: merge with PC8001
uint8_t data = 0x00;
data |= ioport("CTRL")->read() & 0xcf;
data |= m_centronics_busy;
// data |= m_centronics_ack << 1;
data |= ioport("CTRL")->read() & 0xca;
data |= m_rtc->data_out_r() << 4;
data |= m_crtc->vrtc_r() << 5;
// TODO: enable line from pc80s31k (bit 3, active_low)
return data;
// return ioport("CTRL")->read();
}
inline attotime pc8801_state::mouse_limit_hz()
@ -667,6 +675,9 @@ inline attotime pc8801fh_state::mouse_limit_hz()
*/
void pc8801_state::port40_w(uint8_t data)
{
// TODO: merge with PC8001
m_centronics->write_strobe(BIT(data, 0));
m_rtc->stb_w((data & 2) >> 1);
m_rtc->clk_w((data & 4) >> 2);
@ -879,6 +890,7 @@ uint8_t pc8801_state::extram_bank_r()
void pc8801_state::extram_bank_w(uint8_t data)
{
// TODO: bits 2 and 3 also accesses bank for PC-8801-17 "VAB" card
m_extram_bank = data;
}
@ -924,6 +936,7 @@ template <unsigned kanji_level> void pc8801_state::kanji_w(offs_t offset, uint8_
// https://retrocomputerpeople.web.fc2.com/machines/nec/8801/io_map88.html
}
#if 0
void pc8801_state::rtc_w(uint8_t data)
{
m_rtc->c0_w((data & 1) >> 0);
@ -933,6 +946,7 @@ void pc8801_state::rtc_w(uint8_t data)
// TODO: remaining bits
}
#endif
/*
* PC8801FH overrides (CPU clock switch)
@ -1011,7 +1025,7 @@ void pc8801_state::main_io(address_map &map)
map(0x0d, 0x0d).portr("KEY13");
map(0x0e, 0x0e).portr("KEY14");
map(0x0f, 0x0f).portr("KEY15");
map(0x10, 0x10).w(FUNC(pc8801_state::rtc_w));
map(0x10, 0x10).w(FUNC(pc8801_state::port10_w));
map(0x20, 0x21).mirror(0x0e).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); // CMT / RS-232C ch. 0
map(0x30, 0x30).portr("DSW1").w(FUNC(pc8801_state::port30_w));
map(0x31, 0x31).portr("DSW2").w(FUNC(pc8801_state::port31_w));
@ -1039,6 +1053,7 @@ void pc8801_state::main_io(address_map &map)
map(0x70, 0x70).rw(FUNC(pc8801_state::window_bank_r), FUNC(pc8801_state::window_bank_w));
map(0x71, 0x71).rw(FUNC(pc8801_state::ext_rom_bank_r), FUNC(pc8801_state::ext_rom_bank_w));
map(0x78, 0x78).w(FUNC(pc8801_state::window_bank_inc_w));
// map(0x82, 0x82).w access window for PC8801-16
// map(0x8e, 0x8e).r <unknown>, accessed by scruiser on boot (a board ID?)
// map(0x90, 0x9f) PC-8801-31 CD-ROM i/f (8801MC)
// map(0xa0, 0xa3) GSX-8800 or network board
@ -1066,7 +1081,7 @@ void pc8801_state::main_io(address_map &map)
map(0xe8, 0xeb).rw(FUNC(pc8801_state::kanji_r<0>), FUNC(pc8801_state::kanji_w<0>));
map(0xec, 0xef).rw(FUNC(pc8801_state::kanji_r<1>), FUNC(pc8801_state::kanji_w<1>));
// map(0xf0, 0xf1) dictionary bank (8801MA and later)
// map(0xf3, 0xf3) DMA floppy (unknown)
// map(0xf3, 0xf3) DMA floppy (direct access like PC88VA?)
// map(0xf4, 0xf7) DMA 5'25-inch floppy (?)
// map(0xf8, 0xfb) DMA 8-inch floppy (?)
map(0xfc, 0xff).m(m_pc80s31, FUNC(pc80s31_device::host_map));
@ -1441,9 +1456,6 @@ void pc8801_state::machine_start()
{
pc8001_base_state::machine_start();
m_rtc->cs_w(1);
m_rtc->oe_w(1);
// TODO: ready signal connected to FDRDY, presumably for the floppy ch.0 and 1
m_dma->ready_w(1);
@ -1726,7 +1738,13 @@ void pc8801_state::pc8801(machine_config &config)
m_pic->set_int_dis_hack(true);
UPD1990A(config, m_rtc);
//CENTRONICS(config, "centronics", centronics_devices, "printer");
CENTRONICS(config, m_centronics, centronics_devices, "printer");
m_centronics->ack_handler().set(FUNC(pc8801_state::write_centronics_ack));
m_centronics->busy_handler().set(FUNC(pc8801_state::write_centronics_busy));
OUTPUT_LATCH(config, m_cent_data_out);
m_centronics->set_output_latch(*m_cent_data_out);
// TODO: needs T88 format support
CASSETTE(config, m_cassette);
@ -2076,29 +2094,27 @@ ROM_START( pc8801mc )
ROM_LOAD( "mc_jisyo.rom", 0x00000, 0x80000, CRC(bd6eb062) SHA1(deef0cc2a9734ba891a6d6c022aa70ffc66f783e) )
ROM_END
/* System Drivers */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
COMP( 1981, pc8801, 0, 0, pc8801, pc8801, pc8801_state, empty_init, "NEC", "PC-8801", MACHINE_NOT_WORKING )
COMP( 1983, pc8801mk2, pc8801, 0, pc8801, pc8801, pc8801_state, empty_init, "NEC", "PC-8801mkII", MACHINE_NOT_WORKING )
COMP( 1981, pc8801, 0, 0, pc8801, pc8801, pc8801_state, empty_init, "NEC", "PC-8801", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1983, pc8801mk2, pc8801, 0, pc8801, pc8801, pc8801_state, empty_init, "NEC", "PC-8801mkII", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
// internal OPN
COMP( 1985, pc8801mk2sr, 0, 0, pc8801mk2sr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIISR", MACHINE_NOT_WORKING )
//COMP( 1985, pc8801mk2tr, pc8801mk2sr, 0, pc8801mk2sr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIITR", MACHINE_NOT_WORKING )
COMP( 1985, pc8801mk2fr, pc8801mk2sr, 0, pc8801mk2sr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIIFR", MACHINE_NOT_WORKING )
COMP( 1985, pc8801mk2mr, pc8801mk2sr, 0, pc8801mk2mr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIIMR", MACHINE_NOT_WORKING )
COMP( 1985, pc8801mk2sr, 0, 0, pc8801mk2sr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIISR", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
//COMP( 1985, pc8801mk2tr, pc8801mk2sr, 0, pc8801mk2sr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIITR", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1985, pc8801mk2fr, pc8801mk2sr, 0, pc8801mk2sr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIIFR", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1985, pc8801mk2mr, pc8801mk2sr, 0, pc8801mk2mr, pc8801, pc8801mk2sr_state, empty_init, "NEC", "PC-8801mkIIMR", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
// internal OPNA
//COMP( 1986, pc8801fh, pc8801mh, 0, pc8801fh, pc8801fh, pc8801fh_state, empty_init, "NEC", "PC-8801FH", MACHINE_NOT_WORKING )
COMP( 1986, pc8801mh, 0, 0, pc8801fh, pc8801fh, pc8801fh_state, empty_init, "NEC", "PC-8801MH", MACHINE_NOT_WORKING )
COMP( 1987, pc8801fa, pc8801mh, 0, pc8801fh, pc8801fh, pc8801fh_state, empty_init, "NEC", "PC-8801FA", MACHINE_NOT_WORKING )
COMP( 1987, pc8801ma, 0, 0, pc8801ma, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801MA", MACHINE_NOT_WORKING )
//COMP( 1988, pc8801fe, pc8801ma, 0, pc8801fa, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801FE", MACHINE_NOT_WORKING )
COMP( 1988, pc8801ma2, pc8801ma, 0, pc8801ma, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801MA2", MACHINE_NOT_WORKING )
//COMP( 1989, pc8801fe2, pc8801ma, 0, pc8801fa, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801FE2", MACHINE_NOT_WORKING )
COMP( 1989, pc8801mc, pc8801ma, 0, pc8801mc, pc8801fh, pc8801mc_state, empty_init, "NEC", "PC-8801MC", MACHINE_NOT_WORKING )
//COMP( 1986, pc8801fh, pc8801mh, 0, pc8801fh, pc8801fh, pc8801fh_state, empty_init, "NEC", "PC-8801FH", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1986, pc8801mh, 0, 0, pc8801fh, pc8801fh, pc8801fh_state, empty_init, "NEC", "PC-8801MH", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1987, pc8801fa, pc8801mh, 0, pc8801fh, pc8801fh, pc8801fh_state, empty_init, "NEC", "PC-8801FA", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1987, pc8801ma, 0, 0, pc8801ma, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801MA", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
//COMP( 1988, pc8801fe, pc8801ma, 0, pc8801fa, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801FE", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1988, pc8801ma2, pc8801ma, 0, pc8801ma, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801MA2", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
//COMP( 1989, pc8801fe2, pc8801ma, 0, pc8801fa, pc8801fh, pc8801ma_state, empty_init, "NEC", "PC-8801FE2", MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
COMP( 1989, pc8801mc, pc8801ma, 0, pc8801mc, pc8801fh, pc8801mc_state, empty_init, "NEC", "PC-8801MC", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_TIMING | MACHINE_IMPERFECT_GRAPHICS )
// PC98DO (PC88+PC98, V33 + μPD70008AC)
// belongs to own driver
//COMP( 1989, pc98do, 0, 0, pc98do, pc98do, pc8801_state, empty_init, "NEC", "PC-98DO", MACHINE_NOT_WORKING )
//COMP( 1990, pc98dop, 0, 0, pc98do, pc98do, pc8801_state, empty_init, "NEC", "PC-98DO+", MACHINE_NOT_WORKING )

View File

@ -32,7 +32,6 @@
#include "speaker.h"
#define I8214_TAG "i8214"
#define UPD1990A_TAG "upd1990a"
class pc8801_state : public pc8001_base_state
{
@ -43,7 +42,6 @@ public:
, m_screen(*this, "screen")
, m_pc80s31(*this, "pc80s31")
, m_pic(*this, I8214_TAG)
, m_rtc(*this, UPD1990A_TAG)
, m_usart(*this, "usart")
// , m_cassette(*this, "cassette")
, m_beeper(*this, "beeper")
@ -86,7 +84,7 @@ protected:
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<upd1990a_device> m_rtc;
required_device<i8251_device> m_usart;
// required_device<cassette_image_device> m_cassette;
required_device<beep_device> m_beeper;
@ -183,7 +181,7 @@ private:
void alu_ctrl2_w(uint8_t data);
template <unsigned kanji_level> uint8_t kanji_r(offs_t offset);
template <unsigned kanji_level> void kanji_w(offs_t offset, uint8_t data);
void rtc_w(uint8_t data);
// void rtc_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER(txdata_callback);