📄 vgabios.diff
字号:
Index: Makefile===================================================================RCS file: /sources/vgabios/vgabios/Makefile,vretrieving revision 1.17diff -u -w -r1.17 Makefile--- Makefile 6 Mar 2005 13:06:47 -0000 1.17+++ Makefile 14 Jun 2006 00:51:06 -0000@@ -22,7 +22,7 @@ cirrus-bios: vgabios-cirrus.bin vgabios-cirrus.debug.bin clean:- /bin/rm -f biossums *.o *.s *.ld86 \+ /bin/rm -f biossums vbetables-gen vbetables.h *.o *.s *.ld86 \ temp.awk.* vgabios*.orig _vgabios_* _vgabios-debug_* core vgabios*.bin vgabios*.txt $(RELEASE).bin *.bak dist-clean: clean@@ -79,3 +79,9 @@ biossums: biossums.c $(CC) -o biossums biossums.c++vbetables-gen: vbetables-gen.c+ $(CC) -o vbetables-gen vbetables-gen.c++vbetables.h: vbetables-gen+ ./vbetables-gen > $@Index: clext.c===================================================================RCS file: /sources/vgabios/vgabios/clext.c,vretrieving revision 1.10diff -u -w -r1.10 clext.c--- clext.c 25 Mar 2006 10:19:15 -0000 1.10+++ clext.c 14 Jun 2006 00:51:06 -0000@@ -544,6 +544,13 @@ cirrus_set_video_mode_extended: call cirrus_switch_mode pop ax ;; mode+ test al, #0x80+ jnz cirrus_set_video_mode_extended_1+ push ax+ mov ax, #0xffff ; set to 0xff to keep win 2K happy+ call cirrus_clear_vram+ pop ax+cirrus_set_video_mode_extended_1: and al, #0x7f push ds@@ -1011,6 +1018,13 @@ 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@@ -1479,6 +1493,38 @@ 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+ mov cx, #0xa000+ mov es, cx+ xor di, di+ mov ax, si+ mov cx, #8192+ cld+ rep + stosw+ pop ax+ inc ah+ cmp ah, bl+ jne cirrus_clear_vram_1++ pop es+ popa+ ret+ cirrus_extbios_handlers: ;; 80h dw cirrus_extbios_80hIndex: vbe.c===================================================================RCS file: /sources/vgabios/vgabios/vbe.c,vretrieving revision 1.48diff -u -w -r1.48 vbe.c--- vbe.c 26 Dec 2005 19:50:26 -0000 1.48+++ vbe.c 14 Jun 2006 00:51:07 -0000@@ -118,21 +118,114 @@ .word VBE_VESA_MODE_END_OF_LIST #endif + .align 2 vesa_pm_start: dw vesa_pm_set_window - vesa_pm_start- dw vesa_pm_set_display_strt - vesa_pm_start+ dw vesa_pm_set_display_start - vesa_pm_start dw vesa_pm_unimplemented - vesa_pm_start- dw 0+ dw vesa_pm_io_ports_table - vesa_pm_start+vesa_pm_io_ports_table:+ dw VBE_DISPI_IOPORT_INDEX+ dw VBE_DISPI_IOPORT_INDEX + 1+ dw VBE_DISPI_IOPORT_DATA+ dw VBE_DISPI_IOPORT_DATA + 1+ dw 0xffff+ dw 0xffff USE32 vesa_pm_set_window:- mov ax, #0x4f05- int #0x10+ cmp bx, #0x00+ je vesa_pm_set_display_window1+ mov ax, #0x0100+ ret+vesa_pm_set_display_window1:+ mov ax, dx+ push dx+ push ax+ mov dx, # VBE_DISPI_IOPORT_INDEX+ mov ax, # VBE_DISPI_INDEX_BANK+ out dx, ax+ pop ax+ mov dx, # VBE_DISPI_IOPORT_DATA+ out dx, ax+ pop dx+ mov ax, #0x004f ret vesa_pm_set_display_start:- mov ax, #0x4f07- int #0x10+ cmp bl, #0x80+ je vesa_pm_set_display_start1+ cmp bl, #0x00+ je vesa_pm_set_display_start1+ mov ax, #0x0100+ ret+vesa_pm_set_display_start1:+; convert offset to (X, Y) coordinate +; (would be simpler to change Bochs VBE API...)+ push eax+ push ecx+ push edx+ push esi+ push edi+ shl edx, #16+ and ecx, #0xffff+ or ecx, edx+ shl ecx, #2+ mov eax, ecx++ push eax+ mov dx, # VBE_DISPI_IOPORT_INDEX+ mov ax, # VBE_DISPI_INDEX_VIRT_WIDTH+ out dx, ax+ mov dx, # VBE_DISPI_IOPORT_DATA+ in ax, dx+ movzx ecx, ax++ mov dx, # VBE_DISPI_IOPORT_INDEX+ mov ax, # VBE_DISPI_INDEX_BPP+ out dx, ax+ mov dx, # VBE_DISPI_IOPORT_DATA+ in ax, dx+ movzx esi, ax+ pop eax++ add esi, #7+ shr esi, #3+ imul ecx, esi+ xor edx, edx+ div ecx+ mov edi, eax+ mov eax, edx+ xor edx, edx+ div esi++ push dx+ push ax+ mov dx, # VBE_DISPI_IOPORT_INDEX+ mov ax, # VBE_DISPI_INDEX_X_OFFSET+ out dx, ax+ pop ax+ mov dx, # VBE_DISPI_IOPORT_DATA+ out dx, ax+ pop dx++ mov ax, di+ push dx+ push ax+ mov dx, # VBE_DISPI_IOPORT_INDEX+ mov ax, # VBE_DISPI_INDEX_Y_OFFSET+ out dx, ax+ pop ax+ mov dx, # VBE_DISPI_IOPORT_DATA+ out dx, ax+ pop dx++ pop edi+ pop esi+ pop edx+ pop ecx+ pop eax+ mov ax, #0x004f ret vesa_pm_unimplemented:@@ -835,6 +928,64 @@ ASM_END +Bit16u vbe_biosfn_read_video_state_size()+{+ return 9 * 2;+}++void vbe_biosfn_save_video_state(ES, BX)+ Bit16u ES; Bit16u BX;+{+ Bit16u enable, i;++ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);+ enable = inw(VBE_DISPI_IOPORT_DATA);+ write_word(ES, BX, enable);+ BX += 2;+ if (!(enable & VBE_DISPI_ENABLED)) + return;+ for(i = VBE_DISPI_INDEX_XRES; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {+ if (i != VBE_DISPI_INDEX_ENABLE) {+ outw(VBE_DISPI_IOPORT_INDEX, i);+ write_word(ES, BX, inw(VBE_DISPI_IOPORT_DATA));+ BX += 2;+ }+ }+}+++void vbe_biosfn_restore_video_state(ES, BX)+ Bit16u ES; Bit16u BX;+{+ Bit16u enable, i;++ enable = read_word(ES, BX);+ BX += 2;+ + if (!(enable & VBE_DISPI_ENABLED)) {+ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);+ outw(VBE_DISPI_IOPORT_DATA, enable);+ } else {+ outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_XRES);+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));+ BX += 2;+ outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_YRES);+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));+ BX += 2;+ outw(VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_BPP);+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));+ BX += 2;+ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);+ outw(VBE_DISPI_IOPORT_DATA, enable);++ for(i = VBE_DISPI_INDEX_BANK; i <= VBE_DISPI_INDEX_Y_OFFSET; i++) {+ outw(VBE_DISPI_IOPORT_INDEX, i);+ outw(VBE_DISPI_IOPORT_DATA, read_word(ES, BX));+ BX += 2;+ }+ }+}+ /** Function 04h - Save/Restore State * * Input:@@ -849,10 +1000,48 @@ * BX = Number of 64-byte blocks to hold the state buffer (if DL=00h) * */-void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX)+void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX)+Bit16u *AX; Bit16u CX; Bit16u DX; Bit16u ES; Bit16u *BX; {-}+ Bit16u ss=get_SS();+ Bit16u result, val; + result = 0x4f;+ switch(GET_DL()) {+ case 0x00:+ val = biosfn_read_video_state_size2(CX);+#ifdef DEBUG+ printf("VGA state size=%x\n", val);+#endif+ if (CX & 8)+ val += vbe_biosfn_read_video_state_size();+ write_word(ss, BX, val);+ break;+ case 0x01:+ val = read_word(ss, BX);+ val = biosfn_save_video_state(CX, ES, val);+#ifdef DEBUG+ printf("VGA save_state offset=%x\n", val);+#endif+ if (CX & 8)+ vbe_biosfn_save_video_state(ES, val);+ break;+ case 0x02:+ val = read_word(ss, BX);+ val = biosfn_restore_video_state(CX, ES, val);+#ifdef DEBUG+ printf("VGA restore_state offset=%x\n", val);+#endif+ if (CX & 8)+ vbe_biosfn_restore_video_state(ES, val);+ break;+ default:+ // function failed+ result = 0x100;+ break;+ }+ write_word(ss, AX, result);+} /** Function 05h - Display Window Control * @@ -1090,7 +1279,7 @@ */ ASM_START vbe_biosfn_return_protected_mode_interface:- test bx, bx+ test bl, bl jnz _fail mov di, #0xc000 mov es, diIndex: vbe.h===================================================================RCS file: /sources/vgabios/vgabios/vbe.h,vretrieving revision 1.24diff -u -w -r1.24 vbe.h--- vbe.h 9 May 2004 20:31:31 -0000 1.24+++ vbe.h 14 Jun 2006 00:51:07 -0000@@ -14,7 +14,7 @@ void vbe_biosfn_return_controller_information(AX, ES, DI); void vbe_biosfn_return_mode_information(AX, CX, ES, DI); void vbe_biosfn_set_mode(AX, BX, ES, DI);-void vbe_biosfn_save_restore_state(AX, DL, CX, ES, BX); +void vbe_biosfn_save_restore_state(AX, CX, DX, ES, BX); void vbe_biosfn_set_get_palette_data(AX); void vbe_biosfn_return_protected_mode_interface(AX); @@ -151,6 +151,12 @@ Bit8u Reserved[189]; } ModeInfoBlock; +typedef struct ModeInfoListItem+{+ Bit16u mode;+ ModeInfoBlockCompact info;+} ModeInfoListItem;+ // VBE Return Status Info // AL #define VBE_RETURN_STATUS_SUPPORTED 0x4F@@ -193,6 +199,10 @@ #define VBE_VESA_MODE_1280X1024X1555 0x119 #define VBE_VESA_MODE_1280X1024X565 0x11A #define VBE_VESA_MODE_1280X1024X888 0x11B+#define VBE_VESA_MODE_1600X1200X8 0x11C+#define VBE_VESA_MODE_1600X1200X1555 0x11D+#define VBE_VESA_MODE_1600X1200X565 0x11E+#define VBE_VESA_MODE_1600X1200X888 0x11F // BOCHS/PLEX86 'own' mode numbers #define VBE_OWN_MODE_320X200X8888 0x140@@ -202,6 +212,12 @@ #define VBE_OWN_MODE_1024X768X8888 0x144 #define VBE_OWN_MODE_1280X1024X8888 0x145 #define VBE_OWN_MODE_320X200X8 0x146+#define VBE_OWN_MODE_1600X1200X8888 0x147+#define VBE_OWN_MODE_1152X864X8 0x148+#define VBE_OWN_MODE_1152X864X1555 0x149+#define VBE_OWN_MODE_1152X864X565 0x14a+#define VBE_OWN_MODE_1152X864X888 0x14b+#define VBE_OWN_MODE_1152X864X8888 0x14c #define VBE_VESA_MODE_END_OF_LIST 0xFFFF @@ -259,7 +275,7 @@ // like 0xE0000000 - #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 4+ #define VBE_DISPI_TOTAL_VIDEO_MEMORY_MB 8 #define VBE_DISPI_BANK_ADDRESS 0xA0000 #define VBE_DISPI_BANK_SIZE_KB 64Index: vgabios.c===================================================================RCS file: /sources/vgabios/vgabios/vgabios.c,vretrieving revision 1.64diff -u -w -r1.64 vgabios.c--- vgabios.c 25 Mar 2006 10:19:16 -0000 1.64+++ vgabios.c 14 Jun 2006 00:51:07 -0000@@ -109,8 +109,8 @@ static void biosfn_write_string(); static void biosfn_read_state_info(); static void biosfn_read_video_state_size();-static void biosfn_save_video_state();-static void biosfn_restore_video_state();+static Bit16u biosfn_save_video_state();+static Bit16u biosfn_restore_video_state(); extern Bit8u video_save_pointer_table[]; // This is for compiling with gcc2 and gcc3@@ -748,12 +748,7 @@ vbe_biosfn_set_mode(&AX,BX,ES,DI); break; case 0x04:- //FIXME-#ifdef DEBUG- unimplemented();-#endif- // function failed- AX=0x100;+ vbe_biosfn_save_restore_state(&AX, CX, DX, ES, &BX); break; case 0x09: //FIXME@@ -3138,23 +3133,215 @@ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -