1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder, Ales Dlabac
3 #ifndef MAME_INCLUDES_M5_H
4 #define MAME_INCLUDES_M5_H
5 
6 #include "imagedev/cassette.h"
7 #include "imagedev/floppy.h"
8 #include "imagedev/snapquik.h"
9 
10 #include "cpu/z80/z80.h"
11 #include "machine/i8255.h"
12 #include "machine/ram.h"
13 #include "machine/upd765.h"
14 #include "machine/wd_fdc.h" //brno mod
15 #include "machine/z80ctc.h"
16 
17 #include "bus/centronics/ctronics.h"
18 #include "bus/m5/slot.h"
19 
20 
21 #define Z80_TAG         "ic17"
22 #define Z80CTC_TAG      "ic19"
23 #define SN76489AN_TAG   "ic15"
24 #define TMS9918A_TAG    "ic10"
25 #define TMS9929A_TAG    "ic10"
26 #define I8255A_TAG      "i8255a"
27 #define Z80_FD5_TAG     "z80fd5"
28 #define UPD765_TAG      "upd765"
29 #define CENTRONICS_TAG  "centronics"
30 #define SCREEN_TAG      "screen"
31 //brno mod
32 #define WD2797_TAG      "5f"
33 #define RAMDISK         "ramdisk"
34 
35 
36 class m5_state : public driver_device
37 {
38 public:
m5_state(const machine_config & mconfig,device_type type,const char * tag)39 	m5_state(const machine_config &mconfig, device_type type, const char *tag)
40 		: driver_device(mconfig, type, tag)
41 		, m_maincpu(*this, Z80_TAG)
42 		, m_ctc(*this, Z80CTC_TAG)
43 		, m_fd5cpu(*this, Z80_FD5_TAG)
44 		, m_ppi(*this, I8255A_TAG)
45 		, m_fdc(*this, UPD765_TAG)
46 		, m_floppy0(*this, UPD765_TAG ":0:525dd")
47 		, m_cassette(*this, "cassette")
48 		, m_cart1(*this, "cartslot1")
49 		, m_cart2(*this, "cartslot2")
50 		, m_centronics(*this, CENTRONICS_TAG)
51 		, m_ram(*this, RAM_TAG)
52 		, m_reset(*this, "RESET")
53 		, m_DIPS(*this, "DIPS")
54 	{ }
55 
56 	void m5(machine_config &config);
57 	void pal(machine_config &config);
58 	void ntsc(machine_config &config);
59 
60 	void init_pal();
61 	void init_ntsc();
62 
63 	DECLARE_WRITE_LINE_MEMBER(sordm5_video_interrupt_callback);
64 
65 protected:
66 	required_device<z80_device> m_maincpu;
67 	required_device<z80ctc_device> m_ctc;
68 	//I've changed following devices to optional since we have to remove them in BRNO mod (I don't know better solution)
69 	optional_device<cpu_device> m_fd5cpu;
70 	optional_device<i8255_device> m_ppi;
71 	optional_device<upd765a_device> m_fdc;
72 	optional_device<floppy_image_device> m_floppy0;
73 	required_device<cassette_image_device> m_cassette;
74 	optional_device<m5_cart_slot_device> m_cart1;
75 	optional_device<m5_cart_slot_device> m_cart2;
76 	required_device<centronics_device> m_centronics;
77 	required_device<ram_device> m_ram;
78 	required_ioport m_reset;
79 	optional_ioport m_DIPS;
80 	m5_cart_slot_device *m_cart_ram, *m_cart;
81 
82 	uint8_t sts_r();
83 	void com_w(uint8_t data);
84 
85 	virtual void machine_start() override;
86 	virtual void machine_reset() override;
87 private:
88 	uint8_t ppi_pa_r();
89 	void ppi_pa_w(uint8_t data);
90 	void ppi_pb_w(uint8_t data);
91 	uint8_t ppi_pc_r();
92 	void ppi_pc_w(uint8_t data);
93 
94 	uint8_t fd5_data_r();
95 	void fd5_data_w(uint8_t data);
96 	uint8_t fd5_com_r();
97 	void fd5_com_w(uint8_t data);
98 	void fd5_ctrl_w(uint8_t data);
99 	void fd5_tc_w(uint8_t data);
100 
101 	DECLARE_FLOPPY_FORMATS( floppy_formats );
102 
103 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
104 
105 	// memory
106 	uint8_t mem64KBI_r();
107 	void mem64KBI_w(offs_t offset, uint8_t data);
108 	void mem64KBF_w(uint8_t data);
109 	void mem64KRX_w(offs_t offset, uint8_t data);
110 
111 	void fd5_io(address_map &map);
112 	void fd5_mem(address_map &map);
113 	void m5_io(address_map &map);
114 	void m5_mem(address_map &map);
115 
116 	// video state
117 //  const TMS9928a_interface *m_vdp_intf;
118 
119 	int m_centronics_busy;
120 
121 	uint8_t m_ram_mode;
122 	uint8_t m_ram_type;
123 	memory_region *m_cart_rom;
124 
125 	// floppy state for fd5
126 	uint8_t m_fd5_data;
127 	uint8_t m_fd5_com;
128 	int m_intra;
129 	int m_ibfa;
130 	int m_obfa;
131 };
132 
133 
134 class brno_state : public m5_state
135 {
136 public:
brno_state(const machine_config & mconfig,device_type type,const char * tag)137 	brno_state(const machine_config &mconfig, device_type type, const char *tag)
138 		: m5_state(mconfig, type, tag)
139 		, m_fdc(*this, WD2797_TAG)
140 		, m_floppy0(*this, WD2797_TAG":0")
141 		, m_floppy1(*this, WD2797_TAG":1")
142 		//,  m_ramdisk(*this, RAMDISK)
143 	{ }
144 
145 	void brno(machine_config &config);
146 
147 	void init_brno();
148 
149 private:
150 	uint8_t mmu_r();
151 	void mmu_w(uint8_t data);
152 	uint8_t ramsel_r();
153 	void ramsel_w(uint8_t data);
154 	uint8_t romsel_r();
155 	void romsel_w(uint8_t data);
156 
157 	uint8_t fd_r();
158 	void fd_w(uint8_t data);
159 	DECLARE_FLOPPY_FORMATS(floppy_formats);
160 
161 
162 	//  DECLARE_WRITE_LINE_MEMBER( wd2797_intrq_w );
163 	//  DECLARE_WRITE_LINE_MEMBER( wd2797_drq_w );
164 	//  DECLARE_WRITE_LINE_MEMBER( wd2797_index_callback);
165 
166 		//required_device<ram_device> m_ramdisk;
167 	DECLARE_SNAPSHOT_LOAD_MEMBER(brno);
168 	//  DECLARE_DEVICE_IMAGE_LOAD_MEMBER(m5_cart);
169 
170 	void brno_io(address_map &map);
171 	void m5_mem_brno(address_map &map);
172 
173 	virtual void machine_start() override;
174 	virtual void machine_reset() override;
175 
176 	required_device<wd2797_device> m_fdc;
177 	required_device<floppy_connector> m_floppy0;
178 	optional_device<floppy_connector> m_floppy1;
179 	floppy_image_device *m_floppy;
180 
181 	uint8_t m_rambank; // bank #
182 	uint8_t m_ramcpu; //where Ramdisk bank is mapped
183 	bool m_romen;
184 	bool m_ramen;
185 
186 	uint8_t m_rammap[16]; // memory map
187 };
188 
189 #endif // MAME_INCLUDES_M5_H
190