summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/bus/cbus/pc9801_cbus.cpp2
-rw-r--r--src/mame/drivers/pc9801.cpp323
-rw-r--r--src/mame/includes/pc9801.h339
4 files changed, 342 insertions, 323 deletions
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 44944ec3565..5b1ee9aa1da 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -2416,6 +2416,7 @@ files {
MAME_DIR .. "src/mame/drivers/pc88va.cpp",
MAME_DIR .. "src/mame/drivers/pc100.cpp",
MAME_DIR .. "src/mame/drivers/pc9801.cpp",
+ MAME_DIR .. "src/mame/includes/pc9801.h",
MAME_DIR .. "src/mame/machine/pc9801_kbd.cpp",
MAME_DIR .. "src/mame/machine/pc9801_kbd.h",
MAME_DIR .. "src/mame/machine/pc9801_cd.cpp",
diff --git a/src/devices/bus/cbus/pc9801_cbus.cpp b/src/devices/bus/cbus/pc9801_cbus.cpp
index 06af21561d3..5daefe547a5 100644
--- a/src/devices/bus/cbus/pc9801_cbus.cpp
+++ b/src/devices/bus/cbus/pc9801_cbus.cpp
@@ -3,7 +3,7 @@
/**********************************************************************
CCBUS Slot interface for PC-98xx family
-
+
**********************************************************************/
#include "emu.h"
diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp
index de598dfbdb0..23ebba2e158 100644
--- a/src/mame/drivers/pc9801.cpp
+++ b/src/mame/drivers/pc9801.cpp
@@ -433,329 +433,8 @@ Keyboard TX commands:
#include "formats/dip_dsk.h"
#include "formats/nfd_dsk.h"
-#define UPD1990A_TAG "upd1990a"
-#define UPD8251_TAG "upd8251"
-#define SASIBUS_TAG "sasi"
-
-class pc9801_state : public driver_device
-{
-public:
- pc9801_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_dmac(*this, "i8237"),
- m_pit8253(*this, "pit8253"),
- m_pic1(*this, "pic8259_master"),
- m_pic2(*this, "pic8259_slave"),
- m_fdc_2hd(*this, "upd765_2hd"),
- m_fdc_2dd(*this, "upd765_2dd"),
- m_rtc(*this, UPD1990A_TAG),
- m_keyb(*this, "keyb"),
- m_sio(*this, UPD8251_TAG),
- m_hgdc1(*this, "upd7220_chr"),
- m_hgdc2(*this, "upd7220_btm"),
- m_sasibus(*this, SASIBUS_TAG),
- m_sasi_data_out(*this, "sasi_data_out"),
- m_sasi_data_in(*this, "sasi_data_in"),
- m_sasi_ctrl_in(*this, "sasi_ctrl_in"),
- m_ide1(*this, "ide1"),
- m_ide2(*this, "ide2"),
- m_video_ram_1(*this, "video_ram_1"),
- m_video_ram_2(*this, "video_ram_2"),
- m_ext_gvram(*this, "ext_gvram"),
- m_beeper(*this, "beeper"),
- m_ram(*this, RAM_TAG),
- m_ipl(*this, "ipl_bank"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_screen(*this, "screen")
- {
- }
-
- required_device<cpu_device> m_maincpu;
- required_device<am9517a_device> m_dmac;
- required_device<pit8253_device> m_pit8253;
- required_device<pic8259_device> m_pic1;
- required_device<pic8259_device> m_pic2;
- required_device<upd765a_device> m_fdc_2hd;
- optional_device<upd765a_device> m_fdc_2dd;
- required_device<upd1990a_device> m_rtc;
- required_device<pc9801_kbd_device> m_keyb;
- required_device<i8251_device> m_sio;
- required_device<upd7220_device> m_hgdc1;
- required_device<upd7220_device> m_hgdc2;
- optional_device<scsi_port_device> m_sasibus;
- optional_device<output_latch_device> m_sasi_data_out;
- optional_device<input_buffer_device> m_sasi_data_in;
- optional_device<input_buffer_device> m_sasi_ctrl_in;
- optional_device<ata_interface_device> m_ide1;
- optional_device<ata_interface_device> m_ide2;
- required_shared_ptr<uint16_t> m_video_ram_1;
- required_shared_ptr<uint16_t> m_video_ram_2;
- optional_shared_ptr<uint32_t> m_ext_gvram;
- required_device<beep_device> m_beeper;
- optional_device<ram_device> m_ram;
- optional_device<address_map_bank_device> m_ipl;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
- required_device<screen_device> m_screen;
-
- virtual void video_start() override;
- uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
- enum
- {
- TIMER_VBIRQ
- };
-
- emu_timer *m_vbirq;
- uint8_t *m_char_rom;
- uint8_t *m_kanji_rom;
-
- uint8_t m_dma_offset[4];
- uint8_t m_dma_autoinc[4];
- int m_dack;
-
- uint8_t m_video_ff[8],m_gfx_ff;
- uint8_t m_txt_scroll_reg[8];
- uint8_t m_pal_clut[4];
-
- std::unique_ptr<uint16_t[]> m_tvram;
-
- uint16_t m_font_addr;
- uint8_t m_font_line;
- uint16_t m_font_lr;
-
- uint8_t m_fdc_2dd_ctrl,m_fdc_2hd_ctrl;
- uint8_t m_nmi_ff;
-
- uint8_t m_vram_bank;
- uint8_t m_vram_disp;
-
- /* PC9801RS specific */
- uint8_t m_gate_a20; //A20 line
- uint8_t m_access_ctrl; // DMA related
- uint8_t m_fdc_ctrl;
- uint8_t m_ex_video_ff[128];
- struct {
- uint8_t pal_entry;
- uint8_t r[16],g[16],b[16];
- }m_analog16;
- struct {
- uint8_t pal_entry;
- uint8_t r[0x100],g[0x100],b[0x100];
- uint16_t read_bank;
- uint16_t write_bank;
- }m_analog256;
- struct {
- uint8_t mode;
- uint8_t tile[4], tile_index;
- }m_grcg;
-
- struct {
- uint16_t regs[8];
- uint16_t pat[4];
- uint16_t src[4];
- int16_t count;
- uint16_t leftover[4];
- bool first;
- bool init;
- } m_egc;
-
- /* PC9821 specific */
- uint8_t m_sdip[24], m_sdip_bank;
- uint8_t m_pc9821_window_bank;
- uint8_t m_ext2_ff;
- uint8_t m_sys_type;
-
- DECLARE_WRITE_LINE_MEMBER( write_uart_clock );
- DECLARE_WRITE8_MEMBER(rtc_w);
- DECLARE_WRITE8_MEMBER(dmapg4_w);
- DECLARE_WRITE8_MEMBER(dmapg8_w);
- DECLARE_WRITE8_MEMBER(nmi_ctrl_w);
- DECLARE_WRITE8_MEMBER(vrtc_clear_w);
- DECLARE_WRITE8_MEMBER(pc9801_video_ff_w);
- DECLARE_READ8_MEMBER(txt_scrl_r);
- DECLARE_WRITE8_MEMBER(txt_scrl_w);
- DECLARE_READ8_MEMBER(grcg_r);
- DECLARE_WRITE8_MEMBER(grcg_w);
- DECLARE_WRITE16_MEMBER(egc_w);
- DECLARE_READ8_MEMBER(pc9801_a0_r);
- DECLARE_WRITE8_MEMBER(pc9801_a0_w);
- DECLARE_READ8_MEMBER(fdc_2hd_ctrl_r);
- DECLARE_WRITE8_MEMBER(fdc_2hd_ctrl_w);
- DECLARE_READ8_MEMBER(fdc_2dd_ctrl_r);
- DECLARE_WRITE8_MEMBER(fdc_2dd_ctrl_w);
- DECLARE_READ16_MEMBER(tvram_r);
- DECLARE_WRITE16_MEMBER(tvram_w);
- DECLARE_READ8_MEMBER(gvram_r);
- DECLARE_WRITE8_MEMBER(gvram_w);
- DECLARE_WRITE8_MEMBER(pc9801rs_mouse_freq_w);
- DECLARE_CUSTOM_INPUT_MEMBER(system_type_r);
- DECLARE_READ16_MEMBER(grcg_gvram_r);
- DECLARE_WRITE16_MEMBER(grcg_gvram_w);
- DECLARE_READ16_MEMBER(grcg_gvram0_r);
- DECLARE_WRITE16_MEMBER(grcg_gvram0_w);
-
- DECLARE_READ16_MEMBER(pc9821_grcg_gvram_r);
- DECLARE_WRITE16_MEMBER(pc9821_grcg_gvram_w);
- DECLARE_READ16_MEMBER(pc9821_grcg_gvram0_r);
- DECLARE_WRITE16_MEMBER(pc9821_grcg_gvram0_w);
- uint16_t m_pc9821_256vram_bank;
-
- DECLARE_READ16_MEMBER(upd7220_grcg_r);
- DECLARE_WRITE16_MEMBER(upd7220_grcg_w);
- void egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask);
- uint16_t egc_blit_r(uint32_t offset, uint16_t mem_mask);
- uint32_t a20_286(bool state);
-
- DECLARE_READ8_MEMBER(ide_ctrl_r);
- DECLARE_WRITE8_MEMBER(ide_ctrl_w);
- DECLARE_READ16_MEMBER(ide_cs0_r);
- DECLARE_WRITE16_MEMBER(ide_cs0_w);
- DECLARE_READ16_MEMBER(ide_cs1_r);
- DECLARE_WRITE16_MEMBER(ide_cs1_w);
- DECLARE_WRITE_LINE_MEMBER(ide1_irq_w);
- DECLARE_WRITE_LINE_MEMBER(ide2_irq_w);
-
- uint8_t m_ide_sel;
- bool m_ide1_irq, m_ide2_irq;
-
- DECLARE_WRITE8_MEMBER(sasi_data_w);
- DECLARE_READ8_MEMBER(sasi_data_r);
- DECLARE_WRITE_LINE_MEMBER(write_sasi_io);
- DECLARE_WRITE_LINE_MEMBER(write_sasi_req);
- DECLARE_READ8_MEMBER(sasi_status_r);
- DECLARE_WRITE8_MEMBER(sasi_ctrl_w);
-
- uint8_t m_sasi_data;
- int m_sasi_data_enable;
- uint8_t m_sasi_ctrl;
-
- DECLARE_READ8_MEMBER(pc9801rs_knjram_r);
- DECLARE_WRITE8_MEMBER(pc9801rs_knjram_w);
- DECLARE_WRITE8_MEMBER(pc9801rs_bank_w);
- DECLARE_READ8_MEMBER(a20_ctrl_r);
- DECLARE_WRITE8_MEMBER(a20_ctrl_w);
- DECLARE_READ8_MEMBER(fdc_mode_ctrl_r);
- DECLARE_WRITE8_MEMBER(fdc_mode_ctrl_w);
-// DECLARE_READ8_MEMBER(pc9801rs_2dd_r);
-// DECLARE_WRITE8_MEMBER(pc9801rs_2dd_w);
- DECLARE_WRITE8_MEMBER(pc9801rs_video_ff_w);
- DECLARE_WRITE8_MEMBER(pc9801rs_a0_w);
- DECLARE_WRITE8_MEMBER(pc9821_video_ff_w);
- DECLARE_READ8_MEMBER(pc9821_a0_r);
- DECLARE_WRITE8_MEMBER(pc9821_a0_w);
- DECLARE_READ8_MEMBER(access_ctrl_r);
- DECLARE_WRITE8_MEMBER(access_ctrl_w);
- DECLARE_READ8_MEMBER(midi_r);
-// DECLARE_READ8_MEMBER(winram_r);
-// DECLARE_WRITE8_MEMBER(winram_w);
- DECLARE_READ8_MEMBER(pic_r);
- DECLARE_WRITE8_MEMBER(pic_w);
-
- DECLARE_READ8_MEMBER(sdip_0_r);
- DECLARE_READ8_MEMBER(sdip_1_r);
- DECLARE_READ8_MEMBER(sdip_2_r);
- DECLARE_READ8_MEMBER(sdip_3_r);
- DECLARE_READ8_MEMBER(sdip_4_r);
- DECLARE_READ8_MEMBER(sdip_5_r);
- DECLARE_READ8_MEMBER(sdip_6_r);
- DECLARE_READ8_MEMBER(sdip_7_r);
- DECLARE_READ8_MEMBER(sdip_8_r);
- DECLARE_READ8_MEMBER(sdip_9_r);
- DECLARE_READ8_MEMBER(sdip_a_r);
- DECLARE_READ8_MEMBER(sdip_b_r);
-
- DECLARE_WRITE8_MEMBER(sdip_0_w);
- DECLARE_WRITE8_MEMBER(sdip_1_w);
- DECLARE_WRITE8_MEMBER(sdip_2_w);
- DECLARE_WRITE8_MEMBER(sdip_3_w);
- DECLARE_WRITE8_MEMBER(sdip_4_w);
- DECLARE_WRITE8_MEMBER(sdip_5_w);
- DECLARE_WRITE8_MEMBER(sdip_6_w);
- DECLARE_WRITE8_MEMBER(sdip_7_w);
- DECLARE_WRITE8_MEMBER(sdip_8_w);
- DECLARE_WRITE8_MEMBER(sdip_9_w);
- DECLARE_WRITE8_MEMBER(sdip_a_w);
- DECLARE_WRITE8_MEMBER(sdip_b_w);
-
- DECLARE_READ8_MEMBER(window_bank_r);
- DECLARE_WRITE8_MEMBER(window_bank_w);
- DECLARE_READ16_MEMBER(timestamp_r);
- DECLARE_READ8_MEMBER(ext2_video_ff_r);
- DECLARE_WRITE8_MEMBER(ext2_video_ff_w);
-
- DECLARE_FLOPPY_FORMATS( floppy_formats );
- UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
- UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
-
-private:
- uint8_t m_sdip_read(uint16_t port, uint8_t sdip_offset);
- void m_sdip_write(uint16_t port, uint8_t sdip_offset,uint8_t data);
- uint16_t egc_do_partial_op(int plane, uint16_t src, uint16_t pat, uint16_t dst) const;
- uint16_t egc_shift(int plane, uint16_t val);
-public:
- DECLARE_MACHINE_START(pc9801_common);
- DECLARE_MACHINE_START(pc9801f);
- DECLARE_MACHINE_START(pc9801rs);
- DECLARE_MACHINE_START(pc9801bx2);
- DECLARE_MACHINE_START(pc9821);
- DECLARE_MACHINE_START(pc9821ap2);
- DECLARE_MACHINE_RESET(pc9801_common);
- DECLARE_MACHINE_RESET(pc9801f);
- DECLARE_MACHINE_RESET(pc9801rs);
- DECLARE_MACHINE_RESET(pc9821);
-
- DECLARE_PALETTE_INIT(pc9801);
- INTERRUPT_GEN_MEMBER(vrtc_irq);
- DECLARE_READ8_MEMBER(get_slave_ack);
- DECLARE_WRITE_LINE_MEMBER(dma_hrq_changed);
- DECLARE_WRITE_LINE_MEMBER(tc_w);
- DECLARE_READ8_MEMBER(dma_read_byte);
- DECLARE_WRITE8_MEMBER(dma_write_byte);
- DECLARE_WRITE_LINE_MEMBER(dack0_w);
- DECLARE_WRITE_LINE_MEMBER(dack1_w);
- DECLARE_WRITE_LINE_MEMBER(dack2_w);
- DECLARE_WRITE_LINE_MEMBER(dack3_w);
- DECLARE_WRITE8_MEMBER(ppi_sys_portc_w);
-
- DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq);
- DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq);
- DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_drq);
-
- DECLARE_READ8_MEMBER(ppi_mouse_porta_r);
- DECLARE_WRITE8_MEMBER(ppi_mouse_porta_w);
- DECLARE_WRITE8_MEMBER(ppi_mouse_portb_w);
- DECLARE_WRITE8_MEMBER(ppi_mouse_portc_w);
- struct{
- uint8_t control;
- uint8_t lx;
- uint8_t ly;
- uint8_t freq_reg;
- uint8_t freq_index;
- }m_mouse;
- TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
- DECLARE_READ8_MEMBER(unk_r);
-
- DECLARE_DRIVER_INIT(pc9801_kanji);
- inline void set_dma_channel(int channel, int state);
- virtual void device_reset_after_children() override;
-};
-
-
-
-#define ATTRSEL_REG 0
-#define WIDTH40_REG 2
-#define FONTSEL_REG 3
-#define INTERLACE_REG 4
-#define MEMSW_REG 6
-#define DISPLAY_REG 7
+#include "includes/pc9801.h"
-#define ANALOG_16_MODE 0
-#define ANALOG_256_MODE (0x20 >> 1)
-#define GDC_IS_5MHz (0x84 >> 1)
void pc9801_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
diff --git a/src/mame/includes/pc9801.h b/src/mame/includes/pc9801.h
new file mode 100644
index 00000000000..6ae3af993b4
--- /dev/null
+++ b/src/mame/includes/pc9801.h
@@ -0,0 +1,339 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese,Carl
+
+#pragma once
+
+#ifndef __PC9801__
+#define __PC9801__
+
+#define UPD1990A_TAG "upd1990a"
+#define UPD8251_TAG "upd8251"
+#define SASIBUS_TAG "sasi"
+
+#define ATTRSEL_REG 0
+#define WIDTH40_REG 2
+#define FONTSEL_REG 3
+#define INTERLACE_REG 4
+#define MEMSW_REG 6
+#define DISPLAY_REG 7
+
+#define ANALOG_16_MODE 0
+#define ANALOG_256_MODE (0x20 >> 1)
+#define GDC_IS_5MHz (0x84 >> 1)
+
+class pc9801_state : public driver_device
+{
+public:
+ pc9801_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_dmac(*this, "i8237"),
+ m_pit8253(*this, "pit8253"),
+ m_pic1(*this, "pic8259_master"),
+ m_pic2(*this, "pic8259_slave"),
+ m_fdc_2hd(*this, "upd765_2hd"),
+ m_fdc_2dd(*this, "upd765_2dd"),
+ m_rtc(*this, UPD1990A_TAG),
+ m_keyb(*this, "keyb"),
+ m_sio(*this, UPD8251_TAG),
+ m_hgdc1(*this, "upd7220_chr"),
+ m_hgdc2(*this, "upd7220_btm"),
+ m_sasibus(*this, SASIBUS_TAG),
+ m_sasi_data_out(*this, "sasi_data_out"),
+ m_sasi_data_in(*this, "sasi_data_in"),
+ m_sasi_ctrl_in(*this, "sasi_ctrl_in"),
+ m_ide1(*this, "ide1"),
+ m_ide2(*this, "ide2"),
+ m_video_ram_1(*this, "video_ram_1"),
+ m_video_ram_2(*this, "video_ram_2"),
+ m_ext_gvram(*this, "ext_gvram"),
+ m_beeper(*this, "beeper"),
+ m_ram(*this, RAM_TAG),
+ m_ipl(*this, "ipl_bank"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_palette(*this, "palette"),
+ m_screen(*this, "screen")
+ {
+ }
+
+ required_device<cpu_device> m_maincpu;
+ required_device<am9517a_device> m_dmac;
+ required_device<pit8253_device> m_pit8253;
+ required_device<pic8259_device> m_pic1;
+ required_device<pic8259_device> m_pic2;
+ required_device<upd765a_device> m_fdc_2hd;
+ optional_device<upd765a_device> m_fdc_2dd;
+ required_device<upd1990a_device> m_rtc;
+ required_device<pc9801_kbd_device> m_keyb;
+ required_device<i8251_device> m_sio;
+ required_device<upd7220_device> m_hgdc1;
+ required_device<upd7220_device> m_hgdc2;
+ optional_device<scsi_port_device> m_sasibus;
+ optional_device<output_latch_device> m_sasi_data_out;
+ optional_device<input_buffer_device> m_sasi_data_in;
+ optional_device<input_buffer_device> m_sasi_ctrl_in;
+ optional_device<ata_interface_device> m_ide1;
+ optional_device<ata_interface_device> m_ide2;
+ required_shared_ptr<uint16_t> m_video_ram_1;
+ required_shared_ptr<uint16_t> m_video_ram_2;
+ optional_shared_ptr<uint32_t> m_ext_gvram;
+ required_device<beep_device> m_beeper;
+ optional_device<ram_device> m_ram;
+ optional_device<address_map_bank_device> m_ipl;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<palette_device> m_palette;
+ required_device<screen_device> m_screen;
+
+ DECLARE_WRITE_LINE_MEMBER( write_uart_clock );
+ DECLARE_WRITE8_MEMBER(rtc_w);
+ DECLARE_WRITE8_MEMBER(dmapg4_w);
+ DECLARE_WRITE8_MEMBER(dmapg8_w);
+ DECLARE_WRITE8_MEMBER(nmi_ctrl_w);
+ DECLARE_WRITE8_MEMBER(vrtc_clear_w);
+ DECLARE_WRITE8_MEMBER(pc9801_video_ff_w);
+ DECLARE_READ8_MEMBER(txt_scrl_r);
+ DECLARE_WRITE8_MEMBER(txt_scrl_w);
+ DECLARE_READ8_MEMBER(grcg_r);
+ DECLARE_WRITE8_MEMBER(grcg_w);
+ DECLARE_WRITE16_MEMBER(egc_w);
+ DECLARE_READ8_MEMBER(pc9801_a0_r);
+ DECLARE_WRITE8_MEMBER(pc9801_a0_w);
+ DECLARE_READ8_MEMBER(fdc_2hd_ctrl_r);
+ DECLARE_WRITE8_MEMBER(fdc_2hd_ctrl_w);
+ DECLARE_READ8_MEMBER(fdc_2dd_ctrl_r);
+ DECLARE_WRITE8_MEMBER(fdc_2dd_ctrl_w);
+ DECLARE_READ16_MEMBER(tvram_r);
+ DECLARE_WRITE16_MEMBER(tvram_w);
+ DECLARE_READ8_MEMBER(gvram_r);
+ DECLARE_WRITE8_MEMBER(gvram_w);
+ DECLARE_WRITE8_MEMBER(pc9801rs_mouse_freq_w);
+ DECLARE_CUSTOM_INPUT_MEMBER(system_type_r);
+ DECLARE_READ16_MEMBER(grcg_gvram_r);
+ DECLARE_WRITE16_MEMBER(grcg_gvram_w);
+ DECLARE_READ16_MEMBER(grcg_gvram0_r);
+ DECLARE_WRITE16_MEMBER(grcg_gvram0_w);
+
+ DECLARE_READ16_MEMBER(pc9821_grcg_gvram_r);
+ DECLARE_WRITE16_MEMBER(pc9821_grcg_gvram_w);
+ DECLARE_READ16_MEMBER(pc9821_grcg_gvram0_r);
+ DECLARE_WRITE16_MEMBER(pc9821_grcg_gvram0_w);
+
+ DECLARE_READ16_MEMBER(upd7220_grcg_r);
+ DECLARE_WRITE16_MEMBER(upd7220_grcg_w);
+
+ DECLARE_READ8_MEMBER(ide_ctrl_r);
+ DECLARE_WRITE8_MEMBER(ide_ctrl_w);
+ DECLARE_READ16_MEMBER(ide_cs0_r);
+ DECLARE_WRITE16_MEMBER(ide_cs0_w);
+ DECLARE_READ16_MEMBER(ide_cs1_r);
+ DECLARE_WRITE16_MEMBER(ide_cs1_w);
+ DECLARE_WRITE_LINE_MEMBER(ide1_irq_w);
+ DECLARE_WRITE_LINE_MEMBER(ide2_irq_w);
+
+ DECLARE_WRITE8_MEMBER(sasi_data_w);
+ DECLARE_READ8_MEMBER(sasi_data_r);
+ DECLARE_WRITE_LINE_MEMBER(write_sasi_io);
+ DECLARE_WRITE_LINE_MEMBER(write_sasi_req);
+ DECLARE_READ8_MEMBER(sasi_status_r);
+ DECLARE_WRITE8_MEMBER(sasi_ctrl_w);
+
+ DECLARE_READ8_MEMBER(pc9801rs_knjram_r);
+ DECLARE_WRITE8_MEMBER(pc9801rs_knjram_w);
+ DECLARE_WRITE8_MEMBER(pc9801rs_bank_w);
+ DECLARE_READ8_MEMBER(a20_ctrl_r);
+ DECLARE_WRITE8_MEMBER(a20_ctrl_w);
+ DECLARE_READ8_MEMBER(fdc_mode_ctrl_r);
+ DECLARE_WRITE8_MEMBER(fdc_mode_ctrl_w);
+// DECLARE_READ8_MEMBER(pc9801rs_2dd_r);
+// DECLARE_WRITE8_MEMBER(pc9801rs_2dd_w);
+ DECLARE_WRITE8_MEMBER(pc9801rs_video_ff_w);
+ DECLARE_WRITE8_MEMBER(pc9801rs_a0_w);
+ DECLARE_WRITE8_MEMBER(pc9821_video_ff_w);
+ DECLARE_READ8_MEMBER(pc9821_a0_r);
+ DECLARE_WRITE8_MEMBER(pc9821_a0_w);
+ DECLARE_READ8_MEMBER(access_ctrl_r);
+ DECLARE_WRITE8_MEMBER(access_ctrl_w);
+ DECLARE_READ8_MEMBER(midi_r);
+// DECLARE_READ8_MEMBER(winram_r);
+// DECLARE_WRITE8_MEMBER(winram_w);
+ DECLARE_READ8_MEMBER(pic_r);
+ DECLARE_WRITE8_MEMBER(pic_w);
+
+ DECLARE_READ8_MEMBER(sdip_0_r);
+ DECLARE_READ8_MEMBER(sdip_1_r);
+ DECLARE_READ8_MEMBER(sdip_2_r);
+ DECLARE_READ8_MEMBER(sdip_3_r);
+ DECLARE_READ8_MEMBER(sdip_4_r);
+ DECLARE_READ8_MEMBER(sdip_5_r);
+ DECLARE_READ8_MEMBER(sdip_6_r);
+ DECLARE_READ8_MEMBER(sdip_7_r);
+ DECLARE_READ8_MEMBER(sdip_8_r);
+ DECLARE_READ8_MEMBER(sdip_9_r);
+ DECLARE_READ8_MEMBER(sdip_a_r);
+ DECLARE_READ8_MEMBER(sdip_b_r);
+
+ DECLARE_WRITE8_MEMBER(sdip_0_w);
+ DECLARE_WRITE8_MEMBER(sdip_1_w);
+ DECLARE_WRITE8_MEMBER(sdip_2_w);
+ DECLARE_WRITE8_MEMBER(sdip_3_w);
+ DECLARE_WRITE8_MEMBER(sdip_4_w);
+ DECLARE_WRITE8_MEMBER(sdip_5_w);
+ DECLARE_WRITE8_MEMBER(sdip_6_w);
+ DECLARE_WRITE8_MEMBER(sdip_7_w);
+ DECLARE_WRITE8_MEMBER(sdip_8_w);
+ DECLARE_WRITE8_MEMBER(sdip_9_w);
+ DECLARE_WRITE8_MEMBER(sdip_a_w);
+ DECLARE_WRITE8_MEMBER(sdip_b_w);
+
+ DECLARE_READ8_MEMBER(window_bank_r);
+ DECLARE_WRITE8_MEMBER(window_bank_w);
+ DECLARE_READ16_MEMBER(timestamp_r);
+ DECLARE_READ8_MEMBER(ext2_video_ff_r);
+ DECLARE_WRITE8_MEMBER(ext2_video_ff_w);
+
+ DECLARE_FLOPPY_FORMATS( floppy_formats );
+ UPD7220_DISPLAY_PIXELS_MEMBER( hgdc_display_pixels );
+ UPD7220_DRAW_TEXT_LINE_MEMBER( hgdc_draw_text );
+
+ DECLARE_MACHINE_START(pc9801_common);
+ DECLARE_MACHINE_START(pc9801f);
+ DECLARE_MACHINE_START(pc9801rs);
+ DECLARE_MACHINE_START(pc9801bx2);
+ DECLARE_MACHINE_START(pc9821);
+ DECLARE_MACHINE_START(pc9821ap2);
+ DECLARE_MACHINE_RESET(pc9801_common);
+ DECLARE_MACHINE_RESET(pc9801f);
+ DECLARE_MACHINE_RESET(pc9801rs);
+ DECLARE_MACHINE_RESET(pc9821);
+
+ DECLARE_PALETTE_INIT(pc9801);
+ INTERRUPT_GEN_MEMBER(vrtc_irq);
+ DECLARE_READ8_MEMBER(get_slave_ack);
+ DECLARE_WRITE_LINE_MEMBER(dma_hrq_changed);
+ DECLARE_WRITE_LINE_MEMBER(tc_w);
+ DECLARE_READ8_MEMBER(dma_read_byte);
+ DECLARE_WRITE8_MEMBER(dma_write_byte);
+ DECLARE_WRITE_LINE_MEMBER(dack0_w);
+ DECLARE_WRITE_LINE_MEMBER(dack1_w);
+ DECLARE_WRITE_LINE_MEMBER(dack2_w);
+ DECLARE_WRITE_LINE_MEMBER(dack3_w);
+ DECLARE_WRITE8_MEMBER(ppi_sys_portc_w);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_2dd_irq);
+ DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_irq);
+ DECLARE_WRITE_LINE_MEMBER(pc9801rs_fdc_drq);
+
+ DECLARE_READ8_MEMBER(ppi_mouse_porta_r);
+ DECLARE_WRITE8_MEMBER(ppi_mouse_porta_w);
+ DECLARE_WRITE8_MEMBER(ppi_mouse_portb_w);
+ DECLARE_WRITE8_MEMBER(ppi_mouse_portc_w);
+ TIMER_DEVICE_CALLBACK_MEMBER( mouse_irq_cb );
+ DECLARE_READ8_MEMBER(unk_r);
+
+ DECLARE_DRIVER_INIT(pc9801_kanji);
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ uint32_t a20_286(bool state);
+
+protected:
+ virtual void video_start() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void device_reset_after_children() override;
+
+
+private:
+ enum
+ {
+ TIMER_VBIRQ
+ };
+
+ inline void set_dma_channel(int channel, int state);
+ emu_timer *m_vbirq;
+ uint8_t *m_char_rom;
+ uint8_t *m_kanji_rom;
+
+ uint8_t m_dma_offset[4];
+ uint8_t m_dma_autoinc[4];
+ int m_dack;
+
+ uint8_t m_video_ff[8],m_gfx_ff;
+ uint8_t m_txt_scroll_reg[8];
+ uint8_t m_pal_clut[4];
+
+ std::unique_ptr<uint16_t[]> m_tvram;
+
+ uint16_t m_font_addr;
+ uint8_t m_font_line;
+ uint16_t m_font_lr;
+
+ uint8_t m_fdc_2dd_ctrl,m_fdc_2hd_ctrl;
+ uint8_t m_nmi_ff;
+
+ uint8_t m_vram_bank;
+ uint8_t m_vram_disp;
+
+ uint8_t m_sasi_data;
+ int m_sasi_data_enable;
+ uint8_t m_sasi_ctrl;
+
+ struct{
+ uint8_t control;
+ uint8_t lx;
+ uint8_t ly;
+ uint8_t freq_reg;
+ uint8_t freq_index;
+ }m_mouse;
+
+ uint8_t m_ide_sel;
+ bool m_ide1_irq, m_ide2_irq;
+
+ /* PC9801RS specific, move to specific state */
+ uint8_t m_gate_a20; //A20 line
+ uint8_t m_access_ctrl; // DMA related
+ uint8_t m_fdc_ctrl;
+ uint8_t m_ex_video_ff[128];
+ struct {
+ uint8_t pal_entry;
+ uint8_t r[16],g[16],b[16];
+ }m_analog16;
+ struct {
+ uint8_t pal_entry;
+ uint8_t r[0x100],g[0x100],b[0x100];
+ uint16_t read_bank;
+ uint16_t write_bank;
+ }m_analog256;
+ struct {
+ uint8_t mode;
+ uint8_t tile[4], tile_index;
+ }m_grcg;
+
+ void egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask);
+ uint16_t egc_blit_r(uint32_t offset, uint16_t mem_mask);
+
+
+ /* PC9821 specific */
+ uint8_t m_sdip[24], m_sdip_bank;
+ uint8_t m_pc9821_window_bank;
+ uint8_t m_ext2_ff;
+ uint8_t m_sys_type;
+
+ struct {
+ uint16_t regs[8];
+ uint16_t pat[4];
+ uint16_t src[4];
+ int16_t count;
+ uint16_t leftover[4];
+ bool first;
+ bool init;
+ } m_egc;
+
+ uint16_t m_pc9821_256vram_bank;
+
+ uint8_t m_sdip_read(uint16_t port, uint8_t sdip_offset);
+ void m_sdip_write(uint16_t port, uint8_t sdip_offset,uint8_t data);
+ uint16_t egc_do_partial_op(int plane, uint16_t src, uint16_t pat, uint16_t dst) const;
+ uint16_t egc_shift(int plane, uint16_t val);
+};
+
+
+#endif