1 // license:BSD-3-Clause
2 // copyright-holders:Phill Harvey-Smith, Carl
3 /*
4     rmnimbus.c
5     Machine driver for the Research Machines Nimbus.
6 
7     Phill Harvey-Smith
8     2009-11-29.
9 */
10 #ifndef MAME_INCLUDES_RMNIMBUS_H
11 #define MAME_INCLUDES_RMNIMBUS_H
12 
13 #pragma once
14 
15 #include "cpu/i86/i186.h"
16 #include "cpu/mcs51/mcs51.h"
17 #include "machine/z80sio.h"
18 #include "machine/wd_fdc.h"
19 #include "bus/scsi/scsi.h"
20 #include "machine/6522via.h"
21 #include "machine/ram.h"
22 #include "machine/eepromser.h"
23 #include "sound/ay8910.h"
24 #include "sound/msm5205.h"
25 #include "bus/centronics/ctronics.h"
26 #include "emupal.h"
27 #include "screen.h"
28 
29 #define MAINCPU_TAG "maincpu"
30 #define IOCPU_TAG   "iocpu"
31 #define Z80SIO_TAG  "z80sio"
32 #define FDC_TAG     "wd2793"
33 #define SCSIBUS_TAG "scsibus"
34 #define ER59256_TAG "er59256"
35 #define AY8910_TAG  "ay8910"
36 #define MONO_TAG    "mono"
37 #define MSM5205_TAG "msm5205"
38 #define VIA_TAG     "via6522"
39 #define CENTRONICS_TAG "centronics"
40 
41 /* Mouse / Joystick */
42 
43 #define JOYSTICK0_TAG           "joystick0"
44 #define MOUSE_BUTTON_TAG        "mousebtn"
45 #define MOUSEX_TAG              "mousex"
46 #define MOUSEY_TAG              "mousey"
47 
48 /* Memory controller */
49 #define RAM_BANK00_TAG  "bank0"
50 #define RAM_BANK01_TAG  "bank1"
51 #define RAM_BANK02_TAG  "bank2"
52 #define RAM_BANK03_TAG  "bank3"
53 #define RAM_BANK04_TAG  "bank4"
54 #define RAM_BANK05_TAG  "bank5"
55 #define RAM_BANK06_TAG  "bank6"
56 #define RAM_BANK07_TAG  "bank7"
57 
58 class rmnimbus_state : public driver_device
59 {
60 public:
rmnimbus_state(const machine_config & mconfig,device_type type,const char * tag)61 	rmnimbus_state(const machine_config &mconfig, device_type type, const char *tag) :
62 		driver_device(mconfig, type, tag),
63 		m_maincpu(*this, MAINCPU_TAG),
64 		m_iocpu(*this, IOCPU_TAG),
65 		m_msm(*this, MSM5205_TAG),
66 		m_scsibus(*this, SCSIBUS_TAG),
67 		m_ram(*this, RAM_TAG),
68 		m_eeprom(*this, ER59256_TAG),
69 		m_via(*this, VIA_TAG),
70 		m_centronics(*this, CENTRONICS_TAG),
71 		m_palette(*this, "palette"),
72 		m_scsi_data_out(*this, "scsi_data_out"),
73 		m_scsi_data_in(*this, "scsi_data_in"),
74 		m_scsi_ctrl_out(*this, "scsi_ctrl_out"),
75 		m_fdc(*this, FDC_TAG),
76 		m_z80sio(*this, Z80SIO_TAG),
77 		m_screen(*this, "screen"),
78 		m_io_config(*this, "config"),
79 		m_io_joystick0(*this, JOYSTICK0_TAG),
80 		m_io_mouse_button(*this, MOUSE_BUTTON_TAG),
81 		m_io_mousex(*this, MOUSEX_TAG),
82 		m_io_mousey(*this, MOUSEY_TAG)
83 	{
84 	}
85 
imperfect_features()86 	static constexpr feature_type imperfect_features() { return feature::MOUSE; }
87 
88 	void nimbus(machine_config &config);
89 
90 	uint32_t m_debug_machine;
91 
92 	void decode_subbios(device_t *device, offs_t pc, uint8_t raw_flag);
93 	void decode_dos21(device_t *device, offs_t pc);
94 
95 private:
96 	required_device<i80186_cpu_device> m_maincpu;
97 	required_device<i8031_device> m_iocpu;
98 	required_device<msm5205_device> m_msm;
99 	required_device<scsi_port_device> m_scsibus;
100 	required_device<ram_device> m_ram;
101 	required_device<eeprom_serial_93cxx_device> m_eeprom;
102 	required_device<via6522_device> m_via;
103 	required_device<centronics_device> m_centronics;
104 	required_device<palette_device> m_palette;
105 	required_device<output_latch_device> m_scsi_data_out;
106 	required_device<input_buffer_device> m_scsi_data_in;
107 	required_device<output_latch_device> m_scsi_ctrl_out;
108 	required_device<wd2793_device> m_fdc;
109 	required_device<z80sio_device> m_z80sio;
110 	required_device<screen_device> m_screen;
111 	required_ioport m_io_config;
112 	required_ioport m_io_joystick0;
113 	required_ioport m_io_mouse_button;
114 	required_ioport m_io_mousex;
115 	required_ioport m_io_mousey;
116 
117 	bitmap_ind16 m_video_mem;
118 
119 	uint8_t m_mcu_reg080;
120 	uint8_t m_iou_reg092;
121 	uint8_t m_last_playmode;
122 	uint8_t m_ay8910_a;
123 	uint16_t m_x, m_y, m_yline;
124 	uint8_t m_colours, m_mode, m_op;
125 	uint32_t m_debug_video;
126 	uint8_t m_vector;
127 	uint8_t m_eeprom_bits;
128 	uint8_t m_eeprom_state;
129 
130 	uint8_t nimbus_mcu_r();
131 	void nimbus_mcu_w(uint8_t data);
132 	uint8_t scsi_r(offs_t offset);
133 	void scsi_w(offs_t offset, uint8_t data);
134 	void fdc_ctl_w(uint8_t data);
135 	uint8_t nimbus_pc8031_r(offs_t offset);
136 	void nimbus_pc8031_w(offs_t offset, uint8_t data);
137 	uint8_t nimbus_pc8031_iou_r(offs_t offset);
138 	void nimbus_pc8031_iou_w(offs_t offset, uint8_t data);
139 	uint8_t nimbus_pc8031_port1_r();
140 	void nimbus_pc8031_port1_w(uint8_t data);
141 	uint8_t nimbus_pc8031_port3_r();
142 	void nimbus_pc8031_port3_w(uint8_t data);
143 	uint8_t nimbus_iou_r(offs_t offset);
144 	void nimbus_iou_w(offs_t offset, uint8_t data);
145 	void nimbus_sound_ay8910_porta_w(uint8_t data);
146 	void nimbus_sound_ay8910_portb_w(uint8_t data);
147 	uint8_t nimbus_mouse_js_r();
148 	void nimbus_mouse_js_w(uint8_t data);
149 	uint16_t nimbus_video_io_r(offs_t offset, uint16_t mem_mask = ~0);
150 	void nimbus_video_io_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
151 	virtual void machine_start() override;
152 	virtual void machine_reset() override;
153 	virtual void video_start() override;
154 	virtual void video_reset() override;
155 	uint32_t screen_update_nimbus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
156 	DECLARE_WRITE_LINE_MEMBER(sio_interrupt);
157 	DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_intrq_w);
158 	DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_drq_w);
159 	void nimbus_via_write_portb(uint8_t data);
160 	DECLARE_WRITE_LINE_MEMBER(write_scsi_bsy);
161 	DECLARE_WRITE_LINE_MEMBER(write_scsi_cd);
162 	DECLARE_WRITE_LINE_MEMBER(write_scsi_io);
163 	DECLARE_WRITE_LINE_MEMBER(write_scsi_msg);
164 	DECLARE_WRITE_LINE_MEMBER(write_scsi_req);
165 	DECLARE_WRITE_LINE_MEMBER(nimbus_msm5205_vck);
166 	DECLARE_WRITE_LINE_MEMBER(write_scsi_iena);
167 
168 	uint8_t get_pixel(uint16_t x, uint16_t y);
169 	uint16_t read_pixel_line(uint16_t x, uint16_t y, uint8_t pixels, uint8_t bpp);
170 	uint16_t read_pixel_data(uint16_t x, uint16_t y);
171 	void set_pixel(uint16_t x, uint16_t y, uint8_t colour);
172 	void set_pixel40(uint16_t x, uint16_t y, uint8_t colour);
173 	void write_pixel_line(uint16_t x, uint16_t y, uint16_t, uint8_t pixels, uint8_t bpp);
174 	void move_pixel_line(uint16_t x, uint16_t y, uint8_t width);
175 	void write_pixel_data(uint16_t x, uint16_t y, uint16_t    data);
176 	void change_palette(uint8_t bank, uint16_t colours);
177 	void external_int(uint8_t vector, bool state);
178 	uint8_t cascade_callback();
179 	void nimbus_bank_memory();
180 	void memory_reset();
181 	void fdc_reset();
182 	uint8_t fdc_driveno(uint8_t drivesel);
183 	void hdc_reset();
184 	void hdc_post_rw();
185 	void hdc_drq(bool state);
186 	void pc8031_reset();
187 	//void ipc_dumpregs();
188 	void iou_reset();
189 	void rmni_sound_reset();
190 	void mouse_js_reset();
191 	void check_scsi_irq();
192 
193 	int m_scsi_iena;
194 	int m_scsi_msg;
195 	int m_scsi_bsy;
196 	int m_scsi_io;
197 	int m_scsi_cd;
198 	int m_scsi_req;
199 
200 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
201 
202 	enum
203 	{
204 		TIMER_MOUSE
205 	};
206 
207 	// Static data related to Floppy and SCSI hard disks
208 	struct
209 	{
210 		uint8_t   reg400;
211 	} m_nimbus_drives;
212 
213 	/* 8031 Peripheral controller */
214 	struct
215 	{
216 		uint8_t   ipc_in;
217 		uint8_t   ipc_out;
218 		uint8_t   status_in;
219 		uint8_t   status_out;
220 	} m_ipc_interface;
221 
222 	/* Mouse/Joystick */
223 	struct
224 	{
225 		uint8_t   m_mouse_px;
226 		uint8_t   m_mouse_py;
227 
228 		uint8_t   m_mouse_x;
229 		uint8_t   m_mouse_y;
230 		uint8_t   m_mouse_pc;
231 		uint8_t   m_mouse_pcx;
232 		uint8_t   m_mouse_pcy;
233 
234 		uint8_t   m_intstate_x;
235 		uint8_t   m_intstate_y;
236 
237 		uint8_t   m_reg0a4;
238 
239 		emu_timer   *m_mouse_timer;
240 	} m_nimbus_mouse;
241 
242 	void nimbus_io(address_map &map);
243 	void nimbus_iocpu_io(address_map &map);
244 	void nimbus_iocpu_mem(address_map &map);
245 	void nimbus_mem(address_map &map);
246 
247 	void decode_dssi_none(uint16_t ds, uint16_t si, uint8_t raw_flag);
248 	void decode_dssi_generic(uint16_t ds, uint16_t si, uint8_t raw_flag);
249 	void decode_dssi_f_fill_area(uint16_t ds, uint16_t si, uint8_t raw_flag);
250 	void decode_dssi_f_plot_character_string(uint16_t ds, uint16_t si, uint8_t raw_flag);
251 	void decode_dssi_f_set_new_clt(uint16_t ds, uint16_t si, uint8_t raw_flag);
252 	void decode_dssi_f_plonk_char(uint16_t ds, uint16_t si, uint8_t raw_flag);
253 	void decode_dssi_f_rw_sectors(uint16_t ds, uint16_t si, uint8_t raw_flag);
254 
255 	void debug_command(int ref, const std::vector<std::string> &params);
256 	void video_debug(int ref, const std::vector<std::string> &params);
257 };
258 
259 #endif // MAME_INCLUDES_RMNIMBUS_H
260