aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Ruppert <info@vruppert.de>2003-04-26 07:22:26 +0000
committerVolker Ruppert <info@vruppert.de>2003-04-26 07:22:26 +0000
commit86d1f4e72c35247744978dff0462c91a3c809a34 (patch)
treeeb3750a30ec73dd8396b72bb379564229d36e8d0
parentcb042356415dc7d7d009f5877d4370609a057dfc (diff)
downloadvgabios-86d1f4e72c35247744978dff0462c91a3c809a34.tar.gz
- added missing VBE function dispi_get_bank()
- added missing return codes for VBE function 4F05h - memory size is always reported in VBE function 4F00h - fixed scan line length for VBE mode 0102h - fixed function set_active_page() for graphics modes - fixed the page sizes of some VGA modes
-rw-r--r--vbe.c21
-rw-r--r--vbetables.h4
-rw-r--r--vgabios.c29
-rw-r--r--vgatables.h8
4 files changed, 45 insertions, 17 deletions
diff --git a/vbe.c b/vbe.c
index a952daa..4ba5ebf 100644
--- a/vbe.c
+++ b/vbe.c
@@ -192,6 +192,12 @@ static void dispi_set_bank(bank)
outw(VBE_DISPI_IOPORT_DATA,bank);
}
+static Bit16u dispi_get_bank()
+{
+ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_BANK);
+ return inw(VBE_DISPI_IOPORT_DATA);
+}
+
static void dispi_set_bank_farcall()
{
ASM_START
@@ -474,11 +480,11 @@ Bit16u *AX;Bit16u ES;Bit16u DI;
vbe_info_block.Reserved[cur_mode] = VBE_VESA_MODE_END_OF_LIST;
#endif
+ // VBE Total Memory (in 64b blocks)
+ vbe_info_block.TotalMemory = VBE_TOTAL_VIDEO_MEMORY_DIV_64K;
+
if (vbe2_info)
{
- // VBE Total Memory (in 64b blocks)
- vbe_info_block.TotalMemory = VBE_TOTAL_VIDEO_MEMORY_DIV_64K;
-
// OEM Stuff
vbe_info_block.OemSoftwareRev = VBE_OEM_SOFTWARE_REV;
vbe_info_block.OemVendorNamePtr_Seg = 0xc000;
@@ -734,11 +740,20 @@ Bit16u *AX;Bit16u BX;Bit16u *DX;
{
Bit16u ss = get_SS();
Bit16u window = read_word(ss, DX);
+ Bit16u result = 0x014f;
if (BX==0x0000)
{
dispi_set_bank(window);
+ result = 0x4f;
+ }
+ else if (BX==0x0100)
+ {
+ window = dispi_get_bank();
+ write_word(ss, DX, result);
+ result = 0x4f;
}
+ write_word(ss, AX, result);
}
diff --git a/vbetables.h b/vbetables.h
index 326977d..2fd5f7d 100644
--- a/vbetables.h
+++ b/vbetables.h
@@ -251,7 +251,7 @@ static ModeInfoListItem mode_info_list[]=
/*Bit16u WinASegment*/ VGAMEM_GRAPH,
/*Bit16u WinBSegment*/ 0,
/*Bit32u WinFuncPtr*/ 0,
- /*Bit16u BytesPerScanLine*/ 800,
+ /*Bit16u BytesPerScanLine*/ 100,
// Mandatory information for VBE 1.2 and above
/*Bit16u XResolution*/ 800,
/*Bit16u YResolution*/ 600,
@@ -279,7 +279,7 @@ static ModeInfoListItem mode_info_list[]=
/*Bit32u OffScreenMemOffset*/ 0,
/*Bit16u OffScreenMemSize*/ 0,
// Mandatory information for VBE 3.0 and above
- /*Bit16u LinBytesPerScanLine*/ 800,
+ /*Bit16u LinBytesPerScanLine*/ 100,
/*Bit8u BnkNumberOfPages*/ 0,
/*Bit8u LinNumberOfPages*/ 0,
/*Bit8u LinRedMaskSize*/ 0,
diff --git a/vgabios.c b/vgabios.c
index 3485762..197e9a1 100644
--- a/vgabios.c
+++ b/vgabios.c
@@ -1079,22 +1079,35 @@ Bit8u page;
{
Bit16u cursor,dummy;
Bit16u nbcols,nbrows,address;
+ Bit8u mode,line;
if(page>7)return;
+ // Get the mode
+ mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE);
+ line=find_vga_entry(mode);
+ if(line==0xFF)return;
+
// Get pos curs pos for the right page
biosfn_get_cursor_pos(page,&dummy,&cursor);
- // Get the dimensions
- nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
- nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1;
+ if(vga_modes[line].class==TEXT)
+ {
+ // Get the dimensions
+ nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
+ nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1;
- // Calculate the address knowing nbcols nbrows and page num
- address=SCREEN_MEM_START(nbcols,nbrows,page);
- write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START,address);
+ // Calculate the address knowing nbcols nbrows and page num
+ address=SCREEN_MEM_START(nbcols,nbrows,page);
+ write_word(BIOSMEM_SEG,BIOSMEM_CURRENT_START,address);
- // Start address
- address=SCREEN_IO_START(nbcols,nbrows,page);
+ // Start address
+ address=SCREEN_IO_START(nbcols,nbrows,page);
+ }
+ else
+ {
+ address = page*vga_modes[line].slength;
+ }
// CRTC regs 0x0c and 0x0d
outb(read_word(BIOSMEM_SEG,BIOSMEM_CRTC_ADDRESS),0x0c);
diff --git a/vgatables.h b/vgatables.h
index 40d3146..5bf00dd 100644
--- a/vgatables.h
+++ b/vgatables.h
@@ -124,10 +124,10 @@ static VGAMODES vga_modes[MODE_MAX+1]=
{0x05, 0xFFFF, GRAPH, CGA, 1, 2, 320, 200, 40, 25, 8, 8, 0xB800, 0x0800, 0x63, 0xFF, 0x02, 0x01, 0x01, 0x02, 0x01},
{0x06, 0xFFFF, GRAPH, CGA, 1, 1, 640, 200, 80, 25, 8, 8, 0xB800, 0x1000, 0x63, 0xFF, 0x03, 0x02, 0x02, 0x03, 0x01},
{0x07, 0xFFFF, TEXT, MTEXT, 4, 4, 720, 400, 80, 25, 9, 16, 0xB000, 0x1000, 0x66, 0xFF, 0x04, 0x03, 0x03, 0x01, 0x00},
- {0x0D, 0xFFFF, GRAPH, PLANAR4, 8, 4, 320, 200, 40, 25, 8, 8, 0xA000, 0x0000, 0x63, 0xFF, 0x05, 0x04, 0x04, 0x04, 0x01},
- {0x0E, 0xFFFF, GRAPH, PLANAR4, 4, 4, 640, 200, 80, 25, 8, 8, 0xA000, 0x0000, 0x63, 0xFF, 0x06, 0x04, 0x04, 0x05, 0x01},
- {0x0F, 0xFFFF, GRAPH, PLANAR2, 2, 2, 640, 350, 80, 25, 8, 14, 0xA000, 0x0000, 0xa2, 0xFF, 0x07, 0x05, 0x04, 0x05, 0x00},
- {0x10, 0xFFFF, GRAPH, PLANAR4, 2, 4, 640, 350, 80, 25, 8, 14, 0xA000, 0x0000, 0xa3, 0xFF, 0x07, 0x06, 0x04, 0x05, 0x02},
+ {0x0D, 0xFFFF, GRAPH, PLANAR4, 8, 4, 320, 200, 40, 25, 8, 8, 0xA000, 0x2000, 0x63, 0xFF, 0x05, 0x04, 0x04, 0x04, 0x01},
+ {0x0E, 0xFFFF, GRAPH, PLANAR4, 4, 4, 640, 200, 80, 25, 8, 8, 0xA000, 0x4000, 0x63, 0xFF, 0x06, 0x04, 0x04, 0x05, 0x01},
+ {0x0F, 0xFFFF, GRAPH, PLANAR2, 2, 2, 640, 350, 80, 25, 8, 14, 0xA000, 0x8000, 0xa2, 0xFF, 0x07, 0x05, 0x04, 0x05, 0x00},
+ {0x10, 0xFFFF, GRAPH, PLANAR4, 2, 4, 640, 350, 80, 25, 8, 14, 0xA000, 0x8000, 0xa3, 0xFF, 0x07, 0x06, 0x04, 0x05, 0x02},
{0x11, 0xFFFF, GRAPH, PLANAR1, 1, 1, 640, 480, 80, 30, 8, 16, 0xA000, 0x0000, 0xe3, 0xFF, 0x08, 0x07, 0x04, 0x05, 0x02},
{0x12, 0xFFFF, GRAPH, PLANAR4, 1, 4, 640, 480, 80, 30, 8, 16, 0xA000, 0x0000, 0xe3, 0xFF, 0x08, 0x06, 0x04, 0x05, 0x02},
{0x13, 0xFFFF, GRAPH, LINEAR8, 1, 8, 320, 200, 40, 25, 8, 8, 0xA000, 0x0000, 0x63, 0xFF, 0x09, 0x08, 0x05, 0x06, 0x03},