1 // license:BSD-3-Clause
2 // copyright-holders:Ryan Holtz
3 
4 #ifndef MAME_INCLUDES_CDI_H
5 #define MAME_INCLUDES_CDI_H
6 
7 #include "machine/scc68070.h"
8 #include "machine/cdislavehle.h"
9 #include "machine/cdicdic.h"
10 #include "sound/dmadac.h"
11 #include "video/mcd212.h"
12 #include "cpu/mcs51/mcs51.h"
13 #include "cpu/m6805/m68hc05.h"
14 #include "screen.h"
15 
16 /*----------- driver state -----------*/
17 
18 class cdi_state : public driver_device
19 {
20 public:
cdi_state(const machine_config & mconfig,device_type type,const char * tag)21 	cdi_state(const machine_config &mconfig, device_type type, const char *tag)
22 		: driver_device(mconfig, type, tag)
23 		, m_maincpu(*this, "maincpu")
24 		, m_planea(*this, "mcd212:planea")
25 		, m_slave_hle(*this, "slave_hle")
26 		, m_servo(*this, "servo")
27 		, m_slave(*this, "slave")
28 		, m_cdic(*this, "cdic")
29 		, m_cdda(*this, "cdda")
30 		, m_mcd212(*this, "mcd212")
31 		, m_lcd(*this, "lcd")
32 		, m_dmadac(*this, "dac%u", 1U)
33 	{ }
34 
35 	void cdimono1_base(machine_config &config);
36 	void cdimono1(machine_config &config);
37 	void cdimono2(machine_config &config);
38 	void cdi910(machine_config &config);
39 
40 protected:
41 	virtual void machine_reset() override;
42 
43 	void cdimono1_mem(address_map &map);
44 
45 	required_device<scc68070_device> m_maincpu;
46 
47 private:
48 	virtual void video_start() override;
49 
50 	enum servo_portc_bit_t
51 	{
52 		INV_JUC_OUT = (1 << 2),
53 		INV_DIV4_IN = (1 << 5),
54 		INV_CADDYSWITCH_IN = (1 << 7)
55 	};
56 
57 	void draw_lcd(int y);
58 	uint32_t screen_update_cdimono1_lcd(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
59 
60 	void cdi910_mem(address_map &map);
61 	void cdimono2_mem(address_map &map);
62 	void cdi070_cpuspace(address_map &map);
63 
64 	uint16_t dvc_r(offs_t offset, uint16_t mem_mask = ~0);
65 	void dvc_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
66 
67 	required_shared_ptr<uint16_t> m_planea;
68 	optional_device<cdislave_hle_device> m_slave_hle;
69 	optional_device<m68hc05c8_device> m_servo;
70 	optional_device<m68hc05c8_device> m_slave;
71 	optional_device<cdicdic_device> m_cdic;
72 	required_device<cdda_device> m_cdda;
73 	required_device<mcd212_device> m_mcd212;
74 	optional_device<screen_device> m_lcd;
75 
76 	required_device_array<dmadac_sound_device, 2> m_dmadac;
77 
78 	bitmap_rgb32 m_lcdbitmap;
79 };
80 
81 class quizard_state : public cdi_state
82 {
83 public:
quizard_state(const machine_config & mconfig,device_type type,const char * tag)84 	quizard_state(const machine_config &mconfig, device_type type, const char *tag)
85 		: cdi_state(mconfig, type, tag)
86 		, m_mcu(*this, "mcu")
87 		, m_inputs(*this, "P%u", 0U)
88 	{ }
89 
90 	void quizard(machine_config &config);
91 
92 private:
93 	virtual void machine_start() override;
94 	virtual void machine_reset() override;
95 
96 	uint8_t mcu_p0_r();
97 	uint8_t mcu_p1_r();
98 	uint8_t mcu_p2_r();
99 	uint8_t mcu_p3_r();
100 	void mcu_p0_w(uint8_t data);
101 	void mcu_p1_w(uint8_t data);
102 	void mcu_p2_w(uint8_t data);
103 	void mcu_p3_w(uint8_t data);
104 	void mcu_tx(uint8_t data);
105 	uint8_t mcu_rx();
106 
107 	void mcu_rx_from_cpu(uint8_t data);
108 	void mcu_rtsn_from_cpu(int state);
109 
110 	required_device<i8751_device> m_mcu;
111 	required_ioport_array<3> m_inputs;
112 
113 	uint8_t m_mcu_rx_from_cpu;
114 	bool m_mcu_initial_byte;
115 };
116 
117 // Quizard 2 language values:
118 // 0x2b1: Italian
119 // 0x001: French
120 // 0x188: German
121 
122 #endif // MAME_INCLUDES_CDI_H
123