2 * firmware initialization code for Trident Blade3d graphics adapter
3 * written by Fuger Shen 2003-10-10
4 * (C) 2003 XGI Technology Inc.
5 * This code is released under GPL with permission from XGI
12 #include <console/console.h>
13 #include <device/device.h>
14 #include <device/pci.h>
15 #include <device/pci_ids.h>
16 #include <device/pci_ops.h>
19 //----------------------------------------------------------------------------//
21 // Fuger Shen 2003-10-10
22 //----------------------------------------------------------------------------//
25 #define outp(port,val) outb(val, port)
27 #define WORD unsigned int
28 #define BYTE unsigned char
29 #define DWORD unsigned long
31 #define SGRAMTimg 0x27
32 #define CHIPREV 0x3 //1,RA 2,RB,3,RC
34 #define Port_SRX 0x3c4
35 #define Port_CRX 0x3d4
36 #define Port_GRX 0x3ce
37 #define Port_BRX 0x3c0
39 static BYTE Mem_Clk_Table[][2] = {
40 //For EDO, 3x5.2a.3:2=01 3x4.28.2:0
41 { 0x50, 0x46 }, //000, F_78
42 { 0xCF, 0x51 }, //001, F_81 = 81.011Mhz
43 { 0x30, 0x83 }, //010, F_40 = 40.006Mhz
44 { 0x1B, 0x43 }, //011, F_50 = 49.999MHz
45 { 0x22, 0x43 }, //100, F_60 = 59.999MHz
46 { 0x42, 0x46 }, //101, F_66 = 65.988MHz
47 { 0x33, 0x44 }, //110, F_70 = 69.999Mhz
48 { 0x22, 0x42 }, //111, F_75 = 74,999Mhz
49 //for SGRAM, 3x5.2a.3:2=1x
50 { 0x3A, 0x05 }, //000, F_135
51 { 0x38, 0x05 }, //001, F_130
52 { 0x44, 0x44 }, //010, F_90 = 89.999MHz
53 { 0x22, 0x04 }, //011, F_100=100.227MHz
54 { 0x0E, 0x01 }, //100, F_105
55 { 0x3D, 0x07 }, //101, F_110=109.989Mhz
56 { 0x22, 0x03 }, //110, F_120=119.999MHz
57 { 0x36, 0x05 }, //111, F_125
61 typedef struct Reg_struct {
68 typedef Def_Reg_struct* lpDef_Reg_struct;
69 // , *pDef_Reg_struct, far * lpDef_Reg_struct;
71 static Def_Reg_struct Mode3_temp[] = { //mode3 temp
72 //port index value mask
73 {Port_CRX, 0x00, 0x5F, 0x00},
74 {Port_CRX, 0x01, 0x4F, 0x00},
75 {Port_CRX, 0x02, 0x50, 0x00},
76 {Port_CRX, 0x03, 0x82, 0x00},
77 {Port_CRX, 0x04, 0x55, 0x00},
78 {Port_CRX, 0x05, 0x81, 0x00},
79 {Port_CRX, 0x06, 0xBF, 0x00},
80 {Port_CRX, 0x07, 0x1F, 0x00},
81 {Port_CRX, 0x08, 0x00, 0x00},
82 {Port_CRX, 0x09, 0xC7, 0x00},
83 {Port_CRX, 0x0a, 0x06, 0x00},
84 {Port_CRX, 0x0b, 0x07, 0x00},
85 {Port_CRX, 0x0c, 0x00, 0x00},
86 {Port_CRX, 0x0d, 0x00, 0x00},
87 {Port_CRX, 0x0e, 0x00, 0x00},
88 {Port_CRX, 0x0f, 0x00, 0x00},
89 {Port_CRX, 0x10, 0x9C, 0x00},
90 {Port_CRX, 0x11, 0x8E, 0x00},
91 {Port_CRX, 0x12, 0x8F, 0x00},
92 {Port_CRX, 0x13, 0x28, 0x00},
93 {Port_CRX, 0x14, 0x1F, 0x00},
94 {Port_CRX, 0x15, 0x96, 0x00},
95 {Port_CRX, 0x16, 0xB9, 0x00},
96 {Port_CRX, 0x17, 0xA3, 0x00},
97 {Port_CRX, 0x18, 0xFF, 0x00},
100 WORD Length_Mode3_temp = sizeof(Mode3_temp) / sizeof(Def_Reg_struct);
102 Def_Reg_struct Mode3_reg[] = { //mode3
103 //port index value mask
104 {Port_CRX, 0x00, 0x5F, 0x00}, //3d5
105 {Port_CRX, 0x01, 0x4F, 0x00},
106 {Port_CRX, 0x02, 0x50, 0x00},
107 {Port_CRX, 0x03, 0x82, 0x00},
108 {Port_CRX, 0x04, 0x55, 0x00},
109 {Port_CRX, 0x05, 0x81, 0x00},
110 {Port_CRX, 0x06, 0xBF, 0x00},
111 {Port_CRX, 0x07, 0x1F, 0x00},
112 {Port_CRX, 0x08, 0x00, 0x00},
113 {Port_CRX, 0x09, 0x4F, 0x00},
114 {Port_CRX, 0x0a, 0x0D, 0x00},
115 {Port_CRX, 0x0b, 0x0E, 0x00},
116 {Port_CRX, 0x0c, 0x00, 0x00},
117 {Port_CRX, 0x0d, 0x00, 0x00},
118 {Port_CRX, 0x0e, 0x00, 0x00},
119 {Port_CRX, 0x0f, 0x00, 0x00},
120 {Port_CRX, 0x10, 0x9C, 0x00},
121 {Port_CRX, 0x11, 0x8E, 0x00},
122 {Port_CRX, 0x12, 0x8F, 0x00},
123 {Port_CRX, 0x13, 0x28, 0x00},
124 {Port_CRX, 0x14, 0x1F, 0x00},
125 {Port_CRX, 0x15, 0x96, 0x00},
126 {Port_CRX, 0x16, 0xB9, 0x00},
127 {Port_CRX, 0x17, 0xA3, 0x00},
128 {Port_CRX, 0x18, 0xFF, 0x00},
131 {Port_BRX, 0x00, 0x00, 0x00},
132 {Port_BRX, 0x01, 0x01, 0x00},
133 {Port_BRX, 0x02, 0x02, 0x00},
134 {Port_BRX, 0x03, 0x03, 0x00},
135 {Port_BRX, 0x04, 0x04, 0x00},
136 {Port_BRX, 0x05, 0x05, 0x00},
137 {Port_BRX, 0x06, 0x14, 0x00},
138 {Port_BRX, 0x07, 0x07, 0x00},
139 {Port_BRX, 0x08, 0x38, 0x00},
140 {Port_BRX, 0x09, 0x39, 0x00},
141 {Port_BRX, 0x0a, 0x3A, 0x00},
142 {Port_BRX, 0x0b, 0x3B, 0x00},
143 {Port_BRX, 0x0c, 0x3C, 0x00},
144 {Port_BRX, 0x0d, 0x3D, 0x00},
145 {Port_BRX, 0x0e, 0x3E, 0x00},
146 {Port_BRX, 0x0f, 0x3F, 0x00},
147 {Port_BRX, 0x10, 0x0C, 0x00},
148 {Port_BRX, 0x11, 0x00, 0x00},
149 {Port_BRX, 0x12, 0x0F, 0x00},
150 {Port_BRX, 0x13, 0x08, 0x00},
151 {Port_BRX, 0x14, 0x00, 0x00},
153 {Port_SRX, 0x00, 0x03, 0x00},
154 {Port_SRX, 0x01, 0x00, 0x00},
155 {Port_SRX, 0x02, 0x03, 0x00},
156 {Port_SRX, 0x03, 0x00, 0x00},
157 {Port_SRX, 0x04, 0x02, 0x00},
158 {Port_SRX, 0x18, 0xa6, 0x00}, //VCLK
159 {Port_SRX, 0x19, 0xc9, 0x00},
160 {Port_SRX, 0x0D, 0x20, 0x00},
161 {Port_SRX, 0x12, 0x11, 0x00},
163 {Port_CRX, 0x19, 0x4a, 0x00},
164 //{Port_CRX, 0x20, 0x20, 0x00},
165 //{Port_CRX, 0x23, 0x00, 0x00},
166 //{Port_CRX, 0x1E, 0x89, 0x00},
167 {Port_CRX, 0x21, 0xce, 0x00},
168 //{Port_CRX, 0x25, 0x07, 0x00},
169 //{Port_CRX, 0x27, 0x08, 0x00},
170 //{Port_CRX, 0x2B, 0x00, 0x00},
171 //{Port_CRX, 0x29, 0x04, 0x00},
172 //{Port_CRX, 0x2F, 0x22, 0x00},
173 {Port_CRX, 0x37, 0x81, 0x00},
174 //{Port_CRX, 0x38, 0x00, 0x00},
175 //{Port_CRX, 0x3b, 0x01, 0x00},
176 {Port_CRX, 0x56, 0x00, 0x00},
177 {Port_CRX, 0x57, 0x54, 0x00},
179 {Port_GRX, 0x05, 0x10, 0x00},
180 {Port_GRX, 0x06, 0x0e, 0x00}, //
181 {Port_GRX, 0x0F, 0x20, 0x00},
182 //{Port_GRX, 0x31, 0x06, 0x00},
183 //{Port_GRX, 0x33, 0x30, 0x00},
184 //{Port_GRX, 0x52, 0x10, 0x00},
187 static WORD Length_Mode3_reg = sizeof(Mode3_reg) / sizeof(Def_Reg_struct);
189 static Def_Reg_struct Init_reg[] = {
190 //port index value mask
191 {Port_GRX, 0x25, 0x00, 0x00},
192 {Port_GRX, 0x21, 0x00, 0x00},
193 {Port_GRX, 0x22, 0x00, 0x00},
194 {Port_GRX, 0x26, 0x08, 0x00},
195 {Port_GRX, 0x27, 0x00, 0x00},
196 {Port_GRX, 0x28, 0xFF, 0x00},
197 {Port_GRX, 0x29, 0x00, 0x00},
198 {Port_GRX, 0x2A, 0x00, 0x00},
199 {Port_GRX, 0x2C, 0x06, 0x00},
200 {Port_GRX, 0x2E, 0x00, 0x00},
201 {Port_GRX, 0x2F, 0x00, 0x00},
202 {Port_GRX, 0x20, 0x80, 0x00},
204 {Port_SRX, 0x24, 0x0F, 0x00},
205 {Port_SRX, 0x37, 0x30, 0x00},
206 {Port_SRX, 0x38, 0x04, 0x00},
208 {Port_GRX, 0x23, 0x00, 0x00},
209 {Port_GRX, 0x33, 0x20, 0x00},
210 {Port_GRX, 0x30, 0x00, 0x00},
212 {Port_GRX, 0x28, 0x18, 0x00},
214 {Port_CRX, 0x0F, 0x20, 0x40},
215 {Port_CRX, 0x1F, 0x00, 0x00},
216 {Port_CRX, 0x20, 0x30, 0x00},
217 {Port_CRX, 0x23, 0x10, 0x00},
218 {Port_CRX, 0x25, 0x86, 0x00},
219 {Port_CRX, 0x2F, 0x1F, 0x00},
220 {Port_CRX, 0x30, 0x0F, 0x00},
221 {Port_CRX, 0x33, 0x00, 0x00},
222 {Port_CRX, 0x38, 0x10, 0x00},
223 {Port_CRX, 0x39, 0x00, 0x00},
224 {Port_CRX, 0x5E, 0x00, 0x00},
225 {Port_CRX, 0x29, 0x04, 0x00},
227 {Port_GRX, 0x5C, 0x00, 0x80},
228 {Port_GRX, 0x62, 0x00, 0x08},
230 {Port_SRX, 0x20, 0x04, 0x00},
231 {Port_GRX, 0x2F, 0x23, 0x00},
232 {Port_SRX, 0x0B, 0x00, 0x00},
233 {Port_SRX, 0x0D, 0x28, 0x00},
236 static WORD Length_Init_reg = sizeof(Init_reg) / sizeof(Def_Reg_struct);
238 static BYTE C8x16_Char[][8] = {
239 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
240 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //;0
241 { 0x00, 0x00, 0x7E, 0x81, 0xA5, 0x81, 0x81, 0xBD },
242 { 0x99, 0x81, 0x81, 0x7E, 0x00, 0x00, 0x00, 0x00 }, //;1
243 { 0x00, 0x00, 0x7E, 0xFF, 0xDB, 0xFF, 0xFF, 0xC3 },
244 { 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00 }, //;2
245 { 0x00, 0x00, 0x00, 0x00, 0x6C, 0xFE, 0xFE, 0xFE },
246 { 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00 }, //;3
247 { 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE },
248 { 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 }, //;4
249 { 0x00, 0x00, 0x00, 0x18, 0x3C, 0x3C, 0xE7, 0xE7 },
250 { 0xE7, 0x99, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //;5
251 { 0x00, 0x00, 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF },
252 { 0x7E, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //;6
253 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3C },
254 { 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //;7
255 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3 },
256 { 0xC3, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, //;8
257 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x42 },
258 { 0x42, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00 }, //;9
259 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x99, 0xBD },
260 { 0xBD, 0x99, 0xC3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, ////10
261 { 0x00, 0x00, 0x1E, 0x0E, 0x1A, 0x32, 0x78, 0xCC },
262 { 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00 }, //11
263 { 0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C },
264 { 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //12
265 { 0x00, 0x00, 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x30 },
266 { 0x30, 0x70, 0xF0, 0xE0, 0x00, 0x00, 0x00, 0x00 }, //13
267 { 0x00, 0x00, 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x63 },
268 { 0x63, 0x67, 0xE7, 0xE6, 0xC0, 0x00, 0x00, 0x00 }, //14
269 { 0x00, 0x00, 0x00, 0x18, 0x18, 0xDB, 0x3C, 0xE7 },
270 { 0x3C, 0xDB, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //15
271 { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFE, 0xF8 },
272 { 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00 }, //16
273 { 0x00, 0x02, 0x06, 0x0E, 0x1E, 0x3E, 0xFE, 0x3E },
274 { 0x1E, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00 }, //17
275 { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18 },
276 { 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00 }, //18
277 { 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66 },
278 { 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00 }, //19
279 { 0x00, 0x00, 0x7F, 0xDB, 0xDB, 0xDB, 0x7B, 0x1B },
280 { 0x1B, 0x1B, 0x1B, 0x1B, 0x00, 0x00, 0x00, 0x00 }, //20
281 { 0x00, 0x7C, 0xC6, 0x60, 0x38, 0x6C, 0xC6, 0xC6 },
282 { 0x6C, 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00 }, //21
283 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
284 { 0xFE, 0xFE, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //22
285 { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18 },
286 { 0x18, 0x7E, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00 }, //23
287 { 0x00, 0x00, 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18 },
288 { 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //24
289 { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 },
290 { 0x18, 0x7E, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00 }, //25
291 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0C, 0xFE },
292 { 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //26
293 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xFE },
294 { 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //27
295 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0 },
296 { 0xC0, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //28
297 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x6C, 0xFE },
298 { 0x6C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //29
299 { 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7C },
300 { 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 }, //30
301 { 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x7C },
302 { 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 }, //31
303 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
304 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //32
305 { 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x3C, 0x18, 0x18 },
306 { 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //33
307 { 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00 },
308 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //34
309 { 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0x6C },
310 { 0x6C, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00 }, //35
311 { 0x18, 0x18, 0x7C, 0xC6, 0xC2, 0xC0, 0x7C, 0x06 },
312 { 0x86, 0xC6, 0x7C, 0x18, 0x18, 0x00, 0x00, 0x00 }, //36
313 { 0x00, 0x00, 0x00, 0x00, 0xC2, 0xC6, 0x0C, 0x18 },
314 { 0x30, 0x60, 0xC6, 0x86, 0x00, 0x00, 0x00, 0x00 }, //37
315 { 0x00, 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x76, 0xDC },
316 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //38
317 { 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00 },
318 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //39
319 { 0x00, 0x00, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30 },
320 { 0x30, 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00 }, //40
321 { 0x00, 0x00, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C },
322 { 0x0C, 0x0C, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00 }, //41
323 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3C, 0xFF },
324 { 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //42
325 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E },
326 { 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //43
327 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
328 { 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00 }, //44
329 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE },
330 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //45
331 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
332 { 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //46
333 { 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0C, 0x18 },
334 { 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00 }, //47
335 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0xD6 },
336 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //48
337 { 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18 },
338 { 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00 }, //49
339 { 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x18, 0x30 },
340 { 0x60, 0xC0, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //50
341 { 0x00, 0x00, 0x7C, 0xC6, 0x06, 0x06, 0x3C, 0x06 },
342 { 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //51
343 { 0x00, 0x00, 0x0C, 0x1C, 0x3C, 0x6C, 0xCC, 0xFE },
344 { 0x0C, 0x0C, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00 }, //52
345 { 0x00, 0x00, 0xFE, 0xC0, 0xC0, 0xC0, 0xFC, 0x0E },
346 { 0x06, 0x06, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //53
347 { 0x00, 0x00, 0x38, 0x60, 0xC0, 0xC0, 0xFC, 0xC6 },
348 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //54
349 { 0x00, 0x00, 0xFE, 0xC6, 0x06, 0x06, 0x0C, 0x18 },
350 { 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00 }, //55
351 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0xC6 },
352 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //56
353 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7E, 0x06 },
354 { 0x06, 0x06, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00 }, //57
355 { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00 },
356 { 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 }, //58
357 { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00 },
358 { 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00 }, //59
359 { 0x00, 0x00, 0x00, 0x06, 0x0C, 0x18, 0x30, 0x60 },
360 { 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00 }, //60
361 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00 },
362 { 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //61
363 { 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0C, 0x06 },
364 { 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00 }, //62
365 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x0C, 0x18, 0x18 },
366 { 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //63
367 { 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xDE, 0xDE },
368 { 0xDE, 0xDC, 0xC0, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //64
369 { 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE },
370 { 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //65
371 { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x66 },
372 { 0x66, 0x66, 0x66, 0xFC, 0x00, 0x00, 0x00, 0x00 }, //66
373 { 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0 },
374 { 0xC0, 0xC2, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //67
375 { 0x00, 0x00, 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x66 },
376 { 0x66, 0x66, 0x6C, 0xF8, 0x00, 0x00, 0x00, 0x00 }, //68
377 { 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68 },
378 { 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //69
379 { 0x00, 0x00, 0xFE, 0x66, 0x62, 0x68, 0x78, 0x68 },
380 { 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 }, //70
381 { 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xDE },
382 { 0xC6, 0xC6, 0x66, 0x3A, 0x00, 0x00, 0x00, 0x00 }, //71
383 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0xC6 },
384 { 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //72
385 { 0x00, 0x00, 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18 },
386 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //73
387 { 0x00, 0x00, 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C },
388 { 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00 }, //74
389 { 0x00, 0x00, 0xE6, 0x66, 0x6C, 0x6C, 0x78, 0x78 },
390 { 0x6C, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 }, //75
391 { 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60 },
392 { 0x60, 0x62, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //76
393 { 0x00, 0x00, 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6 },
394 { 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //77
395 { 0x00, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE, 0xCE },
396 { 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //78
397 { 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0xC6 },
398 { 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00 }, //79
399 { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x60 },
400 { 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 }, //80
401 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6 },
402 { 0xC6, 0xD6, 0xDE, 0x7C, 0x0C, 0x0E, 0x00, 0x00 }, //81
403 { 0x00, 0x00, 0xFC, 0x66, 0x66, 0x66, 0x7C, 0x6C },
404 { 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 }, //82
405 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0x60, 0x38, 0x0C },
406 { 0x06, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //83
407 { 0x00, 0x00, 0x7E, 0x7E, 0x5A, 0x18, 0x18, 0x18 },
408 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //84
409 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6 },
410 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //85
411 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6 },
412 { 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00 }, //86
413 { 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xD6 },
414 { 0xD6, 0xFE, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00 }, //87
415 { 0x00, 0x00, 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38 },
416 { 0x6C, 0x6C, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //88
417 { 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18 },
418 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //89
419 { 0x00, 0x00, 0xFE, 0xC6, 0x86, 0x0C, 0x18, 0x30 },
420 { 0x60, 0xC2, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //90
421 { 0x00, 0x00, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30 },
422 { 0x30, 0x30, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //91
423 { 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x70, 0x38 },
424 { 0x1C, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00 }, //92
425 { 0x00, 0x00, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C },
426 { 0x0C, 0x0C, 0x0C, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //93
427 { 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00 },
428 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //94
429 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
430 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00 }, //95
431 { 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 },
432 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //96
433 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C },
434 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //97
435 { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x78, 0x6C, 0x66 },
436 { 0x66, 0x66, 0x66, 0xDC, 0x00, 0x00, 0x00, 0x00 }, //98
437 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC0 },
438 { 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //99
439 { 0x00, 0x00, 0x1C, 0x0C, 0x0C, 0x3C, 0x6C, 0xCC },
440 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //100
441 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xFE },
442 { 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //101
443 { 0x00, 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60 },
444 { 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 }, //102
445 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC },
446 { 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00 }, //103
447 { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x6C, 0x76, 0x66 },
448 { 0x66, 0x66, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 }, //104
449 { 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18 },
450 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //105
451 { 0x00, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x06, 0x06 },
452 { 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0x00 }, //106
453 { 0x00, 0x00, 0xE0, 0x60, 0x60, 0x66, 0x6C, 0x78 },
454 { 0x78, 0x6C, 0x66, 0xE6, 0x00, 0x00, 0x00, 0x00 }, //107
455 { 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18 },
456 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //108
457 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0xD6 },
458 { 0xD6, 0xD6, 0xD6, 0xD6, 0x00, 0x00, 0x00, 0x00 }, //109
459 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66 },
460 { 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00 }, //110
461 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6 },
462 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //111
463 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x66, 0x66 },
464 { 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00 }, //112
465 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xCC, 0xCC },
466 { 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, 0x1E, 0x00 }, //113
467 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x76, 0x62 },
468 { 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00 }, //114
469 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC6, 0x60 },
470 { 0x38, 0x0C, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //115
471 { 0x00, 0x00, 0x10, 0x30, 0x30, 0xFC, 0x30, 0x30 },
472 { 0x30, 0x30, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00 }, //116
473 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC },
474 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //117
475 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66 },
476 { 0x66, 0x66, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00 }, //118
477 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6 },
478 { 0xD6, 0xD6, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00 }, //119
479 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x6C, 0x38 },
480 { 0x38, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //120
481 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xC6, 0xC6 },
482 { 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0xF8, 0x00 }, //121
483 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xCC, 0x18 },
484 { 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //122
485 { 0x00, 0x00, 0x0E, 0x18, 0x18, 0x18, 0x70, 0x18 },
486 { 0x18, 0x18, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00 }, //123
487 { 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18 },
488 { 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //124
489 { 0x00, 0x00, 0x70, 0x18, 0x18, 0x18, 0x0E, 0x18 },
490 { 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00 }, //125
491 { 0x00, 0x00, 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00 },
492 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //126
493 { 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6C, 0xC6 },
494 { 0xC6, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 }, //127
495 { 0x00, 0x00, 0x3C, 0x66, 0xC2, 0xC0, 0xC0, 0xC0 },
496 { 0xC2, 0x66, 0x3C, 0x0C, 0x06, 0x7C, 0x00, 0x00 }, //128
497 { 0x00, 0x00, 0xCC, 0xCC, 0x00, 0xCC, 0xCC, 0xCC },
498 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //129
499 { 0x00, 0x0C, 0x18, 0x30, 0x00, 0x7C, 0xC6, 0xFE },
500 { 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //130
501 { 0x00, 0x10, 0x38, 0x6C, 0x00, 0x78, 0x0C, 0x7C },
502 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //131
503 { 0x00, 0x00, 0xCC, 0xCC, 0x00, 0x78, 0x0C, 0x7C },
504 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //132
505 { 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0C, 0x7C },
506 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //133
507 { 0x00, 0x38, 0x6C, 0x38, 0x00, 0x78, 0x0C, 0x7C },
508 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //134
509 { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x60, 0x60 },
510 { 0x66, 0x3C, 0x0C, 0x06, 0x3C, 0x00, 0x00, 0x00 }, //135
511 { 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xFE },
512 { 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //136
513 { 0x00, 0x00, 0xC6, 0xC6, 0x00, 0x7C, 0xC6, 0xFE },
514 { 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //137
515 { 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xFE },
516 { 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //138
517 { 0x00, 0x00, 0x66, 0x66, 0x00, 0x38, 0x18, 0x18 },
518 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //139
519 { 0x00, 0x18, 0x3C, 0x66, 0x00, 0x38, 0x18, 0x18 },
520 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //140
521 { 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18 },
522 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //141
523 { 0x00, 0xC6, 0xC6, 0x10, 0x38, 0x6C, 0xC6, 0xC6 },
524 { 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //142
525 { 0x38, 0x6C, 0x38, 0x00, 0x38, 0x6C, 0xC6, 0xC6 },
526 { 0xFE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //143
527 { 0x18, 0x30, 0x60, 0x00, 0xFE, 0x66, 0x60, 0x7C },
528 { 0x60, 0x60, 0x66, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //144
529 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x76, 0x36 },
530 { 0x7E, 0xD8, 0xD8, 0x6E, 0x00, 0x00, 0x00, 0x00 }, //145
531 { 0x00, 0x00, 0x3E, 0x6C, 0xCC, 0xCC, 0xFE, 0xCC },
532 { 0xCC, 0xCC, 0xCC, 0xCE, 0x00, 0x00, 0x00, 0x00 }, //146
533 { 0x00, 0x10, 0x38, 0x6C, 0x00, 0x7C, 0xC6, 0xC6 },
534 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //147
535 { 0x00, 0x00, 0xC6, 0xC6, 0x00, 0x7C, 0xC6, 0xC6 },
536 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //148
537 { 0x00, 0x60, 0x30, 0x18, 0x00, 0x7C, 0xC6, 0xC6 },
538 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //149
539 { 0x00, 0x30, 0x78, 0xCC, 0x00, 0xCC, 0xCC, 0xCC },
540 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //150
541 { 0x00, 0x60, 0x30, 0x18, 0x00, 0xCC, 0xCC, 0xCC },
542 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //151
543 { 0x00, 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0xC6 },
544 { 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x0C, 0x78, 0x00 }, //152
545 { 0x00, 0xC6, 0xC6, 0x00, 0x38, 0x6C, 0xC6, 0xC6 },
546 { 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00 }, //153
547 { 0x00, 0xC6, 0xC6, 0x00, 0xC6, 0xC6, 0xC6, 0xC6 },
548 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //154
549 { 0x00, 0x18, 0x18, 0x3C, 0x66, 0x60, 0x60, 0x60 },
550 { 0x66, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //155
551 { 0x00, 0x38, 0x6C, 0x64, 0x60, 0xF0, 0x60, 0x60 },
552 { 0x60, 0x60, 0xE6, 0xFC, 0x00, 0x00, 0x00, 0x00 }, //156
553 { 0x00, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18 },
554 { 0x7E, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //157
555 { 0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC4, 0xCC, 0xDE },
556 { 0xCC, 0xCC, 0xCC, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //158
557 { 0x00, 0x0E, 0x1B, 0x18, 0x18, 0x18, 0x7E, 0x18 },
558 { 0x18, 0x18, 0x18, 0x18, 0xD8, 0x70, 0x00, 0x00 }, //159
559 { 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0C, 0x7C },
560 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //160
561 { 0x00, 0x0C, 0x18, 0x30, 0x00, 0x38, 0x18, 0x18 },
562 { 0x18, 0x18, 0x18, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //161
563 { 0x00, 0x18, 0x30, 0x60, 0x00, 0x7C, 0xC6, 0xC6 },
564 { 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //162
565 { 0x00, 0x18, 0x30, 0x60, 0x00, 0xCC, 0xCC, 0xCC },
566 { 0xCC, 0xCC, 0xCC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //163
567 { 0x00, 0x00, 0x76, 0xDC, 0x00, 0xDC, 0x66, 0x66 },
568 { 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00 }, //164
569 { 0x76, 0xDC, 0x00, 0xC6, 0xE6, 0xF6, 0xFE, 0xDE },
570 { 0xCE, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //165
571 { 0x00, 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00 },
572 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //166
573 { 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00 },
574 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //167
575 { 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60 },
576 { 0xC0, 0xC6, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00 }, //168
577 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xC0 },
578 { 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00 }, //169
579 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06 },
580 { 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00 }, //170
581 { 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30 },
582 { 0x60, 0xCE, 0x93, 0x06, 0x0C, 0x1F, 0x00, 0x00 }, //171
583 { 0x00, 0xC0, 0xC0, 0xC2, 0xC6, 0xCC, 0x18, 0x30 },
584 { 0x66, 0xCE, 0x9A, 0x3F, 0x06, 0x0F, 0x00, 0x00 }, //172
585 { 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18 },
586 { 0x3C, 0x3C, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00 }, //173
587 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC },
588 { 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //174
589 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33 },
590 { 0x66, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //175
591 { 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44 },
592 { 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44 }, //176
593 { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA },
594 { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA }, //177
595 { 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77 },
596 { 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77 }, //178
597 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 },
598 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //179
599 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8 },
600 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //180
601 { 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8 },
602 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //181
603 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6 },
604 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //182
605 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE },
606 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //183
607 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0xF8 },
608 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //184
609 { 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xF6 },
610 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //185
611 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 },
612 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //186
613 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x06, 0xF6 },
614 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //187
615 { 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0x06, 0xFE },
616 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //188
617 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE },
618 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //189
619 { 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0xF8 },
620 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //190
621 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8 },
622 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //191
623 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F },
624 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //192
625 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF },
626 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //193
627 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF },
628 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //194
629 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F },
630 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //195
631 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF },
632 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //196
633 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF },
634 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //197
635 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F },
636 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //198
637 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37 },
638 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //199
639 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3F },
640 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //200
641 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x37 },
642 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //201
643 { 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xFF },
644 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //202
645 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xF7 },
646 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //203
647 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37 },
648 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //204
649 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF },
650 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //205
651 { 0x36, 0x36, 0x36, 0x36, 0x36, 0xF7, 0x00, 0xF7 },
652 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //206
653 { 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0xFF },
654 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //207
655 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF },
656 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //208
657 { 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF },
658 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //209
659 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF },
660 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //210
661 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F },
662 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //211
663 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x1F },
664 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //212
665 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x1F },
666 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //213
667 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F },
668 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //214
669 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF },
670 { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 }, //215
671 { 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0xFF },
672 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //216
673 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8 },
674 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //217
675 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F },
676 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //218
677 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
678 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, //219
679 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF },
680 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, //220
681 { 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 },
682 { 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 }, //221
683 { 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F },
684 { 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F }, //222
685 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 },
686 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //223
687 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0xD8 },
688 { 0xD8, 0xD8, 0xDC, 0x76, 0x00, 0x00, 0x00, 0x00 }, //224
689 { 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xDC, 0xC6 },
690 { 0xC3, 0xC3, 0xC3, 0xCE, 0x00, 0x00, 0x00, 0x00 }, //225
691 { 0x00, 0x00, 0xFE, 0xC6, 0xC6, 0xC0, 0xC0, 0xC0 },
692 { 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00 }, //226
693 { 0x00, 0x00, 0x00, 0x00, 0x80, 0xFE, 0x6C, 0x6C },
694 { 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00 }, //227
695 { 0x00, 0x00, 0x00, 0xFE, 0xC6, 0x60, 0x30, 0x18 },
696 { 0x30, 0x60, 0xC6, 0xFE, 0x00, 0x00, 0x00, 0x00 }, //228
697 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xD8, 0xD8 },
698 { 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00 }, //229
699 { 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66 },
700 { 0x66, 0x7C, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00 }, //230
701 { 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x18, 0x18 },
702 { 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00 }, //231
703 { 0x00, 0x00, 0x00, 0x7E, 0x18, 0x3C, 0x66, 0x66 },
704 { 0x66, 0x3C, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00 }, //232
705 { 0x00, 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xFE },
706 { 0xC6, 0xC6, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00 }, //233
707 { 0x00, 0x00, 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C },
708 { 0x6C, 0x6C, 0x6C, 0xEE, 0x00, 0x00, 0x00, 0x00 }, //234
709 { 0x00, 0x00, 0x1E, 0x30, 0x18, 0x0C, 0x3E, 0x66 },
710 { 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x00, 0x00 }, //235
711 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xDB, 0xDB },
712 { 0xDB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //236
713 { 0x00, 0x00, 0x00, 0x03, 0x06, 0x7E, 0xCF, 0xDB },
714 { 0xF3, 0x7E, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00 }, //237
715 { 0x00, 0x00, 0x1C, 0x30, 0x60, 0x60, 0x7C, 0x60 },
716 { 0x60, 0x60, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00 }, //238
717 { 0x00, 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0xC6 },
718 { 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x00, 0x00, 0x00 }, //239
719 { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE },
720 { 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00 }, //240
721 { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7E, 0x18 },
722 { 0x18, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00 }, //241
723 { 0x00, 0x00, 0x00, 0x30, 0x18, 0x0C, 0x06, 0x0C },
724 { 0x18, 0x30, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00 }, //242
725 { 0x00, 0x00, 0x00, 0x0C, 0x18, 0x30, 0x60, 0x30 },
726 { 0x18, 0x0C, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00 }, //243
727 { 0x00, 0x00, 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18 },
728 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 }, //244
729 { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 },
730 { 0xD8, 0xD8, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00 }, //245
731 { 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7E },
732 { 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 }, //246
733 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xDC, 0x00 },
734 { 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //247
735 { 0x00, 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00 },
736 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //248
737 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18 },
738 { 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //249
739 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
740 { 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //250
741 { 0x00, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xEC },
742 { 0x6C, 0x6C, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00 }, //251
743 { 0x00, 0xD8, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x00 },
744 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //252
745 { 0x00, 0x70, 0x98, 0x30, 0x60, 0xC8, 0xF8, 0x00 },
746 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //253
747 { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x7C, 0x7C },
748 { 0x7C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00 }, //254
749 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
750 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, //255
753 static void config_OEM_regs(void);
754 static void unprotect_reg(void);
755 static void reprotect_reg(void);
756 static void set_memCLK(BYTE mem_Type, BYTE mem_MD);
757 static void init_SGRAM(void);
758 static void config_video_memory(void);
759 static void set_video_mode(void);
760 static void clear_MEM(void);
761 static void set_font(void);
763 static int init9880(void)
768 //outp(Port_CRX, 0x2a);
769 //outp(Port_CRX+1, (inp(Port_CRX+1) & ~0x0c) | 0x08);
779 if (CHIPREV == 0x02) {
780 printk_debug("blade3d: chip revision B\n");
781 outp(Port_CRX, 0xc0);
782 outp(Port_CRX + 1, 0x00);
786 //config_video_memory();
790 outp(Port_SRX, 0x01);
791 outp(Port_SRX + 1, inp(Port_SRX + 1) & ~0x20);
796 static void config_OEM_regs(void)
798 BYTE CRX_2A, Old_value;
803 lpDef_Reg_struct lpMode3_temp;
804 lpDef_Reg_struct lpInit_reg;
805 lpMode3_temp = &Mode3_temp[0];
806 lpInit_reg = &Init_reg[0];
808 printk_debug("blade3d: config_OEM_regs()\n");
810 outp(Port_GRX, 0x24);
811 outp(Port_GRX + 1, 0xe0);
812 //MCLK VCLK to 16 bit
813 outp(Port_CRX, 0xcf);
814 outp(Port_CRX + 1, inp(Port_CRX + 1) | 0x03);
816 //outp(Port_SRX, 0x3b);
817 //outp(Port_SRX+1, inp(Port_SRX+1) | 0x20);
819 outp(Port_CRX, 0x3b);
820 outp(Port_CRX + 1, inp(Port_CRX + 1) | 0x20);
822 outp(Port_CRX, 0x1a);
823 outp(Port_CRX + 1, inp(Port_CRX + 1) & 0x08);
825 outp(Port_CRX, 0x2a);
826 CRX_2A = inp(Port_CRX + 1);
827 outp(Port_CRX + 1, CRX_2A & ~0x20);
829 mem_Type = (CRX_2A & ~0x20) & 0x08;
831 outp(Port_GRX, 0x0f);
832 if (0x08 == mem_Type)
833 outp(Port_GRX + 1, inp(Port_GRX + 1) | 0x20);
835 outp(Port_GRX + 1, inp(Port_GRX + 1) & ~0x20);
837 outp(Port_CRX, 0x28);
838 mem_MD = inp(Port_CRX + 1) & 0x07;
840 set_memCLK(mem_Type, mem_MD);
843 if (0x08 == mem_Type) {
844 outp(Port_CRX, 0x2e);
845 outp(Port_CRX + 1, 0x00);
847 outp(Port_CRX, 0x2d);
848 outp(Port_CRX + 1, 0x92);
850 outp(Port_CRX, 0x2d);
851 outp(Port_CRX + 1, 0x82);
854 for (i = 0; i < Length_Mode3_temp; i++) {
855 outp(lpMode3_temp[i].rPort, lpMode3_temp[i].rIndex);
856 Old_value = inp(lpMode3_temp[i].rPort + 1);
857 outp(lpMode3_temp[i].rPort + 1,
858 lpMode3_temp[i].rValue | (Old_value & lpMode3_temp[i].
862 outp(Port_SRX, 0x01);
863 outp(Port_SRX + 1, inp(Port_SRX + 1) | 0x20);
865 for (i = 0; i < Length_Init_reg; i++) {
866 outp(lpInit_reg[i].rPort, lpInit_reg[i].rIndex);
867 Old_value = inp(lpInit_reg[i].rPort + 1);
868 outp(lpInit_reg[i].rPort + 1,
869 lpInit_reg[i].rValue | (Old_value & lpInit_reg[i].
875 outp(Port_CRX, 0x1a);
876 if (0x08 == inp(Port_CRX + 1)) {
877 outp(Port_CRX, 0x20);
878 outp(Port_CRX + 1, inp(Port_CRX + 1) | 0x04);
881 } //end config_OEM_reg
883 //---------------------------------------------------------------------------//
885 static void unprotect_reg(void)
887 outp(Port_SRX, 0x11);
888 outp(Port_SRX + 1, 0x92);
891 static void reprotect_reg(void)
893 outp(Port_SRX, 0x11);
894 outp(Port_SRX + 1, 0x87);
897 static void set_memCLK(BYTE mem_Type, BYTE mem_MD)
901 Index = ((mem_Type + mem_MD) << 0x01) & 0xf;
902 outp(Port_SRX, 0x16);
903 outp(Port_SRX + 1, Mem_Clk_Table[Index][0]);
904 outp(Port_SRX, 0x17);
905 outp(Port_SRX + 1, Mem_Clk_Table[Index][1]);
909 static void init_SGRAM(void)
913 outp(Port_CRX, 0x2a);
914 if (inp(Port_CRX + 1) & 0x08) //SGRAM
916 outp(Port_CRX, 0x28);
917 if (inp(Port_CRX + 1) & 0x08) {
918 outp(Port_CRX, 0x1c);
919 outp(Port_CRX + 1, 0x7a);
921 outp(Port_CRX, 0x1c);
922 outp(Port_CRX + 1, 0x3a);
924 outp(Port_CRX, 0x1b);
925 outp(Port_CRX + 1, SGRAMTimg);
926 if (CHIPREV >= 0x03) {
927 outp(Port_CRX, 0x1a);
928 outp(Port_CRX + 1, inp(Port_CRX + 1) | 0x01);
930 outp(Port_CRX, 0x1a);
931 outp(Port_CRX + 1, 0x16);
932 outp(Port_CRX + 1, inp(Port_CRX + 1) | 0x16);
933 for (i = 0; i < 10; i++) {
934 outp(Port_CRX, 0x1c);
936 inp(Port_CRX + 1) | 0x40);
939 outp(Port_CRX, 0x1c);
940 Temp = (inp(Port_CRX + 1) | 0x20) & 0x3c;
941 outp(Port_CRX + 1, Temp);
942 outp(Port_CRX + 1, Temp & 0x08);
946 printk_debug("blade3d: No SGRAM found.\n");
950 static void config_video_memory(void)
952 printk_debug("blade3d: Error: no video memory init\n");
955 static void set_video_mode(void)
959 lpDef_Reg_struct lpMode3_reg;
960 lpMode3_reg = &Mode3_reg[0];
962 printk_debug("blade3d: setting video mode\n");
964 for (i = 0; i < Length_Mode3_reg; i++) {
965 if (lpMode3_reg[i].rPort == Port_BRX) {
968 outp(lpMode3_reg[i].rPort, lpMode3_reg[i].rIndex);
969 outp(lpMode3_reg[i].rPort, lpMode3_reg[i].rValue);
971 outp(lpMode3_reg[i].rPort, lpMode3_reg[i].rIndex);
972 Old_value = inp(lpMode3_reg[i].rPort + 1);
973 outp(lpMode3_reg[i].rPort + 1,
975 rValue | (Old_value & lpMode3_reg[i].rMask));
982 static void set_font(void)
985 printk_debug("blade3d: setting font (not implemented)\n");
988 static void clear_MEM(void)
990 //_fmemset(MK_FP(0xb800,0),0x720,0x4000);
991 __asm__("push %ax\n\t"
995 "mov %ax, 0xb800\n\t"
998 "mov %cx, 0x4000\n\t"
1009 static void trident_blade3d_init(struct device *dev)
1011 printk_info("blade3d: initializing video card\n");
1015 static struct device_operations trident_blade3d_ops = {
1016 .read_resources = pci_dev_read_resources,
1017 .set_resources = pci_dev_set_resources,
1018 .enable_resources = pci_dev_enable_resources,
1019 .init = trident_blade3d_init,
1023 static const struct pci_driver trident_blade3d_driver __pci_driver = {
1024 .ops = &trident_blade3d_ops,