summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/esqvfd.h
blob: 3b0e008ed5e4be998b573c4f31b28f10bb4dfae4 (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
// license:BSD-3-Clause
// copyright-holders:R. Belmont
#ifndef MAME_MACHINE_ESQVFD_H
#define MAME_MACHINE_ESQVFD_H

#include <memory>
#include <tuple>


class esqvfd_device : public device_t {
public:
	void write(uint8_t data) { write_char(data); }

	virtual void write_char(int data) = 0;
	virtual void update_display();
	virtual bool write_contents(std::ostream &o) { return false; }

	// why isn't the font just stored in this order?
	static uint32_t conv_segments(uint16_t segin) { return bitswap<15>(segin, 12, 11, 7, 6, 4, 10, 3, 14, 15, 0, 13, 9, 5, 1, 2); }

protected:
	class output_helper {
	public:
		typedef std::unique_ptr<output_helper> ptr;
		virtual ~output_helper() { }
		virtual void resolve() = 0;
		virtual int32_t set(unsigned n, int32_t value) = 0;
	};

	template <unsigned N> class output_helper_impl : public output_helper, protected output_manager::output_finder<void, N> {
	public:
		output_helper_impl(device_t &device) : output_manager::output_finder<void, N>(device, "vfd%u", 0U) { }
		virtual void resolve() override { output_manager::output_finder<void, N>::resolve(); }
		virtual int32_t set(unsigned n, int32_t value) override { return this->operator[](n) = value; }
	};

	typedef std::tuple<output_helper::ptr, int, int> dimensions_param;

	template <int R, int C> static dimensions_param make_dimensions(device_t &device) { return dimensions_param(std::make_unique<output_helper_impl<R * C> >(device), R, C); }

	esqvfd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, dimensions_param &&dimensions);

	static constexpr uint8_t AT_NORMAL      = 0x00;
	static constexpr uint8_t AT_BOLD        = 0x01;
	static constexpr uint8_t AT_UNDERLINE   = 0x02;
	static constexpr uint8_t AT_BLINK       = 0x04;
	static constexpr uint8_t AT_BLINKED     = 0x80;   // set when character should be blinked off

	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;

	output_helper::ptr m_vfds;
	int m_cursx, m_cursy;
	int m_savedx, m_savedy;
	int const m_rows, m_cols;
	uint8_t m_curattr;
	uint8_t m_lastchar;
	uint8_t m_chars[2][40];
	uint8_t m_attrs[2][40];
	uint8_t m_dirty[2][40];
};

class esq1x22_device : public esqvfd_device {
public:
	esq1x22_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	virtual void write_char(int data) override;

protected:
	virtual void device_add_mconfig(machine_config &config) override;

private:
};

class esq2x40_device : public esqvfd_device {
public:
	esq2x40_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	virtual void write_char(int data) override;
	virtual bool write_contents(std::ostream &o) override;

protected:
	virtual void device_add_mconfig(machine_config &config) override;
};

class esq2x40_sq1_device : public esqvfd_device {
public:
	esq2x40_sq1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	virtual void write_char(int data) override;

protected:
	virtual void device_add_mconfig(machine_config &config) override;

private:
	bool m_wait87shift, m_wait88shift;
};

DECLARE_DEVICE_TYPE(ESQ1X22,     esq1x22_device)
DECLARE_DEVICE_TYPE(ESQ2X40,     esq2x40_device)
DECLARE_DEVICE_TYPE(ESQ2X40_SQ1, esq2x40_sq1_device)

#endif // MAME_MACHINE_ESQVFD_H