1 // license:BSD-3-Clause
2 // copyright-holders:Krzysztof Strzecha
3 /*****************************************************************************
4  *
5  * includes/pmd85.h
6  *
7  ****************************************************************************/
8 #ifndef MAME_INCLUDES_PMD85_H
9 #define MAME_INCLUDES_PMD85_H
10 
11 #pragma once
12 
13 #include "machine/i8251.h"
14 #include "machine/pit8253.h"
15 #include "machine/i8255.h"
16 #include "imagedev/cassette.h"
17 #include "sound/spkrdev.h"
18 #include "machine/ram.h"
19 #include "emupal.h"
20 
21 
22 class pmd85_state : public driver_device
23 {
24 public:
pmd85_state(const machine_config & mconfig,device_type type,const char * tag)25 	pmd85_state(const machine_config &mconfig, device_type type, const char *tag)
26 		: driver_device(mconfig, type, tag)
27 		, m_maincpu(*this, "maincpu")
28 		, m_rom(*this, "maincpu")
29 		, m_ram(*this, RAM_TAG)
30 		, m_cassette(*this, "cassette")
31 		, m_speaker(*this, "speaker")
32 		, m_pit(*this, "pit")
33 		, m_uart(*this, "uart")
34 		, m_ppi0(*this, "ppi0")
35 		, m_ppi1(*this, "ppi1")
36 		, m_ppi2(*this, "ppi2")
37 		, m_ppi3(*this, "ppi3")
38 		, m_bank(*this, "bank%d", 0U)
39 		, m_io_dsw0(*this, "DSW0")
40 		, m_palette(*this, "palette")
41 		, m_io_keyboard(*this, "KEY%u", 0U)
42 		, m_leds(*this, "led%u", 0U)
43 	{ }
44 
45 	void pmd85(machine_config &config, bool with_uart = true);
46 	void pmd851(machine_config &config);
47 	void pmd853(machine_config &config);
48 	void pmd852a(machine_config &config);
49 	void alfa(machine_config &config);
50 	void c2717(machine_config &config);
51 	void mato(machine_config &config);
52 
53 	void init_mato();
54 	void init_pmd852a();
55 	void init_pmd851();
56 	void init_pmd852();
57 	void init_pmd853();
58 	void init_alfa();
59 	void init_c2717();
60 
61 	DECLARE_INPUT_CHANGED_MEMBER(pmd85_reset);
62 
63 private:
64 	enum
65 	{
66 		TIMER_CASSETTE
67 	};
68 
69 	bool m_txd, m_rts;
70 	uint8_t m_rom_module_present;
71 	uint8_t m_ppi_port_outputs[4][3];
72 	uint8_t m_startup_mem_map;
73 	uint8_t m_pmd853_memory_mapping;
74 	bool m_previous_level;
75 	bool m_clk_level;
76 	bool m_clk_level_tape;
77 	uint8_t m_model;
78 	emu_timer * m_cassette_timer;
79 	void (pmd85_state::*update_memory)();
80 	uint8_t io_r(offs_t offset);
81 	void io_w(offs_t offset, uint8_t data);
82 	uint8_t mato_io_r(offs_t offset);
83 	void mato_io_w(offs_t offset, uint8_t data);
84 
85 	virtual void machine_reset() override;
86 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
87 	TIMER_CALLBACK_MEMBER(cassette_timer_callback);
88 	uint8_t ppi0_porta_r();
89 	uint8_t ppi0_portb_r();
90 	uint8_t ppi0_portc_r();
91 	void ppi0_porta_w(uint8_t data);
92 	void ppi0_portb_w(uint8_t data);
93 	void ppi0_portc_w(uint8_t data);
94 	uint8_t mato_ppi0_portb_r();
95 	uint8_t mato_ppi0_portc_r();
96 	void mato_ppi0_portc_w(uint8_t data);
97 	uint8_t ppi1_porta_r();
98 	uint8_t ppi1_portb_r();
99 	uint8_t ppi1_portc_r();
100 	void ppi1_porta_w(uint8_t data);
101 	void ppi1_portb_w(uint8_t data);
102 	void ppi1_portc_w(uint8_t data);
103 	uint8_t ppi2_porta_r();
104 	uint8_t ppi2_portb_r();
105 	uint8_t ppi2_portc_r();
106 	void ppi2_porta_w(uint8_t data);
107 	void ppi2_portb_w(uint8_t data);
108 	void ppi2_portc_w(uint8_t data);
109 	uint8_t ppi3_porta_r();
110 	uint8_t ppi3_portb_r();
111 	uint8_t ppi3_portc_r();
112 	void ppi3_porta_w(uint8_t data);
113 	void ppi3_portb_w(uint8_t data);
114 	void ppi3_portc_w(uint8_t data);
115 
116 	void alfa_mem(address_map &map);
117 	void c2717_mem(address_map &map);
118 	void mato_io(address_map &map);
119 	void mato_mem(address_map &map);
120 	void pmd852a_mem(address_map &map);
121 	void pmd853_mem(address_map &map);
122 	void pmd85_io(address_map &map);
123 	void pmd85_mem(address_map &map);
124 
125 	virtual void machine_start() override;
126 
127 	void pmd851_update_memory();
128 	void pmd852a_update_memory();
129 	void pmd853_update_memory();
130 	void alfa_update_memory();
131 	void mato_update_memory();
132 	void c2717_update_memory();
133 	void common_driver_init();
134 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
135 
136 	required_device<cpu_device> m_maincpu;
137 	required_region_ptr<u8> m_rom;
138 	required_device<ram_device> m_ram;
139 	required_device<cassette_image_device> m_cassette;
140 	required_device<speaker_sound_device> m_speaker;
141 	required_device<pit8253_device> m_pit;
142 	optional_device<i8251_device> m_uart;
143 	optional_device<i8255_device> m_ppi0;
144 	optional_device<i8255_device> m_ppi1;
145 	optional_device<i8255_device> m_ppi2;
146 	optional_device<i8255_device> m_ppi3;
147 	optional_memory_bank_array<17> m_bank;
148 	optional_ioport m_io_dsw0;
149 	required_device<palette_device> m_palette;
150 	optional_ioport_array<16> m_io_keyboard;
151 	output_finder<3> m_leds;
152 };
153 
154 
155 #endif // MAME_INCLUDES_PMD85_H
156