e50d40514b79632f8bb2f9c6bc2fd39a7218664f
[coreboot.git] / src / drivers / trident / blade3d / blade3d.c
1 /*
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
6  */
7 #include <delay.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <arch/io.h>
11
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>
17
18
19 //----------------------------------------------------------------------------//
20 // init chip 9880
21 // Fuger Shen 2003-10-10
22 //----------------------------------------------------------------------------//
23
24 #define inp inb
25 #define outp(port,val) outb(val, port)
26
27 #define WORD    unsigned int
28 #define BYTE    unsigned char
29 #define DWORD   unsigned long
30
31 #define SGRAMTimg   0x27
32 #define CHIPREV     0x3         //1,RA 2,RB,3,RC
33
34 #define Port_SRX    0x3c4
35 #define Port_CRX    0x3d4
36 #define Port_GRX    0x3ce
37 #define Port_BRX    0x3c0
38
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
58 };
59
60
61 typedef struct Reg_struct {
62         WORD rPort;
63         BYTE rIndex;
64         BYTE rValue;
65         BYTE rMask;
66 } Def_Reg_struct;
67
68 typedef Def_Reg_struct* lpDef_Reg_struct; 
69 // , *pDef_Reg_struct, far * lpDef_Reg_struct;
70
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},
98 };
99
100 WORD Length_Mode3_temp = sizeof(Mode3_temp) / sizeof(Def_Reg_struct);
101
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},
129
130         //brx
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},
152
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},
162
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},
178
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},
185 };
186
187 static WORD Length_Mode3_reg = sizeof(Mode3_reg) / sizeof(Def_Reg_struct);
188
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},
203
204         {Port_SRX, 0x24, 0x0F, 0x00},
205         {Port_SRX, 0x37, 0x30, 0x00},
206         {Port_SRX, 0x38, 0x04, 0x00},
207
208         {Port_GRX, 0x23, 0x00, 0x00},
209         {Port_GRX, 0x33, 0x20, 0x00},
210         {Port_GRX, 0x30, 0x00, 0x00},
211         //
212         {Port_GRX, 0x28, 0x18, 0x00}, 
213
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},
226
227         {Port_GRX, 0x5C, 0x00, 0x80},
228         {Port_GRX, 0x62, 0x00, 0x08},
229
230         {Port_SRX, 0x20, 0x04, 0x00},
231         {Port_GRX, 0x2F, 0x23, 0x00},
232         {Port_SRX, 0x0B, 0x00, 0x00},
233         {Port_SRX, 0x0D, 0x28, 0x00},
234 };
235
236 static WORD Length_Init_reg = sizeof(Init_reg) / sizeof(Def_Reg_struct);
237
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
751 };
752
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);
762
763 static int init9880(void)
764 {
765         unprotect_reg();
766
767         //if use SDRAM
768         //outp(Port_CRX, 0x2a);
769         //outp(Port_CRX+1, (inp(Port_CRX+1) & ~0x0c) | 0x08);
770         //disable other card
771
772         //enable VGA
773         outp(0x3c3, 0x01);
774         outp(0x4e68, 0x08);
775
776         outp(0x3c2, 0x23);
777
778         //if chip revB
779         if (CHIPREV == 0x02) {
780                 printk(BIOS_DEBUG, "blade3d: chip revision B\n");
781                 outp(Port_CRX, 0xc0);
782                 outp(Port_CRX + 1, 0x00);
783         }
784         config_OEM_regs();
785         init_SGRAM();
786         //config_video_memory();
787         set_video_mode();
788         reprotect_reg();
789         //screen on
790         outp(Port_SRX, 0x01);
791         outp(Port_SRX + 1, inp(Port_SRX + 1) & ~0x20);
792
793         return 0;
794 }
795
796 static void config_OEM_regs(void)
797 {
798         BYTE CRX_2A, Old_value;
799         BYTE mem_Type;
800         BYTE mem_MD;
801         WORD i;
802
803         lpDef_Reg_struct lpMode3_temp;
804         lpDef_Reg_struct lpInit_reg;
805         lpMode3_temp = &Mode3_temp[0];
806         lpInit_reg = &Init_reg[0];
807
808         printk(BIOS_DEBUG, "blade3d: config_OEM_regs()\n");
809         
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);
815         //3c5.0e
816         //outp(Port_SRX, 0x3b);
817         //outp(Port_SRX+1, inp(Port_SRX+1) | 0x20);
818         //
819         outp(Port_CRX, 0x3b);
820         outp(Port_CRX + 1, inp(Port_CRX + 1) | 0x20);
821         //
822         outp(Port_CRX, 0x1a);
823         outp(Port_CRX + 1, inp(Port_CRX + 1) & 0x08);
824         //
825         outp(Port_CRX, 0x2a);
826         CRX_2A = inp(Port_CRX + 1);
827         outp(Port_CRX + 1, CRX_2A & ~0x20);
828
829         mem_Type = (CRX_2A & ~0x20) & 0x08;
830
831         outp(Port_GRX, 0x0f);
832         if (0x08 == mem_Type)
833                 outp(Port_GRX + 1, inp(Port_GRX + 1) | 0x20);
834         else
835                 outp(Port_GRX + 1, inp(Port_GRX + 1) & ~0x20);
836
837         outp(Port_CRX, 0x28);
838         mem_MD = inp(Port_CRX + 1) & 0x07;
839
840         set_memCLK(mem_Type, mem_MD);
841         delay(100);
842
843         if (0x08 == mem_Type) {
844                 outp(Port_CRX, 0x2e);
845                 outp(Port_CRX + 1, 0x00);
846                 delay(100);
847                 outp(Port_CRX, 0x2d);
848                 outp(Port_CRX + 1, 0x92);
849         } else {
850                 outp(Port_CRX, 0x2d);
851                 outp(Port_CRX + 1, 0x82);
852         }
853
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].
859                                                rMask));
860         }
861         //screen off
862         outp(Port_SRX, 0x01);
863         outp(Port_SRX + 1, inp(Port_SRX + 1) | 0x20);
864
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].
870                                              rMask));
871         }
872         delay(10);
873         init_SGRAM();
874
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);
879         }
880
881 }                               //end config_OEM_reg
882
883 //---------------------------------------------------------------------------//
884
885 static void unprotect_reg(void)
886 {
887         outp(Port_SRX, 0x11);
888         outp(Port_SRX + 1, 0x92);
889 }
890
891 static void reprotect_reg(void)
892 {
893         outp(Port_SRX, 0x11);
894         outp(Port_SRX + 1, 0x87);
895 }
896
897 static void set_memCLK(BYTE mem_Type, BYTE mem_MD)
898 {
899         BYTE Index;
900
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]);
906
907 }
908
909 static void init_SGRAM(void)
910 {
911         BYTE Temp, i;
912
913         outp(Port_CRX, 0x2a);
914         if (inp(Port_CRX + 1) & 0x08)   //SGRAM
915         {
916                 outp(Port_CRX, 0x28);
917                 if (inp(Port_CRX + 1) & 0x08) {
918                         outp(Port_CRX, 0x1c);
919                         outp(Port_CRX + 1, 0x7a);
920                 } else {
921                         outp(Port_CRX, 0x1c);
922                         outp(Port_CRX + 1, 0x3a);
923                 }
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);
929                 } else {
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);
935                                 outp(Port_CRX + 1,
936                                      inp(Port_CRX + 1) | 0x40);
937                         }
938                         delay(100);
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);
943                 }
944
945         } else {                        //SGRAM
946                 printk(BIOS_DEBUG, "blade3d: No SGRAM found.\n");
947         }
948 }
949
950 static void config_video_memory(void)
951 {
952         printk(BIOS_DEBUG, "blade3d: Error: no video memory init\n");
953 }
954
955 static void set_video_mode(void)
956 {
957         BYTE i;
958         BYTE Old_value;
959         lpDef_Reg_struct lpMode3_reg;
960         lpMode3_reg = &Mode3_reg[0];
961
962         printk(BIOS_DEBUG, "blade3d: setting video mode\n");
963         outp(0x3c2, 0x67);
964         for (i = 0; i < Length_Mode3_reg; i++) {
965                 if (lpMode3_reg[i].rPort == Port_BRX) {
966                         inp(0x3DA);
967                         delay(3);
968                         outp(lpMode3_reg[i].rPort, lpMode3_reg[i].rIndex);
969                         outp(lpMode3_reg[i].rPort, lpMode3_reg[i].rValue);
970                 } else {
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,
974                              lpMode3_reg[i].
975                              rValue | (Old_value & lpMode3_reg[i].rMask));
976                 }
977         }
978         //set_font();
979         //clear_MEM();
980 }
981
982 static void set_font(void)
983 {
984
985         printk(BIOS_DEBUG, "blade3d: setting font (not implemented)\n");
986 }
987
988 static void clear_MEM(void)
989 {
990         //_fmemset(MK_FP(0xb800,0),0x720,0x4000);
991         __asm__("push %ax\n\t"
992                 "push %cx\n\t"
993                 "push %di\n\t"
994                 "push %es\n\t"
995                 "mov %ax, 0xb800\n\t"
996                 "mov %es, %ax\n\t"
997                 "mov %ax, 0x720\n\t"
998                 "mov %cx, 0x4000\n\t"
999                 "xor %di, %di\n\t"
1000                 "rep stosw\n\t"
1001                 "pop %es\n\t"
1002                 "pop %di\n\t"
1003                 "pop %cx\n\t"
1004                 "pop %ax\n\t"
1005                );
1006 }
1007
1008
1009 static void trident_blade3d_init(struct device *dev)
1010 {
1011         printk(BIOS_INFO, "blade3d: initializing video card\n");
1012         init9880();
1013 }
1014
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,
1020         .scan_bus         = 0,
1021 };
1022
1023 static const struct pci_driver trident_blade3d_driver __pci_driver = {
1024         .ops    = &trident_blade3d_ops,
1025         .vendor = 0x1023,
1026         .device = 0x9880,
1027 };
1028