// // QEMU Cirrus CLGD 54xx VGABIOS Extension. // // Copyright (c) 2004 Makoto Suzuki (suzu) // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // //#define CIRRUS_VESA3_PMINFO #ifdef VBE #undef CIRRUS_VESA3_PMINFO #endif #define PM_BIOSMEM_CURRENT_MODE 0x449 #define PM_BIOSMEM_CRTC_ADDRESS 0x463 #define PM_BIOSMEM_VBE_MODE 0x4BA #define PM_BIOSMEM_VBE_POWER 0x4BC typedef struct { /* + 0 */ unsigned short mode; unsigned short width; unsigned short height; unsigned short depth; /* + 8 */ unsigned short hidden_dac; /* 0x3c6 */ unsigned short *seq; /* 0x3c4 */ unsigned short *graph; /* 0x3ce */ unsigned short *crtc; /* 0x3d4 */ /* +16 */ unsigned char bitsperpixel; unsigned char vesacolortype; unsigned char vesaredmask; unsigned char vesaredpos; unsigned char vesagreenmask; unsigned char vesagreenpos; unsigned char vesabluemask; unsigned char vesabluepos; /* +24 */ unsigned char vesareservedmask; unsigned char vesareservedpos; } cirrus_mode_t; #define CIRRUS_MODE_SIZE 26 /* For VESA BIOS 3.0 */ #define CIRRUS_PM16INFO_SIZE 20 /* VGA */ unsigned short cseq_vga[] = {0x0007,0xffff}; unsigned short cgraph_vga[] = {0x0009,0x000a,0x000b,0xffff}; unsigned short ccrtc_vga[] = {0x001a,0x001b,0x001d,0xffff}; /* extensions */ unsigned short cgraph_svgacolor[] = { 0x0000,0x0001,0x0002,0x0003,0x0004,0x4005,0x0506,0x0f07,0xff08, 0x0009,0x000a,0x000b, 0xffff }; /* 640x480x8 */ unsigned short cseq_640x480x8[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107, 0x580b,0x580c,0x580d,0x580e, 0x0412,0x0013,0x2017, 0x331b,0x331c,0x331d,0x331e, 0xffff }; unsigned short ccrtc_640x480x8[] = { 0x2c11, 0x5f00,0x4f01,0x4f02,0x8003,0x5204,0x1e05,0x0b06,0x3e07, 0x4009,0x000c,0x000d, 0xea10,0xdf12,0x5013,0x4014,0xdf15,0x0b16,0xc317,0xff18, 0x001a,0x221b,0x001d, 0xffff }; /* 640x480x16 */ unsigned short cseq_640x480x16[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1707, 0x580b,0x580c,0x580d,0x580e, 0x0412,0x0013,0x2017, 0x331b,0x331c,0x331d,0x331e, 0xffff }; unsigned short ccrtc_640x480x16[] = { 0x2c11, 0x5f00,0x4f01,0x4f02,0x8003,0x5204,0x1e05,0x0b06,0x3e07, 0x4009,0x000c,0x000d, 0xea10,0xdf12,0xa013,0x4014,0xdf15,0x0b16,0xc317,0xff18, 0x001a,0x221b,0x001d, 0xffff }; /* 640x480x24 */ unsigned short cseq_640x480x24[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1507, 0x580b,0x580c,0x580d,0x580e, 0x0412,0x0013,0x2017, 0x331b,0x331c,0x331d,0x331e, 0xffff }; unsigned short ccrtc_640x480x24[] = { 0x2c11, 0x5f00,0x4f01,0x4f02,0x8003,0x5204,0x1e05,0x0b06,0x3e07, 0x4009,0x000c,0x000d, 0xea10,0xdf12,0x0013,0x4014,0xdf15,0x0b16,0xc317,0xff18, 0x001a,0x321b,0x001d, 0xffff }; /* 800x600x8 */ unsigned short cseq_800x600x8[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107, 0x230b,0x230c,0x230d,0x230e, 0x0412,0x0013,0x2017, 0x141b,0x141c,0x141d,0x141e, 0xffff }; unsigned short ccrtc_800x600x8[] = { 0x2311,0x7d00,0x6301,0x6302,0x8003,0x6b04,0x1a05,0x9806,0xf007, 0x6009,0x000c,0x000d, 0x7d10,0x5712,0x6413,0x4014,0x5715,0x9816,0xc317,0xff18, 0x001a,0x221b,0x001d, 0xffff }; /* 800x600x16 */ unsigned short cseq_800x600x16[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1707, 0x230b,0x230c,0x230d,0x230e, 0x0412,0x0013,0x2017, 0x141b,0x141c,0x141d,0x141e, 0xffff }; unsigned short ccrtc_800x600x16[] = { 0x2311,0x7d00,0x6301,0x6302,0x8003,0x6b04,0x1a05,0x9806,0xf007, 0x6009,0x000c,0x000d, 0x7d10,0x5712,0xc813,0x4014,0x5715,0x9816,0xc317,0xff18, 0x001a,0x221b,0x001d, 0xffff }; /* 800x600x24 */ unsigned short cseq_800x600x24[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1507, 0x230b,0x230c,0x230d,0x230e, 0x0412,0x0013,0x2017, 0x141b,0x141c,0x141d,0x141e, 0xffff }; unsigned short ccrtc_800x600x24[] = { 0x2311,0x7d00,0x6301,0x6302,0x8003,0x6b04,0x1a05,0x9806,0xf007, 0x6009,0x000c,0x000d, 0x7d10,0x5712,0x2c13,0x4014,0x5715,0x9816,0xc317,0xff18, 0x001a,0x321b,0x001d, 0xffff }; /* 1024x768x8 */ unsigned short cseq_1024x768x8[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1107, 0x760b,0x760c,0x760d,0x760e, 0x0412,0x0013,0x2017, 0x341b,0x341c,0x341d,0x341e, 0xffff }; unsigned short ccrtc_1024x768x8[] = { 0x2911,0xa300,0x7f01,0x7f02,0x8603,0x8304,0x9405,0x2406,0xf507, 0x6009,0x000c,0x000d, 0x0310,0xff12,0x8013,0x4014,0xff15,0x2416,0xc317,0xff18, 0x001a,0x221b,0x001d, 0xffff }; /* 1024x768x16 */ unsigned short cseq_1024x768x16[] = { 0x0300,0x2101,0x0f02,0x0003,0x0e04,0x1707, 0x760b,0x760c,0x760d,0x760e, 0x0412,0x0013,0x2017, 0x341b,0x341c,0x341d,0x341e, 0xffff }; unsigned short ccrtc_1024x768x16[] = { 0x2911,0xa300,0x7f01,0x7f02,0x8603,0x8304,0x9405,0x2406,0xf507, 0x6009,0x000c,0x000d, 0x0310,0xff1
#! /bin/sh
# A little script I whipped up to make it easy to
# patch source trees and have sane error handling
# -Erik
#
# (c) 2002 Erik Andersen <andersen@codepoet.org>

# Set directories from arguments, or use defaults.
targetdir=${1-.}
patchdir=${2-../kernel-patches}
patchpattern=${3-*}

if [ ! -d "${targetdir}" ] ; then
    echo "Aborting.  '${targetdir}' is not a directory."
    exit 1
fi
if [ ! -d "${patchdir}" ] ; then
    echo "Aborting.  '${patchdir}' is not a directory."
    exit 1
fi
    
for i in ${patchdir}/${patchpattern} ; do 
    case "$i" in
	*.gz)
	type="gzip"; uncomp="gunzip -dc"; ;; 
	*.bz)
	type="bzip"; uncomp="bunzip -dc"; ;; 
	*.bz2)
	type="bzip2"; uncomp="bunzip2 -dc"; ;; 
	*.zip)
	type="zip"; uncomp="unzip -d"; ;; 
	*.Z)
	type="compress"; uncomp="uncompress -c"; ;; 
	*)
	type="plaintext"; uncomp="cat"; ;; 
    esac
    [ -d "${i}" ] && echo "Ignoring subdirectory ${i}" && continue	
    echo ""
    echo "Applying ${i} using ${type}: " 
    ${uncomp} ${i} | ${PATCH:-patch} -f -p1 -d ${targetdir}
    if [ $? != 0 ] ; then
        echo "Patch failed!  Please fix $i!"
	exit 1
    fi
done

# Check for rejects...
if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
    echo "Aborting.  Reject files found."
    exit 1
fi

# Remove backup files
find $targetdir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
ax, #0x08 stosb mov ax, #0x10 stosb mov al, #1 ;; count of planes stosb mov al, [si+6] ;; bpp stosb mov al, #0x1 ;; XXX number of banks stosb mov al, [si+17] stosb ;; memory model mov al, #0x0 ;; XXX size of bank in K stosb call cirrus_get_line_offset_entry mov bx, [si+4] mul bx ;; dx:ax=vramdisp or ax, ax jz cirrus_vesa_01h_3 inc dx cirrus_vesa_01h_3: call cirrus_extbios_85h ;; al=vram in 64k mov ah, #0x00 mov cx, dx xor dx, dx div cx dec ax stosb ;; number of image pages = vramtotal/vramdisp-1 mov al, #0x00 stosb ;; v1.2+ stuffs push si add si, #18 movsw movsw movsw movsw pop si mov ah, [si+16] mov al, #0x0 sub ah, #9 rcl al, #1 ; bit 0=palette flag stosb ;; direct screen mode info ;; v2.0+ stuffs ;; 32-bit LFB address xor ax, ax stosw call cirrus_get_lfb_addr stosw or ax, ax jz cirrus_vesa_01h_4 push di mov di, bp db 0x26 ;; es: mov ax, [di] or ax, #0x0080 ;; mode bit 7:LFB stosw pop di cirrus_vesa_01h_4: xor ax, ax stosw ; reserved stosw ; reserved stosw ; reserved mov ax, #0x004F mov di, bp pop bx pop dx pop cx pop si pop ds test cx, #0x4000 ;; LFB flag jz cirrus_vesa_01h_5 push cx db 0x26 ;; es: mov cx, [di] cmp cx, #0x0080 ;; is LFB supported? jnz cirrus_vesa_01h_6 mov ax, #0x014F ;; error - no LFB cirrus_vesa_01h_6: pop cx cirrus_vesa_01h_5: ret cirrus_vesa_02h: ;; XXX support CRTC registers test bx, #0x3e00 jnz cirrus_vesa_02h_2 ;; unknown flags mov ax, bx and ax, #0x1ff ;; bit 8-0 mode cmp ax, #0x100 ;; legacy VGA mode jb cirrus_vesa_02h_legacy call cirrus_vesamode_to_mode cmp ax, #0xffff jnz cirrus_vesa_02h_1 cirrus_vesa_02h_2: jmp cirrus_vesa_unimplemented cirrus_vesa_02h_legacy: #ifdef CIRRUS_VESA3_PMINFO db 0x2e ;; cs: cmp byte ptr [cirrus_vesa_is_protected_mode], #0 jnz cirrus_vesa_02h_2 #endif // CIRRUS_VESA3_PMINFO int #0x10 mov ax, #0x004F ret cirrus_vesa_02h_1: push si push ax call cirrus_get_modeentry_nomask call cirrus_switch_mode test bx, #0x4000 ;; LFB jnz cirrus_vesa_02h_3 call cirrus_enable_16k_granularity cirrus_vesa_02h_3: test bx, #0x8000 ;; no clear jnz cirrus_vesa_02h_4 push ax xor ax,ax call cirrus_clear_vram pop ax cirrus_vesa_02h_4: pop ax push ds #ifdef CIRRUS_VESA3_PMINFO db 0x2e ;; cs: mov si, [cirrus_vesa_sel0000_data] #else xor si, si #endif mov ds, si mov [PM_BIOSMEM_CURRENT_MODE], al mov [PM_BIOSMEM_VBE_MODE], bx pop ds pop si mov ax, #0x004F ret cirrus_vesa_03h: push ds #ifdef CIRRUS_VESA3_PMINFO db 0x2e ;; cs: mov ax, [cirrus_vesa_sel0000_data] #else xor ax, ax #endif mov ds, ax mov bx, # PM_BIOSMEM_VBE_MODE mov ax, [bx] mov bx, ax test bx, bx jnz cirrus_vesa_03h_1 mov bx, # PM_BIOSMEM_CURRENT_MODE mov al, [bx] mov bl, al xor bh, bh cirrus_vesa_03h_1: mov ax, #0x004f pop ds ret cirrus_vesa_05h_farentry: call cirrus_vesa_05h retf cirrus_vesa_05h: cmp bl, #0x01 ja cirrus_vesa_05h_1 cmp bh, #0x00 jz cirrus_vesa_05h_setmempage cmp bh, #0x01 jz cirrus_vesa_05h_getmempage cirrus_vesa_05h_1: jmp cirrus_vesa_unimplemented cirrus_vesa_05h_setmempage: or dh, dh ; address must be < 0x100 jnz cirrus_vesa_05h_1 push dx mov al, bl ;; bl=bank number add al, #0x09 mov ah, dl ;; dx=window address in granularity mov dx, #0x3ce out dx, ax pop dx mov ax, #0x004F ret cirrus_vesa_05h_getmempage: mov al, bl ;; bl=bank number add al, #0x09 mov dx, #0x3ce out dx, al inc dx in al, dx xor dx, dx mov dl, al ;; dx=window address in granularity mov ax, #0x004F ret cirrus_vesa_06h: mov ax, cx cmp bl, #0x01 je cirrus_vesa_06h_3 cmp bl, #0x02 je cirrus_vesa_06h_2 jb cirrus_vesa_06h_1 mov ax, #0x0100 ret cirrus_vesa_06h_1: call cirrus_get_bpp_bytes mov bl, al xor bh, bh mov ax, cx mul bx cirrus_vesa_06h_2: call cirrus_set_line_offset cirrus_vesa_06h_3: call cirrus_get_bpp_bytes mov bl, al xor bh, bh xor dx, dx call cirrus_get_line_offset push ax div bx mov cx, ax pop bx call cirrus_extbios_85h ;; al=vram in 64k xor dx, dx mov dl, al xor ax, ax div bx mov dx, ax mov ax, #0x004f ret cirrus_vesa_07h: cmp bl, #0x80 je cirrus_vesa_07h_1 cmp bl, #0x01 je cirrus_vesa_07h_2 jb cirrus_vesa_07h_1 mov ax, #0x0100 ret cirrus_vesa_07h_1: push dx call cirrus_get_bpp_bytes mov bl, al xor bh, bh mov ax, cx mul bx pop bx push ax call cirrus_get_line_offset mul bx pop bx add ax, bx jnc cirrus_vesa_07h_3 inc dx cirrus_vesa_07h_3: push dx and dx, #0x0003 mov bx, #0x04 div bx pop dx shr dx, #2 call cirrus_set_start_addr mov ax, #0x004f ret cirrus_vesa_07h_2: call cirrus_get_start_addr shl dx, #2 push dx mov bx, #0x04 mul bx pop bx or dx, bx push ax call cirrus_get_line_offset mov bx, ax pop ax div bx push ax push dx call cirrus_get_bpp_bytes mov bl, al xor bh, bh pop ax xor dx, dx div bx mov cx, ax pop dx mov ax, #0x004f ret cirrus_vesa_10h: ;; Power management functions ;; Set up DS to read stored power info from RAM push ds #ifdef CIRRUS_VESA3_PMINFO db 0x2e ;; cs: mov ax, [cirrus_vesa_sel0000_data] #else xor ax, ax #endif mov ds, ax ;; Now choose the right function cmp bl, #0x00 ja cirrus_vesa_10h_01 ;; ;; Function 00h: Get capabilities ;; mov bx, #0x0720 ;; 07: standby/suspend/off, 20: VBE/PM 2.0 mov ax, #0x004f jmp cirrus_vesa_10h_done cirrus_vesa_10h_01: cmp bl, #0x01 ja cirrus_vesa_10h_02 ;; ;; Function 01h: Set power state ;; mov ax, bx mov bx, # PM_BIOSMEM_VBE_POWER mov [bx], ah mov ax, #0x004f jmp cirrus_vesa_10h_done cirrus_vesa_10h_02: cmp bl, #0x02 ja cirrus_vesa_10h_unimplemented ;; ;; Function 02h: Get power state ;; mov bx, # PM_BIOSMEM_VBE_POWER mov bh, [bx] mov ax, #0x004f jmp cirrus_vesa_10h_done cirrus_vesa_10h_unimplemented: mov ax, #0x014F ;; not implemented cirrus_vesa_10h_done: pop ds ret cirrus_vesa_unimplemented: mov ax, #0x014F ;; not implemented ret ;; in ax:vesamode, out ax:cirrusmode cirrus_vesamode_to_mode: push ds push cx push si push cs pop ds mov cx, #0xffff mov si, #_cirrus_vesa_modelist cvtm_1: cmp [si],ax jz cvtm_2 cmp [si],cx jz cvtm_2 add si, #4 jmp cvtm_1 cvtm_2: mov ax,[si+2] pop si pop cx pop ds ret ; cirrus_get_crtc ;; NOTE - may be called in protected mode cirrus_get_crtc: push ds push ax mov dx, #0x3cc in al, dx and al, #0x01 shl al, #5 mov dx, #0x3b4 add dl, al pop ax pop ds ret ;; in - al:mode, out - cflag:result, si:table, ax:destroyed cirrus_get_modeentry: and al, #0x7f cirrus_get_modeentry_nomask: mov si, #_cirrus_modes cgm_1: db 0x2e ;; cs: mov ah, [si] cmp al, ah jz cgm_2 cmp ah, #0xff jz cgm_4 add si, # CIRRUS_MODE_SIZE jmp cgm_1 cgm_4: xor si, si stc ;; video mode is not supported jmp cgm_3 cgm_2: clc ;; video mode is supported cgm_3: ret ; get LFB address ; out - ax:LFB address (high 16 bit) ;; NOTE - may be called in protected mode cirrus_get_lfb_addr: push cx push dx push eax xor cx, cx mov dl, #0x00 call cirrus_pci_read cmp ax, #0xffff jz cirrus_get_lfb_addr_5 cirrus_get_lfb_addr_3: mov dl, #0x00 call cirrus_pci_read cmp ax, #0x1013 ;; cirrus jz cirrus_get_lfb_addr_4 add cx, #0x8 cmp cx, #0x200 ;; search bus #0 and #1 jb cirrus_get_lfb_addr_3 cirrus_get_lfb_addr_5: xor dx, dx ;; no LFB jmp cirrus_get_lfb_addr_6 cirrus_get_lfb_addr_4: mov dl, #0x10 ;; I/O space #0 call cirrus_pci_read test ax, #0xfff1 jnz cirrus_get_lfb_addr_5 shr eax, #16 mov dx, ax ;; LFB address cirrus_get_lfb_addr_6: pop eax mov ax, dx pop dx pop cx ret cirrus_pci_read: mov eax, #0x00800000 mov ax, cx shl eax, #8 mov al, dl mov dx, #0xcf8 out dx, eax add dl, #4 in eax, dx ret ;; out - al:bytes per pixel cirrus_get_bpp_bytes: push dx mov dx, #0x03c4 mov al, #0x07 out dx, al inc dx in al, dx and al, #0x0e cmp al, #0x06 jne cirrus_get_bpp_bytes_1 and al, #0x02 cirrus_get_bpp_bytes_1: shr al, #1 cmp al, #0x04 je cirrus_get_bpp_bytes_2 inc al cirrus_get_bpp_bytes_2: pop dx ret ;; in - ax: new line offset cirrus_set_line_offset: shr ax, #3 push ax call cirrus_get_crtc mov al, #0x13 out dx, al inc dx pop ax out dx, al dec dx mov al, #0x1b out dx, al inc dx shl ah, #4 in al, dx and al, #ef or al, ah out dx, al ret ;; out - ax: active line offset cirrus_get_line_offset: push dx push bx call cirrus_get_crtc mov al, #0x13 out dx, al inc dx in al, dx mov bl, al dec dx mov al, #0x1b out dx, al inc dx in al, dx mov ah, al shr ah, #4 and ah, #0x01 mov al, bl shl ax, #3 pop bx pop dx ret ;; in - si: table ;; out - ax: line offset for mode cirrus_get_line_offset_entry: push bx mov bx, [si+14] ;; crtc table push bx offset_loop1: mov ax, [bx] cmp al, #0x13 je offset_found1 inc bx inc bx jnz offset_loop1 offset_found1: xor al, al shr ax, #5 pop bx push ax offset_loop2: mov ax, [bx] cmp al, #0x1b je offset_found2 inc bx inc bx jnz offset_loop2 offset_found2: pop bx and ax, #0x1000 shr ax, #1 or ax, bx pop bx ret ;; in - new address in DX:AX cirrus_set_start_addr: push bx push dx push ax call cirrus_get_crtc mov al, #0x0d out dx, al inc dx pop ax out dx, al dec dx mov al, #0x0c out dx, al inc dx mov al, ah out dx, al dec dx mov al, #0x1d out dx, al inc dx in al, dx and al, #0x7f pop bx mov ah, bl shl bl, #4 and bl, #0x80 or al, bl out dx, al dec dx mov bl, ah and ah, #0x01 shl bl, #1 and bl, #0x0c or ah, bl mov al, #0x1b out dx, al inc dx in al, dx and al, #0xf2 or al, ah out dx, al pop bx ret ;; out - current address in DX:AX cirrus_get_start_addr: push bx call cirrus_get_crtc mov al, #0x0c out dx, al inc dx in al, dx mov ah, al dec dx mov al, #0x0d out dx, al inc dx in al, dx push ax dec dx mov al, #0x1b out dx, al inc dx in al, dx dec dx mov bl, al and al, #0x01 and bl, #0x0c shr bl, #1 or bl, al mov al, #0x1d out dx, al inc dx in al, dx and al, #0x80 shr al, #4 or bl, al mov dl, bl xor dh, dh pop ax pop bx ret cirrus_clear_vram: pusha push es mov si, ax call cirrus_enable_16k_granularity call cirrus_extbios_85h shl al, #2 mov bl, al xor ah,ah cirrus_clear_vram_1: mov al, #0x09 mov dx, #0x3ce out dx, ax push ax ;; Windows Vista appears to be emulating this sequence as part of changing ;; screen resolution, but it generates 4096 writes per iteration. ;; Instead, use a magic register sequence to write the whole bank. ;;mov cx, #0xa000 ;;mov es, cx ;;xor di, di ;;mov ax, si ;;mov cx, #8192 ;;cld ;;rep ;; stosw mov ax, si shl ax, #8 mov al, #0xfe out dx, ax ;; Low byte of value to be written to the bank mov ax, si mov al, #0xff out dx, ax ;; High byte and trigger the write pop ax inc ah cmp ah, bl jne cirrus_clear_vram_1 xor ah,ah mov dx, #0x3ce out dx, ax pop es popa ret cirrus_extbios_handlers: ;; 80h dw cirrus_extbios_80h dw cirrus_extbios_81h dw cirrus_extbios_82h dw cirrus_extbios_unimplemented ;; 84h dw cirrus_extbios_unimplemented dw cirrus_extbios_85h dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; 88h dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; 8Ch dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; 90h dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; 94h dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; 98h dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_9Ah dw cirrus_extbios_unimplemented ;; 9Ch dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; A0h dw cirrus_extbios_A0h dw cirrus_extbios_A1h dw cirrus_extbios_A2h dw cirrus_extbios_unimplemented ;; A4h dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; A8h dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented ;; ACh dw cirrus_extbios_unimplemented dw cirrus_extbios_unimplemented dw cirrus_extbios_AEh dw cirrus_extbios_unimplemented cirrus_vesa_handlers: ;; 00h dw cirrus_vesa_00h dw cirrus_vesa_01h dw cirrus_vesa_02h dw cirrus_vesa_03h ;; 04h dw cirrus_vesa_unimplemented dw cirrus_vesa_05h dw cirrus_vesa_06h dw cirrus_vesa_07h ;; 08h dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented ;; 0Ch dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented dw cirrus_vesa_unimplemented ;; 10h dw cirrus_vesa_10h ASM_END #ifdef CIRRUS_VESA3_PMINFO ASM_START cirrus_vesa_pminfo: /* + 0 */ .byte 0x50,0x4d,0x49,0x44 ;; signature[4] /* + 4 */ dw cirrus_vesa_pmbios_entry ;; entry_bios dw cirrus_vesa_pmbios_init ;; entry_init /* + 8 */ cirrus_vesa_sel0000_data: dw 0x0000 ;; sel_00000 cirrus_vesa_selA000_data: dw 0xA000 ;; sel_A0000 /* +12 */ cirrus_vesa_selB000_data: dw 0xB000 ;; sel_B0000 cirrus_vesa_selB800_data: dw 0xB800 ;; sel_B8000 /* +16 */ cirrus_vesa_selC000_data: dw 0xC000 ;; sel_C0000 cirrus_vesa_is_protected_mode: ;; protected mode flag and checksum dw (~((0xf2 + (cirrus_vesa_pmbios_entry >> 8) + (cirrus_vesa_pmbios_entry) \ + (cirrus_vesa_pmbios_init >> 8) + (cirrus_vesa_pmbios_init)) & 0xff) << 8) + 0x01 ASM_END #endif // CIRRUS_VESA3_PMINFO #ifdef CIRRUS_DEBUG static void cirrus_debugmsg(DI, SI, BP, SP, BX, DX, CX, AX, DS, ES, FLAGS) Bit16u DI, SI, BP, SP, BX, DX, CX, AX, ES, DS, FLAGS; { if((GET_AH()!=0x0E)&&(GET_AH()!=0x02)&&(GET_AH()!=0x09)&&(AX!=0x4F05)) printf("vgabios call ah%02x al%02x bx%04x cx%04x dx%04x\n",GET_AH(),GET_AL(),BX,CX,DX); } #endif