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