|
|
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 ! 951: call cirrus_get_lfb_addr ! 952: stosw ! 953: or ax, ax ! 954: jz cirrus_vesa_01h_4 ! 955: push di ! 956: mov di, bp ! 957: db 0x26 ;; es: ! 958: mov ax, [di] ! 959: or ax, #0x0080 ;; mode bit 7:LFB ! 960: stosw ! 961: pop di ! 962: cirrus_vesa_01h_4: ! 963: ! 964: xor ax, ax ! 965: stosw ; reserved ! 966: stosw ; reserved ! 967: stosw ; reserved ! 968: ! 969: mov ax, #0x004F ! 970: mov di, bp ! 971: pop bx ! 972: pop dx ! 973: pop cx ! 974: pop si ! 975: pop ds ! 976: ! 977: test cx, #0x4000 ;; LFB flag ! 978: jz cirrus_vesa_01h_5 ! 979: push cx ! 980: db 0x26 ;; es: ! 981: mov cx, [di] ! 982: cmp cx, #0x0080 ;; is LFB supported? ! 983: jnz cirrus_vesa_01h_6 ! 984: mov ax, #0x014F ;; error - no LFB ! 985: cirrus_vesa_01h_6: ! 986: pop cx ! 987: cirrus_vesa_01h_5: ! 988: ret ! 989: ! 990: cirrus_vesa_02h: ! 991: ;; XXX support CRTC registers ! 992: test bx, #0x3e00 ! 993: jnz cirrus_vesa_02h_2 ;; unknown flags ! 994: mov ax, bx ! 995: and ax, #0x1ff ;; bit 8-0 mode ! 996: cmp ax, #0x100 ;; legacy VGA mode ! 997: jb cirrus_vesa_02h_legacy ! 998: call cirrus_vesamode_to_mode ! 999: cmp ax, #0xffff ! 1000: jnz cirrus_vesa_02h_1 ! 1001: cirrus_vesa_02h_2: ! 1002: jmp cirrus_vesa_unimplemented ! 1003: cirrus_vesa_02h_legacy: ! 1004: #ifdef CIRRUS_VESA3_PMINFO ! 1005: db 0x2e ;; cs: ! 1006: cmp byte ptr [cirrus_vesa_is_protected_mode], #0 ! 1007: jnz cirrus_vesa_02h_2 ! 1008: #endif // CIRRUS_VESA3_PMINFO ! 1009: int #0x10 ! 1010: mov ax, #0x004F ! 1011: ret ! 1012: cirrus_vesa_02h_1: ! 1013: push si ! 1014: push ax ! 1015: call cirrus_get_modeentry_nomask ! 1016: call cirrus_switch_mode ! 1017: test bx, #0x4000 ;; LFB ! 1018: jnz cirrus_vesa_02h_3 ! 1019: call cirrus_enable_16k_granularity ! 1020: cirrus_vesa_02h_3: ! 1021: test bx, #0x8000 ;; no clear ! 1022: jnz cirrus_vesa_02h_4 ! 1023: push ax ! 1024: xor ax,ax ! 1025: call cirrus_clear_vram ! 1026: pop ax ! 1027: cirrus_vesa_02h_4: ! 1028: pop ax ! 1029: push ds ! 1030: #ifdef CIRRUS_VESA3_PMINFO ! 1031: db 0x2e ;; cs: ! 1032: mov si, [cirrus_vesa_sel0000_data] ! 1033: #else ! 1034: xor si, si ! 1035: #endif ! 1036: mov ds, si ! 1037: mov [PM_BIOSMEM_CURRENT_MODE], al ! 1038: mov [PM_BIOSMEM_VBE_MODE], bx ! 1039: pop ds ! 1040: pop si ! 1041: mov ax, #0x004F ! 1042: ret ! 1043: ! 1044: cirrus_vesa_03h: ! 1045: push ds ! 1046: #ifdef CIRRUS_VESA3_PMINFO ! 1047: db 0x2e ;; cs: ! 1048: mov ax, [cirrus_vesa_sel0000_data] ! 1049: #else ! 1050: xor ax, ax ! 1051: #endif ! 1052: mov ds, ax ! 1053: mov bx, # PM_BIOSMEM_VBE_MODE ! 1054: mov ax, [bx] ! 1055: mov bx, ax ! 1056: test bx, bx ! 1057: jnz cirrus_vesa_03h_1 ! 1058: mov bx, # PM_BIOSMEM_CURRENT_MODE ! 1059: mov al, [bx] ! 1060: mov bl, al ! 1061: xor bh, bh ! 1062: cirrus_vesa_03h_1: ! 1063: mov ax, #0x004f ! 1064: pop ds ! 1065: ret ! 1066: ! 1067: cirrus_vesa_05h_farentry: ! 1068: call cirrus_vesa_05h ! 1069: retf ! 1070: ! 1071: cirrus_vesa_05h: ! 1072: cmp bl, #0x01 ! 1073: ja cirrus_vesa_05h_1 ! 1074: cmp bh, #0x00 ! 1075: jz cirrus_vesa_05h_setmempage ! 1076: cmp bh, #0x01 ! 1077: jz cirrus_vesa_05h_getmempage ! 1078: cirrus_vesa_05h_1: ! 1079: jmp cirrus_vesa_unimplemented ! 1080: cirrus_vesa_05h_setmempage: ! 1081: or dh, dh ; address must be < 0x100 ! 1082: jnz cirrus_vesa_05h_1 ! 1083: push dx ! 1084: mov al, bl ;; bl=bank number ! 1085: add al, #0x09 ! 1086: mov ah, dl ;; dx=window address in granularity ! 1087: mov dx, #0x3ce ! 1088: out dx, ax ! 1089: pop dx ! 1090: mov ax, #0x004F ! 1091: ret ! 1092: cirrus_vesa_05h_getmempage: ! 1093: mov al, bl ;; bl=bank number ! 1094: add al, #0x09 ! 1095: mov dx, #0x3ce ! 1096: out dx, al ! 1097: inc dx ! 1098: in al, dx ! 1099: xor dx, dx ! 1100: mov dl, al ;; dx=window address in granularity ! 1101: mov ax, #0x004F ! 1102: ret ! 1103: ! 1104: cirrus_vesa_06h: ! 1105: mov ax, cx ! 1106: cmp bl, #0x01 ! 1107: je cirrus_vesa_06h_3 ! 1108: cmp bl, #0x02 ! 1109: je cirrus_vesa_06h_2 ! 1110: jb cirrus_vesa_06h_1 ! 1111: mov ax, #0x0100 ! 1112: ret ! 1113: cirrus_vesa_06h_1: ! 1114: call cirrus_get_bpp_bytes ! 1115: mov bl, al ! 1116: xor bh, bh ! 1117: mov ax, cx ! 1118: mul bx ! 1119: cirrus_vesa_06h_2: ! 1120: call cirrus_set_line_offset ! 1121: cirrus_vesa_06h_3: ! 1122: call cirrus_get_bpp_bytes ! 1123: mov bl, al ! 1124: xor bh, bh ! 1125: xor dx, dx ! 1126: call cirrus_get_line_offset ! 1127: push ax ! 1128: div bx ! 1129: mov cx, ax ! 1130: pop bx ! 1131: call cirrus_extbios_85h ;; al=vram in 64k ! 1132: xor dx, dx ! 1133: mov dl, al ! 1134: xor ax, ax ! 1135: div bx ! 1136: mov dx, ax ! 1137: mov ax, #0x004f ! 1138: ret ! 1139: ! 1140: cirrus_vesa_07h: ! 1141: cmp bl, #0x80 ! 1142: je cirrus_vesa_07h_1 ! 1143: cmp bl, #0x01 ! 1144: je cirrus_vesa_07h_2 ! 1145: jb cirrus_vesa_07h_1 ! 1146: mov ax, #0x0100 ! 1147: ret ! 1148: cirrus_vesa_07h_1: ! 1149: push dx ! 1150: call cirrus_get_bpp_bytes ! 1151: mov bl, al ! 1152: xor bh, bh ! 1153: mov ax, cx ! 1154: mul bx ! 1155: pop bx ! 1156: push ax ! 1157: call cirrus_get_line_offset ! 1158: mul bx ! 1159: pop bx ! 1160: add ax, bx ! 1161: jnc cirrus_vesa_07h_3 ! 1162: inc dx ! 1163: cirrus_vesa_07h_3: ! 1164: push dx ! 1165: and dx, #0x0003 ! 1166: mov bx, #0x04 ! 1167: div bx ! 1168: pop dx ! 1169: shr dx, #2 ! 1170: call cirrus_set_start_addr ! 1171: mov ax, #0x004f ! 1172: ret ! 1173: cirrus_vesa_07h_2: ! 1174: call cirrus_get_start_addr ! 1175: shl dx, #2 ! 1176: push dx ! 1177: mov bx, #0x04 ! 1178: mul bx ! 1179: pop bx ! 1180: or dx, bx ! 1181: push ax ! 1182: call cirrus_get_line_offset ! 1183: mov bx, ax ! 1184: pop ax ! 1185: div bx ! 1186: push ax ! 1187: push dx ! 1188: call cirrus_get_bpp_bytes ! 1189: mov bl, al ! 1190: xor bh, bh ! 1191: pop ax ! 1192: xor dx, dx ! 1193: div bx ! 1194: mov cx, ax ! 1195: pop dx ! 1196: mov ax, #0x004f ! 1197: ret ! 1198: ! 1199: cirrus_vesa_10h: ! 1200: cmp bl, #0x00 ! 1201: jne cirrus_vesa_10h_01 ! 1202: mov bx, #0x0f30 ! 1203: mov ax, #0x004f ! 1204: ret ! 1205: cirrus_vesa_10h_01: ! 1206: cmp bl, #0x01 ! 1207: jne cirrus_vesa_10h_02 ! 1208: push dx ! 1209: push ds ! 1210: mov dx, #0x40 ! 1211: mov ds, dx ! 1212: mov [0xb9], bh ! 1213: pop ds ! 1214: pop dx ! 1215: mov ax, #0x004f ! 1216: ret ! 1217: cirrus_vesa_10h_02: ! 1218: cmp bl, #0x02 ! 1219: jne cirrus_vesa_unimplemented ! 1220: push dx ! 1221: push ds ! 1222: mov dx, #0x40 ! 1223: mov ds, dx ! 1224: mov bh, [0xb9] ! 1225: pop ds ! 1226: pop dx ! 1227: mov ax, #0x004f ! 1228: ret ! 1229: ! 1230: cirrus_vesa_unimplemented: ! 1231: mov ax, #0x014F ;; not implemented ! 1232: ret ! 1233: ! 1234: ! 1235: ;; in ax:vesamode, out ax:cirrusmode ! 1236: cirrus_vesamode_to_mode: ! 1237: push ds ! 1238: push cx ! 1239: push si ! 1240: push cs ! 1241: pop ds ! 1242: mov cx, #0xffff ! 1243: mov si, #_cirrus_vesa_modelist ! 1244: cvtm_1: ! 1245: cmp [si],ax ! 1246: jz cvtm_2 ! 1247: cmp [si],cx ! 1248: jz cvtm_2 ! 1249: add si, #4 ! 1250: jmp cvtm_1 ! 1251: cvtm_2: ! 1252: mov ax,[si+2] ! 1253: pop si ! 1254: pop cx ! 1255: pop ds ! 1256: ret ! 1257: ! 1258: ; cirrus_get_crtc ! 1259: ;; NOTE - may be called in protected mode ! 1260: cirrus_get_crtc: ! 1261: push ds ! 1262: push ax ! 1263: mov dx, #0x3cc ! 1264: in al, dx ! 1265: and al, #0x01 ! 1266: shl al, #5 ! 1267: mov dx, #0x3b4 ! 1268: add dl, al ! 1269: pop ax ! 1270: pop ds ! 1271: ret ! 1272: ! 1273: ;; in - al:mode, out - cflag:result, si:table, ax:destroyed ! 1274: cirrus_get_modeentry: ! 1275: and al, #0x7f ! 1276: cirrus_get_modeentry_nomask: ! 1277: mov si, #_cirrus_modes ! 1278: cgm_1: ! 1279: db 0x2e ;; cs: ! 1280: mov ah, [si] ! 1281: cmp al, ah ! 1282: jz cgm_2 ! 1283: cmp ah, #0xff ! 1284: jz cgm_4 ! 1285: add si, # CIRRUS_MODE_SIZE ! 1286: jmp cgm_1 ! 1287: cgm_4: ! 1288: xor si, si ! 1289: stc ;; video mode is not supported ! 1290: jmp cgm_3 ! 1291: cgm_2: ! 1292: clc ;; video mode is supported ! 1293: cgm_3: ! 1294: ret ! 1295: ! 1296: ; get LFB address ! 1297: ; out - ax:LFB address (high 16 bit) ! 1298: ;; NOTE - may be called in protected mode ! 1299: cirrus_get_lfb_addr: ! 1300: push cx ! 1301: push dx ! 1302: push eax ! 1303: xor cx, cx ! 1304: mov dl, #0x00 ! 1305: call cirrus_pci_read ! 1306: cmp ax, #0xffff ! 1307: jz cirrus_get_lfb_addr_5 ! 1308: cirrus_get_lfb_addr_3: ! 1309: mov dl, #0x00 ! 1310: call cirrus_pci_read ! 1311: cmp ax, #0x1013 ;; cirrus ! 1312: jz cirrus_get_lfb_addr_4 ! 1313: add cx, #0x8 ! 1314: cmp cx, #0x200 ;; search bus #0 and #1 ! 1315: jb cirrus_get_lfb_addr_3 ! 1316: cirrus_get_lfb_addr_5: ! 1317: xor dx, dx ;; no LFB ! 1318: jmp cirrus_get_lfb_addr_6 ! 1319: cirrus_get_lfb_addr_4: ! 1320: mov dl, #0x10 ;; I/O space #0 ! 1321: call cirrus_pci_read ! 1322: test ax, #0xfff1 ! 1323: jnz cirrus_get_lfb_addr_5 ! 1324: shr eax, #16 ! 1325: mov dx, ax ;; LFB address ! 1326: cirrus_get_lfb_addr_6: ! 1327: pop eax ! 1328: mov ax, dx ! 1329: pop dx ! 1330: pop cx ! 1331: ret ! 1332: ! 1333: cirrus_pci_read: ! 1334: mov eax, #0x00800000 ! 1335: mov ax, cx ! 1336: shl eax, #8 ! 1337: mov al, dl ! 1338: mov dx, #0xcf8 ! 1339: out dx, eax ! 1340: add dl, #4 ! 1341: in eax, dx ! 1342: ret ! 1343: ! 1344: ;; out - al:bytes per pixel ! 1345: cirrus_get_bpp_bytes: ! 1346: push dx ! 1347: mov dx, #0x03c4 ! 1348: mov al, #0x07 ! 1349: out dx, al ! 1350: inc dx ! 1351: in al, dx ! 1352: and al, #0x0e ! 1353: cmp al, #0x06 ! 1354: jne cirrus_get_bpp_bytes_1 ! 1355: and al, #0x02 ! 1356: cirrus_get_bpp_bytes_1: ! 1357: shr al, #1 ! 1358: cmp al, #0x04 ! 1359: je cirrus_get_bpp_bytes_2 ! 1360: inc al ! 1361: cirrus_get_bpp_bytes_2: ! 1362: pop dx ! 1363: ret ! 1364: ! 1365: ;; in - ax: new line offset ! 1366: cirrus_set_line_offset: ! 1367: shr ax, #3 ! 1368: push ax ! 1369: call cirrus_get_crtc ! 1370: mov al, #0x13 ! 1371: out dx, al ! 1372: inc dx ! 1373: pop ax ! 1374: out dx, al ! 1375: dec dx ! 1376: mov al, #0x1b ! 1377: out dx, al ! 1378: inc dx ! 1379: shl ah, #4 ! 1380: in al, dx ! 1381: and al, #ef ! 1382: or al, ah ! 1383: out dx, al ! 1384: ret ! 1385: ! 1386: ;; out - ax: active line offset ! 1387: cirrus_get_line_offset: ! 1388: push dx ! 1389: push bx ! 1390: call cirrus_get_crtc ! 1391: mov al, #0x13 ! 1392: out dx, al ! 1393: inc dx ! 1394: in al, dx ! 1395: mov bl, al ! 1396: dec dx ! 1397: mov al, #0x1b ! 1398: out dx, al ! 1399: inc dx ! 1400: in al, dx ! 1401: mov ah, al ! 1402: shr ah, #4 ! 1403: and ah, #0x01 ! 1404: mov al, bl ! 1405: shl ax, #3 ! 1406: pop bx ! 1407: pop dx ! 1408: ret ! 1409: ! 1410: ;; in - si: table ! 1411: ;; out - ax: line offset for mode ! 1412: cirrus_get_line_offset_entry: ! 1413: push bx ! 1414: mov bx, [si+14] ;; crtc table ! 1415: push bx ! 1416: offset_loop1: ! 1417: mov ax, [bx] ! 1418: cmp al, #0x13 ! 1419: je offset_found1 ! 1420: inc bx ! 1421: inc bx ! 1422: jnz offset_loop1 ! 1423: offset_found1: ! 1424: xor al, al ! 1425: shr ax, #5 ! 1426: pop bx ! 1427: push ax ! 1428: offset_loop2: ! 1429: mov ax, [bx] ! 1430: cmp al, #0x1b ! 1431: je offset_found2 ! 1432: inc bx ! 1433: inc bx ! 1434: jnz offset_loop2 ! 1435: offset_found2: ! 1436: pop bx ! 1437: and ax, #0x1000 ! 1438: shr ax, #1 ! 1439: or ax, bx ! 1440: pop bx ! 1441: ret ! 1442: ! 1443: ;; in - new address in DX:AX ! 1444: cirrus_set_start_addr: ! 1445: push bx ! 1446: push dx ! 1447: push ax ! 1448: call cirrus_get_crtc ! 1449: mov al, #0x0d ! 1450: out dx, al ! 1451: inc dx ! 1452: pop ax ! 1453: out dx, al ! 1454: dec dx ! 1455: mov al, #0x0c ! 1456: out dx, al ! 1457: inc dx ! 1458: mov al, ah ! 1459: out dx, al ! 1460: dec dx ! 1461: mov al, #0x1d ! 1462: out dx, al ! 1463: inc dx ! 1464: in al, dx ! 1465: and al, #0x7f ! 1466: pop bx ! 1467: mov ah, bl ! 1468: shl bl, #4 ! 1469: and bl, #0x80 ! 1470: or al, bl ! 1471: out dx, al ! 1472: dec dx ! 1473: mov bl, ah ! 1474: and ah, #0x01 ! 1475: shl bl, #1 ! 1476: and bl, #0x0c ! 1477: or ah, bl ! 1478: mov al, #0x1b ! 1479: out dx, al ! 1480: inc dx ! 1481: in al, dx ! 1482: and al, #0xf2 ! 1483: or al, ah ! 1484: out dx, al ! 1485: pop bx ! 1486: ret ! 1487: ! 1488: ;; out - current address in DX:AX ! 1489: cirrus_get_start_addr: ! 1490: push bx ! 1491: call cirrus_get_crtc ! 1492: mov al, #0x0c ! 1493: out dx, al ! 1494: inc dx ! 1495: in al, dx ! 1496: mov ah, al ! 1497: dec dx ! 1498: mov al, #0x0d ! 1499: out dx, al ! 1500: inc dx ! 1501: in al, dx ! 1502: push ax ! 1503: dec dx ! 1504: mov al, #0x1b ! 1505: out dx, al ! 1506: inc dx ! 1507: in al, dx ! 1508: dec dx ! 1509: mov bl, al ! 1510: and al, #0x01 ! 1511: and bl, #0x0c ! 1512: shr bl, #1 ! 1513: or bl, al ! 1514: mov al, #0x1d ! 1515: out dx, al ! 1516: inc dx ! 1517: in al, dx ! 1518: and al, #0x80 ! 1519: shr al, #4 ! 1520: or bl, al ! 1521: mov dl, bl ! 1522: xor dh, dh ! 1523: pop ax ! 1524: pop bx ! 1525: ret ! 1526: ! 1527: cirrus_clear_vram: ! 1528: pusha ! 1529: push es ! 1530: mov si, ax ! 1531: ! 1532: call cirrus_enable_16k_granularity ! 1533: call cirrus_extbios_85h ! 1534: shl al, #2 ! 1535: mov bl, al ! 1536: xor ah,ah ! 1537: cirrus_clear_vram_1: ! 1538: mov al, #0x09 ! 1539: mov dx, #0x3ce ! 1540: out dx, ax ! 1541: push ax ! 1542: mov cx, #0xa000 ! 1543: mov es, cx ! 1544: xor di, di ! 1545: mov ax, si ! 1546: mov cx, #8192 ! 1547: cld ! 1548: rep ! 1549: stosw ! 1550: pop ax ! 1551: inc ah ! 1552: cmp ah, bl ! 1553: jne cirrus_clear_vram_1 ! 1554: ! 1555: xor ah,ah ! 1556: mov dx, #0x3ce ! 1557: out dx, ax ! 1558: ! 1559: pop es ! 1560: popa ! 1561: ret ! 1562: ! 1563: cirrus_extbios_handlers: ! 1564: ;; 80h ! 1565: dw cirrus_extbios_80h ! 1566: dw cirrus_extbios_81h ! 1567: dw cirrus_extbios_82h ! 1568: dw cirrus_extbios_unimplemented ! 1569: ;; 84h ! 1570: dw cirrus_extbios_unimplemented ! 1571: dw cirrus_extbios_85h ! 1572: dw cirrus_extbios_unimplemented ! 1573: dw cirrus_extbios_unimplemented ! 1574: ;; 88h ! 1575: dw cirrus_extbios_unimplemented ! 1576: dw cirrus_extbios_unimplemented ! 1577: dw cirrus_extbios_unimplemented ! 1578: dw cirrus_extbios_unimplemented ! 1579: ;; 8Ch ! 1580: dw cirrus_extbios_unimplemented ! 1581: dw cirrus_extbios_unimplemented ! 1582: dw cirrus_extbios_unimplemented ! 1583: dw cirrus_extbios_unimplemented ! 1584: ;; 90h ! 1585: dw cirrus_extbios_unimplemented ! 1586: dw cirrus_extbios_unimplemented ! 1587: dw cirrus_extbios_unimplemented ! 1588: dw cirrus_extbios_unimplemented ! 1589: ;; 94h ! 1590: dw cirrus_extbios_unimplemented ! 1591: dw cirrus_extbios_unimplemented ! 1592: dw cirrus_extbios_unimplemented ! 1593: dw cirrus_extbios_unimplemented ! 1594: ;; 98h ! 1595: dw cirrus_extbios_unimplemented ! 1596: dw cirrus_extbios_unimplemented ! 1597: dw cirrus_extbios_9Ah ! 1598: dw cirrus_extbios_unimplemented ! 1599: ;; 9Ch ! 1600: dw cirrus_extbios_unimplemented ! 1601: dw cirrus_extbios_unimplemented ! 1602: dw cirrus_extbios_unimplemented ! 1603: dw cirrus_extbios_unimplemented ! 1604: ;; A0h ! 1605: dw cirrus_extbios_A0h ! 1606: dw cirrus_extbios_A1h ! 1607: dw cirrus_extbios_A2h ! 1608: dw cirrus_extbios_unimplemented ! 1609: ;; A4h ! 1610: dw cirrus_extbios_unimplemented ! 1611: dw cirrus_extbios_unimplemented ! 1612: dw cirrus_extbios_unimplemented ! 1613: dw cirrus_extbios_unimplemented ! 1614: ;; A8h ! 1615: dw cirrus_extbios_unimplemented ! 1616: dw cirrus_extbios_unimplemented ! 1617: dw cirrus_extbios_unimplemented ! 1618: dw cirrus_extbios_unimplemented ! 1619: ;; ACh ! 1620: dw cirrus_extbios_unimplemented ! 1621: dw cirrus_extbios_unimplemented ! 1622: dw cirrus_extbios_AEh ! 1623: dw cirrus_extbios_unimplemented ! 1624: ! 1625: cirrus_vesa_handlers: ! 1626: ;; 00h ! 1627: dw cirrus_vesa_00h ! 1628: dw cirrus_vesa_01h ! 1629: dw cirrus_vesa_02h ! 1630: dw cirrus_vesa_03h ! 1631: ;; 04h ! 1632: dw cirrus_vesa_unimplemented ! 1633: dw cirrus_vesa_05h ! 1634: dw cirrus_vesa_06h ! 1635: dw cirrus_vesa_07h ! 1636: ;; 08h ! 1637: dw cirrus_vesa_unimplemented ! 1638: dw cirrus_vesa_unimplemented ! 1639: dw cirrus_vesa_unimplemented ! 1640: dw cirrus_vesa_unimplemented ! 1641: ;; 0Ch ! 1642: dw cirrus_vesa_unimplemented ! 1643: dw cirrus_vesa_unimplemented ! 1644: dw cirrus_vesa_unimplemented ! 1645: dw cirrus_vesa_unimplemented ! 1646: ;; 10h ! 1647: dw cirrus_vesa_10h ! 1648: ! 1649: ! 1650: ASM_END ! 1651: ! 1652: #ifdef CIRRUS_VESA3_PMINFO ! 1653: ASM_START ! 1654: cirrus_vesa_pminfo: ! 1655: /* + 0 */ ! 1656: .byte 0x50,0x4d,0x49,0x44 ;; signature[4] ! 1657: /* + 4 */ ! 1658: dw cirrus_vesa_pmbios_entry ;; entry_bios ! 1659: dw cirrus_vesa_pmbios_init ;; entry_init ! 1660: /* + 8 */ ! 1661: cirrus_vesa_sel0000_data: ! 1662: dw 0x0000 ;; sel_00000 ! 1663: cirrus_vesa_selA000_data: ! 1664: dw 0xA000 ;; sel_A0000 ! 1665: /* +12 */ ! 1666: cirrus_vesa_selB000_data: ! 1667: dw 0xB000 ;; sel_B0000 ! 1668: cirrus_vesa_selB800_data: ! 1669: dw 0xB800 ;; sel_B8000 ! 1670: /* +16 */ ! 1671: cirrus_vesa_selC000_data: ! 1672: dw 0xC000 ;; sel_C0000 ! 1673: cirrus_vesa_is_protected_mode: ! 1674: ;; protected mode flag and checksum ! 1675: dw (~((0xf2 + (cirrus_vesa_pmbios_entry >> 8) + (cirrus_vesa_pmbios_entry) \ ! 1676: + (cirrus_vesa_pmbios_init >> 8) + (cirrus_vesa_pmbios_init)) & 0xff) << 8) + 0x01 ! 1677: ASM_END ! 1678: #endif // CIRRUS_VESA3_PMINFO ! 1679: ! 1680: ! 1681: #ifdef CIRRUS_DEBUG ! 1682: static void cirrus_debugmsg(DI, SI, BP, SP, BX, DX, CX, AX, DS, ES, FLAGS) ! 1683: Bit16u DI, SI, BP, SP, BX, DX, CX, AX, ES, DS, FLAGS; ! 1684: { ! 1685: if((GET_AH()!=0x0E)&&(GET_AH()!=0x02)&&(GET_AH()!=0x09)&&(AX!=0x4F05)) ! 1686: printf("vgabios call ah%02x al%02x bx%04x cx%04x dx%04x\n",GET_AH(),GET_AL(),BX,CX,DX); ! 1687: } ! 1688: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.