source: trunk/packages/xen-common/xen-common/tools/firmware/vgabios/clext.c @ 34

Last change on this file since 34 was 34, checked in by hartmans, 17 years ago

Add xen and xen-common

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