Bochs/bochs/patches/patch.vbe-lfb
Jeroen Janssen 92b2332af4 - adding vbe lfb enabled vgabios (+debug version) in tar.gz file
- updating vbe-lfb patch to currect cvs + adding some more instructions regarding the bios
2002-03-24 10:38:14 +00:00

168 lines
4.4 KiB
Plaintext

----------------------------------------------------------------------
Patch name: VBE Linear Frame Buffer support
Author: Jeroen Janssen
Date: 24 March 2002
RCS Id: $Id: patch.vbe-lfb,v 1.2 2002/03/21 07:13:47 japj Exp $
Detailed description:
This patch will (together with an update vgabios) add support for
VBE Linear Frame Buffer modes.
The file patch.vbe-lfb-bios.tar.gz contains a LFB enabled vbebios.
It was build from the vgabios sources on 24 March 2002 with
#define VBE_HAVE_LFB uncommented in vbe.c
In order to test the LFB code, you need to replace the vgaromimage:
line in .bochsrc to the extracted vbebios.bin.
The tar.gz file also contains a 'debug' build bios that shows lots
of information on the bochsout logfile.
Patch was created with:
cvs diff -u
Apply patch to what version:
cvs checked out on 24 March 2002, release version 1.4pre1
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
*** iodev/vga.cc 16 Mar 2002 11:37:43 -0000 1.29
--- iodev/vga.cc 24 Mar 2002 10:30:06 -0000
@@ -2081,9 +2081,20 @@
bx_vga_c::vbe_mem_read(Bit32u addr)
{
Bit32u offset;
- offset = addr - 0xA0000;
+
+ if (addr >= VBE_DISPI_LFB_PHYSICAL_ADDRESS)
+ {
+ // LFB read
+ // FIXME: check for max VBE video memory size
+ offset = offset - VBE_DISPI_LFB_PHYSICAL_ADDRESS;
+ }
+ else
+ {
+ // banked mode read
+ offset = BX_VGA_THIS s.vbe_bank*65536 + addr - 0xA0000;
+ }
- return (BX_VGA_THIS s.vbe_memory[BX_VGA_THIS s.vbe_bank*65536 + offset]);
+ return (BX_VGA_THIS s.vbe_memory[offset]);
}
void
@@ -2091,7 +2102,18 @@
{
Bit32u offset;
unsigned x_tileno, y_tileno;
- offset = BX_VGA_THIS s.vbe_bank*65536 + (addr - 0xA0000);
+
+ if (addr >= VBE_DISPI_LFB_PHYSICAL_ADDRESS)
+ {
+ // LFB write
+ // FIXME: check for max VBE video memory size
+ offset = offset - VBE_DISPI_LFB_PHYSICAL_ADDRESS;
+ }
+ else
+ {
+ // banked mode write
+ offset = BX_VGA_THIS s.vbe_bank*65536 + (addr - 0xA0000);
+ }
// check for out of memory write
if (offset < sizeof(BX_VGA_THIS s.vbe_memory))
*** iodev/vga.h 16 Mar 2002 10:22:57 -0000 1.10
--- iodev/vga.h 24 Mar 2002 10:30:11 -0000
@@ -52,6 +52,8 @@
#define VBE_DISPI_DISABLED 0x00
#define VBE_DISPI_ENABLED 0x01
+ #define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000
+
#define BX_MAX_XRES VBE_DISPI_MAX_XRES
#define BX_MAX_YRES VBE_DISPI_MAX_YRES
*** memory/memory.cc 3 Oct 2001 13:10:38 -0000 1.9
--- memory/memory.cc 24 Mar 2002 10:30:16 -0000
@@ -224,6 +224,37 @@
data_ptr = (Bit8u *) data + (len - 1);
#endif
+
+#if BX_SUPPORT_VBE
+ // Check VBE LFB support
+
+ if (a20addr >= VBE_DISPI_LFB_PHYSICAL_ADDRESS)
+ {
+ for (i = 0; i < len; i++) {
+ // FIXME: check for max VBE video memory size
+
+ //if (a20addr < BX_MEM_THIS len) {
+ //vector[a20addr] = *data_ptr;
+ //BX_DBG_DIRTY_PAGE(a20addr >> 12);
+ //BX_DYN_DIRTY_PAGE(a20addr >> 12);
+ BX_VGA_MEM_WRITE(a20addr, *data_ptr);
+ // }
+
+ // otherwise ignore byte, since it overruns memory
+ addr++;
+ a20addr = A20ADDR(addr);
+#ifdef BX_LITTLE_ENDIAN
+ data_ptr++;
+#else // BX_BIG_ENDIAN
+ data_ptr--;
+#endif
+ }
+ return;
+ }
+
+#endif
+
+
#if BX_SUPPORT_APIC
bx_generic_apic_c *local_apic = &cpu->local_apic;
bx_generic_apic_c *ioapic = bx_devices.ioapic;
@@ -422,6 +453,36 @@
#else // BX_BIG_ENDIAN
data_ptr = (Bit8u *) data + (len - 1);
#endif
+
+#if BX_SUPPORT_VBE
+ // Check VBE LFB support
+
+ if (a20addr >= VBE_DISPI_LFB_PHYSICAL_ADDRESS)
+ {
+ for (i = 0; i < len; i++) {
+ // FIXME: check for max VBE video memory size
+
+ //if (a20addr < BX_MEM_THIS len) {
+ //vector[a20addr] = *data_ptr;
+ //BX_DBG_DIRTY_PAGE(a20addr >> 12);
+ //BX_DYN_DIRTY_PAGE(a20addr >> 12);
+ *data_ptr = BX_VGA_MEM_READ(a20addr);
+ // }
+
+ // otherwise ignore byte, since it overruns memory
+ addr++;
+ a20addr = A20ADDR(addr);
+#ifdef BX_LITTLE_ENDIAN
+ data_ptr++;
+#else // BX_BIG_ENDIAN
+ data_ptr--;
+#endif
+ }
+ return;
+ }
+
+#endif
+
#if BX_SUPPORT_APIC
bx_generic_apic_c *local_apic = &cpu->local_apic;