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
|
// license:BSD-3-Clause
// copyright-holders:AJR
/**********************************************************************
AMD Am8052 Alphanumeric CRT Controller (CRTC)
Skeleton device.
**********************************************************************/
#include "emu.h"
#include "video/am8052.h"
//#include "screen.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// device type definition
DEFINE_DEVICE_TYPE(AM8052, am8052_device, "am8052", "Am8052 CRTC")
//**************************************************************************
// DEVICE IMPLEMENTATION
//**************************************************************************
//-------------------------------------------------
// am8052_device - constructor
//-------------------------------------------------
am8052_device::am8052_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, AM8052, tag, owner, clock)
, m_pointer(0x1f)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void am8052_device::device_start()
{
save_item(NAME(m_pointer));
}
//-------------------------------------------------
// pointer_w - set pointer register
//-------------------------------------------------
void am8052_device::pointer_w(u16 data)
{
m_pointer = data & 0x1f;
}
//-------------------------------------------------
// data_w - write to data register
//-------------------------------------------------
void am8052_device::data_w(u16 data)
{
switch (m_pointer)
{
case 0x00:
logerror("%s: Mode Register 1 = %04X\n", machine().describe_context(), data);
break;
case 0x01:
logerror("%s: Mode Register 2 = %04X\n", machine().describe_context(), data & 0xb7ff);
break;
case 0x02:
logerror("%s: Attribute Port Enable Register = %04X\n", machine().describe_context(), data & 0x67ff);
break;
case 0x03:
logerror("%s: Attribute Redefinition Register = %02X\n", machine().describe_context(), data & 0x001f);
break;
case 0x04:
logerror("%s: Top Of Page Soft Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
break;
case 0x05:
logerror("%s: Top Of Page Soft Register (LO) = %04X\n", machine().describe_context(), data);
break;
case 0x06:
logerror("%s: Top Of Window Soft Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
break;
case 0x07:
logerror("%s: Top Of Window Soft Register (LO) = %04X\n", machine().describe_context(), data);
break;
case 0x08:
logerror("%s: Attribute Flag Register = %02X (value) & %02X (mask)\n", machine().describe_context(), data & 0x00ff, (data & 0xff00) >> 8);
break;
case 0x09:
logerror("%s: Top Of Page Hard Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
break;
case 0x0a:
logerror("%s: Top Of Page Hard Register (LO) = %04X\n", machine().describe_context(), data);
break;
case 0x0b:
logerror("%s: Top Of Window Hard Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
break;
case 0x0c:
logerror("%s: Top Of Window Hard Register (LO) = %04X\n", machine().describe_context(), data);
break;
case 0x10:
logerror("%s: Burst Space Register = %02X\n", machine().describe_context(), (data & 0xff00) >> 8);
logerror("%s: Burst Count Register = %02X\n", machine().describe_context(), data & 0x00ff);
break;
case 0x11:
logerror("%s: Vertical Sync Width Register = %02X\n", machine().describe_context(), data & 0x003f);
logerror("%s: Vertical Scan Delay Register = %02X\n", machine().describe_context(), (data & 0x0fc0) >> 6);
break;
case 0x12:
logerror("%s: Vertical Active Lines Register = %03X\n", machine().describe_context(), data & 0x0fff);
break;
case 0x13:
logerror("%s: Vertical Total Lines Register = %03X\n", machine().describe_context(), data & 0x0fff);
break;
case 0x14:
logerror("%s: Horizontal Sync Width Register = %02X\n", machine().describe_context(), data & 0x00ff);
logerror("%s: Vertical Interrupt Register = %02X\n", machine().describe_context(), (data & 0xff00) >> 8);
break;
case 0x15:
logerror("%s: Horizontal Drive Register = %03X\n", machine().describe_context(), data & 0x01ff);
break;
case 0x16:
logerror("%s: Horizontal Scan Delay Register = %03X\n", machine().describe_context(), data & 0x01ff);
break;
case 0x17:
logerror("%s: Horizontal Total Count Register = %03X\n", machine().describe_context(), data & 0x03ff);
break;
case 0x18:
logerror("%s: Horizontal Total Display Register = %03X\n", machine().describe_context(), data & 0x03ff);
break;
default:
logerror("%s: Unknown Register (%02X) = %04X\n", machine().describe_context(), m_pointer, data);
break;
}
}
|