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" +#include "includes/pc9801.h" -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 m_maincpu; - required_device m_dmac; - required_device m_pit8253; - required_device m_pic1; - required_device m_pic2; - required_device m_fdc_2hd; - optional_device m_fdc_2dd; - required_device m_rtc; - required_device m_keyb; - required_device m_sio; - required_device m_hgdc1; - required_device m_hgdc2; - optional_device m_sasibus; - optional_device m_sasi_data_out; - optional_device m_sasi_data_in; - optional_device m_sasi_ctrl_in; - optional_device m_ide1; - optional_device m_ide2; - required_shared_ptr m_video_ram_1; - required_shared_ptr m_video_ram_2; - optional_shared_ptr m_ext_gvram; - required_device m_beeper; - optional_device m_ram; - optional_device m_ipl; - required_device m_gfxdecode; - required_device m_palette; - required_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 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 - -#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 m_maincpu; + required_device m_dmac; + required_device m_pit8253; + required_device m_pic1; + required_device m_pic2; + required_device m_fdc_2hd; + optional_device m_fdc_2dd; + required_device m_rtc; + required_device m_keyb; + required_device m_sio; + required_device m_hgdc1; + required_device m_hgdc2; + optional_device m_sasibus; + optional_device m_sasi_data_out; + optional_device m_sasi_data_in; + optional_device m_sasi_ctrl_in; + optional_device m_ide1; + optional_device m_ide2; + required_shared_ptr m_video_ram_1; + required_shared_ptr m_video_ram_2; + optional_shared_ptr m_ext_gvram; + required_device m_beeper; + optional_device m_ram; + optional_device m_ipl; + required_device m_gfxdecode; + required_device m_palette; + required_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 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