summaryrefslogtreecommitdiffstats
path: root/src/mame/includes/pc88va.h
blob: 0bb75fb62b51ec7018cf5f2cf6f9b2085dc14c48 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
// license:BSD-3-Clause
// copyright-holders:Angelo Salese
/********************************************************************************************

    PC-88VA (c) 1987 NEC

********************************************************************************************/

#pragma once

#ifndef MAME_INCLUDES_PC88VA_H
#define MAME_INCLUDES_PC88VA_H

#include "cpu/nec/v5x.h"
#include "cpu/z80/z80.h"
#include "imagedev/floppy.h"
#include "machine/am9517a.h"
#include "machine/i8255.h"
#include "machine/pic8259.h"
#include "machine/pit8253.h"
//#include "machine/upd71071.h"
#include "machine/upd765.h"
#include "machine/bankdev.h"
#include "sound/ymopn.h"

#include "emupal.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"

#include "formats/xdf_dsk.h"

// TODO: for the time being, just disable FDC CPU, it's for PC-8801 compatibility mode anyway.
//       the whole FDC device should be converted (it's also used by PC-9801)
#define TEST_SUBFDC 0



class pc88va_state : public driver_device
{
public:
	pc88va_state(const machine_config &mconfig, device_type type, const char *tag) :
		driver_device(mconfig, type, tag),
		m_maincpu(*this, "maincpu"),
		m_screen(*this, "screen"),
		m_fdc(*this, "upd765"),
		m_fdd(*this, "upd765:%u", 0U),
		m_dmac(*this, "dmac"),
		m_pic1(*this, "pic8259_master"),
		m_pic2(*this, "pic8259_slave"),
		m_palram(*this, "palram"),
		m_sysbank(*this, "sysbank"),
		m_tvram(*this, "tvram"),
		m_gvram(*this, "gvram"),
		m_gfxdecode(*this, "gfxdecode"),
		m_palette(*this, "palette")
	{ }

	void pc88va(machine_config &config);

protected:
	struct tsp_t
	{
		uint16_t tvram_vreg_offset = 0;
		uint16_t attr_offset = 0;
		uint16_t spr_offset = 0;
		uint8_t disp_on = 0;
		uint8_t spr_on = 0;
		uint8_t pitch = 0;
		uint8_t line_height = 0;
		uint8_t h_line_pos = 0;
		uint8_t blink = 0;
		uint16_t cur_pos_x = 0, cur_pos_y = 0;
		uint8_t curn = 0;
		uint8_t curn_blink = 0;
	};

	virtual void machine_start() override;
	virtual void machine_reset() override;
	virtual void video_start() override;

private:

	required_device<cpu_device> m_maincpu;
	required_device<screen_device> m_screen;
	required_device<upd765a_device> m_fdc;
	required_device_array<floppy_connector, 2> m_fdd;
	required_device<am9517a_device> m_dmac;
	required_device<pic8259_device> m_pic1;
	required_device<pic8259_device> m_pic2;
	required_shared_ptr<uint16_t> m_palram;
	required_device<address_map_bank_device> m_sysbank;
	required_shared_ptr<uint16_t> m_tvram;
	required_shared_ptr<uint16_t> m_gvram;
	std::unique_ptr<uint8_t[]> m_kanjiram;

	uint16_t m_bank_reg = 0;
	uint16_t m_screen_ctrl_reg = 0;
	uint8_t m_timer3_io_reg = 0;
	emu_timer *m_t3_mouse_timer = nullptr;
	tsp_t m_tsp;
	uint16_t m_video_pri_reg[2]{};
	uint8_t m_backupram_wp = 0;
	uint8_t m_cmd = 0;
	uint8_t m_buf_size = 0;
	uint8_t m_buf_index = 0;
	uint8_t m_buf_ram[16]{};
	uint8_t m_portc_test = 0;
	uint8_t m_fdc_motor_status[2]{};

	/* timers */
	emu_timer *m_tc_clear_timer = nullptr;
	emu_timer *m_fdc_timer = nullptr;
	emu_timer *m_motor_start_timer[2]{};

	/* floppy state */
	uint8_t m_i8255_0_pc = 0;
	uint8_t m_i8255_1_pc = 0;
	uint8_t m_fdc_mode = 0;
	uint8_t m_fdc_irq_opcode = 0;
	uint8_t idp_status_r();
	void idp_command_w(uint8_t data);
	void idp_param_w(uint8_t data);
	void palette_ram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
	uint16_t sys_port4_r();
	uint16_t bios_bank_r();
	void bios_bank_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
	uint8_t rom_bank_r();
	uint8_t key_r(offs_t offset);
	void backupram_wp_1_w(uint16_t data);
	void backupram_wp_0_w(uint16_t data);
	uint8_t kanji_ram_r(offs_t offset);
	void kanji_ram_w(offs_t offset, uint8_t data);
	uint8_t hdd_status_r();
	#if TEST_SUBFDC
	uint8_t upd765_tc_r();
	void upd765_mc_w(uint8_t data);
	#else
	uint8_t no_subfdc_r();
	#endif
	uint8_t pc88va_fdc_r(offs_t offset);
	void pc88va_fdc_w(offs_t offset, uint8_t data);
	uint16_t sysop_r();
	uint16_t screen_ctrl_r();
	void screen_ctrl_w(uint16_t data);
	void timer3_ctrl_reg_w(uint8_t data);
	void video_pri_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
	uint8_t backupram_dsw_r(offs_t offset);
	void sys_port1_w(uint8_t data);
	uint32_t screen_update_pc88va(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
	INTERRUPT_GEN_MEMBER(pc88va_vrtc_irq);
	uint8_t cpu_8255_c_r();
	void cpu_8255_c_w(uint8_t data);
	uint8_t fdc_8255_c_r();
	void fdc_8255_c_w(uint8_t data);
	uint8_t r232_ctrl_porta_r();
	uint8_t r232_ctrl_portb_r();
	uint8_t r232_ctrl_portc_r();
	void r232_ctrl_porta_w(uint8_t data);
	void r232_ctrl_portb_w(uint8_t data);
	void r232_ctrl_portc_w(uint8_t data);
	uint8_t get_slave_ack(offs_t offset);
	DECLARE_WRITE_LINE_MEMBER(pc88va_pit_out0_changed);
//  DECLARE_WRITE_LINE_MEMBER(pc88va_upd765_interrupt);
	uint8_t m_fdc_ctrl_2;
	TIMER_CALLBACK_MEMBER(pc8801fd_upd765_tc_to_zero);
	TIMER_CALLBACK_MEMBER(t3_mouse_callback);
	TIMER_CALLBACK_MEMBER(pc88va_fdc_timer);
	TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_0);
	TIMER_CALLBACK_MEMBER(pc88va_fdc_motor_start_1);
//  uint16_t m_fdc_dma_r();
//  void m_fdc_dma_w(uint16_t data);
	DECLARE_WRITE_LINE_MEMBER(pc88va_hlda_w);
	DECLARE_WRITE_LINE_MEMBER(pc88va_tc_w);
	uint8_t fdc_dma_r();
	void fdc_dma_w(uint8_t data);
	uint8_t dma_memr_cb(offs_t offset);
	void dma_memw_cb(offs_t offset, uint8_t data);

	DECLARE_WRITE_LINE_MEMBER(fdc_irq);
	DECLARE_WRITE_LINE_MEMBER(fdc_drq);
	static void floppy_formats(format_registration &fr);
	void pc88va_fdc_update_ready(floppy_image_device *, int);
	void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect);
	uint32_t calc_kanji_rom_addr(uint8_t jis1,uint8_t jis2,int x,int y);
	void draw_text(bitmap_rgb32 &bitmap, const rectangle &cliprect);
	void tsp_sprite_enable(uint32_t spr_offset, uint16_t sw_bit);
	void execute_sync_cmd();
	void execute_dspon_cmd();
	void execute_dspdef_cmd();
	void execute_curdef_cmd();
	void execute_actscr_cmd();
	void execute_curs_cmd();
	void execute_emul_cmd();
	void execute_spron_cmd();
	void execute_sprsw_cmd();

	void pc88va_map(address_map &map);
	void pc88va_io_map(address_map &map);
	void sysbank_map(address_map &map);

	void pc88va_z80_io_map(address_map &map);
	void pc88va_z80_map(address_map &map);
protected:
	required_device<gfxdecode_device> m_gfxdecode;
	required_device<palette_device> m_palette;
};


#endif