1 // license:BSD-3-Clause 2 // copyright-holders:Angelo Salese 3 /******************************************************************************************** 4 5 PC-88VA (c) 1987 NEC 6 7 ********************************************************************************************/ 8 9 #pragma once 10 11 #ifndef MAME_INCLUDES_PC88VA_H 12 #define MAME_INCLUDES_PC88VA_H 13 14 #include "cpu/nec/nec.h" 15 #include "cpu/z80/z80.h" 16 #include "imagedev/floppy.h" 17 #include "machine/am9517a.h" 18 #include "machine/i8255.h" 19 #include "machine/pic8259.h" 20 #include "machine/pit8253.h" 21 //#include "machine/upd71071.h" 22 #include "machine/upd765.h" 23 #include "machine/bankdev.h" 24 #include "sound/2203intf.h" 25 26 #include "emupal.h" 27 #include "screen.h" 28 #include "softlist.h" 29 #include "speaker.h" 30 31 #include "formats/xdf_dsk.h" 32 33 // TODO: for the time being, just disable FDC CPU, it's for PC-8801 compatibility mode anyway. 34 // the whole FDC device should be converted (it's also used by PC-9801) 35 #define TEST_SUBFDC 0 36 37 38 39 class pc88va_state : public driver_device 40 { 41 public: 42 enum 43 { 44 TIMER_PC8801FD_UPD765_TC_TO_ZERO, 45 TIMER_T3_MOUSE_CALLBACK, 46 TIMER_PC88VA_FDC_TIMER, 47 TIMER_PC88VA_FDC_MOTOR_START_0, 48 TIMER_PC88VA_FDC_MOTOR_START_1 49 }; 50 pc88va_state(const machine_config & mconfig,device_type type,const char * tag)51 pc88va_state(const machine_config &mconfig, device_type type, const char *tag) : 52 driver_device(mconfig, type, tag), 53 m_maincpu(*this, "maincpu"), 54 m_screen(*this, "screen"), 55 m_fdc(*this, "upd765"), 56 m_fdd(*this, "upd765:%u", 0U), 57 m_dmac(*this, "dmac"), 58 m_pic1(*this, "pic8259_master"), 59 m_pic2(*this, "pic8259_slave"), 60 m_palram(*this, "palram"), 61 m_sysbank(*this, "sysbank"), 62 m_tvram(*this, "tvram"), 63 m_gvram(*this, "gvram"), 64 m_gfxdecode(*this, "gfxdecode"), 65 m_palette(*this, "palette") 66 { } 67 68 void pc88va(machine_config &config); 69 70 protected: 71 struct tsp_t 72 { 73 uint16_t tvram_vreg_offset; 74 uint16_t attr_offset; 75 uint16_t spr_offset; 76 uint8_t disp_on; 77 uint8_t spr_on; 78 uint8_t pitch; 79 uint8_t line_height; 80 uint8_t h_line_pos; 81 uint8_t blink; 82 uint16_t cur_pos_x,cur_pos_y; 83 uint8_t curn; 84 uint8_t curn_blink; 85 }; 86 87 virtual void machine_start() override; 88 virtual void machine_reset() override; 89 virtual void video_start() override; 90 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; 91 92 private: 93 required_device<cpu_device> m_maincpu; 94 required_device<screen_device> m_screen; 95 required_device<upd765a_device> m_fdc; 96 required_device_array<floppy_connector, 2> m_fdd; 97 required_device<am9517a_device> m_dmac; 98 required_device<pic8259_device> m_pic1; 99 required_device<pic8259_device> m_pic2; 100 required_shared_ptr<uint16_t> m_palram; 101 required_device<address_map_bank_device> m_sysbank; 102 required_shared_ptr<uint16_t> m_tvram; 103 required_shared_ptr<uint16_t> m_gvram; 104 uint8_t *m_kanjiram; 105 uint16_t m_bank_reg; 106 uint16_t m_screen_ctrl_reg; 107 uint8_t m_timer3_io_reg; 108 emu_timer *m_t3_mouse_timer; 109 tsp_t m_tsp; 110 uint16_t m_video_pri_reg[2]; 111 uint8_t m_backupram_wp; 112 uint8_t m_cmd; 113 uint8_t m_buf_size; 114 uint8_t m_buf_index; 115 uint8_t m_buf_ram[16]; 116 uint8_t m_portc_test; 117 uint8_t m_fdc_motor_status[2]; 118 119 /* floppy state */ 120 uint8_t m_i8255_0_pc; 121 uint8_t m_i8255_1_pc; 122 uint8_t m_fdc_mode; 123 uint8_t m_fdc_irq_opcode; 124 uint8_t idp_status_r(); 125 void idp_command_w(uint8_t data); 126 void idp_param_w(uint8_t data); 127 void palette_ram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 128 uint16_t sys_port4_r(); 129 uint16_t bios_bank_r(); 130 void bios_bank_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 131 uint8_t rom_bank_r(); 132 uint8_t key_r(offs_t offset); 133 void backupram_wp_1_w(uint16_t data); 134 void backupram_wp_0_w(uint16_t data); 135 uint8_t kanji_ram_r(offs_t offset); 136 void kanji_ram_w(offs_t offset, uint8_t data); 137 uint8_t hdd_status_r(); 138 #if TEST_SUBFDC 139 uint8_t upd765_tc_r(); 140 void upd765_mc_w(uint8_t data); 141 #else 142 uint8_t no_subfdc_r(); 143 #endif 144 uint8_t pc88va_fdc_r(offs_t offset); 145 void pc88va_fdc_w(offs_t offset, uint8_t data); 146 uint16_t sysop_r(); 147 uint16_t screen_ctrl_r(); 148 void screen_ctrl_w(uint16_t data); 149 void timer3_ctrl_reg_w(uint8_t data); 150 void video_pri_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 151 uint8_t backupram_dsw_r(offs_t offset); 152 void sys_port1_w(uint8_t data); 153 uint32_t screen_update_pc88va(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 154 INTERRUPT_GEN_MEMBER(pc88va_vrtc_irq); 155 uint8_t cpu_8255_c_r(); 156 void cpu_8255_c_w(uint8_t data); 157 uint8_t fdc_8255_c_r(); 158 void fdc_8255_c_w(uint8_t data); 159 uint8_t r232_ctrl_porta_r(); 160 uint8_t r232_ctrl_portb_r(); 161 uint8_t r232_ctrl_portc_r(); 162 void r232_ctrl_porta_w(uint8_t data); 163 void r232_ctrl_portb_w(uint8_t data); 164 void r232_ctrl_portc_w(uint8_t data); 165 uint8_t get_slave_ack(offs_t offset); 166 DECLARE_WRITE_LINE_MEMBER(pc88va_pit_out0_changed); 167 // DECLARE_WRITE_LINE_MEMBER(pc88va_upd765_interrupt); 168 uint8_t m_fdc_ctrl_2; 169 TIMER_CALLBACK_MEMBER(pc8801fd_upd765_tc_to_zero); 170 TIMER_CALLBACK_MEMBER(t3_mouse_callback); 171 TIMER_CALLBACK_MEMBER(pc88va_fdc_timer); 172 TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_0); 173 TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_1); 174 // uint16_t m_fdc_dma_r(); 175 // void m_fdc_dma_w(uint16_t data); 176 DECLARE_WRITE_LINE_MEMBER(pc88va_hlda_w); 177 DECLARE_WRITE_LINE_MEMBER(pc88va_tc_w); 178 uint8_t fdc_dma_r(); 179 void fdc_dma_w(uint8_t data); 180 uint8_t dma_memr_cb(offs_t offset); 181 void dma_memw_cb(offs_t offset, uint8_t data); 182 183 DECLARE_WRITE_LINE_MEMBER(fdc_irq); 184 DECLARE_WRITE_LINE_MEMBER(fdc_drq); 185 DECLARE_FLOPPY_FORMATS( floppy_formats ); 186 void pc88va_fdc_update_ready(floppy_image_device *, int); 187 void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect); 188 uint32_t calc_kanji_rom_addr(uint8_t jis1,uint8_t jis2,int x,int y); 189 void draw_text(bitmap_rgb32 &bitmap, const rectangle &cliprect); 190 void tsp_sprite_enable(uint32_t spr_offset, uint16_t sw_bit); 191 void execute_sync_cmd(); 192 void execute_dspon_cmd(); 193 void execute_dspdef_cmd(); 194 void execute_curdef_cmd(); 195 void execute_actscr_cmd(); 196 void execute_curs_cmd(); 197 void execute_emul_cmd(); 198 void execute_spron_cmd(); 199 void execute_sprsw_cmd(); 200 201 void pc88va_map(address_map &map); 202 void pc88va_io_map(address_map &map); 203 void sysbank_map(address_map &map); 204 205 void pc88va_z80_io_map(address_map &map); 206 void pc88va_z80_map(address_map &map); 207 protected: 208 required_device<gfxdecode_device> m_gfxdecode; 209 required_device<palette_device> m_palette; 210 }; 211 212 213 #endif 214