1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_BULLET_H
4 #define MAME_INCLUDES_BULLET_H
5 
6 #pragma once
7 
8 #include "cpu/z80/z80.h"
9 #include "bus/centronics/ctronics.h"
10 #include "bus/scsi/scsi.h"
11 #include "imagedev/floppy.h"
12 #include "machine/ram.h"
13 #include "machine/timer.h"
14 #include "machine/wd_fdc.h"
15 #include "machine/z80ctc.h"
16 #include "machine/z80dma.h"
17 #include "machine/z80pio.h"
18 #include "machine/z80sio.h"
19 
20 #define Z80_TAG         "u20"
21 #define Z80CTC_TAG      "u1"
22 #define Z80DMA_TAG      "u50"
23 #define Z80DART_TAG     "u45"
24 #define Z80PIO_TAG      "z80pio"
25 #define MB8877_TAG      "u55"
26 #define CENTRONICS_TAG  "centronics"
27 #define SCSIBUS_TAG     "scsi"
28 #define RS232_A_TAG     "rs232a"
29 #define RS232_B_TAG     "rs232b"
30 
31 class bullet_state : public driver_device
32 {
33 public:
bullet_state(const machine_config & mconfig,device_type type,const char * tag)34 	bullet_state(const machine_config &mconfig, device_type type, const char *tag)
35 		: driver_device(mconfig, type, tag),
36 		m_maincpu(*this, Z80_TAG),
37 		m_ctc(*this, Z80CTC_TAG),
38 		m_dart(*this, Z80DART_TAG),
39 		m_dmac(*this, Z80DMA_TAG),
40 		m_fdc(*this, MB8877_TAG),
41 		m_ram(*this, RAM_TAG),
42 		m_floppy0(*this, MB8877_TAG":0"),
43 		m_floppy1(*this, MB8877_TAG":1"),
44 		m_floppy2(*this, MB8877_TAG":2"),
45 		m_floppy3(*this, MB8877_TAG":3"),
46 		m_floppy4(*this, MB8877_TAG":4"),
47 		m_floppy5(*this, MB8877_TAG":5"),
48 		m_floppy6(*this, MB8877_TAG":6"),
49 		m_floppy7(*this, MB8877_TAG":7"),
50 		m_floppy(nullptr),
51 		m_centronics(*this, CENTRONICS_TAG),
52 		m_rom(*this, Z80_TAG),
53 		m_sw1(*this, "SW1"),
54 		m_fdrdy(0),
55 		m_exdsk_sw(false),
56 		m_hdcon_sw(false)
57 	{
58 	}
59 
60 	uint8_t mreq_r(offs_t offset);
61 	void mreq_w(offs_t offset, uint8_t data);
62 	uint8_t info_r();
63 	uint8_t brom_r();
64 	void brom_w(uint8_t data);
65 	uint8_t win_r();
66 	void wstrobe_w(uint8_t data);
67 	void exdsk_w(uint8_t data);
68 	void exdma_w(uint8_t data);
69 	void hdcon_w(uint8_t data);
70 	void segst_w(uint8_t data);
71 	uint8_t dma_mreq_r(offs_t offset);
72 	void dma_mreq_w(offs_t offset, uint8_t data);
73 	uint8_t pio_pb_r();
74 	DECLARE_WRITE_LINE_MEMBER( dartardy_w );
75 	DECLARE_WRITE_LINE_MEMBER( dartbrdy_w );
76 	DECLARE_WRITE_LINE_MEMBER( write_centronics_busy );
77 	DECLARE_WRITE_LINE_MEMBER( write_centronics_perror );
78 	DECLARE_WRITE_LINE_MEMBER( write_centronics_select );
79 	DECLARE_WRITE_LINE_MEMBER( write_centronics_fault );
80 	DECLARE_WRITE_LINE_MEMBER( fdc_drq_w );
81 
82 	TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
83 	DECLARE_WRITE_LINE_MEMBER(dart_rxtxca_w);
84 	uint8_t io_read_byte(offs_t offset);
85 	void io_write_byte(offs_t offset, uint8_t data);
86 
87 	void bullet(machine_config &config);
88 	void bullet_io(address_map &map);
89 	void bullet_mem(address_map &map);
90 protected:
91 	virtual void machine_start() override;
92 	virtual void machine_reset() override;
93 
94 	void update_dma_rdy();
95 
96 	required_device<z80_device> m_maincpu;
97 	required_device<z80ctc_device> m_ctc;
98 	required_device<z80dart_device> m_dart;
99 	required_device<z80dma_device> m_dmac;
100 	required_device<mb8877_device> m_fdc;
101 	required_device<ram_device> m_ram;
102 	required_device<floppy_connector> m_floppy0;
103 	required_device<floppy_connector> m_floppy1;
104 	required_device<floppy_connector> m_floppy2;
105 	required_device<floppy_connector> m_floppy3;
106 	required_device<floppy_connector> m_floppy4;
107 	required_device<floppy_connector> m_floppy5;
108 	required_device<floppy_connector> m_floppy6;
109 	required_device<floppy_connector> m_floppy7;
110 	floppy_image_device *m_floppy;
111 	required_device<centronics_device> m_centronics;
112 	required_memory_region m_rom;
113 	required_ioport m_sw1;
114 
115 	// memory state
116 	int m_segst;
117 	int m_brom;
118 
119 	// DMA state
120 	uint8_t m_exdma;
121 	int m_buf;
122 	bool m_fdrdy;
123 	int m_dartardy;
124 	int m_dartbrdy;
125 	int m_winrdy;
126 	int m_exrdy1;
127 	int m_exrdy2;
128 	bool m_exdsk_sw;
129 	bool m_hdcon_sw;
130 
131 	int m_centronics_busy;
132 	int m_centronics_perror;
133 	int m_centronics_select;
134 	int m_centronics_fault;
135 };
136 
137 class bulletf_state : public bullet_state
138 {
139 public:
bulletf_state(const machine_config & mconfig,device_type type,const char * tag)140 	bulletf_state(const machine_config &mconfig, device_type type, const char *tag) :
141 		bullet_state(mconfig, type, tag),
142 		m_floppy8(*this, MB8877_TAG":8"),
143 		m_floppy9(*this, MB8877_TAG":9"),
144 		m_scsibus(*this, SCSIBUS_TAG),
145 		m_scsi_data_in(*this, "scsi_data_in"),
146 		m_scsi_data_out(*this, "scsi_data_out"),
147 		m_scsi_ctrl_in(*this, "scsi_ctrl_in")
148 	{
149 	}
150 
151 	uint8_t mreq_r(offs_t offset);
152 	void mreq_w(offs_t offset, uint8_t data);
153 	void xdma0_w(uint8_t data);
154 	void xfdc_w(uint8_t data);
155 	void mbank_w(uint8_t data);
156 	uint8_t hwsts_r();
157 	uint8_t scsi_r();
158 	void scsi_w(uint8_t data);
159 
160 	uint8_t dma_mreq_r(offs_t offset);
161 	void dma_mreq_w(offs_t offset, uint8_t data);
162 	void pio_pa_w(uint8_t data);
163 	DECLARE_WRITE_LINE_MEMBER( cstrb_w );
164 	DECLARE_WRITE_LINE_MEMBER( req_w );
165 
166 	void bulletf(machine_config &config);
167 	void bulletf_io(address_map &map);
168 	void bulletf_mem(address_map &map);
169 protected:
170 	virtual void machine_start() override;
171 	virtual void machine_reset() override;
172 
173 	void update_dma_rdy();
174 
175 	required_device<floppy_connector> m_floppy8;
176 	required_device<floppy_connector> m_floppy9;
177 	required_device<scsi_port_device> m_scsibus;
178 	required_device<input_buffer_device> m_scsi_data_in;
179 	required_device<output_latch_device> m_scsi_data_out;
180 	required_device<input_buffer_device> m_scsi_ctrl_in;
181 
182 	int m_rome;
183 	uint8_t m_xdma0;
184 	uint8_t m_mbank;
185 	int m_wack;
186 	int m_wrdy;
187 };
188 
189 #endif // MAME_INCLUDES_BULLET_H
190