summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/dec_lk201.h
blob: 87a7e45a65d98a63e22b668eef25321ba4375a24 (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
// license:BSD-3-Clause
// copyright-holders:R. Belmont, M. Burke
#ifndef MAME_MACHINE_DEC_LK201_H
#define MAME_MACHINE_DEC_LK201_H

#pragma once

#include "sound/beep.h"

#include "diserial.h"


//**************************************************************************
//  MACROS / CONSTANTS
//**************************************************************************

#define LK_CMD_LEDS_ON          0x13    /* light LEDs - 1st param: led bitmask */
#define LK_CMD_LEDS_OFF         0x11    /* turn off LEDs */

#define LK_CMD_DIS_KEYCLK       0x99    /* disable the keyclick */
#define LK_CMD_ENB_KEYCLK       0x1b    /* enable the keyclick - 1st param: volume */
#define LK_CMD_DIS_CTLCLK       0xb9    /* disable the Ctrl keyclick */
#define LK_CMD_ENB_CTLCLK       0xbb    /* enable the Ctrl keyclick */
#define LK_CMD_SOUND_CLK        0x9f    /* emit a keyclick  - 1st param: volume */
#define LK_CMD_DIS_BELL         0xa1    /* disable the bell */
#define LK_CMD_ENB_BELL         0x23    /* enable the bell - 1st param: volume */
#define LK_CMD_BELL             0xa7    /* emit a bell - 1st param: volume */

// TCR - Timer Compare Register
#define TCR_OCIE 0x40 // Bit 6 (output compare IRQ enable)
#define TCR_OLVL 0x01 // Bit 1 (output level)

// TSR - Timer Status Register
#define TSR_OCFL 0x40 // TSR (68HC05 output compare flag)


//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// ======================> lk201_device

class lk201_device : public device_t, public device_serial_interface
{
public:
	// construction/destruction
	lk201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);

	uint8_t ddr_r(offs_t offset);
	void ddr_w(offs_t offset, uint8_t data);
	uint8_t ports_r(offs_t offset);
	void ports_w(offs_t offset, uint8_t data);
	uint8_t sci_r(offs_t offset);
	void sci_w(offs_t offset, uint8_t data);
	uint8_t spi_r(offs_t offset);
	void spi_w(offs_t offset, uint8_t data);
	uint8_t timer_r(offs_t offset);
	void timer_w(offs_t offset, uint8_t data);

	auto tx_handler() { return m_tx_handler.bind(); }

	void lk201_map(address_map &map);
protected:
	// device-level overrides
	virtual void device_add_mconfig(machine_config &config) override;
	virtual const tiny_rom_entry *device_rom_region() const override;
	virtual ioport_constructor device_input_ports() const override;
	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;

	// device_serial overrides
	virtual void rcv_complete() override;    // Rx completed receiving byte
	virtual void tra_complete() override;    // Tx completed sending byte
	virtual void tra_callback() override;    // Tx send bit

private:
	uint8_t ddrs[3];
	uint8_t ports[3];
	uint8_t led_data;
	uint8_t kbd_data;

	union {
		struct {
			uint8_t tcr;
			uint8_t tsr;
			uint8_t icrh;
			uint8_t icrl;
			uint8_t ocrh;
			uint8_t ocrl;
			uint8_t crh;
			uint8_t crl;
			uint8_t acrh;
			uint8_t acrl;
		};
		uint8_t regs[10];
	} m_timer;

	emu_timer *m_count;
	emu_timer *m_beeper;

	uint8_t sci_ctl2;
	uint8_t sci_status;
	//uint8_t sci_data;

	uint8_t spi_status;
	uint8_t spi_data;

	required_device<cpu_device> m_maincpu;
	required_device<beep_device> m_speaker;

	required_ioport_array<18> m_kbd;

	output_finder<> m_led_wait;
	output_finder<> m_led_compose;
	output_finder<> m_led_lock;
	output_finder<> m_led_hold;

	void send_port(uint8_t offset, uint8_t data);
	void update_interrupts();

	int m_kbd_state;

	devcb_write_line m_tx_handler;
};

// device type definition
DECLARE_DEVICE_TYPE(LK201, lk201_device)

#endif // MAME_MACHINE_DEC_LK201_H