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