1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_V1050_H
4 #define MAME_INCLUDES_V1050_H
5 
6 #pragma once
7 
8 #include "cpu/z80/z80.h"
9 #include "cpu/m6502/m6502.h"
10 #include "bus/centronics/ctronics.h"
11 #include "bus/scsi/s1410.h"
12 #include "imagedev/floppy.h"
13 #include "machine/clock.h"
14 #include "machine/i8214.h"
15 #include "machine/i8251.h"
16 #include "machine/i8255.h"
17 #include "machine/msm58321.h"
18 #include "machine/ram.h"
19 #include "machine/timer.h"
20 #include "bus/scsi/scsi.h"
21 #include "bus/scsi/scsihd.h"
22 #include "machine/v1050kb.h"
23 #include "machine/wd_fdc.h"
24 #include "video/mc6845.h"
25 #include "emupal.h"
26 
27 #define SCREEN_TAG              "screen"
28 
29 #define Z80_TAG                 "u80"
30 #define UPB8214_TAG             "u38"
31 #define I8255A_DISP_TAG         "u79"
32 #define I8255A_MISC_TAG         "u10"
33 #define I8255A_RTC_TAG          "u36"
34 #define I8251A_KB_TAG           "u85"
35 #define I8251A_SIO_TAG          "u8"
36 #define MSM58321RS_TAG          "u26"
37 #define MB8877_TAG              "u13"
38 #define FDC9216_TAG             "u25"
39 #define M6502_TAG               "u76"
40 #define I8255A_M6502_TAG        "u101"
41 #define H46505_TAG              "u75"
42 #define CENTRONICS_TAG          "centronics"
43 #define CLOCK_KB_TAG            "keyboard_clock"
44 #define CLOCK_SIO_TAG           "sio_clock"
45 #define TIMER_ACK_TAG           "timer_ack"
46 #define TIMER_RST_TAG           "timer_rst"
47 #define SASIBUS_TAG             "sasi"
48 #define RS232_TAG               "rs232"
49 #define V1050_KEYBOARD_TAG      "v1050kb"
50 
51 #define V1050_VIDEORAM_SIZE     0x8000
52 #define V1050_VIDEORAM_MASK     0x7fff
53 
54 #define INT_RS_232          0
55 #define INT_WINCHESTER      1
56 #define INT_KEYBOARD        2
57 #define INT_FLOPPY          3
58 #define INT_VSYNC           4
59 #define INT_DISPLAY         5
60 #define INT_EXPANSION_B     6
61 #define INT_EXPANSION_A     7
62 
63 class v1050_state : public driver_device
64 {
65 public:
v1050_state(const machine_config & mconfig,device_type type,const char * tag)66 	v1050_state(const machine_config &mconfig, device_type type, const char *tag) :
67 		driver_device(mconfig, type, tag),
68 		m_maincpu(*this, Z80_TAG),
69 		m_subcpu(*this, M6502_TAG),
70 		m_pic(*this, UPB8214_TAG),
71 		m_ppi_disp(*this, I8255A_DISP_TAG),
72 		m_ppi_6502(*this, I8255A_M6502_TAG),
73 		m_rtc(*this, MSM58321RS_TAG),
74 		m_uart_kb(*this, I8251A_KB_TAG),
75 		m_uart_sio(*this, I8251A_SIO_TAG),
76 		m_fdc(*this, MB8877_TAG),
77 		m_crtc(*this, H46505_TAG),
78 		m_palette(*this, "palette"),
79 		m_centronics(*this, CENTRONICS_TAG),
80 		m_ram(*this, RAM_TAG),
81 		m_floppy0(*this, MB8877_TAG":0"),
82 		m_floppy1(*this, MB8877_TAG":1"),
83 		m_floppy2(*this, MB8877_TAG":2"),
84 		m_floppy3(*this, MB8877_TAG":3"),
85 		m_clock_sio(*this, CLOCK_SIO_TAG),
86 		m_timer_ack(*this, TIMER_ACK_TAG),
87 		m_timer_rst(*this, TIMER_RST_TAG),
88 		m_sasibus(*this, SASIBUS_TAG),
89 		m_sasi_data_out(*this, "scsi_data_out"),
90 		m_sasi_data_in(*this, "scsi_data_in"),
91 		m_sasi_ctrl_in(*this, "scsi_ctrl_in"),
92 		m_rom(*this, Z80_TAG),
93 		m_video_ram(*this, "video_ram"),
94 		m_attr_ram(*this, "attr_ram"),
95 		m_int_mask(0),
96 		m_int_state(0),
97 		m_rtc_ppi_pa(0),
98 		m_rtc_ppi_pc(0)
99 	{
100 	}
101 
102 	void v1050(machine_config &config);
103 	void v1050_video(machine_config &config);
104 
105 private:
106 	uint8_t kb_data_r();
107 	uint8_t kb_status_r();
108 	void v1050_i8214_w(uint8_t data);
109 	uint8_t vint_clr_r();
110 	void vint_clr_w(uint8_t data);
111 	uint8_t dint_clr_r();
112 	void dint_clr_w(uint8_t data);
113 	void bank_w(uint8_t data);
114 	void dint_w(uint8_t data);
115 	void dvint_clr_w(uint8_t data);
116 	void misc_ppi_pa_w(uint8_t data);
117 	void misc_ppi_pc_w(uint8_t data);
118 	uint8_t rtc_ppi_pa_r();
119 	void rtc_ppi_pa_w(uint8_t data);
120 	void rtc_ppi_pb_w(uint8_t data);
121 	uint8_t rtc_ppi_pc_r();
122 	void rtc_ppi_pc_w(uint8_t data);
123 	DECLARE_WRITE_LINE_MEMBER( kb_rxrdy_w );
124 	DECLARE_WRITE_LINE_MEMBER( sio_rxrdy_w );
125 	DECLARE_WRITE_LINE_MEMBER( sio_txrdy_w );
126 	DECLARE_WRITE_LINE_MEMBER( fdc_intrq_w );
127 	DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
128 	uint8_t attr_r();
129 	void attr_w(uint8_t data);
130 	uint8_t videoram_r(offs_t offset);
131 	void videoram_w(offs_t offset, uint8_t data);
132 	DECLARE_WRITE_LINE_MEMBER( crtc_vs_w );
133 	void sasi_data_w(uint8_t data);
134 	DECLARE_WRITE_LINE_MEMBER(write_sasi_io);
135 	void sasi_ctrl_w(uint8_t data);
136 
WRITE_LINE_MEMBER(rtc_ppi_pa_0_w)137 	WRITE_LINE_MEMBER( rtc_ppi_pa_0_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 0)) | ((state & 1) << 0); }
WRITE_LINE_MEMBER(rtc_ppi_pa_1_w)138 	WRITE_LINE_MEMBER( rtc_ppi_pa_1_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 1)) | ((state & 1) << 1); }
WRITE_LINE_MEMBER(rtc_ppi_pa_2_w)139 	WRITE_LINE_MEMBER( rtc_ppi_pa_2_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 2)) | ((state & 1) << 2); }
WRITE_LINE_MEMBER(rtc_ppi_pa_3_w)140 	WRITE_LINE_MEMBER( rtc_ppi_pa_3_w ){ m_rtc_ppi_pa = (m_rtc_ppi_pa & ~(1 << 3)) | ((state & 1) << 3); }
WRITE_LINE_MEMBER(rtc_ppi_pc_3_w)141 	WRITE_LINE_MEMBER( rtc_ppi_pc_3_w ){ m_rtc_ppi_pc = (m_rtc_ppi_pc & ~(1 << 3)) | ((state & 1) << 3); }
142 
143 	TIMER_DEVICE_CALLBACK_MEMBER(v1050_keyboard_tick);
144 	TIMER_DEVICE_CALLBACK_MEMBER(sasi_ack_tick);
145 	TIMER_DEVICE_CALLBACK_MEMBER(sasi_rst_tick);
146 	DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock);
147 	DECLARE_WRITE_LINE_MEMBER(write_sio_clock);
148 	DECLARE_WRITE_LINE_MEMBER(pic_int_w);
149 	void disp_ppi_pc_w(uint8_t data);
150 	void m6502_ppi_pc_w(uint8_t data);
151 	uint8_t misc_ppi_pc_r();
152 	IRQ_CALLBACK_MEMBER(v1050_int_ack);
153 
154 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
155 	DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
156 
157 	MC6845_UPDATE_ROW(crtc_update_row);
158 
159 	void v1050_crt_mem(address_map &map);
160 	void v1050_io(address_map &map);
161 	void v1050_mem(address_map &map);
162 
163 	virtual void machine_start() override;
164 	virtual void machine_reset() override;
165 
166 	virtual void video_start() override;
167 
168 	void bankswitch();
169 	void update_fdc();
170 	void set_interrupt(int line, int state);
171 	void scan_keyboard();
172 	void set_baud_sel(int sel);
173 
174 	required_device<cpu_device> m_maincpu;
175 	required_device<cpu_device> m_subcpu;
176 	required_device<i8214_device> m_pic;
177 	required_device<i8255_device> m_ppi_disp;
178 	required_device<i8255_device> m_ppi_6502;
179 	required_device<msm58321_device> m_rtc;
180 	required_device<i8251_device> m_uart_kb;
181 	required_device<i8251_device> m_uart_sio;
182 	required_device<mb8877_device> m_fdc;
183 	required_device<mc6845_device> m_crtc;
184 	required_device<palette_device> m_palette;
185 	required_device<centronics_device> m_centronics;
186 	required_device<ram_device> m_ram;
187 	required_device<floppy_connector> m_floppy0;
188 	required_device<floppy_connector> m_floppy1;
189 	required_device<floppy_connector> m_floppy2;
190 	required_device<floppy_connector> m_floppy3;
191 	required_device<clock_device> m_clock_sio;
192 	required_device<timer_device> m_timer_ack;
193 	required_device<timer_device> m_timer_rst;
194 	required_device<scsi_port_device> m_sasibus;
195 	required_device<output_latch_device> m_sasi_data_out;
196 	required_device<input_buffer_device> m_sasi_data_in;
197 	required_device<input_buffer_device> m_sasi_ctrl_in;
198 	required_memory_region m_rom;
199 	required_shared_ptr<uint8_t> m_video_ram;
200 	optional_shared_ptr<uint8_t> m_attr_ram;
201 
202 	// interrupt state
203 	uint8_t m_int_mask;           // interrupt mask
204 	uint8_t m_int_state;
205 	int m_f_int_enb;            // floppy interrupt enable
206 	bool m_fdc_irq;
207 	bool m_fdc_drq;
208 
209 	// keyboard state
210 	uint8_t m_keylatch;           // keyboard row select
211 	uint8_t m_keydata;
212 	int m_keyavail;
213 
214 	// serial state
215 	int m_rxrdy;                // receiver ready
216 	int m_txrdy;                // transmitter ready
217 	int m_baud_sel;             // baud select
218 
219 	// memory state
220 	uint8_t m_bank;               // bank register
221 
222 	// video state
223 	uint8_t m_attr;               // attribute latch
224 
225 	// sasi state
226 	uint8_t m_sasi_data;
227 	int m_sasi_data_enable;
228 
229 	uint8_t m_rtc_ppi_pa;
230 	uint8_t m_rtc_ppi_pc;
231 
232 	int m_centronics_busy;
233 	int m_centronics_perror;
234 };
235 
236 #endif // MAME_INCLUDES_V1050_H
237