1 // license:BSD-3-Clause
2 // copyright-holders:AJR
3 /**********************************************************************
4
5 AMD Am8052 Alphanumeric CRT Controller (CRTC)
6
7 Skeleton device.
8
9 **********************************************************************/
10
11 #include "emu.h"
12 #include "video/am8052.h"
13 //#include "screen.h"
14
15 //**************************************************************************
16 // GLOBAL VARIABLES
17 //**************************************************************************
18
19 // device type definition
20 DEFINE_DEVICE_TYPE(AM8052, am8052_device, "am8052", "Am8052 CRTC")
21
22 //**************************************************************************
23 // DEVICE IMPLEMENTATION
24 //**************************************************************************
25
26 //-------------------------------------------------
27 // am8052_device - constructor
28 //-------------------------------------------------
29
am8052_device(const machine_config & mconfig,const char * tag,device_t * owner,u32 clock)30 am8052_device::am8052_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
31 : device_t(mconfig, AM8052, tag, owner, clock)
32 , m_pointer(0x1f)
33 {
34 }
35
36
37 //-------------------------------------------------
38 // device_start - device-specific startup
39 //-------------------------------------------------
40
device_start()41 void am8052_device::device_start()
42 {
43 save_item(NAME(m_pointer));
44 }
45
46
47 //-------------------------------------------------
48 // pointer_w - set pointer register
49 //-------------------------------------------------
50
pointer_w(u16 data)51 void am8052_device::pointer_w(u16 data)
52 {
53 m_pointer = data & 0x1f;
54 }
55
56
57 //-------------------------------------------------
58 // data_w - write to data register
59 //-------------------------------------------------
60
data_w(u16 data)61 void am8052_device::data_w(u16 data)
62 {
63 switch (m_pointer)
64 {
65 case 0x00:
66 logerror("%s: Mode Register 1 = %04X\n", machine().describe_context(), data);
67 break;
68
69 case 0x01:
70 logerror("%s: Mode Register 2 = %04X\n", machine().describe_context(), data & 0xb7ff);
71 break;
72
73 case 0x02:
74 logerror("%s: Attribute Port Enable Register = %04X\n", machine().describe_context(), data & 0x67ff);
75 break;
76
77 case 0x03:
78 logerror("%s: Attribute Redefinition Register = %02X\n", machine().describe_context(), data & 0x001f);
79 break;
80
81 case 0x04:
82 logerror("%s: Top Of Page Soft Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
83 break;
84
85 case 0x05:
86 logerror("%s: Top Of Page Soft Register (LO) = %04X\n", machine().describe_context(), data);
87 break;
88
89 case 0x06:
90 logerror("%s: Top Of Window Soft Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
91 break;
92
93 case 0x07:
94 logerror("%s: Top Of Window Soft Register (LO) = %04X\n", machine().describe_context(), data);
95 break;
96
97 case 0x08:
98 logerror("%s: Attribute Flag Register = %02X (value) & %02X (mask)\n", machine().describe_context(), data & 0x00ff, (data & 0xff00) >> 8);
99 break;
100
101 case 0x09:
102 logerror("%s: Top Of Page Hard Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
103 break;
104
105 case 0x0a:
106 logerror("%s: Top Of Page Hard Register (LO) = %04X\n", machine().describe_context(), data);
107 break;
108
109 case 0x0b:
110 logerror("%s: Top Of Window Hard Register (HI) = %02X:%02X\n", machine().describe_context(), (data & 0x7f00) >> 8, data & 0x00ff);
111 break;
112
113 case 0x0c:
114 logerror("%s: Top Of Window Hard Register (LO) = %04X\n", machine().describe_context(), data);
115 break;
116
117 case 0x10:
118 logerror("%s: Burst Space Register = %02X\n", machine().describe_context(), (data & 0xff00) >> 8);
119 logerror("%s: Burst Count Register = %02X\n", machine().describe_context(), data & 0x00ff);
120 break;
121
122 case 0x11:
123 logerror("%s: Vertical Sync Width Register = %02X\n", machine().describe_context(), data & 0x003f);
124 logerror("%s: Vertical Scan Delay Register = %02X\n", machine().describe_context(), (data & 0x0fc0) >> 6);
125 break;
126
127 case 0x12:
128 logerror("%s: Vertical Active Lines Register = %03X\n", machine().describe_context(), data & 0x0fff);
129 break;
130
131 case 0x13:
132 logerror("%s: Vertical Total Lines Register = %03X\n", machine().describe_context(), data & 0x0fff);
133 break;
134
135 case 0x14:
136 logerror("%s: Horizontal Sync Width Register = %02X\n", machine().describe_context(), data & 0x00ff);
137 logerror("%s: Vertical Interrupt Register = %02X\n", machine().describe_context(), (data & 0xff00) >> 8);
138 break;
139
140 case 0x15:
141 logerror("%s: Horizontal Drive Register = %03X\n", machine().describe_context(), data & 0x01ff);
142 break;
143
144 case 0x16:
145 logerror("%s: Horizontal Scan Delay Register = %03X\n", machine().describe_context(), data & 0x01ff);
146 break;
147
148 case 0x17:
149 logerror("%s: Horizontal Total Count Register = %03X\n", machine().describe_context(), data & 0x03ff);
150 break;
151
152 case 0x18:
153 logerror("%s: Horizontal Total Display Register = %03X\n", machine().describe_context(), data & 0x03ff);
154 break;
155
156 default:
157 logerror("%s: Unknown Register (%02X) = %04X\n", machine().describe_context(), m_pointer, data);
158 break;
159 }
160 }
161