summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/includes/hh_tms1k.h
blob: 1ab7b2cce9015c0620e7052740e5f197b745db8c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// license:BSD-3-Clause
// copyright-holders:hap, Sean Riddle, Kevin Horton
/*

  TMS1000 MCU series tabletops/handhelds or other simple devices.

*/

#ifndef _HH_TMS1K_H_
#define _HH_TMS1K_H_


#include "emu.h"
#include "cpu/tms0980/tms0980.h"
#include "sound/speaker.h"


class hh_tms1k_state : public driver_device
{
public:
	hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag),
		m_maincpu(*this, "maincpu"),
		m_inp_matrix(*this, "IN"),
		m_speaker(*this, "speaker"),
		m_display_wait(33),
		m_display_maxy(1),
		m_display_maxx(0)
	{ }

	// devices
	required_device<cpu_device> m_maincpu;
	optional_ioport_array<7> m_inp_matrix; // max 7
	optional_device<speaker_sound_device> m_speaker;

	// misc common
	UINT16 m_r;                         // MCU R-pins data
	UINT16 m_o;                         // MCU O-pins data
	UINT16 m_inp_mux;                   // multiplexed inputs mask
	bool m_power_on;

	UINT8 read_inputs(int columns);
	DECLARE_INPUT_CHANGED_MEMBER(power_button);
	DECLARE_WRITE_LINE_MEMBER(auto_power_off);

	// display common
	int m_display_wait;                 // led/lamp off-delay in microseconds (default 33ms)
	int m_display_maxy;                 // display matrix number of rows
	int m_display_maxx;                 // display matrix number of columns

	UINT32 m_display_state[0x20];       // display matrix rows data
	UINT16 m_display_segmask[0x20];     // if not 0, display matrix row is a digit, mask indicates connected segments
	UINT32 m_display_cache[0x20];       // (internal use)
	UINT8 m_display_decay[0x20][0x20];  // (internal use)

	TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
	void display_update();
	void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety);

	// game-specific handlers
	void mathmagi_display();
	DECLARE_WRITE16_MEMBER(mathmagi_write_r);
	DECLARE_WRITE16_MEMBER(mathmagi_write_o);
	DECLARE_READ8_MEMBER(mathmagi_read_k);

	void amaztron_display();
	DECLARE_WRITE16_MEMBER(amaztron_write_r);
	DECLARE_WRITE16_MEMBER(amaztron_write_o);
	DECLARE_READ8_MEMBER(amaztron_read_k);

	void tc4_display();
	DECLARE_WRITE16_MEMBER(tc4_write_r);
	DECLARE_WRITE16_MEMBER(tc4_write_o);
	DECLARE_READ8_MEMBER(tc4_read_k);

	void ebball_display();
	DECLARE_WRITE16_MEMBER(ebball_write_r);
	DECLARE_WRITE16_MEMBER(ebball_write_o);
	DECLARE_READ8_MEMBER(ebball_read_k);

	void ebball2_display();
	DECLARE_WRITE16_MEMBER(ebball2_write_r);
	DECLARE_WRITE16_MEMBER(ebball2_write_o);
	DECLARE_READ8_MEMBER(ebball2_read_k);

	void ebball3_display();
	DECLARE_WRITE16_MEMBER(ebball3_write_r);
	DECLARE_WRITE16_MEMBER(ebball3_write_o);
	DECLARE_READ8_MEMBER(ebball3_read_k);
	void ebball3_set_clock();
	DECLARE_INPUT_CHANGED_MEMBER(ebball3_difficulty_switch);
	DECLARE_MACHINE_RESET(ebball3);

	DECLARE_WRITE16_MEMBER(elecdet_write_r);
	DECLARE_WRITE16_MEMBER(elecdet_write_o);
	DECLARE_READ8_MEMBER(elecdet_read_k);

	void starwbc_display();
	DECLARE_WRITE16_MEMBER(starwbc_write_r);
	DECLARE_WRITE16_MEMBER(starwbc_write_o);
	DECLARE_READ8_MEMBER(starwbc_read_k);

	DECLARE_WRITE16_MEMBER(comp4_write_r);
	DECLARE_WRITE16_MEMBER(comp4_write_o);
	DECLARE_READ8_MEMBER(comp4_read_k);

	DECLARE_WRITE16_MEMBER(simon_write_r);
	DECLARE_WRITE16_MEMBER(simon_write_o);
	DECLARE_READ8_MEMBER(simon_read_k);

	DECLARE_WRITE16_MEMBER(ssimon_write_r);
	DECLARE_WRITE16_MEMBER(ssimon_write_o);
	DECLARE_READ8_MEMBER(ssimon_read_k);

	DECLARE_WRITE16_MEMBER(cnsector_write_r);
	DECLARE_WRITE16_MEMBER(cnsector_write_o);
	DECLARE_READ8_MEMBER(cnsector_read_k);

	DECLARE_WRITE16_MEMBER(merlin_write_r);
	DECLARE_WRITE16_MEMBER(merlin_write_o);
	DECLARE_READ8_MEMBER(merlin_read_k);

	DECLARE_WRITE16_MEMBER(stopthief_write_r);
	DECLARE_WRITE16_MEMBER(stopthief_write_o);
	DECLARE_READ8_MEMBER(stopthief_read_k);

	DECLARE_WRITE16_MEMBER(bankshot_write_r);
	DECLARE_WRITE16_MEMBER(bankshot_write_o);
	DECLARE_READ8_MEMBER(bankshot_read_k);

	DECLARE_WRITE16_MEMBER(splitsec_write_r);
	DECLARE_WRITE16_MEMBER(splitsec_write_o);
	DECLARE_READ8_MEMBER(splitsec_read_k);

	void tandy12_display();
	DECLARE_WRITE16_MEMBER(tandy12_write_r);
	DECLARE_WRITE16_MEMBER(tandy12_write_o);
	DECLARE_READ8_MEMBER(tandy12_read_k);

protected:
	virtual void machine_start();
	virtual void machine_reset();
};


// LED segments
enum
{
	lA = 0x01,
	lB = 0x02,
	lC = 0x04,
	lD = 0x08,
	lE = 0x10,
	lF = 0x20,
	lG = 0x40,
	lDP = 0x80
};


#endif /* _HH_TMS1K_H_ */