summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/atari/stkbd.h
blob: 00320663a0d456c167f7b192067607a1111fa841 (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
// license:BSD-3-Clause
// copyright-holders:Curt Coder, Olivier Galibert

#ifndef MAME_ATARI_STKBD_H
#define MAME_ATARI_STKBD_H

// Atari ST family keyboard implementation

// Composed of a hd6301 that scans the keyboard, manages the two atari
// joystick ports (one for mouse or joystick, one for joystick).
// Communicates with the main cpu through serial.

#include "cpu/m6800/m6801.h"

class st_kbd_device : public device_t {
public:
	st_kbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);

	void tx_w(int state);
	auto rx_cb() { return m_rx_cb.bind(); }

protected:
	virtual void device_start() override ATTR_COLD;
	virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
	virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
	virtual ioport_constructor device_input_ports() const override ATTR_COLD;

private:
	enum {
		PHASE_STATIC,
		PHASE_POSITIVE,
		PHASE_NEGATIVE
	};

	static const int mouse_xya[3][4];
	static const int mouse_xyb[3][4];

	required_device<hd6301_cpu_device> m_cpu;
	output_finder<> m_led;
	devcb_write_line m_rx_cb;
	required_ioport_array<16> m_keys;
	required_ioport_array<2> m_joy;
	required_ioport m_mousex;
	required_ioport m_mousey;
	required_ioport m_mouseb;
	required_ioport m_config;

	uint16_t m_keylatch;
	uint8_t m_mouse;
	uint8_t m_mouse_x;
	uint8_t m_mouse_y;
	uint8_t m_mouse_px;
	uint8_t m_mouse_py;
	uint8_t m_mouse_pc;
	int m_tx;
	int m_joy_disabled;
	emu_timer *m_mouse_timer;

	TIMER_CALLBACK_MEMBER(mouse_tick);

	uint8_t port1_r();
	uint8_t port2_r();
	void port2_w(uint8_t data);
	void port3_w(uint8_t data);
	uint8_t port4_r();
	void port4_w(uint8_t data);
};

DECLARE_DEVICE_TYPE(ST_KBD, st_kbd_device)

#endif