mirror of
https://github.com/holub/mame
synced 2025-06-30 16:00:01 +03:00
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:
parent
2e531b9f25
commit
d75885a767
2068
hash/pc8801_flop.xml
2068
hash/pc8801_flop.xml
File diff suppressed because it is too large
Load Diff
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user