diff options
author | Volker Ruppert <info@vruppert.de> | 2003-04-26 07:22:26 +0000 |
---|---|---|
committer | Volker Ruppert <info@vruppert.de> | 2003-04-26 07:22:26 +0000 |
commit | 86d1f4e72c35247744978dff0462c91a3c809a34 (patch) | |
tree | eb3750a30ec73dd8396b72bb379564229d36e8d0 | |
parent | cb042356415dc7d7d009f5877d4370609a057dfc (diff) | |
download | vgabios-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.c | 21 | ||||
-rw-r--r-- | vbetables.h | 4 | ||||
-rw-r--r-- | vgabios.c | 29 | ||||
-rw-r--r-- | vgatables.h | 8 |
4 files changed, 45 insertions, 17 deletions
@@ -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, @@ -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}, |