1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 #ifndef MAME_INCLUDES_KYOCERA_H
4 #define MAME_INCLUDES_KYOCERA_H
5 
6 #pragma once
7 
8 #include "cpu/i8085/i8085.h"
9 #include "imagedev/cassette.h"
10 #include "machine/buffer.h"
11 #include "machine/i8155.h"
12 #include "machine/i8251.h"
13 #include "machine/im6402.h"
14 #include "machine/ram.h"
15 #include "machine/rp5c01.h"
16 #include "machine/timer.h"
17 #include "machine/upd1990a.h"
18 #include "sound/spkrdev.h"
19 #include "video/hd44102.h"
20 #include "video/hd61830.h"
21 
22 #include "bus/generic/slot.h"
23 #include "bus/generic/carts.h"
24 #include "bus/centronics/ctronics.h"
25 #include "bus/rs232/rs232.h"
26 
27 #include "emupal.h"
28 #include "rendlay.h"
29 
30 
31 #define SCREEN_TAG      "screen"
32 #define I8085_TAG       "m19"
33 #define I8155_TAG       "m25"
34 #define UPD1990A_TAG    "m18"
35 #define IM6402_TAG      "m22"
36 #define MC14412_TAG     "m31"
37 #define CENTRONICS_TAG  "centronics"
38 #define RS232_TAG       "rs232"
39 
40 //#define I8085_TAG     "m19"
41 //#define I8155_TAG     "m12"
42 //#define MC14412_TAG   "m8"
43 #define RP5C01A_TAG     "m301"
44 #define TCM5089_TAG     "m11"
45 #define I8251_TAG       "m20"
46 #define HD61830_TAG     "m18"
47 
48 class kc85_state : public driver_device
49 {
50 public:
kc85_state(const machine_config & mconfig,device_type type,const char * tag)51 	kc85_state(const machine_config &mconfig, device_type type, const char *tag) :
52 		driver_device(mconfig, type, tag),
53 		m_maincpu(*this, I8085_TAG),
54 		m_rtc(*this, UPD1990A_TAG),
55 		m_uart(*this, IM6402_TAG),
56 		m_lcdc(*this, "m%u", 0U),
57 		m_centronics(*this, CENTRONICS_TAG),
58 		m_speaker(*this, "speaker"),
59 		m_cassette(*this, "cassette"),
60 		m_opt_cart(*this, "opt_cartslot"),
61 		m_ram(*this, RAM_TAG),
62 		m_rs232(*this, RS232_TAG),
63 		m_rom(*this, I8085_TAG),
64 		m_y(*this, "Y%u", 0U),
65 		m_battery(*this, "BATTERY")
66 	{ }
67 
68 	void kc85(machine_config &config);
69 	void kc85_video(machine_config &config);
70 
71 protected:
72 	DECLARE_WRITE_LINE_MEMBER(kc85_sod_w);
73 	DECLARE_READ_LINE_MEMBER(kc85_sid_r);
74 
75 	void i8155_pa_w(uint8_t data);
76 	void i8155_pb_w(uint8_t data);
77 	uint8_t i8155_pc_r();
78 
79 	DECLARE_WRITE_LINE_MEMBER( i8155_to_w );
80 	DECLARE_WRITE_LINE_MEMBER( write_centronics_busy );
81 	DECLARE_WRITE_LINE_MEMBER( write_centronics_select );
82 
83 	required_device<i8085a_cpu_device> m_maincpu;
84 	required_device<upd1990a_device> m_rtc;
85 	optional_device<im6402_device> m_uart;
86 	required_device_array<hd44102_device, 10> m_lcdc;
87 	required_device<centronics_device> m_centronics;
88 	required_device<speaker_sound_device> m_speaker;
89 	required_device<cassette_image_device> m_cassette;
90 	required_device<generic_slot_device> m_opt_cart;
91 	required_device<ram_device> m_ram;
92 	required_device<rs232_port_device> m_rs232;
93 	required_memory_region m_rom;
94 	required_ioport_array<9> m_y;
95 	required_ioport m_battery;
96 
97 	virtual void machine_start() override;
98 	memory_region *m_opt_region;
99 
100 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
101 
102 	uint8_t uart_r();
103 	uint8_t uart_status_r();
104 	void uart_ctrl_w(uint8_t data);
105 	void modem_w(uint8_t data);
106 	void ctrl_w(uint8_t data);
107 	uint8_t keyboard_r();
108 	uint8_t lcd_r(offs_t offset);
109 	void lcd_w(offs_t offset, uint8_t data);
110 
111 	/* memory state */
112 	uint8_t m_bank;           /* memory bank selection */
113 
114 	/* keyboard state */
115 	uint16_t m_keylatch;      /* keyboard latch */
116 
117 	/* sound state */
118 	int m_buzzer;               /* buzzer select */
119 	int m_bell;             /* bell output */
120 
121 	int m_centronics_busy;
122 	int m_centronics_select;
123 
124 	void kc85_palette(palette_device &palette) const;
125 	void kc85_io(address_map &map);
126 	void kc85_mem(address_map &map);
127 	void trsm100_io(address_map &map);
128 };
129 
130 class trsm100_state : public kc85_state
131 {
132 public:
trsm100_state(const machine_config & mconfig,device_type type,const char * tag)133 	trsm100_state(const machine_config &mconfig, device_type type, const char *tag) :
134 		kc85_state(mconfig, type, tag)
135 	{ }
136 
137 	void trsm100(machine_config &config);
138 	void tandy102(machine_config &config);
139 
140 private:
141 	virtual void machine_start() override;
142 };
143 
144 class pc8201_state : public kc85_state
145 {
146 public:
pc8201_state(const machine_config & mconfig,device_type type,const char * tag)147 	pc8201_state(const machine_config &mconfig, device_type type, const char *tag) :
148 		kc85_state(mconfig, type, tag),
149 		m_cas_cart(*this, "cas_cartslot")
150 	{ }
151 
152 	void pc8300(machine_config &config);
153 	void pc8201(machine_config &config);
154 
155 private:
156 	virtual void machine_start() override;
157 	required_device<generic_slot_device> m_cas_cart;
158 
159 	uint8_t bank_r();
160 	void bank_w(uint8_t data);
161 	void scp_w(uint8_t data);
162 	uint8_t uart_status_r();
163 	void romah_w(uint8_t data);
164 	void romal_w(uint8_t data);
165 	void romam_w(uint8_t data);
166 	uint8_t romrd_r();
167 
168 	void bankswitch(uint8_t data);
169 
170 	// ROM cassette
171 	int m_rom_sel;
172 	uint32_t m_rom_addr;
173 
174 	/* peripheral state */
175 	int m_iosel;                /* serial interface select */
176 	void pc8201_io(address_map &map);
177 	void pc8201_mem(address_map &map);
178 };
179 
180 class tandy200_state : public driver_device
181 {
182 public:
tandy200_state(const machine_config & mconfig,device_type type,const char * tag)183 	tandy200_state(const machine_config &mconfig, device_type type, const char *tag) :
184 		driver_device(mconfig, type, tag),
185 		m_maincpu(*this, I8085_TAG),
186 		m_rtc(*this, RP5C01A_TAG),
187 		m_lcdc(*this, HD61830_TAG),
188 		m_centronics(*this, CENTRONICS_TAG),
189 		m_cent_data_out(*this, "cent_data_out"),
190 		m_speaker(*this, "speaker"),
191 		m_cassette(*this, "cassette"),
192 		m_opt_cart(*this, "opt_cartslot"),
193 		m_ram(*this, RAM_TAG),
194 		m_rs232(*this, RS232_TAG),
195 		m_rom(*this, I8085_TAG),
196 		m_y(*this, "Y%u", 0U)
197 	{ }
198 
199 	void tandy200(machine_config &config);
200 
201 private:
202 	required_device<i8085a_cpu_device> m_maincpu;
203 	required_device<rp5c01_device> m_rtc;
204 	required_device<hd61830_device> m_lcdc;
205 	required_device<centronics_device> m_centronics;
206 	required_device<output_latch_device> m_cent_data_out;
207 	required_device<speaker_sound_device> m_speaker;
208 	required_device<cassette_image_device> m_cassette;
209 	required_device<generic_slot_device> m_opt_cart;
210 	required_device<ram_device> m_ram;
211 	required_device<rs232_port_device> m_rs232;
212 	required_memory_region m_rom;
213 	required_ioport_array<9> m_y;
214 
215 	virtual void machine_start() override;
216 	memory_region *m_opt_region;
217 
218 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
219 
220 	uint8_t bank_r();
221 	void bank_w(uint8_t data);
222 	uint8_t stbk_r();
223 	void stbk_w(uint8_t data);
224 	void i8155_pa_w(uint8_t data);
225 	void i8155_pb_w(uint8_t data);
226 	uint8_t i8155_pc_r();
227 	DECLARE_WRITE_LINE_MEMBER( i8155_to_w );
228 	DECLARE_WRITE_LINE_MEMBER(kc85_sod_w);
229 	DECLARE_READ_LINE_MEMBER(kc85_sid_r);
230 	DECLARE_WRITE_LINE_MEMBER( write_centronics_busy );
231 	DECLARE_WRITE_LINE_MEMBER( write_centronics_select );
232 
233 	void tandy200_palette(palette_device &palette) const;
234 
235 	TIMER_DEVICE_CALLBACK_MEMBER(tandy200_tp_tick);
236 
237 	void bankswitch(uint8_t data);
238 
239 	/* memory state */
240 	uint8_t m_bank;           /* memory bank selection */
241 
242 	/* keyboard state */
243 	uint16_t m_keylatch;      /* keyboard latch */
244 	int m_tp;               /* timing pulse */
245 
246 	/* sound state */
247 	int m_buzzer;           /* buzzer select */
248 	int m_bell;             /* bell output */
249 
250 	int m_centronics_busy;
251 	int m_centronics_select;
252 	void tandy200_video(machine_config &config);
253 	void tandy200_io(address_map &map);
254 	void tandy200_lcdc(address_map &map);
255 	void tandy200_mem(address_map &map);
256 };
257 
258 #endif // MAME_INCLUDES_KYOCERA_H
259