summaryrefslogtreecommitdiffstats
path: root/src/mame/drivers/lee1220.cpp
blob: ed82b0ce522d5ca61df4ef69cb2c552acc47f20f (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
// license:BSD-3-Clause
// copyright-holders:AJR
/****************************************************************************

    Skeleton driver for Lee Data 1220 terminal (IBM 3278-compatible).

****************************************************************************/

#include "emu.h"
#include "cpu/i8085/i8085.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/am9517a.h"
#include "machine/i8251.h"
#include "machine/pit8253.h"
//#include "machine/wd1933.h"
#include "video/mc6845.h"
#include "screen.h"

#include <algorithm>


class lee1220_state : public driver_device
{
public:
	lee1220_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag)
		, m_maincpu(*this, "maincpu")
		, m_crtc(*this, "crtc")
	{
	}

	void lee1220(machine_config &config);

protected:
	virtual void machine_start() override;

private:
	MC6845_UPDATE_ROW(update_row);

	u8 sdlc_r(offs_t offset);
	void sdlc_w(offs_t offset, u8 data);
	u8 c0_r();

	void mem_map(address_map &map);
	void io_map(address_map &map);

	required_device<cpu_device> m_maincpu;
	//required_device<wd1933_device> m_sdlc;
	required_device<hd6845s_device> m_crtc;

	u8 m_sdlc_reg[6];
};

void lee1220_state::machine_start()
{
	std::fill_n(&m_sdlc_reg[0], 6, 0);
	save_item(NAME(m_sdlc_reg));
}

MC6845_UPDATE_ROW(lee1220_state::update_row)
{
}


u8 lee1220_state::sdlc_r(offs_t offset)
{
	return m_sdlc_reg[offset]; //m_sdlc->read(~offset & 7);
}

void lee1220_state::sdlc_w(offs_t offset, u8 data)
{
	logerror("%s: Writing %02X to WD1933 register %d\n", machine().describe_context(), data, offset);
	m_sdlc_reg[offset] = data;
	//m_sdlc->write(~offset & 7, ~data);
}

u8 lee1220_state::c0_r()
{
	return 0;
}

void lee1220_state::mem_map(address_map &map)
{
	map(0x0000, 0x2fff).rom().region("program", 0);
	map(0x4000, 0x4fff).ram();
	map(0x7800, 0x7fff).ram();
	map(0x8000, 0xbfff).ram();
}

void lee1220_state::io_map(address_map &map)
{
	map(0x80, 0x8f).rw("dmac", FUNC(am9517a_device::read), FUNC(am9517a_device::write));
	map(0x90, 0x95).rw(FUNC(lee1220_state::sdlc_r), FUNC(lee1220_state::sdlc_w));
	map(0xa0, 0xa0).w("crtc", FUNC(hd6845s_device::address_w));
	map(0xa1, 0xa1).w("crtc", FUNC(hd6845s_device::register_w));
	map(0xb0, 0xb1).rw("usart", FUNC(i8251_device::read), FUNC(i8251_device::write));
	map(0xc0, 0xc0).r(FUNC(lee1220_state::c0_r));
	map(0xd0, 0xd3).w("pit", FUNC(pit8253_device::write));
}

static INPUT_PORTS_START(lee1220)
INPUT_PORTS_END

void lee1220_state::lee1220(machine_config &config)
{
	I8085A(config, m_maincpu, 10'000'000); // Intel P8085AH-2
	m_maincpu->set_addrmap(AS_PROGRAM, &lee1220_state::mem_map);
	m_maincpu->set_addrmap(AS_IO, &lee1220_state::io_map);

	AM9517A(config, "dmac", 5'000'000); // Intel P8237A-5

	I8748(config, "kbdmcu", 5.9904_MHz_XTAL);

	//WD1933(config, m_sdlc); // WDC WD1933PL-11

	i8251_device &usart(I8251(config, "usart", 0)); // NEC D8251AC
	usart.rxrdy_handler().set_inputline(m_maincpu, I8085_RST55_LINE);

	PIT8253(config, "pit"); // Intel D8253-5

	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
	screen.set_color(rgb_t::green());
	screen.set_raw(28'944'000, 1152, 0, 960, 420, 0, 400);
	screen.set_screen_update(m_crtc, FUNC(hd6845s_device::screen_update));

	HD6845S(config, m_crtc, 2'412'000); // Hitachi HD46505SP/HD6845SP
	m_crtc->set_screen("screen");
	m_crtc->set_show_border_area(false);
	m_crtc->set_char_width(12);
	m_crtc->set_update_row_callback(FUNC(lee1220_state::update_row));
}

// Main board XTALs: X1 = 28.944 MHz, X2 = 47.46816 MHz
// TTL daughterboard XTAL: X1 = 5.0688 MHz
// Keyboard XTAL: #20 = 5.9904 MHz
ROM_START(lee1220)
	ROM_REGION(0x3000, "program", 0)
	ROM_LOAD("13260303.u21", 0x0000, 0x1000, CRC(28692f78) SHA1(60957e773cb4350d82b02db8f741bd32a43365f1))
	ROM_LOAD("13260403.u22", 0x1000, 0x1000, CRC(3c54a251) SHA1(8d2849a2590be5cf765d26ff80a170b263a4b080))
	ROM_LOAD("13260503.u23", 0x2000, 0x1000, CRC(0872e674) SHA1(24d07a2cfccf03e90334daea810fe0e7c533e5ec))

	ROM_REGION(0x400, "kbdmcu", 0)
	ROM_LOAD("03278_d8748.2", 0x000, 0x400, CRC(a63ce4d8) SHA1(a713f3aae5e9096a627fab13573eee2170b42b1a))
ROM_END

COMP(1983, lee1220, 0, 0, lee1220, lee1220, lee1220_state, empty_init, "Lee Data", "1220 Display Terminal", MACHINE_IS_SKELETON)