1 // license:GPL-2.0+
2 // copyright-holders:Kevin Thacker, Robbbert
3 /*****************************************************************************
4  *
5  * includes/sorcerer.h
6  *
7  ****************************************************************************/
8 #ifndef MAME_INCLUDES_SORCERER_H
9 #define MAME_INCLUDES_SORCERER_H
10 
11 #pragma once
12 
13 #include "cpu/z80/z80.h"
14 #include "machine/ay31015.h"
15 #include "machine/clock.h"
16 #include "bus/centronics/ctronics.h"
17 #include "bus/rs232/rs232.h"
18 #include "machine/ram.h"
19 #include "imagedev/cassette.h"
20 #include "imagedev/snapquik.h"
21 #include "imagedev/floppy.h"
22 #include "formats/sorc_dsk.h"
23 #include "formats/sorc_cas.h"
24 #include "machine/micropolis.h"
25 #include "machine/wd_fdc.h"
26 #include "machine/z80dma.h"
27 #include "bus/generic/slot.h"
28 #include "bus/generic/carts.h"
29 
30 #define ES_CPU_CLOCK (12638000 / 6)
31 #define ES_UART_CLOCK (ES_CPU_CLOCK / 440)
32 
33 struct cass_data_t {
34 	struct {
35 		int length;     // time cassette level is at input.level
36 		int level;      // cassette level
37 		int bit;        // bit being read
38 	} input;
39 	struct {
40 		int length;     // time cassette level is at output.level
41 		int level;      // cassette level
42 		int bit;        // bit to output
43 	} output;
44 };
45 
46 
47 class sorcerer_state : public driver_device
48 {
49 public:
sorcerer_state(const machine_config & mconfig,device_type type,const char * tag)50 	sorcerer_state(const machine_config &mconfig, device_type type, const char *tag)
51 		: driver_device(mconfig, type, tag)
52 		, m_maincpu(*this, "maincpu")
53 		, m_rom(*this, "maincpu")
54 		, m_pcg(*this, "pcg")
55 		, m_cassette1(*this, "cassette1")
56 		, m_cassette2(*this, "cassette2")
57 		, m_uart(*this, "uart")
58 		, m_uart_clock(*this, "uart_clock")
59 		, m_rs232(*this, "rs232")
60 		, m_centronics(*this, "centronics")
61 		, m_cart(*this, "cartslot")
62 		, m_ram(*this, RAM_TAG)
63 		, m_dma(*this, "dma")
64 		, m_fdc3(*this, "fdc3")
65 		, m_fdc4(*this, "fdc4")
66 		, m_floppy20(*this, "fdc2:0")
67 		, m_floppy21(*this, "fdc2:1")
68 		, m_floppy30(*this, "fdc3:0")
69 		, m_floppy31(*this, "fdc3:1")
70 		, m_floppy32(*this, "fdc3:2")
71 		, m_floppy33(*this, "fdc3:3")
72 		, m_floppy40(*this, "fdc4:0")
73 		, m_floppy41(*this, "fdc4:1")
74 		, m_floppy42(*this, "fdc4:2")
75 		, m_floppy43(*this, "fdc4:3")
76 		, m_iop_config(*this, "CONFIG")
77 		, m_iop_vs(*this, "VS")
78 		, m_iop_x(*this, "X.%u", 0)
79 	{ }
80 
81 	void sorcerer(machine_config &config);
82 	void sorcerera(machine_config &config);
83 	void sorcererb(machine_config &config);
84 
85 protected:
86 	enum
87 	{
88 		TIMER_SERIAL,
89 		TIMER_CASSETTE,
90 	};
91 
92 	u8 portfd_r();
93 	u8 portfe_r();
94 	void portfd_w(u8 data);
95 	void portfe_w(u8 data);
96 	void portff_w(u8 data);
97 	TIMER_CALLBACK_MEMBER(cassette_tc);
98 	TIMER_CALLBACK_MEMBER(serial_tc);
99 	DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb);
100 	DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
101 	void machine_start_common(offs_t endmem);
102 	void machine_reset_common();
103 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
104 
105 	void sorcerer_mem(address_map &map);
106 	void sorcererb_mem(address_map &map);
107 	void sorcerer_io(address_map &map);
108 	void sorcerera_io(address_map &map);
109 	void sorcererb_io(address_map &map);
110 
111 	u8 m_portfe;
112 	u8 m_keyboard_line;
113 	emu_timer *m_serial_timer;
114 	emu_timer *m_cassette_timer;
115 	cass_data_t m_cass_data;
116 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
117 	required_device<z80_device> m_maincpu;
118 	required_region_ptr<u8> m_rom;
119 	required_shared_ptr<u8> m_pcg;
120 	required_device<cassette_image_device> m_cassette1;
121 	required_device<cassette_image_device> m_cassette2;
122 	required_device<ay31015_device> m_uart;
123 	required_device<clock_device> m_uart_clock;
124 	required_device<rs232_port_device> m_rs232;
125 	required_device<centronics_device> m_centronics;
126 	optional_device<generic_slot_device> m_cart;
127 	required_device<ram_device> m_ram;
128 	optional_device<z80dma_device> m_dma;
129 	optional_device<fd1793_device> m_fdc3;
130 	optional_device<wd2793_device> m_fdc4;
131 	optional_device<floppy_connector> m_floppy20;
132 	optional_device<floppy_connector> m_floppy21;
133 	optional_device<floppy_connector> m_floppy30;
134 	optional_device<floppy_connector> m_floppy31;
135 	optional_device<floppy_connector> m_floppy32;
136 	optional_device<floppy_connector> m_floppy33;
137 	optional_device<floppy_connector> m_floppy40;
138 	optional_device<floppy_connector> m_floppy41;
139 	optional_device<floppy_connector> m_floppy42;
140 	optional_device<floppy_connector> m_floppy43;
141 	required_ioport m_iop_config;
142 	required_ioport m_iop_vs;
143 	required_ioport_array<16> m_iop_x;
144 	memory_passthrough_handler *m_rom_shadow_tap;
145 
146 private:
147 	u8 m_port48;
148 	u8 m_port34;
149 	u8 port34_r();
150 	u8 port48_r();
151 	void port34_w(u8 data);
152 	void port48_w(u8 data);
153 	void intrq4_w(bool state);
154 	bool m_halt;
155 	virtual void machine_start() override;
156 	virtual void machine_reset() override;
157 	void busreq_w(bool state);
158 	u8 memory_read_byte(offs_t offset);
159 	void memory_write_byte(offs_t offset, u8 data);
160 	u8 io_read_byte(offs_t offset);
161 	void io_write_byte(offs_t offset, u8 data);
162 };
163 
164 class sorcererd_state : public sorcerer_state
165 {
166 public:
sorcererd_state(const machine_config & mconfig,device_type type,const char * tag)167 	sorcererd_state(const machine_config &mconfig, device_type type, const char *tag)
168 		: sorcerer_state(mconfig, type, tag)
169 		, m_fdc(*this, "fdc")
170 		, m_fdc2(*this, "fdc2")
171 		{ }
172 
173 	void sorcererd(machine_config &config);
174 
175 private:
176 	void sorcererd_mem(address_map &map);
177 	void sorcererd_io(address_map &map);
178 	void port2c_w(u8 data);
179 	void intrq2_w(bool state);
180 	void drq2_w(bool state);
181 	u8 m_port2c;
182 	bool m_wait;
183 	bool m_drq_off;
184 	bool m_intrq_off;
185 	virtual void machine_start() override;
186 	virtual void machine_reset() override;
187 	optional_device<micropolis_device> m_fdc;
188 	optional_device<fd1793_device> m_fdc2;
189 };
190 
191 
192 #endif // MAME_INCLUDES_SORCERER_H
193