
1: Index: Makefile 2: =================================================================== 3: RCS file: /sources/vgabios/vgabios/Makefile,v 4: retrieving revision 1.17 5: diff -u -w -r1.17 Makefile 6: --- Makefile 6 Mar 2005 13:06:47 -0000 1.17 7: +++ Makefile 14 Jun 2006 00:51:06 -0000 8: @@ -22,7 +22,7 @@ 9: cirrus-bios: vgabios-cirrus.bin vgabios-cirrus.debug.bin 10: 11: clean: 12: - /bin/rm -f biossums *.o *.s *.ld86 \ 13: + /bin/rm -f biossums vbetables-gen vbetables.h *.o *.s *.ld86 \ 14: temp.awk.* vgabios*.orig _vgabios_* _vgabios-debug_* core vgabios*.bin vgabios*.txt $(RELEASE).bin *.bak 15: 16: dist-clean: clean 17: @@ -79,3 +79,9 @@ 18: 19: biossums: biossums.c 20: $(CC) -o biossums biossums.c 21: + 22: +vbetables-gen: vbetables-gen.c 23: + $(CC) -o vbetables-gen vbetables-gen.c 24: + 25: +vbetables.h: vbetables-gen 26: + ./vbetables-gen > $@ 27: Index: clext.c 28: =================================================================== 29: RCS file: /sources/vgabios/vgabios/clext.c,v 30: retrieving revision 1.10 31: diff -u -w -r1.10 clext.c 32: --- clext.c 25 Mar 2006 10:19:15 -0000 1.10 33: +++ clext.c 14 Jun 2006 00:51:06 -0000 34: @@ -544,6 +544,13 @@ 35: cirrus_set_video_mode_extended: 36: call cirrus_switch_mode 37: pop ax ;; mode 38: + test al, #0x80 39: + jnz cirrus_set_video_mode_extended_1 40: + push ax 41: + mov ax, #0xffff ; set to 0xff to keep win 2K happy 42: + call cirrus_clear_vram 43: + pop ax 44: +cirrus_set_video_mode_extended_1: 45: and al, #0x7f 46: 47: push ds 48: @@ -1011,6 +1018,13 @@ 49: jnz cirrus_vesa_02h_3 50: call cirrus_enable_16k_granularity 51: cirrus_vesa_02h_3: 52: + test bx, #0x8000 ;; no clear 53: + jnz cirrus_vesa_02h_4 54: + push ax 55: + xor ax,ax 56: + call cirrus_clear_vram 57: + pop ax 58: +cirrus_vesa_02h_4: 59: pop ax 60: push ds 61: #ifdef CIRRUS_VESA3_PMINFO 62: @@ -1479,6 +1493,38 @@ 63: pop bx 64: ret 65: 66: +cirrus_clear_vram: 67: + pusha 68: + push es 69: + mov si, ax 70: + 71: + call cirrus_enable_16k_granularity 72: + call cirrus_extbios_85h 73: + shl al, #2 74: + mov bl, al 75: + xor ah,ah 76: +cirrus_clear_vram_1: 77: + mov al, #0x09 78: + mov dx, #0x3ce 79: + out dx, ax 80: + push ax 81: + mov cx, #0xa000 82: + mov es, cx 83: + xor di, di 84: + mov ax, si 85: + mov cx, #8192 86: + cld 87: + rep 88: + stosw 89: + pop ax 90: + inc ah 91: + cmp ah, bl 92: + jne cirrus_clear_vram_1 93: + 94: + pop es 95: + popa 96: + ret 97: + 98: cirrus_extbios_handlers: 99: ;; 80h 100: dw cirrus_extbios_80h 101: Index: vbe.c 102: =================================================================== 103: RCS file: /sources/vgabios/vgabios/vbe.c,v 104: retrieving revision 1.48 105: diff -u -w -r1.48 vbe.c 106: --- vbe.c 26 Dec 2005 19:50:26 -0000 1.48 107: +++ vbe.c 14 Jun 2006 00:51:07 -0000 108: @@ -118,21 +118,114 @@ 109: .word VBE_VESA_MODE_END_OF_LIST 110: #endif 111: 112: + .align 2 113: vesa_pm_start: 114: dw vesa_pm_set_window - vesa_pm_start 115: - dw vesa_pm_set_display_strt - vesa_pm_start 116: + dw vesa_pm_set_display_start - vesa_pm_start 117: dw vesa_pm_unimplemented - vesa_pm_start 118: - dw 0 119: + dw vesa_pm_io_ports_table - vesa_pm_start 120: +vesa_pm_io_ports_table: 121: + dw VBE_DISPI_IOPORT_INDEX 122: + dw VBE_DISPI_IOPORT_INDEX + 1 123: + dw VBE_DISPI_IOPORT_DATA 124: + dw VBE_DISPI_IOPORT_DATA + 1 125: + dw 0xffff 126: + dw 0xffff 127: 128: USE32 129: vesa_pm_set_window: 130: - mov ax, #0x4f05 131: - int #0x10 132: + cmp bx, #0x00 133: + je vesa_pm_set_display_window1 134: + mov ax, #0x0100 135: + ret 136: +vesa_pm_set_display_window1: 137: + mov ax, dx 138: + push dx 139: + push ax 140: + mov dx, # VBE_DISPI_IOPORT_INDEX 141: + mov ax, # VBE_DISPI_INDEX_BANK 142: + out dx, ax 143: + pop ax 144: + mov dx, # VBE_DISPI_IOPORT_DATA 145: + out dx, ax 146: + pop dx 147: + mov ax, #0x004f 148: ret 149: 150: vesa_pm_set_display_start: 151: - mov ax, #0x4f07 152: - int #0x10 153: + cmp bl, #0x80 154: + je vesa_pm_set_display_start1 155: + cmp bl, #0x00 156: + je vesa_pm_set_display_start1 157: + mov ax, #0x0100 158: + ret 159: +vesa_pm_set_display_start1: 160: +; convert offset to (X, Y) coordinate 161: +; (would be simpler to change Bochs VBE API...) 162: + push eax 163: + push ecx 164: + push edx 165: + push esi 166: + push edi 167: + shl edx, #16 168: + and ecx, #0xffff 169: + or ecx, edx 170: + shl ecx, #2 171: + mov eax, ecx 172: + 173: + push eax 174: + mov dx, # VBE_DISPI_IOPORT_INDEX 175: + mov ax, # VBE_DISPI_INDEX_VIRT_WIDTH 176: + out dx, ax 177: + mov dx, # VBE_DISPI_IOPORT_DATA 178: + in ax, dx 179: + movzx ecx, ax 180: + 181: + mov dx, # VBE_DISPI_IOPORT_INDEX 182: + mov ax, # VBE_DISPI_INDEX_BPP 183: + out dx, ax 184: + mov dx, # VBE_DISPI_IOPORT_DATA 185: + in ax, dx 186: + movzx esi, ax 187: + pop eax 188: + 189: + add esi, #7 190: + shr esi, #3 191: + imul ecx, esi 192: + xor edx, edx 193: + div ecx 194: + mov edi, eax 195: + mov eax, edx 196: + xor edx, edx 197: + div esi 198: + 199: + push dx 200: + push ax 201: + mov dx, # VBE_DISPI_IOPORT_INDEX 202: + mov ax, # VBE_DISPI_INDEX_X_OFFSET 203: + out dx, ax 204: + pop ax 205: + mov dx, # VBE_DISPI_IOPORT_DATA 206: + out dx, ax 207: + pop dx 208: + 209: + mov ax, di 210: + push dx 211: + push ax 212: + mov dx, # VBE_DISPI_IOPORT_INDEX 213: + mov ax, # VBE_DISPI_INDEX_Y_OFFSET 214: + out dx, ax 215: + pop ax 216: + mov dx, # VBE_DISPI_IOPORT_DATA 217: + out dx, ax 218: + pop dx 219: + 220: + pop edi 221: + pop esi 222: + pop edx 223: + pop ecx 224: + pop eax 225: + mov ax, #0x004f 226: ret 227: 228: vesa_pm_unimplemented: 229: @@ -835,6 +928,64 @@ 230: ASM_END 231: 232: 233: +Bit16u vbe_biosfn_read_video_state_size() 234: +{ 235: + return 9 * 2; 236: +} 237: + 238: +void vbe_biosfn_save_video_state(ES, BX) 239: + Bit16u ES; Bit16u BX; 240: +{ 241: + Bit16u enable, i; 242: + 243: + outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE); 244: + enable = inw(VBE_DISPI_IOPORT_DATA); 245: + write_word(ES, BX, enable); 246: + BX += 2; 247: + if (!(enable & VBE_DISPI_ENABLED)) 248: + return; 249: + for(i = VBE_DISPI_INDEX_XRES; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) { 250: + if (i != VBE_DISPI_INDEX_ENABLE) { 251: + outw(VBE_DISPI_IOPORT_INDEX, i); 252: + write_word(ES, BX, inw(VBE_DISPI_IOPORT_DATA)); 253: + BX += 2; 254: + } 255: + } 256: +} 257: + 258: + 259: +void vbe_biosfn_restore_video_state(ES, BX) 260: + Bit16u ES; Bit16u BX; 261: +{ 262: + Bit16u enable, i; 263: + 264: + enable = read_word(ES, BX); 265: + BX += 2; 266: + 267: + if (!(enable & VBE_DISPI_ENABLED)) { 268: + outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE); 269: + outw(VBE_DISPI_IOPORT_DATA, enable); 270: + } else { 271: + outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_XRES); 272: + outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX)); 273: + BX += 2; 274: + outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_YRES); 275: + outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX)); 276: + BX += 2; 277: + outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP); 278: + outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX)); 279: + BX += 2; 280: + outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE); 281: + outw(VBE_DISPI_IOPORT_DATA, enable); 282: + 283: + for(i = VBE_DISPI_INDEX_BANK; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) { 284: + outw(VBE_DISPI_IOPORT_INDEX, i); 285: + outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX)); 286: + BX += 2; 287: + } 288: + } 289: +} 290: + 291: /** Function 04h - Save/Restore State 292: * 293: * Input: 294: @@ -849,10 +1000,48 @@ 295: * BX = Number of 64-byte blocks to hold the state buffer (if DL=00h) 296: * 297: */ 298: -void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX) 299: +void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX) 300: +Bit16u *AX; Bit16u CX; Bit16u DX; Bit16u ES; Bit16u *BX; 301: { 302: -} 303: + Bit16u ss=get_SS(); 304: + Bit16u result, val; 305: 306: + result = 0x4f; 307: + switch(GET_DL()) { 308: + case 0x00: 309: + val = biosfn_read_video_state_size2(CX); 310: +#ifdef DEBUG 311: + printf("VGA state size=%x\n", val); 312: +#endif 313: + if (CX & 8) 314: + val += vbe_biosfn_read_video_state_size(); 315: + write_word(ss, BX, val); 316: + break; 317: + case 0x01: 318: + val = read_word(ss, BX); 319: + val = biosfn_save_video_state(CX, ES, val); 320: +#ifdef DEBUG 321: + printf("VGA save_state offset=%x\n", val); 322: +#endif 323: + if (CX & 8) 324: + vbe_biosfn_save_video_state(ES, val); 325: + break; 326: + case 0x02: 327: + val = read_word(ss, BX); 328: + val = biosfn_restore_video_state(CX, ES, val); 329: +#ifdef DEBUG 330: + printf("VGA restore_state offset=%x\n", val); 331: +#endif 332: + if (CX & 8) 333: + vbe_biosfn_restore_video_state(ES, val); 334: + break; 335: + default: 336: + // function failed 337: + result = 0x100; 338: + break; 339: + } 340: + write_word(ss, AX, result); 341: +} 342: 343: /** Function 05h - Display Window Control 344: * 345: @@ -1090,7 +1279,7 @@ 346: */ 347: ASM_START 348: vbe_biosfn_return_protected_mode_interface: 349: - test bx, bx 350: + test bl, bl 351: jnz _fail 352: mov di, #0xc000 353: mov es, di 354: Index: vbe.h 355: =================================================================== 356: RCS file: /sources/vgabios/vgabios/vbe.h,v 357: retrieving revision 1.24 358: diff -u -w -r1.24 vbe.h 359: --- vbe.h 9 May 2004 20:31:31 -0000 1.24 360: +++ vbe.h 14 Jun 2006 00:51:07 -0000 361: @@ -14,7 +14,7 @@ 362: void vbe_biosfn_return_controller_information(AX, ES, DI); 363: void vbe_biosfn_return_mode_information(AX, CX, ES, DI); 364: void vbe_biosfn_set_mode(AX, BX, ES, DI); 365: -void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX); 366: +void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX); 367: void vbe_biosfn_set_get_palette_data(AX); 368: void vbe_biosfn_return_protected_mode_interface(AX); 369: 370: @@ -151,6 +151,12 @@ 371: Bit8u Reserved[189]; 372: } ModeInfoBlock; 373: 374: +typedef struct ModeInfoListItem 375: +{ 376: + Bit16u mode; 377: + ModeInfoBlockCompact info; 378: +} ModeInfoListItem; 379: + 380: // VBE Return Status Info 381: // AL 382: #define VBE_RETURN_STATUS_SUPPORTED 0x4F 383: @@ -193,6 +199,10 @@ 384: #define VBE_VESA_MODE_1280X1024X1555 0x119 385: #define VBE_VESA_MODE_1280X1024X565 0x11A 386: #define VBE_VESA_MODE_1280X1024X888 0x11B 387: +#define VBE_VESA_MODE_1600X1200X8 0x11C 388: +#define VBE_VESA_MODE_1600X1200X1555 0x11D 389: +#define VBE_VESA_MODE_1600X1200X565 0x11E 390: +#define VBE_VESA_MODE_1600X1200X888 0x11F 391: 392: // BOCHS/PLEX86 'own' mode numbers 393: #define VBE_OWN_MODE_320X200X8888 0x140 394: @@ -202,6 +212,12 @@ 395: #define VBE_OWN_MODE_1024X768X8888 0x144 396: #define VBE_OWN_MODE_1280X1024X8888 0x145 397: #define VBE_OWN_MODE_320X200X8 0x146 398: +#define VBE_OWN_MODE_1600X1200X8888 0x147 399: +#define VBE_OWN_MODE_1152X864X8 0x148 400: +#define VBE_OWN_MODE_1152X864X1555 0x149 401: +#define VBE_OWN_MODE_1152X864X565 0x14a 402: +#define VBE_OWN_MODE_1152X864X888 0x14b 403: +#define VBE_OWN_MODE_1152X864X8888 0x14c 404: 405: #define VBE_VESA_MODE_END_OF_LIST 0xFFFF 406: 407: @@ -259,7 +275,7 @@ 408: // like 0xE0000000 409: 410: 411: - #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 4 412: + #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 8 413: 414: #define VBE_DISPI_BANK_ADDRESS 0xA0000 415: #define VBE_DISPI_BANK_SIZE_KB 64 416: Index: vgabios.c 417: =================================================================== 418: RCS file: /sources/vgabios/vgabios/vgabios.c,v 419: retrieving revision 1.64 420: diff -u -w -r1.64 vgabios.c 421: --- vgabios.c 25 Mar 2006 10:19:16 -0000 1.64 422: +++ vgabios.c 14 Jun 2006 00:51:07 -0000 423: @@ -109,8 +109,8 @@ 424: static void biosfn_write_string(); 425: static void biosfn_read_state_info(); 426: static void biosfn_read_video_state_size(); 427: -static void biosfn_save_video_state(); 428: -static void biosfn_restore_video_state(); 429: +static Bit16u biosfn_save_video_state(); 430: +static Bit16u biosfn_restore_video_state(); 431: extern Bit8u video_save_pointer_table[]; 432: 433: // This is for compiling with gcc2 and gcc3 434: @@ -748,12 +748,7 @@ 435: vbe_biosfn_set_mode(&AX,BX,ES,DI); 436: break; 437: case 0x04: 438: - //FIXME 439: -#ifdef DEBUG 440: - unimplemented(); 441: -#endif 442: - // function failed 443: - AX=0x100; 444: + vbe_biosfn_save_restore_state(&AX, CX, DX, ES, &BX); 445: break; 446: case 0x09: 447: //FIXME 448: @@ -3138,23 +3133,215 @@ 449: } 450: 451: // -------------------------------------------------------------------------------------------- 452: -static void biosfn_read_video_state_size (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX; 453: +// -------------------------------------------------------------------------------------------- 454: +static Bit16u biosfn_read_video_state_size2 (CX) 455: + Bit16u CX; 456: { 457: -#ifdef DEBUG 458: - unimplemented(); 459: -#endif 460: + Bit16u size; 461: + size = 0; 462: + if (CX & 1) { 463: + size += 0x46; 464: + } 465: + if (CX & 2) { 466: + size += (5 + 8 + 5) * 2 + 6; 467: + } 468: + if (CX & 4) { 469: + size += 3 + 256 * 3 + 1; 470: } 471: -static void biosfn_save_video_state (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX; 472: + return size; 473: +} 474: + 475: +static void biosfn_read_video_state_size (CX, BX) 476: + Bit16u CX; Bit16u *BX; 477: { 478: -#ifdef DEBUG 479: - unimplemented(); 480: -#endif 481: + Bit16u ss=get_SS(); 482: + write_word(ss, BX, biosfn_read_video_state_size2(CX)); 483: } 484: -static void biosfn_restore_video_state (CX,ES,BX) Bit16u CX;Bit16u ES;Bit16u BX; 485: + 486: +static Bit16u biosfn_save_video_state (CX,ES,BX) 487: + Bit16u CX;Bit16u ES;Bit16u BX; 488: { 489: -#ifdef DEBUG 490: - unimplemented(); 491: -#endif 492: + Bit16u i, v, crtc_addr, ar_index; 493: + 494: + crtc_addr = read_word(BIOSMEM_SEG, BIOSMEM_CRTC_ADDRESS); 495: + if (CX & 1) { 496: + write_byte(ES, BX, inb(VGAREG_SEQU_ADDRESS)); BX++; 497: + write_byte(ES, BX, inb(crtc_addr)); BX++; 498: + write_byte(ES, BX, inb(VGAREG_GRDC_ADDRESS)); BX++; 499: + inb(VGAREG_ACTL_RESET); 500: + ar_index = inb(VGAREG_ACTL_ADDRESS); 501: + write_byte(ES, BX, ar_index); BX++; 502: + write_byte(ES, BX, inb(VGAREG_READ_FEATURE_CTL)); BX++; 503: + 504: + for(i=1;i<=4;i++){ 505: + outb(VGAREG_SEQU_ADDRESS, i); 506: + write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++; 507: + } 508: + outb(VGAREG_SEQU_ADDRESS, 0); 509: + write_byte(ES, BX, inb(VGAREG_SEQU_DATA)); BX++; 510: + 511: + for(i=0;i<=0x18;i++) { 512: + outb(crtc_addr,i); 513: + write_byte(ES, BX, inb(crtc_addr+1)); BX++; 514: + } 515: + 516: + for(i=0;i<=0x13;i++) { 517: + inb(VGAREG_ACTL_RESET); 518: + outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20)); 519: + write_byte(ES, BX, inb(VGAREG_ACTL_READ_DATA)); BX++; 520: + } 521: + inb(VGAREG_ACTL_RESET); 522: + 523: + for(i=0;i<=8;i++) { 524: + outb(VGAREG_GRDC_ADDRESS,i); 525: + write_byte(ES, BX, inb(VGAREG_GRDC_DATA)); BX++; 526: + } 527: + 528: + write_word(ES, BX, crtc_addr); BX+= 2; 529: + 530: + /* XXX: read plane latches */ 531: + write_byte(ES, BX, 0); BX++; 532: + write_byte(ES, BX, 0); BX++; 533: + write_byte(ES, BX, 0); BX++; 534: + write_byte(ES, BX, 0); BX++; 535: + } 536: + if (CX & 2) { 537: + write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE)); BX++; 538: + write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS)); BX += 2; 539: + write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE)); BX += 2; 540: + write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS)); BX += 2; 541: + write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)); BX++; 542: + write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT)); BX += 2; 543: + write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL)); BX++; 544: + write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES)); BX++; 545: + write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL)); BX++; 546: + write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE)); BX += 2; 547: + for(i=0;i<8;i++) { 548: + write_word(ES, BX, read_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i)); 549: + BX += 2; 550: + } 551: + write_word(ES, BX, read_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START)); BX += 2; 552: + write_byte(ES, BX, read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE)); BX++; 553: + /* current font */ 554: + write_word(ES, BX, read_word(0, 0x1f * 4)); BX += 2; 555: + write_word(ES, BX, read_word(0, 0x1f * 4 + 2)); BX += 2; 556: + write_word(ES, BX, read_word(0, 0x43 * 4)); BX += 2; 557: + write_word(ES, BX, read_word(0, 0x43 * 4 + 2)); BX += 2; 558: + } 559: + if (CX & 4) { 560: + /* XXX: check this */ 561: + write_byte(ES, BX, inb(VGAREG_DAC_STATE)); BX++; /* read/write mode dac */ 562: + write_byte(ES, BX, inb(VGAREG_DAC_WRITE_ADDRESS)); BX++; /* pix address */ 563: + write_byte(ES, BX, inb(VGAREG_PEL_MASK)); BX++; 564: + // Set the whole dac always, from 0 565: + outb(VGAREG_DAC_WRITE_ADDRESS,0x00); 566: + for(i=0;i<256*3;i++) { 567: + write_byte(ES, BX, inb(VGAREG_DAC_DATA)); BX++; 568: + } 569: + write_byte(ES, BX, 0); BX++; /* color select register */ 570: + } 571: + return BX; 572: +} 573: + 574: +static Bit16u biosfn_restore_video_state (CX,ES,BX) 575: + Bit16u CX;Bit16u ES;Bit16u BX; 576: +{ 577: + Bit16u i, crtc_addr, v, addr1, ar_index; 578: + 579: + if (CX & 1) { 580: + // Reset Attribute Ctl flip-flop 581: + inb(VGAREG_ACTL_RESET); 582: + 583: + crtc_addr = read_word(ES, BX + 0x40); 584: + addr1 = BX; 585: + BX += 5; 586: + 587: + for(i=1;i<=4;i++){ 588: + outb(VGAREG_SEQU_ADDRESS, i); 589: + outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++; 590: + } 591: + outb(VGAREG_SEQU_ADDRESS, 0); 592: + outb(VGAREG_SEQU_DATA, read_byte(ES, BX)); BX++; 593: + 594: + // Disable CRTC write protection 595: + outw(crtc_addr,0x0011); 596: + // Set CRTC regs 597: + for(i=0;i<=0x18;i++) { 598: + if (i != 0x11) { 599: + outb(crtc_addr,i); 600: + outb(crtc_addr+1, read_byte(ES, BX)); 601: + } 602: + BX++; 603: + } 604: + // select crtc base address 605: + v = inb(VGAREG_READ_MISC_OUTPUT) & ~0x01; 606: + if (crtc_addr = 0x3d4) 607: + v |= 0x01; 608: + outb(VGAREG_WRITE_MISC_OUTPUT, v); 609: + 610: + // enable write protection if needed 611: + outb(crtc_addr, 0x11); 612: + outb(crtc_addr+1, read_byte(ES, BX - 0x18 + 0x11)); 613: + 614: + // Set Attribute Ctl 615: + ar_index = read_byte(ES, addr1 + 0x03); 616: + inb(VGAREG_ACTL_RESET); 617: + for(i=0;i<=0x13;i++) { 618: + outb(VGAREG_ACTL_ADDRESS, i | (ar_index & 0x20)); 619: + outb(VGAREG_ACTL_WRITE_DATA, read_byte(ES, BX)); BX++; 620: + } 621: + outb(VGAREG_ACTL_ADDRESS, ar_index); 622: + inb(VGAREG_ACTL_RESET); 623: + 624: + for(i=0;i<=8;i++) { 625: + outb(VGAREG_GRDC_ADDRESS,i); 626: + outb(VGAREG_GRDC_DATA, read_byte(ES, BX)); BX++; 627: + } 628: + BX += 2; /* crtc_addr */ 629: + BX += 4; /* plane latches */ 630: + 631: + outb(VGAREG_SEQU_ADDRESS, read_byte(ES, addr1)); addr1++; 632: + outb(crtc_addr, read_byte(ES, addr1)); addr1++; 633: + outb(VGAREG_GRDC_ADDRESS, read_byte(ES, addr1)); addr1++; 634: + addr1++; 635: + outb(crtc_addr - 0x4 + 0xa, read_byte(ES, addr1)); addr1++; 636: + } 637: + if (CX & 2) { 638: + write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE, read_byte(ES, BX)); BX++; 639: + write_word(BIOSMEM_SEG,BIOSMEM_NB_COLS, read_word(ES, BX)); BX += 2; 640: + write_word(BIOSMEM_SEG,BIOSMEM_PAGE_SIZE, read_word(ES, BX)); BX += 2; 641: + write_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS, read_word(ES, BX)); BX += 2; 642: + write_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS, read_byte(ES, BX)); BX++; 643: + write_word(BIOSMEM_SEG,BIOSMEM_CHAR_HEIGHT, read_word(ES, BX)); BX += 2; 644: + write_byte(BIOSMEM_SEG,BIOSMEM_VIDEO_CTL, read_byte(ES, BX)); BX++; 645: + write_byte(BIOSMEM_SEG,BIOSMEM_SWITCHES, read_byte(ES, BX)); BX++; 646: + write_byte(BIOSMEM_SEG,BIOSMEM_MODESET_CTL, read_byte(ES, BX)); BX++; 647: + write_word(BIOSMEM_SEG,BIOSMEM_CURSOR_TYPE, read_word(ES, BX)); BX += 2; 648: + for(i=0;i<8;i++) { 649: + write_word(BIOSMEM_SEG, BIOSMEM_CURSOR_POS+2*i, read_word(ES, BX)); 650: + BX += 2; 651: + } 652: + write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START, read_word(ES, BX)); BX += 2; 653: + write_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE, read_byte(ES, BX)); BX++; 654: + /* current font */ 655: + write_word(0, 0x1f * 4, read_word(ES, BX)); BX += 2; 656: + write_word(0, 0x1f * 4 + 2, read_word(ES, BX)); BX += 2; 657: + write_word(0, 0x43 * 4, read_word(ES, BX)); BX += 2; 658: + write_word(0, 0x43 * 4 + 2, read_word(ES, BX)); BX += 2; 659: + } 660: + if (CX & 4) { 661: + BX++; 662: + v = read_byte(ES, BX); BX++; 663: + outb(VGAREG_PEL_MASK, read_byte(ES, BX)); BX++; 664: + // Set the whole dac always, from 0 665: + outb(VGAREG_DAC_WRITE_ADDRESS,0x00); 666: + for(i=0;i<256*3;i++) { 667: + outb(VGAREG_DAC_DATA, read_byte(ES, BX)); BX++; 668: + } 669: + BX++; 670: + outb(VGAREG_DAC_WRITE_ADDRESS, v); 671: + } 672: + return BX; 673: } 674: 675: // ============================================================================================ 676: diff -u -w vbetables-gen.c 677: --- vbetables-gen.c 1970-01-01 01:00:00.000000000 +0100 678: +++ vbetables-gen.c 2006-06-14 00:52:18.000000000 +0200 679: @@ -0,0 +1,217 @@ 680: +/* Generate the VGABIOS VBE Tables */ 681: +#include <stdlib.h> 682: +#include <stdio.h> 683: + 684: +typedef struct { 685: + int width; 686: + int height; 687: + int depth; 688: + int mode; 689: +} ModeInfo; 690: + 691: +ModeInfo modes[] = { 692: + /* standard VESA modes */ 693: +{ 640, 400, 8 , 0x100}, 694: +{ 640, 480, 8 , 0x101}, 695: +{ 800, 600, 4 , 0x102}, 696: +{ 800, 600, 8 , 0x103}, 697: + //{ 1024, 768, 4 , 0x104}, 698: +{ 1024, 768, 8 , 0x105}, 699: + //{ 1280, 1024, 4 , 0x106}, 700: +{ 1280, 1024, 8 , 0x107}, 701: +{ 320, 200, 15 , 0x10D}, 702: +{ 320, 200, 16 , 0x10E}, 703: +{ 320, 200, 24 , 0x10F}, 704: +{ 640, 480, 15 , 0x110}, 705: +{ 640, 480, 16 , 0x111}, 706: +{ 640, 480, 24 , 0x112}, 707: +{ 800, 600, 15 , 0x113}, 708: +{ 800, 600, 16 , 0x114}, 709: +{ 800, 600, 24 , 0x115}, 710: +{ 1024, 768, 15 , 0x116}, 711: +{ 1024, 768, 16 , 0x117}, 712: +{ 1024, 768, 24 , 0x118}, 713: +{ 1280, 1024, 15 , 0x119}, 714: +{ 1280, 1024, 16 , 0x11A}, 715: +{ 1280, 1024, 24 , 0x11B}, 716: +{ 1600, 1200, 8 , 0x11C}, 717: +{ 1600, 1200, 15 , 0x11D}, 718: +{ 1600, 1200, 16 , 0x11E}, 719: +{ 1600, 1200, 24 , 0x11F}, 720: + 721: + /* BOCHS/PLE, 86 'own' mode numbers */ 722: +{ 320, 200, 32 , 0x140}, 723: +{ 640, 400, 32 , 0x141}, 724: +{ 640, 480, 32 , 0x142}, 725: +{ 800, 600, 32 , 0x143}, 726: +{ 1024, 768, 32 , 0x144}, 727: +{ 1280, 1024, 32 , 0x145}, 728: +{ 320, 200, 8 , 0x146}, 729: +{ 1600, 1200, 32 , 0x147}, 730: +{ 1152, 864, 8 , 0x148}, 731: +{ 1152, 864, 15 , 0x149}, 732: +{ 1152, 864, 16 , 0x14a}, 733: +{ 1152, 864, 24 , 0x14b}, 734: +{ 1152, 864, 32 , 0x14c}, 735: +{ 0, }, 736: +}; 737: + 738: +int main(int argc, char **argv) 739: +{ 740: + const ModeInfo *pm; 741: + int pitch, r_size, r_pos, g_size, g_pos, b_size, b_pos, a_size, a_pos; 742: + const char *str; 743: + 744: + printf("/* THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT */\n"); 745: + printf("static ModeInfoListItem mode_info_list[]=\n"); 746: + printf("{\n"); 747: + for(pm = modes; pm->mode != 0; pm++) { 748: + printf("{ 0x%04x, /* %dx%dx%d */\n", 749: + pm->mode, pm->width, pm->height, pm->depth); 750: + printf("{ /*Bit16u ModeAttributes*/ %s,\n", 751: + "VBE_MODE_ATTRIBUTE_SUPPORTED | " 752: + "VBE_MODE_ATTRIBUTE_EXTENDED_INFORMATION_AVAILABLE | " 753: + "VBE_MODE_ATTRIBUTE_COLOR_MODE | " 754: + "VBE_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER_MODE | " 755: + "VBE_MODE_ATTRIBUTE_GRAPHICS_MODE"); 756: + 757: + printf("/*Bit8u WinAAttributes*/ %s,\n", 758: + "VBE_WINDOW_ATTRIBUTE_RELOCATABLE | " 759: + "VBE_WINDOW_ATTRIBUTE_READABLE | " 760: + "VBE_WINDOW_ATTRIBUTE_WRITEABLE"); 761: + 762: + printf("/*Bit8u WinBAttributes*/ %d,\n", 0); 763: + 764: + printf("/*Bit16u WinGranularity*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB"); 765: + 766: + printf("/*Bit16u WinSize*/ %s,\n", "VBE_DISPI_BANK_SIZE_KB"); 767: + 768: + printf("/*Bit16u WinASegment*/ %s,\n", "VGAMEM_GRAPH"); 769: + 770: + printf("/*Bit16u WinBSegment*/ 0x%04x,\n", 0); 771: + 772: + printf("/*Bit32u WinFuncPtr*/ %d,\n", 0); 773: + 774: + if (pm->depth == 4) 775: + pitch = (pm->width + 7) / 8;