summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/vt50/vt50.h
blob: ac664b1f31865eba37af8d8249abb91735de2410 (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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
// license:BSD-3-Clause
// copyright-holders:AJR

#ifndef MAME_CPU_VT50_VT50_H
#define MAME_CPU_VT50_VT50_H

#pragma once

class vt5x_cpu_device : public cpu_device, public device_video_interface
{
public:
	enum {
		VT5X_PC, VT5X_PAGE,
		VT5X_MODE, VT5X_DONE,
		VT5X_AC, VT5X_B, VT5X_X, VT5X_Y, VT5X_X8, VT5X_XYAD,
		VT5X_CFF, VT5X_VID
	};

	// callback configuration
	auto baud_9600_callback() { return m_baud_9600_callback.bind(); }
	auto vert_count_callback() { return m_vert_count_callback.bind(); }
	auto uart_rd_callback() { return m_uart_rd_callback.bind(); }
	auto uart_xd_callback() { return m_uart_xd_callback.bind(); }
	auto ur_flag_callback() { return m_ur_flag_callback.bind(); }
	auto ut_flag_callback() { return m_ut_flag_callback.bind(); }
	auto ruf_callback() { return m_ruf_callback.bind(); }
	auto key_up_callback() { return m_key_up_callback.bind(); }
	auto kclk_callback() { return m_kclk_callback.bind(); }
	auto frq_callback() { return m_frq_callback.bind(); }
	auto bell_callback() { return m_bell_callback.bind(); }
	auto cen_callback() { return m_cen_callback.bind(); }
	auto ccf_callback() { return m_ccf_callback.bind(); }
	auto csf_callback() { return m_csf_callback.bind(); }
	auto char_data_callback() { return m_char_data_callback.bind(); }

	// screen update method
	u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);

protected:
	// construction/destruction
	vt5x_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, const XTAL &clock, int bbits, int ybits);

	// device-level overrides
	virtual void device_config_complete() override;
	virtual void device_resolve_objects() override;
	virtual void device_start() override;
	virtual void device_reset() override;

	// device_execute_interface overrides
	virtual void execute_run() override;

	// device_memory_interface overrides
	virtual space_config_vector memory_space_config() const override;

	// device_state_interface overrides
	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;

	// video helpers
	void draw_char_line();

	// address translation
	offs_t translate_xy() const;

	// execution helpers
	void execute_te(u8 inst);
	void execute_tf(u8 inst);
	virtual void execute_tw(u8 inst);
	virtual void execute_tg(u8 inst) = 0;
	virtual void execute_th(u8 inst);
	void execute_tj(u8 dest);
	void clock_video_counters();

	// address spaces
	address_space_config m_rom_config;
	address_space_config m_ram_config;
	memory_access<10, 0, 0, ENDIANNESS_LITTLE>::cache m_rom_cache;
	memory_access<11, 0, 0, ENDIANNESS_LITTLE>::cache m_ram_cache;

	// device callbacks
	devcb_write_line m_baud_9600_callback;
	devcb_write8 m_vert_count_callback;
	devcb_read8 m_uart_rd_callback;
	devcb_write8 m_uart_xd_callback;
	devcb_read_line m_ur_flag_callback;
	devcb_read_line m_ut_flag_callback;
	devcb_write_line m_ruf_callback;
	devcb_read8 m_key_up_callback;
	devcb_read_line m_kclk_callback;
	devcb_read_line m_frq_callback;
	devcb_write_line m_bell_callback;
	devcb_write_line m_cen_callback;
	devcb_read_line m_csf_callback;
	devcb_read_line m_ccf_callback;
	devcb_read8 m_char_data_callback;

	// register dimensions
	const u8 m_bbits;
	const u8 m_ybits;

	// internal state
	u16 m_pc;
	u8 m_rom_page;
	bool m_mode_ff;
	bool m_done_ff;
	u8 m_ac;
	u8 m_buffer;
	u8 m_x;
	u8 m_y;
	bool m_x8;
	bool m_cursor_ff;
	bool m_cursor_active;
	bool m_video_process;
	u8 m_ram_do;

	// execution phases
	u8 m_t;
	bool m_write_ff;
	bool m_flag_test_ff;
	bool m_m2u_ff;
	bool m_bell_ff;
	bool m_load_pc;
	s32 m_icount;

	// video timing
	u8 m_horiz_count;
	u16 m_vert_count;
	bool m_top_of_screen;
	u16 m_current_line;
	u16 m_first_line;

	// display bitmap
	bitmap_rgb32 m_bitmap;
};

class vt50_cpu_device : public vt5x_cpu_device
{
public:
	// device type constructor
	vt50_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);

protected:
	// device_disasm_interface overrides
	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;

	virtual void execute_tg(u8 inst) override;
};

class vt52_cpu_device : public vt5x_cpu_device
{
public:
	// device type constructor
	vt52_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);

	auto graphic_callback() { return m_graphic_callback.bind(); }

protected:
	// device-level overrides
	virtual void device_resolve_objects() override;

	// device_disasm_interface overrides
	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;

	virtual void execute_tw(u8 inst) override;
	virtual void execute_tg(u8 inst) override;
	virtual void execute_th(u8 inst) override;

private:
	devcb_write8 m_graphic_callback;
};

DECLARE_DEVICE_TYPE(VT50_CPU, vt50_cpu_device)
DECLARE_DEVICE_TYPE(VT52_CPU, vt52_cpu_device)

#endif // MAME_CPU_VT50_VT50_H