|
|
1.1 root 1: //
2: // QEMU Cirrus CLGD 54xx VGABIOS Extension.
3: //
4: // Copyright (c) 2004 Makoto Suzuki (suzu)
5: //
6: // This library is free software; you can redistribute it and/or
7: // modify it under the terms of the GNU Lesser General Public
8: // License as published by the Free Software Foundation; either
9: // version 2 of the License, or (at your option) any later version.
10: //
11: // This library is distributed in the hope that it will be useful,
12: // but WITHOUT ANY WARRANTY; without even the implied warranty of
13: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: // Lesser General Public License for more details.
15: //
16: // You should have received a copy of the GNU Lesser General Public
17: // License along with this library; if not, write to the Free Software
18: // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19: //
20:
21: //#define CIRRUS_VESA3_PMINFO
22: #ifdef VBE
23: #undef CIRRUS_VESA3_PMINFO
24: #endif
25:
26: #define PM_BIOSMEM_CURRENT_MODE 0x449
27: #define PM_BIOSMEM_CRTC_ADDRESS 0x463
28: #define PM_BIOSMEM_VBE_MODE 0x4BA
29:
30: typedef struct
31: {
32: /* + 0 */
33: unsigned short mode;
34: unsigned short width;
35: unsigned short height;
36: unsigned short depth;
37: /* + 8 */
38: unsigned short hidden_dac; /* 0x3c6 */
39: unsigned short *seq; /* 0x3c4 */
40: unsigned short *graph; /* 0x3ce */
41: unsigned short *crtc; /* 0x3d4 */
42: /* +16 */
43: unsigned char bitsperpixel;
44: unsigned char vesacolortype;
45: unsigned char vesaredmask;
46: unsigned char vesaredpos;
47: unsigned char vesagreenmask;
48: unsigned char vesagreenpos;
49: unsigned char vesabluemask;
50: unsigned char vesabluepos;
51: /* +24 */
52: unsigned char vesareservedmask;
53: unsigned char vesareservedpos;
54: } cirrus_mode_t;
55: #define CIRRUS_MODE_SIZE 26
56:
57:
58: /* For VESA BIOS 3.0 */
59: #define CIRRUS_PM16INFO_SIZE 20
60:
61: /* VGA */
62: unsigned short cseq_vga[] = {0x0007,0xffff};
63: unsigned short cgraph_vga[] = {0x0009,0x000a,0x000b,0xffff};
64: unsigned short ccrtc_vga[] = {0x001a,0x001b,0x001d,0xffff};
65:
66: /* extensions */
67: unsigned short cgraph_svgacolor[] = {
68: 0x0000,0x0001,0x0002,0x0003,0x0004,0x4005,0x0506,0x0f07,0xff08,
69: 0x0009,0x000a,0x000b,
70: 0xffff
71: };
72: /* 640x480x8 */
73: unsigned short cseq_640x480x8[] = {
74: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107,
75: 0x580b,0x580c,0x580d,0x580e,
76: 0x0412,0x0013,0x2017,
77: 0x331b,0x331c,0x331d,0x331e,
78: 0xffff
79: };
80: unsigned short ccrtc_640x480x8[] = {
81: 0x2c11,
82: 0x5f00,0x4f01,0x4f02,0x8003,0x5204,0x1e05,0x0b06,0x3e07,
83: 0x4009,0x000c,0x000d,
84: 0xea10,0xdf12,0x5013,0x4014,0xdf15,0x0b16,0xc317,0xff18,
85: 0x001a,0x221b,0x001d,
86: 0xffff
87: };
88: /* 640x480x16 */
89: unsigned short cseq_640x480x16[] = {
90: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1707,
91: 0x580b,0x580c,0x580d,0x580e,
92: 0x0412,0x0013,0x2017,
93: 0x331b,0x331c,0x331d,0x331e,
94: 0xffff
95: };
96: unsigned short ccrtc_640x480x16[] = {
97: 0x2c11,
98: 0x5f00,0x4f01,0x4f02,0x8003,0x5204,0x1e05,0x0b06,0x3e07,
99: 0x4009,0x000c,0x000d,
100: 0xea10,0xdf12,0xa013,0x4014,0xdf15,0x0b16,0xc317,0xff18,
101: 0x001a,0x221b,0x001d,
102: 0xffff
103: };
104: /* 640x480x24 */
105: unsigned short cseq_640x480x24[] = {
106: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1507,
107: 0x580b,0x580c,0x580d,0x580e,
108: 0x0412,0x0013,0x2017,
109: 0x331b,0x331c,0x331d,0x331e,
110: 0xffff
111: };
112: unsigned short ccrtc_640x480x24[] = {
113: 0x2c11,
114: 0x5f00,0x4f01,0x4f02,0x8003,0x5204,0x1e05,0x0b06,0x3e07,
115: 0x4009,0x000c,0x000d,
116: 0xea10,0xdf12,0x0013,0x4014,0xdf15,0x0b16,0xc317,0xff18,
117: 0x001a,0x321b,0x001d,
118: 0xffff
119: };
120: /* 800x600x8 */
121: unsigned short cseq_800x600x8[] = {
122: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107,
123: 0x230b,0x230c,0x230d,0x230e,
124: 0x0412,0x0013,0x2017,
125: 0x141b,0x141c,0x141d,0x141e,
126: 0xffff
127: };
128: unsigned short ccrtc_800x600x8[] = {
129: 0x2311,0x7d00,0x6301,0x6302,0x8003,0x6b04,0x1a05,0x9806,0xf007,
130: 0x6009,0x000c,0x000d,
131: 0x7d10,0x5712,0x6413,0x4014,0x5715,0x9816,0xc317,0xff18,
132: 0x001a,0x221b,0x001d,
133: 0xffff
134: };
135: /* 800x600x16 */
136: unsigned short cseq_800x600x16[] = {
137: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1707,
138: 0x230b,0x230c,0x230d,0x230e,
139: 0x0412,0x0013,0x2017,
140: 0x141b,0x141c,0x141d,0x141e,
141: 0xffff
142: };
143: unsigned short ccrtc_800x600x16[] = {
144: 0x2311,0x7d00,0x6301,0x6302,0x8003,0x6b04,0x1a05,0x9806,0xf007,
145: 0x6009,0x000c,0x000d,
146: 0x7d10,0x5712,0xc813,0x4014,0x5715,0x9816,0xc317,0xff18,
147: 0x001a,0x221b,0x001d,
148: 0xffff
149: };
150: /* 800x600x24 */
151: unsigned short cseq_800x600x24[] = {
152: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1507,
153: 0x230b,0x230c,0x230d,0x230e,
154: 0x0412,0x0013,0x2017,
155: 0x141b,0x141c,0x141d,0x141e,
156: 0xffff
157: };
158: unsigned short ccrtc_800x600x24[] = {
159: 0x2311,0x7d00,0x6301,0x6302,0x8003,0x6b04,0x1a05,0x9806,0xf007,
160: 0x6009,0x000c,0x000d,
161: 0x7d10,0x5712,0x2c13,0x4014,0x5715,0x9816,0xc317,0xff18,
162: 0x001a,0x321b,0x001d,
163: 0xffff
164: };
165: /* 1024x768x8 */
166: unsigned short cseq_1024x768x8[] = {
167: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107,
168: 0x760b,0x760c,0x760d,0x760e,
169: 0x0412,0x0013,0x2017,
170: 0x341b,0x341c,0x341d,0x341e,
171: 0xffff
172: };
173: unsigned short ccrtc_1024x768x8[] = {
174: 0x2911,0xa300,0x7f01,0x7f02,0x8603,0x8304,0x9405,0x2406,0xf507,
175: 0x6009,0x000c,0x000d,
176: 0x0310,0xff12,0x8013,0x4014,0xff15,0x2416,0xc317,0xff18,
177: 0x001a,0x221b,0x001d,
178: 0xffff
179: };
180: /* 1024x768x16 */
181: unsigned short cseq_1024x768x16[] = {
182: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1707,
183: 0x760b,0x760c,0x760d,0x760e,
184: 0x0412,0x0013,0x2017,
185: 0x341b,0x341c,0x341d,0x341e,
186: 0xffff
187: };
188: unsigned short ccrtc_1024x768x16[] = {
189: 0x2911,0xa300,0x7f01,0x7f02,0x8603,0x8304,0x9405,0x2406,0xf507,
190: 0x6009,0x000c,0x000d,
191: 0x0310,0xff12,0x0013,0x4014,0xff15,0x2416,0xc317,0xff18,
192: 0x001a,0x321b,0x001d,
193: 0xffff
194: };
195: /* 1024x768x24 */
196: unsigned short cseq_1024x768x24[] = {
197: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1507,
198: 0x760b,0x760c,0x760d,0x760e,
199: 0x0412,0x0013,0x2017,
200: 0x341b,0x341c,0x341d,0x341e,
201: 0xffff
202: };
203: unsigned short ccrtc_1024x768x24[] = {
204: 0x2911,0xa300,0x7f01,0x7f02,0x8603,0x8304,0x9405,0x2406,0xf507,
205: 0x6009,0x000c,0x000d,
206: 0x0310,0xff12,0x8013,0x4014,0xff15,0x2416,0xc317,0xff18,
207: 0x001a,0x321b,0x001d,
208: 0xffff
209: };
210: /* 1280x1024x8 */
211: unsigned short cseq_1280x1024x8[] = {
212: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107,
213: 0x760b,0x760c,0x760d,0x760e,
214: 0x0412,0x0013,0x2017,
215: 0x341b,0x341c,0x341d,0x341e,
216: 0xffff
217: };
218: unsigned short ccrtc_1280x1024x8[] = {
219: 0x2911,0xc300,0x9f01,0x9f02,0x8603,0x8304,0x9405,0x2406,0xf707,
220: 0x6009,0x000c,0x000d,
221: 0x0310,0xff12,0xa013,0x4014,0xff15,0x2416,0xc317,0xff18,
222: 0x001a,0x221b,0x001d,
223: 0xffff
224: };
225: /* 1280x1024x16 */
226: unsigned short cseq_1280x1024x16[] = {
227: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1707,
228: 0x760b,0x760c,0x760d,0x760e,
229: 0x0412,0x0013,0x2017,
230: 0x341b,0x341c,0x341d,0x341e,
231: 0xffff
232: };
233: unsigned short ccrtc_1280x1024x16[] = {
234: 0x2911,0xc300,0x9f01,0x9f02,0x8603,0x8304,0x9405,0x2406,0xf707,
235: 0x6009,0x000c,0x000d,
236: 0x0310,0xff12,0x4013,0x4014,0xff15,0x2416,0xc317,0xff18,
237: 0x001a,0x321b,0x001d,
238: 0xffff
239: };
240:
241: /* 1600x1200x8 */
242: unsigned short cseq_1600x1200x8[] = {
243: 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107,
244: 0x760b,0x760c,0x760d,0x760e,
245: 0x0412,0x0013,0x2017,
246: 0x341b,0x341c,0x341d,0x341e,
247: 0xffff
248: };
249: unsigned short ccrtc_1600x1200x8[] = {
250: 0x2911,0xc300,0x9f01,0x9f02,0x8603,0x8304,0x9405,0x2406,0xf707,
251: 0x6009,0x000c,0x000d,
252: 0x0310,0xff12,0xa013,0x4014,0xff15,0x2416,0xc317,0xff18,
253: 0x001a,0x221b,0x001d,
254: 0xffff
255: };
256:
257: cirrus_mode_t cirrus_modes[] =
258: {
259: {0x5f,640,480,8,0x00,
260: cseq_640x480x8,cgraph_svgacolor,ccrtc_640x480x8,8,
261: 4,0,0,0,0,0,0,0,0},
262: {0x64,640,480,16,0xe1,
263: cseq_640x480x16,cgraph_svgacolor,ccrtc_640x480x16,16,
264: 6,5,11,6,5,5,0,0,0},
265: {0x66,640,480,15,0xf0,
266: cseq_640x480x16,cgraph_svgacolor,ccrtc_640x480x16,16,
267: 6,5,10,5,5,5,0,1,15},
268: {0x71,640,480,24,0xe5,
269: cseq_640x480x24,cgraph_svgacolor,ccrtc_640x480x24,24,
270: 6,8,16,8,8,8,0,0,0},
271:
272: {0x5c,800,600,8,0x00,
273: cseq_800x600x8,cgraph_svgacolor,ccrtc_800x600x8,8,
274: 4,0,0,0,0,0,0,0,0},
275: {0x65,800,600,16,0xe1,
276: cseq_800x600x16,cgraph_svgacolor,ccrtc_800x600x16,16,
277: 6,5,11,6,5,5,0,0,0},
278: {0x67,800,600,15,0xf0,
279: cseq_800x600x16,cgraph_svgacolor,ccrtc_800x600x16,16,
280: 6,5,10,5,5,5,0,1,15},
281:
282: {0x60,1024,768,8,0x00,
283: cseq_1024x768x8,cgraph_svgacolor,ccrtc_1024x768x8,8,
284: 4,0,0,0,0,0,0,0,0},
285: {0x74,1024,768,16,0xe1,
286: cseq_1024x768x16,cgraph_svgacolor,ccrtc_1024x768x16,16,
287: 6,5,11,6,5,5,0,0,0},
288: {0x68,1024,768,15,0xf0,
289: cseq_1024x768x16,cgraph_svgacolor,ccrtc_1024x768x16,16,
290: 6,5,10,5,5,5,0,1,15},
291:
292: {0x78,800,600,24,0xe5,
293: cseq_800x600x24,cgraph_svgacolor,ccrtc_800x600x24,24,
294: 6,8,16,8,8,8,0,0,0},
295: {0x79,1024,768,24,0xe5,
296: cseq_1024x768x24,cgraph_svgacolor,ccrtc_1024x768x24,24,
297: 6,8,16,8,8,8,0,0,0},
298:
299: {0x6d,1280,1024,8,0x00,
300: cseq_1280x1024x8,cgraph_svgacolor,ccrtc_1280x1024x8,8,
301: 4,0,0,0,0,0,0,0,0},
302: {0x69,1280,1024,15,0xf0,
303: cseq_1280x1024x16,cgraph_svgacolor,ccrtc_1280x1024x16,16,
304: 6,5,10,5,5,5,0,1,15},
305: {0x75,1280,1024,16,0xe1,
306: cseq_1280x1024x16,cgraph_svgacolor,ccrtc_1280x1024x16,16,
307: 6,5,11,6,5,5,0,0,0},
308:
309: {0x7b,1600,1200,8,0x00,
310: cseq_1600x1200x8,cgraph_svgacolor,ccrtc_1600x1200x8,8,
311: 4,0,0,0,0,0,0,0,0},
312:
313: {0xfe,0,0,0,0,cseq_vga,cgraph_vga,ccrtc_vga,0,
314: 0xff,0,0,0,0,0,0,0,0},
315: {0xff,0,0,0,0,0,0,0,0,
316: 0xff,0,0,0,0,0,0,0,0},
317: };
318:
319: unsigned char cirrus_id_table[] = {
320: // 5430
321: 0xA0, 0x32,
322: // 5446
323: 0xB8, 0x39,
324:
325: 0xff, 0xff
326: };
327:
328:
329: unsigned short cirrus_vesa_modelist[] = {
330: // 640x480x8
331: 0x101, 0x5f,
332: // 640x480x15
333: 0x110, 0x66,
334: // 640x480x16
335: 0x111, 0x64,
336: // 640x480x24
337: 0x112, 0x71,
338: // 800x600x8
339: 0x103, 0x5c,
340: // 800x600x15
341: 0x113, 0x67,
342: // 800x600x16
343: 0x114, 0x65,
344: // 800x600x24
345: 0x115, 0x78,
346: // 1024x768x8
347: 0x105, 0x60,
348: // 1024x768x15
349: 0x116, 0x68,
350: // 1024x768x16
351: 0x117, 0x74,
352: // 1024x768x24
353: 0x118, 0x79,
354: // 1280x1024x8
355: 0x107, 0x6d,
356: // 1280x1024x15
357: 0x119, 0x69,
358: // 1280x1024x16
359: 0x11a, 0x75,
360: // invalid
361: 0xffff,0xffff
362: };
363:
364:
365: ASM_START
366:
367: cirrus_installed:
368: .ascii "cirrus-compatible VGA is detected"
369: .byte 0x0d,0x0a
370: .byte 0x0d,0x0a,0x00
371:
372: cirrus_not_installed:
373: .ascii "cirrus-compatible VGA is not detected"
374: .byte 0x0d,0x0a
375: .byte 0x0d,0x0a,0x00
376:
377: cirrus_vesa_vendorname:
378: cirrus_vesa_productname:
379: cirrus_vesa_oemname:
380: .ascii "VGABIOS Cirrus extension"
381: .byte 0
382: cirrus_vesa_productrevision:
383: .ascii "1.0"
384: .byte 0
385:
386: cirrus_init:
387: call cirrus_check
388: jnz no_cirrus
389: SET_INT_VECTOR(0x10, #0xC000, #cirrus_int10_handler)
390: mov al, #0x0f ; memory setup
391: mov dx, #0x3C4
392: out dx, al
393: inc dx
394: in al, dx
395: and al, #0x18
396: mov ah, al
397: mov al, #0x0a
398: dec dx
399: out dx, ax
400: mov ax, #0x0007 ; set vga mode
401: out dx, ax
402: mov ax, #0x0431 ; reset bitblt
403: mov dx, #0x3CE
404: out dx, ax
405: mov ax, #0x0031
406: out dx, ax
407: no_cirrus:
408: ret
409:
410: cirrus_display_info:
411: push ds
412: push si
413: push cs
414: pop ds
415: call cirrus_check
416: mov si, #cirrus_not_installed
417: jnz cirrus_msgnotinstalled
418: mov si, #cirrus_installed
419:
420: cirrus_msgnotinstalled:
421: call _display_string
422: pop si
423: pop ds
424: ret
425:
426: cirrus_check:
427: push ax
428: push dx
429: mov ax, #0x9206
430: mov dx, #0x3C4
431: out dx, ax
432: inc dx
433: in al, dx
434: cmp al, #0x12
435: pop dx
436: pop ax
437: ret
438:
439:
440: cirrus_int10_handler:
441: pushf
442: push bp
443: cmp ah, #0x00 ;; set video mode
444: jz cirrus_set_video_mode
445: cmp ah, #0x12 ;; cirrus extension
446: jz cirrus_extbios
447: cmp ah, #0x4F ;; VESA extension
448: jz cirrus_vesa
449:
450: cirrus_unhandled:
451: pop bp
452: popf
453: jmp vgabios_int10_handler
454:
455: cirrus_return:
456: #ifdef CIRRUS_DEBUG
457: call cirrus_debug_dump
458: #endif
459: pop bp
460: popf
461: iret
462:
463: cirrus_set_video_mode:
464: #ifdef CIRRUS_DEBUG
465: call cirrus_debug_dump
466: #endif
467: push si
468: push ax
469: push bx
470: push ds
471: #ifdef CIRRUS_VESA3_PMINFO
472: db 0x2e ;; cs:
473: mov si, [cirrus_vesa_sel0000_data]
474: #else
475: xor si, si
476: #endif
477: mov ds, si
478: xor bx, bx
479: mov [PM_BIOSMEM_VBE_MODE], bx
480: pop ds
481: pop bx
482: call cirrus_get_modeentry
483: jnc cirrus_set_video_mode_extended
484: mov al, #0xfe
485: call cirrus_get_modeentry_nomask
486: call cirrus_switch_mode
487: pop ax
488: pop si
489: jmp cirrus_unhandled
490:
491: cirrus_extbios:
492: #ifdef CIRRUS_DEBUG
493: call cirrus_debug_dump
494: #endif
495: cmp bl, #0x80
496: jb cirrus_unhandled
497: cmp bl, #0xAF
498: ja cirrus_unhandled
499: push bx
500: and bx, #0x7F
501: shl bx, 1
502: db 0x2e ;; cs:
503: mov bp, cirrus_extbios_handlers[bx]
504: pop bx
505: push #cirrus_return
506: push bp
507: ret
508:
509: cirrus_vesa:
510: #ifdef CIRRUS_DEBUG
511: call cirrus_debug_dump
512: #endif
513: cmp al, #0x10
514: ja cirrus_vesa_not_handled
515: push bx
516: xor bx, bx
517: mov bl, al
518: shl bx, 1
519: db 0x2e ;; cs:
520: mov bp, cirrus_vesa_handlers[bx]
521: pop bx
522: push #cirrus_return
523: push bp
524: ret
525:
526: cirrus_vesa_not_handled:
527: mov ax, #0x014F ;; not implemented
528: jmp cirrus_return
529:
530: #ifdef CIRRUS_DEBUG
531: cirrus_debug_dump:
532: push es
533: push ds
534: pusha
535: push cs
536: pop ds
537: call _cirrus_debugmsg
538: popa
539: pop ds
540: pop es
541: ret
542: #endif
543:
544: cirrus_set_video_mode_extended:
545: call cirrus_switch_mode
546: pop ax ;; mode
547: test al, #0x80
548: jnz cirrus_set_video_mode_extended_1
549: push ax
550: mov ax, #0xffff ; set to 0xff to keep win 2K happy
551: call cirrus_clear_vram
552: pop ax
553: cirrus_set_video_mode_extended_1:
554: and al, #0x7f
555:
556: push ds
557: #ifdef CIRRUS_VESA3_PMINFO
558: db 0x2e ;; cs:
559: mov si, [cirrus_vesa_sel0000_data]
560: #else
561: xor si, si
562: #endif
563: mov ds, si
564: mov [PM_BIOSMEM_CURRENT_MODE], al
565: pop ds
566:
567: mov al, #0x20
568:
569: pop si
570: jmp cirrus_return
571:
572: cirrus_vesa_pmbios_init:
573: retf
574: cirrus_vesa_pmbios_entry:
575: pushf
576: push bp
577: cmp ah, #0x4F
578: jnz cirrus_vesa_pmbios_unimplemented
579: cmp al, #0x0F
580: ja cirrus_vesa_pmbios_unimplemented
581: push bx
582: xor bx, bx
583: mov bl, al
584: shl bx, 1
585: db 0x2e ;; cs:
586: mov bp, cirrus_vesa_handlers[bx]
587: pop bx
588: push #cirrus_vesa_pmbios_return
589: push bp
590: ret
591: cirrus_vesa_pmbios_unimplemented:
592: mov ax, #0x014F
593: cirrus_vesa_pmbios_return:
594: pop bp
595: popf
596: retf
597:
598: ; in si:mode table
599: cirrus_switch_mode:
600: push ds
601: push bx
602: push dx
603: push cs
604: pop ds
605:
606: mov bx, [si+10] ;; seq
607: mov dx, #0x3c4
608: mov ax, #0x1206
609: out dx, ax ;; Unlock cirrus special
610: call cirrus_switch_mode_setregs
611:
612: mov bx, [si+12] ;; graph
613: mov dx, #0x3ce
614: call cirrus_switch_mode_setregs
615:
616: mov bx, [si+14] ;; crtc
617: call cirrus_get_crtc
618: call cirrus_switch_mode_setregs
619:
620: mov dx, #0x3c6
621: mov al, #0x00
622: out dx, al
623: in al, dx
624: in al, dx
625: in al, dx
626: in al, dx
627: mov al, [si+8] ;; hidden dac
628: out dx, al
629: mov al, #0xff
630: out dx, al
631:
632: mov al, #0x00
633: mov bl, [si+17] ;; memory model
634: or bl, bl
635: jz is_text_mode
636: mov al, #0x01
637: cmp bl, #0x03
638: jnz is_text_mode
639: or al, #0x40
640: is_text_mode:
641: mov bl, #0x10
642: call biosfn_get_single_palette_reg
643: and bh, #0xfe
644: or bh, al
645: call biosfn_set_single_palette_reg
646:
647: pop dx
648: pop bx
649: pop ds
650: ret
651:
652: cirrus_enable_16k_granularity:
653: push ax
654: push dx
655: mov dx, #0x3ce
656: mov al, #0x0b
657: out dx, al
658: inc dx
659: in al, dx
660: or al, #0x20 ;; enable 16k
661: out dx, al
662: pop dx
663: pop ax
664: ret
665:
666: cirrus_switch_mode_setregs:
667: csms_1:
668: mov ax, [bx]
669: cmp ax, #0xffff
670: jz csms_2
671: out dx, ax
672: add bx, #0x2
673: jmp csms_1
674: csms_2:
675: ret
676:
677: cirrus_extbios_80h:
678: push dx
679: call cirrus_get_crtc
680: mov al, #0x27
681: out dx, al
682: inc dx
683: in al, dx
684: mov bx, #_cirrus_id_table
685: c80h_1:
686: db 0x2e ;; cs:
687: mov ah, [bx]
688: cmp ah, al
689: jz c80h_2
690: cmp ah, #0xff
691: jz c80h_2
692: inc bx
693: inc bx
694: jmp c80h_1
695: c80h_2:
696: db 0x2e ;; cs:
697: mov al, 0x1[bx]
698: pop dx
699: mov ah, #0x00
700: xor bx, bx
701: ret
702:
703: cirrus_extbios_81h:
704: mov ax, #0x100 ;; XXX
705: ret
706: cirrus_extbios_82h:
707: push dx
708: call cirrus_get_crtc
709: xor ax, ax
710: mov al, #0x27
711: out dx, al
712: inc dx
713: in al, dx
714: and al, #0x03
715: mov ah, #0xAF
716: pop dx
717: ret
718:
719: cirrus_extbios_85h:
720: push cx
721: push dx
722: mov dx, #0x3C4
723: mov al, #0x0f ;; get DRAM band width
724: out dx, al
725: inc dx
726: in al, dx
727: ;; al = 4 << bandwidth
728: mov cl, al
729: shr cl, #0x03
730: and cl, #0x03
731: cmp cl, #0x03
732: je c85h2
733: mov al, #0x04
734: shl al, cl
735: jmp c85h3
736: c85h2:
737: ;; 4MB or 2MB
738: and al, #0x80
739: mov al, #0x20 ;; 2 MB
740: je c85h3
741: mov al, #0x40 ;; 4 MB
742: c85h3:
743: pop dx
744: pop cx
745: ret
746:
747: cirrus_extbios_9Ah:
748: mov ax, #0x4060
749: mov cx, #0x1132
750: ret
751:
752: cirrus_extbios_A0h:
753: call cirrus_get_modeentry
754: mov ah, #0x01
755: sbb ah, #0x00
756: mov bx, cirrus_extbios_A0h_callback
757: mov si, #0xffff
758: mov di, bx
759: mov ds, bx
760: mov es, bx
761: ret
762:
763: cirrus_extbios_A0h_callback:
764: ;; fatal: not implemented yet
765: cli
766: hlt
767: retf
768:
769: cirrus_extbios_A1h:
770: mov bx, #0x0E00 ;; IBM 8512/8513, color
771: ret
772:
773: cirrus_extbios_A2h:
774: mov al, #0x07 ;; HSync 31.5 - 64.0 kHz
775: ret
776:
777: cirrus_extbios_AEh:
778: mov al, #0x01 ;; High Refresh 75Hz
779: ret
780:
781: cirrus_extbios_unimplemented:
782: ret
783:
784: cirrus_vesa_00h:
785: push ds
786: push si
787: mov bp, di
788: push es
789: pop ds
790: cld
791: mov ax, [di]
792: cmp ax, #0x4256 ;; VB
793: jnz cv00_1
794: mov ax, [di+2]
795: cmp ax, #0x3245 ;; E2
796: jnz cv00_1
797: ;; VBE2
798: lea di, 0x14[bp]
799: mov ax, #0x0100 ;; soft ver.
800: stosw
801: mov ax, # cirrus_vesa_vendorname
802: stosw
803: mov ax, cs
804: stosw
805: mov ax, # cirrus_vesa_productname
806: stosw
807: mov ax, cs
808: stosw
809: mov ax, # cirrus_vesa_productrevision
810: stosw
811: mov ax, cs
812: stosw
813: cv00_1:
814: mov di, bp
815: mov ax, #0x4556 ;; VE
816: stosw
817: mov ax, #0x4153 ;; SA
818: stosw
819: mov ax, #0x0200 ;; v2.00
820: stosw
821: mov ax, # cirrus_vesa_oemname
822: stosw
823: mov ax, cs
824: stosw
825: xor ax, ax ;; caps
826: stosw
827: stosw
828: lea ax, 0x40[bp]
829: stosw
830: mov ax, es
831: stosw
832: call cirrus_extbios_85h ;; vram in 64k
833: mov ah, #0x00
834: stosw
835:
836: push cs
837: pop ds
838: lea di, 0x40[bp]
839: mov si, #_cirrus_vesa_modelist
840: cv00_2:
841: lodsw
842: stosw
843: add si, #2
844: cmp ax, #0xffff
845: jnz cv00_2
846:
847: mov ax, #0x004F
848: mov di, bp
849: pop si
850: pop ds
851: ret
852:
853: cirrus_vesa_01h:
854: mov ax, cx
855: and ax, #0x3fff
856: call cirrus_vesamode_to_mode
857: cmp ax, #0xffff
858: jnz cirrus_vesa_01h_1
859: jmp cirrus_vesa_unimplemented
860: cirrus_vesa_01h_1:
861: push ds
862: push si
863: push cx
864: push dx
865: push bx
866: mov bp, di
867: cld
868: push cs
869: pop ds
870: call cirrus_get_modeentry_nomask
871:
872: push di
873: xor ax, ax
874: mov cx, #0x80
875: rep
876: stosw ;; clear buffer
877: pop di
878:
879: mov ax, #0x003b ;; mode
880: stosw
881: mov ax, #0x0007 ;; attr
882: stosw
883: mov ax, #0x0010 ;; granularity =16K
884: stosw
885: mov ax, #0x0040 ;; size =64K
886: stosw
887: mov ax, #0xA000 ;; segment A
888: stosw
889: xor ax, ax ;; no segment B
890: stosw
891: mov ax, #cirrus_vesa_05h_farentry
892: stosw
893: mov ax, cs
894: stosw
895: call cirrus_get_line_offset_entry
896: stosw ;; bytes per scan line
897: mov ax, [si+2] ;; width
898: stosw
899: mov ax, [si+4] ;; height
900: stosw
901: mov ax, #0x08
902: stosb
903: mov ax, #0x10
904: stosb
905: mov al, #1 ;; count of planes
906: stosb
907: mov al, [si+6] ;; bpp
908: stosb
909: mov al, #0x1 ;; XXX number of banks
910: stosb
911: mov al, [si+17]
912: stosb ;; memory model
913: mov al, #0x0 ;; XXX size of bank in K
914: stosb
915: call cirrus_get_line_offset_entry
916: mov bx, [si+4]
917: mul bx ;; dx:ax=vramdisp
918: or ax, ax
919: jz cirrus_vesa_01h_3
920: inc dx
921: cirrus_vesa_01h_3:
922: call cirrus_extbios_85h ;; al=vram in 64k
923: mov ah, #0x00
924: mov cx, dx
925: xor dx, dx
926: div cx
927: dec ax
928: stosb ;; number of image pages = vramtotal/vramdisp-1
929: mov al, #0x00
930: stosb
931:
932: ;; v1.2+ stuffs
933: push si
934: add si, #18
935: movsw
936: movsw
937: movsw
938: movsw
939: pop si
940:
941: mov ah, [si+16]
942: mov al, #0x0
943: sub ah, #9
944: rcl al, #1 ; bit 0=palette flag
945: stosb ;; direct screen mode info
946:
947: ;; v2.0+ stuffs
948: ;; 32-bit LFB address
949: xor ax, ax
950: stosw
1.1.1.2 ! root 951: mov ax, #0x1013 ;; vendor Cirrus
! 952: call _pci_get_lfb_addr
1.1 root 953: stosw
954: or ax, ax
955: jz cirrus_vesa_01h_4
956: push di
957: mov di, bp
958: db 0x26 ;; es:
959: mov ax, [di]
960: or ax, #0x0080 ;; mode bit 7:LFB
961: stosw
962: pop di
963: cirrus_vesa_01h_4:
964:
965: xor ax, ax
966: stosw ; reserved
967: stosw ; reserved
968: stosw ; reserved
969:
970: mov ax, #0x004F
971: mov di, bp
972: pop bx
973: pop dx
974: pop cx
975: pop si
976: pop ds
977:
978: test cx, #0x4000 ;; LFB flag
979: jz cirrus_vesa_01h_5
980: push cx
981: db 0x26 ;; es:
982: mov cx, [di]
983: cmp cx, #0x0080 ;; is LFB supported?
984: jnz cirrus_vesa_01h_6
985: mov ax, #0x014F ;; error - no LFB
986: cirrus_vesa_01h_6:
987: pop cx
988: cirrus_vesa_01h_5:
989: ret
990:
991: cirrus_vesa_02h:
992: ;; XXX support CRTC registers
993: test bx, #0x3e00
994: jnz cirrus_vesa_02h_2 ;; unknown flags
995: mov ax, bx
996: and ax, #0x1ff ;; bit 8-0 mode
997: cmp ax, #0x100 ;; legacy VGA mode
998: jb cirrus_vesa_02h_legacy
999: call cirrus_vesamode_to_mode
1000: cmp ax, #0xffff
1001: jnz cirrus_vesa_02h_1
1002: cirrus_vesa_02h_2:
1003: jmp cirrus_vesa_unimplemented
1004: cirrus_vesa_02h_legacy:
1005: #ifdef CIRRUS_VESA3_PMINFO
1006: db 0x2e ;; cs:
1007: cmp byte ptr [cirrus_vesa_is_protected_mode], #0
1008: jnz cirrus_vesa_02h_2
1009: #endif // CIRRUS_VESA3_PMINFO
1010: int #0x10
1011: mov ax, #0x004F
1012: ret
1013: cirrus_vesa_02h_1:
1014: push si
1015: push ax
1016: call cirrus_get_modeentry_nomask
1017: call cirrus_switch_mode
1018: test bx, #0x4000 ;; LFB
1019: jnz cirrus_vesa_02h_3
1020: call cirrus_enable_16k_granularity
1021: cirrus_vesa_02h_3:
1022: test bx, #0x8000 ;; no clear
1023: jnz cirrus_vesa_02h_4
1024: push ax
1025: xor ax,ax
1026: call cirrus_clear_vram
1027: pop ax
1028: cirrus_vesa_02h_4:
1029: pop ax
1030: push ds
1031: #ifdef CIRRUS_VESA3_PMINFO
1032: db 0x2e ;; cs:
1033: mov si, [cirrus_vesa_sel0000_data]
1034: #else
1035: xor si, si
1036: #endif
1037: mov ds, si
1038: mov [PM_BIOSMEM_CURRENT_MODE], al
1039: mov [PM_BIOSMEM_VBE_MODE], bx
1040: pop ds
1041: pop si
1042: mov ax, #0x004F
1043: ret
1044:
1045: cirrus_vesa_03h:
1046: push ds
1047: #ifdef CIRRUS_VESA3_PMINFO
1048: db 0x2e ;; cs:
1049: mov ax, [cirrus_vesa_sel0000_data]
1050: #else
1051: xor ax, ax
1052: #endif
1053: mov ds, ax
1054: mov bx, # PM_BIOSMEM_VBE_MODE
1055: mov ax, [bx]
1056: mov bx, ax
1057: test bx, bx
1058: jnz cirrus_vesa_03h_1
1059: mov bx, # PM_BIOSMEM_CURRENT_MODE
1060: mov al, [bx]
1061: mov bl, al
1062: xor bh, bh
1063: cirrus_vesa_03h_1:
1064: mov ax, #0x004f
1065: pop ds
1066: ret
1067:
1068: cirrus_vesa_05h_farentry:
1069: call cirrus_vesa_05h
1070: retf
1071:
1072: cirrus_vesa_05h:
1073: cmp bl, #0x01
1074: ja cirrus_vesa_05h_1
1075: cmp bh, #0x00
1076: jz cirrus_vesa_05h_setmempage
1077: cmp bh, #0x01
1078: jz cirrus_vesa_05h_getmempage
1079: cirrus_vesa_05h_1:
1080: jmp cirrus_vesa_unimplemented
1081: cirrus_vesa_05h_setmempage:
1082: or dh, dh ; address must be < 0x100
1083: jnz cirrus_vesa_05h_1
1084: push dx
1085: mov al, bl ;; bl=bank number
1086: add al, #0x09
1087: mov ah, dl ;; dx=window address in granularity
1088: mov dx, #0x3ce
1089: out dx, ax
1090: pop dx
1091: mov ax, #0x004F
1092: ret
1093: cirrus_vesa_05h_getmempage:
1094: mov al, bl ;; bl=bank number
1095: add al, #0x09
1096: mov dx, #0x3ce
1097: out dx, al
1098: inc dx
1099: in al, dx
1100: xor dx, dx
1101: mov dl, al ;; dx=window address in granularity
1102: mov ax, #0x004F
1103: ret
1104:
1105: cirrus_vesa_06h:
1106: mov ax, cx
1107: cmp bl, #0x01
1108: je cirrus_vesa_06h_3
1109: cmp bl, #0x02
1110: je cirrus_vesa_06h_2
1111: jb cirrus_vesa_06h_1
1112: mov ax, #0x0100
1113: ret
1114: cirrus_vesa_06h_1:
1115: call cirrus_get_bpp_bytes
1116: mov bl, al
1117: xor bh, bh
1118: mov ax, cx
1119: mul bx
1120: cirrus_vesa_06h_2:
1121: call cirrus_set_line_offset
1122: cirrus_vesa_06h_3:
1123: call cirrus_get_bpp_bytes
1124: mov bl, al
1125: xor bh, bh
1126: xor dx, dx
1127: call cirrus_get_line_offset
1128: push ax
1129: div bx
1130: mov cx, ax
1131: pop bx
1132: call cirrus_extbios_85h ;; al=vram in 64k
1133: xor dx, dx
1134: mov dl, al
1135: xor ax, ax
1136: div bx
1137: mov dx, ax
1138: mov ax, #0x004f
1139: ret
1140:
1141: cirrus_vesa_07h:
1142: cmp bl, #0x80
1143: je cirrus_vesa_07h_1
1144: cmp bl, #0x01
1145: je cirrus_vesa_07h_2
1146: jb cirrus_vesa_07h_1
1147: mov ax, #0x0100
1148: ret
1149: cirrus_vesa_07h_1:
1150: push dx
1151: call cirrus_get_bpp_bytes
1152: mov bl, al
1153: xor bh, bh
1154: mov ax, cx
1155: mul bx
1156: pop bx
1157: push ax
1158: call cirrus_get_line_offset
1159: mul bx
1160: pop bx
1161: add ax, bx
1162: jnc cirrus_vesa_07h_3
1163: inc dx
1164: cirrus_vesa_07h_3:
1165: push dx
1166: and dx, #0x0003
1167: mov bx, #0x04
1168: div bx
1169: pop dx
1170: shr dx, #2
1171: call cirrus_set_start_addr
1172: mov ax, #0x004f
1173: ret
1174: cirrus_vesa_07h_2:
1175: call cirrus_get_start_addr
1176: shl dx, #2
1177: push dx
1178: mov bx, #0x04
1179: mul bx
1180: pop bx
1181: or dx, bx
1182: push ax
1183: call cirrus_get_line_offset
1184: mov bx, ax
1185: pop ax
1186: div bx
1187: push ax
1188: push dx
1189: call cirrus_get_bpp_bytes
1190: mov bl, al
1191: xor bh, bh
1192: pop ax
1193: xor dx, dx
1194: div bx
1195: mov cx, ax
1196: pop dx
1197: mov ax, #0x004f
1198: ret
1199:
1200: cirrus_vesa_10h:
1201: cmp bl, #0x00
1202: jne cirrus_vesa_10h_01
1203: mov bx, #0x0f30
1204: mov ax, #0x004f
1205: ret
1206: cirrus_vesa_10h_01:
1207: cmp bl, #0x01
1208: jne cirrus_vesa_10h_02
1209: push dx
1210: push ds
1211: mov dx, #0x40
1212: mov ds, dx
1213: mov [0xb9], bh
1214: pop ds
1215: pop dx
1216: mov ax, #0x004f
1217: ret
1218: cirrus_vesa_10h_02:
1219: cmp bl, #0x02
1220: jne cirrus_vesa_unimplemented
1221: push dx
1222: push ds
1223: mov dx, #0x40
1224: mov ds, dx
1225: mov bh, [0xb9]
1226: pop ds
1227: pop dx
1228: mov ax, #0x004f
1229: ret
1230:
1231: cirrus_vesa_unimplemented:
1232: mov ax, #0x014F ;; not implemented
1233: ret
1234:
1235:
1236: ;; in ax:vesamode, out ax:cirrusmode
1237: cirrus_vesamode_to_mode:
1238: push ds
1239: push cx
1240: push si
1241: push cs
1242: pop ds
1243: mov cx, #0xffff
1244: mov si, #_cirrus_vesa_modelist
1245: cvtm_1:
1246: cmp [si],ax
1247: jz cvtm_2
1248: cmp [si],cx
1249: jz cvtm_2
1250: add si, #4
1251: jmp cvtm_1
1252: cvtm_2:
1253: mov ax,[si+2]
1254: pop si
1255: pop cx
1256: pop ds
1257: ret
1258:
1259: ; cirrus_get_crtc
1260: ;; NOTE - may be called in protected mode
1261: cirrus_get_crtc:
1262: push ds
1263: push ax
1264: mov dx, #0x3cc
1265: in al, dx
1266: and al, #0x01
1267: shl al, #5
1268: mov dx, #0x3b4
1269: add dl, al
1270: pop ax
1271: pop ds
1272: ret
1273:
1274: ;; in - al:mode, out - cflag:result, si:table, ax:destroyed
1275: cirrus_get_modeentry:
1276: and al, #0x7f
1277: cirrus_get_modeentry_nomask:
1278: mov si, #_cirrus_modes
1279: cgm_1:
1280: db 0x2e ;; cs:
1281: mov ah, [si]
1282: cmp al, ah
1283: jz cgm_2
1284: cmp ah, #0xff
1285: jz cgm_4
1286: add si, # CIRRUS_MODE_SIZE
1287: jmp cgm_1
1288: cgm_4:
1289: xor si, si
1290: stc ;; video mode is not supported
1291: jmp cgm_3
1292: cgm_2:
1293: clc ;; video mode is supported
1294: cgm_3:
1295: ret
1296:
1297: ;; out - al:bytes per pixel
1298: cirrus_get_bpp_bytes:
1299: push dx
1300: mov dx, #0x03c4
1301: mov al, #0x07
1302: out dx, al
1303: inc dx
1304: in al, dx
1305: and al, #0x0e
1306: cmp al, #0x06
1307: jne cirrus_get_bpp_bytes_1
1308: and al, #0x02
1309: cirrus_get_bpp_bytes_1:
1310: shr al, #1
1311: cmp al, #0x04
1312: je cirrus_get_bpp_bytes_2
1313: inc al
1314: cirrus_get_bpp_bytes_2:
1315: pop dx
1316: ret
1317:
1318: ;; in - ax: new line offset
1319: cirrus_set_line_offset:
1320: shr ax, #3
1321: push ax
1322: call cirrus_get_crtc
1323: mov al, #0x13
1324: out dx, al
1325: inc dx
1326: pop ax
1327: out dx, al
1328: dec dx
1329: mov al, #0x1b
1330: out dx, al
1331: inc dx
1332: shl ah, #4
1333: in al, dx
1334: and al, #ef
1335: or al, ah
1336: out dx, al
1337: ret
1338:
1339: ;; out - ax: active line offset
1340: cirrus_get_line_offset:
1341: push dx
1342: push bx
1343: call cirrus_get_crtc
1344: mov al, #0x13
1345: out dx, al
1346: inc dx
1347: in al, dx
1348: mov bl, al
1349: dec dx
1350: mov al, #0x1b
1351: out dx, al
1352: inc dx
1353: in al, dx
1354: mov ah, al
1355: shr ah, #4
1356: and ah, #0x01
1357: mov al, bl
1358: shl ax, #3
1359: pop bx
1360: pop dx
1361: ret
1362:
1363: ;; in - si: table
1364: ;; out - ax: line offset for mode
1365: cirrus_get_line_offset_entry:
1366: push bx
1367: mov bx, [si+14] ;; crtc table
1368: push bx
1369: offset_loop1:
1370: mov ax, [bx]
1371: cmp al, #0x13
1372: je offset_found1
1373: inc bx
1374: inc bx
1375: jnz offset_loop1
1376: offset_found1:
1377: xor al, al
1378: shr ax, #5
1379: pop bx
1380: push ax
1381: offset_loop2:
1382: mov ax, [bx]
1383: cmp al, #0x1b
1384: je offset_found2
1385: inc bx
1386: inc bx
1387: jnz offset_loop2
1388: offset_found2:
1389: pop bx
1390: and ax, #0x1000
1391: shr ax, #1
1392: or ax, bx
1393: pop bx
1394: ret
1395:
1396: ;; in - new address in DX:AX
1397: cirrus_set_start_addr:
1398: push bx
1399: push dx
1400: push ax
1401: call cirrus_get_crtc
1402: mov al, #0x0d
1403: out dx, al
1404: inc dx
1405: pop ax
1406: out dx, al
1407: dec dx
1408: mov al, #0x0c
1409: out dx, al
1410: inc dx
1411: mov al, ah
1412: out dx, al
1413: dec dx
1414: mov al, #0x1d
1415: out dx, al
1416: inc dx
1417: in al, dx
1418: and al, #0x7f
1419: pop bx
1420: mov ah, bl
1421: shl bl, #4
1422: and bl, #0x80
1423: or al, bl
1424: out dx, al
1425: dec dx
1426: mov bl, ah
1427: and ah, #0x01
1428: shl bl, #1
1429: and bl, #0x0c
1430: or ah, bl
1431: mov al, #0x1b
1432: out dx, al
1433: inc dx
1434: in al, dx
1435: and al, #0xf2
1436: or al, ah
1437: out dx, al
1438: pop bx
1439: ret
1440:
1441: ;; out - current address in DX:AX
1442: cirrus_get_start_addr:
1443: push bx
1444: call cirrus_get_crtc
1445: mov al, #0x0c
1446: out dx, al
1447: inc dx
1448: in al, dx
1449: mov ah, al
1450: dec dx
1451: mov al, #0x0d
1452: out dx, al
1453: inc dx
1454: in al, dx
1455: push ax
1456: dec dx
1457: mov al, #0x1b
1458: out dx, al
1459: inc dx
1460: in al, dx
1461: dec dx
1462: mov bl, al
1463: and al, #0x01
1464: and bl, #0x0c
1465: shr bl, #1
1466: or bl, al
1467: mov al, #0x1d
1468: out dx, al
1469: inc dx
1470: in al, dx
1471: and al, #0x80
1472: shr al, #4
1473: or bl, al
1474: mov dl, bl
1475: xor dh, dh
1476: pop ax
1477: pop bx
1478: ret
1479:
1480: cirrus_clear_vram:
1481: pusha
1482: push es
1483: mov si, ax
1484:
1485: call cirrus_enable_16k_granularity
1486: call cirrus_extbios_85h
1487: shl al, #2
1488: mov bl, al
1489: xor ah,ah
1490: cirrus_clear_vram_1:
1491: mov al, #0x09
1492: mov dx, #0x3ce
1493: out dx, ax
1494: push ax
1495: mov cx, #0xa000
1496: mov es, cx
1497: xor di, di
1498: mov ax, si
1499: mov cx, #8192
1500: cld
1501: rep
1502: stosw
1503: pop ax
1504: inc ah
1505: cmp ah, bl
1506: jne cirrus_clear_vram_1
1507:
1508: xor ah,ah
1509: mov dx, #0x3ce
1510: out dx, ax
1511:
1512: pop es
1513: popa
1514: ret
1515:
1516: cirrus_extbios_handlers:
1517: ;; 80h
1518: dw cirrus_extbios_80h
1519: dw cirrus_extbios_81h
1520: dw cirrus_extbios_82h
1521: dw cirrus_extbios_unimplemented
1522: ;; 84h
1523: dw cirrus_extbios_unimplemented
1524: dw cirrus_extbios_85h
1525: dw cirrus_extbios_unimplemented
1526: dw cirrus_extbios_unimplemented
1527: ;; 88h
1528: dw cirrus_extbios_unimplemented
1529: dw cirrus_extbios_unimplemented
1530: dw cirrus_extbios_unimplemented
1531: dw cirrus_extbios_unimplemented
1532: ;; 8Ch
1533: dw cirrus_extbios_unimplemented
1534: dw cirrus_extbios_unimplemented
1535: dw cirrus_extbios_unimplemented
1536: dw cirrus_extbios_unimplemented
1537: ;; 90h
1538: dw cirrus_extbios_unimplemented
1539: dw cirrus_extbios_unimplemented
1540: dw cirrus_extbios_unimplemented
1541: dw cirrus_extbios_unimplemented
1542: ;; 94h
1543: dw cirrus_extbios_unimplemented
1544: dw cirrus_extbios_unimplemented
1545: dw cirrus_extbios_unimplemented
1546: dw cirrus_extbios_unimplemented
1547: ;; 98h
1548: dw cirrus_extbios_unimplemented
1549: dw cirrus_extbios_unimplemented
1550: dw cirrus_extbios_9Ah
1551: dw cirrus_extbios_unimplemented
1552: ;; 9Ch
1553: dw cirrus_extbios_unimplemented
1554: dw cirrus_extbios_unimplemented
1555: dw cirrus_extbios_unimplemented
1556: dw cirrus_extbios_unimplemented
1557: ;; A0h
1558: dw cirrus_extbios_A0h
1559: dw cirrus_extbios_A1h
1560: dw cirrus_extbios_A2h
1561: dw cirrus_extbios_unimplemented
1562: ;; A4h
1563: dw cirrus_extbios_unimplemented
1564: dw cirrus_extbios_unimplemented
1565: dw cirrus_extbios_unimplemented
1566: dw cirrus_extbios_unimplemented
1567: ;; A8h
1568: dw cirrus_extbios_unimplemented
1569: dw cirrus_extbios_unimplemented
1570: dw cirrus_extbios_unimplemented
1571: dw cirrus_extbios_unimplemented
1572: ;; ACh
1573: dw cirrus_extbios_unimplemented
1574: dw cirrus_extbios_unimplemented
1575: dw cirrus_extbios_AEh
1576: dw cirrus_extbios_unimplemented
1577:
1578: cirrus_vesa_handlers:
1579: ;; 00h
1580: dw cirrus_vesa_00h
1581: dw cirrus_vesa_01h
1582: dw cirrus_vesa_02h
1583: dw cirrus_vesa_03h
1584: ;; 04h
1585: dw cirrus_vesa_unimplemented
1586: dw cirrus_vesa_05h
1587: dw cirrus_vesa_06h
1588: dw cirrus_vesa_07h
1589: ;; 08h
1590: dw cirrus_vesa_unimplemented
1591: dw cirrus_vesa_unimplemented
1592: dw cirrus_vesa_unimplemented
1593: dw cirrus_vesa_unimplemented
1594: ;; 0Ch
1595: dw cirrus_vesa_unimplemented
1596: dw cirrus_vesa_unimplemented
1597: dw cirrus_vesa_unimplemented
1598: dw cirrus_vesa_unimplemented
1599: ;; 10h
1600: dw cirrus_vesa_10h
1601:
1602:
1603: ASM_END
1604:
1605: #ifdef CIRRUS_VESA3_PMINFO
1606: ASM_START
1607: cirrus_vesa_pminfo:
1608: /* + 0 */
1609: .byte 0x50,0x4d,0x49,0x44 ;; signature[4]
1610: /* + 4 */
1611: dw cirrus_vesa_pmbios_entry ;; entry_bios
1612: dw cirrus_vesa_pmbios_init ;; entry_init
1613: /* + 8 */
1614: cirrus_vesa_sel0000_data:
1615: dw 0x0000 ;; sel_00000
1616: cirrus_vesa_selA000_data:
1617: dw 0xA000 ;; sel_A0000
1618: /* +12 */
1619: cirrus_vesa_selB000_data:
1620: dw 0xB000 ;; sel_B0000
1621: cirrus_vesa_selB800_data:
1622: dw 0xB800 ;; sel_B8000
1623: /* +16 */
1624: cirrus_vesa_selC000_data:
1625: dw 0xC000 ;; sel_C0000
1626: cirrus_vesa_is_protected_mode:
1627: ;; protected mode flag and checksum
1628: dw (~((0xf2 + (cirrus_vesa_pmbios_entry >> 8) + (cirrus_vesa_pmbios_entry) \
1629: + (cirrus_vesa_pmbios_init >> 8) + (cirrus_vesa_pmbios_init)) & 0xff) << 8) + 0x01
1630: ASM_END
1631: #endif // CIRRUS_VESA3_PMINFO
1632:
1633:
1634: #ifdef CIRRUS_DEBUG
1635: static void cirrus_debugmsg(DI, SI, BP, SP, BX, DX, CX, AX, DS, ES, FLAGS)
1636: Bit16u DI, SI, BP, SP, BX, DX, CX, AX, ES, DS, FLAGS;
1637: {
1638: if((GET_AH()!=0x0E)&&(GET_AH()!=0x02)&&(GET_AH()!=0x09)&&(AX!=0x4F05))
1639: printf("vgabios call ah%02x al%02x bx%04x cx%04x dx%04x\n",GET_AH(),GET_AL(),BX,CX,DX);
1640: }
1641: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.