summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Ruppert <info@vruppert.de>2005-12-26 19:50:26 +0000
committerVolker Ruppert <info@vruppert.de>2005-12-26 19:50:26 +0000
commit05ce076e7885fd1fbbbc47a7443198e0014eedf9 (patch)
treef308b2a9d7a051ae0efebd7550cb20c484752459
parent4dcb96db54d6cec2eaab133ac928256ca97a8be6 (diff)
- biossums utility now supports VGABIOS sizes up to 64 kBytes
- Bochs VBE protected mode interface added (based on a patch by malc@pulsesoft.com)
-rw-r--r--biossums.c55
-rw-r--r--vbe.c55
-rw-r--r--vgabios.c7
3 files changed, 82 insertions, 35 deletions
diff --git a/biossums.c b/biossums.c
index b8e7f08..2a356da 100644
--- a/biossums.c
+++ b/biossums.c
@@ -22,11 +22,7 @@ typedef unsigned char byte;
void check( int value, char* message );
-#define LEN_BIOS_DATA 0x8000
-#define MAX_OFFSET (LEN_BIOS_DATA - 1)
-
-
-#define BIOS_OFFSET 0x7FFF
+#define MAX_BIOS_DATA 0x10000
long chksum_bios_get_offset( byte* data, long offset );
byte chksum_bios_calc_value( byte* data, long offset );
@@ -43,7 +39,8 @@ byte chksum_pmid_get_value( byte* data, long offset );
void chksum_pmid_set_value( byte* data, long offset, byte value );
-byte bios_data[LEN_BIOS_DATA];
+byte bios_data[MAX_BIOS_DATA];
+long bios_len;
int main( int argc, char* argv[] ) {
@@ -54,21 +51,29 @@ int main( int argc, char* argv[] ) {
int hits;
- if( argc != 2 ) {
+ if (argc != 2) {
printf( "Error. Need a file-name as an argument.\n" );
exit( EXIT_FAILURE );
}
- if(( stream = fopen( argv[1], "rb" )) == NULL ) {
- printf( "Error opening %s for reading.\n", argv[1] );
- exit( EXIT_FAILURE );
+ if ((stream = fopen(argv[1], "rb")) == NULL) {
+ printf("Error opening %s for reading.\n", argv[1]);
+ exit(EXIT_FAILURE);
}
- if( fread( bios_data, 1, LEN_BIOS_DATA, stream ) >= LEN_BIOS_DATA ) {
- printf( "Error reading max. 32767 Bytes from %s.\n", argv[1] );
- fclose( stream );
- exit( EXIT_FAILURE );
+ memset(bios_data, 0, MAX_BIOS_DATA);
+ bios_len = fread(bios_data, 1, MAX_BIOS_DATA, stream);
+ if (bios_len >= MAX_BIOS_DATA) {
+ printf("Error reading max. 65535 Bytes from %s.\n", argv[1]);
+ fclose(stream);
+ exit(EXIT_FAILURE);
}
- fclose( stream );
+ fclose(stream);
+ if (bios_len < 0x7FFF) {
+ bios_len = 0x8000;
+ } else {
+ bios_len = (bios_len + 0x201) & ~0x1FF;
+ }
+ bios_data[2] = (byte)(bios_len / 512);
hits = 0;
offset = 0L;
@@ -111,8 +116,8 @@ int main( int argc, char* argv[] ) {
printf( "Error opening %s for writing.\n", argv[1] );
exit( EXIT_FAILURE );
}
- if( fwrite( bios_data, 1, LEN_BIOS_DATA, stream ) < LEN_BIOS_DATA ) {
- printf( "Error writing 32KBytes to %s.\n", argv[1] );
+ if( fwrite( bios_data, 1, bios_len, stream ) < bios_len ) {
+ printf( "Error writing %d KBytes to %s.\n", bios_len / 1024, argv[1] );
fclose( stream );
exit( EXIT_FAILURE );
}
@@ -133,7 +138,7 @@ void check( int okay, char* message ) {
long chksum_bios_get_offset( byte* data, long offset ) {
- return( BIOS_OFFSET );
+ return (bios_len - 1);
}
@@ -143,7 +148,7 @@ byte chksum_bios_calc_value( byte* data, long offset ) {
byte sum;
sum = 0;
- for( i = 0; i < MAX_OFFSET; i++ ) {
+ for( i = 0; i < offset; i++ ) {
sum = sum + *( data + i );
}
sum = -sum; /* iso ensures -s + s == 0 on unsigned types */
@@ -153,13 +158,13 @@ byte chksum_bios_calc_value( byte* data, long offset ) {
byte chksum_bios_get_value( byte* data, long offset ) {
- return( *( data + BIOS_OFFSET ) );
+ return( *( data + offset ) );
}
void chksum_bios_set_value( byte* data, long offset, byte value ) {
- *( data + BIOS_OFFSET ) = value;
+ *( data + offset ) = value;
}
@@ -170,7 +175,7 @@ byte chksum_pmid_calc_value( byte* data, long offset ) {
byte sum;
len = PMID_LEN;
- check( offset + len <= MAX_OFFSET, "PMID entry length out of bounds" );
+ check((offset + len) <= (bios_len - 1), "PMID entry length out of bounds" );
sum = 0;
for( i = 0; i < len; i++ ) {
if( i != PMID_CHKSUM ) {
@@ -186,7 +191,7 @@ long chksum_pmid_get_offset( byte* data, long offset ) {
long result = -1L;
- while( offset + PMID_LEN < MAX_OFFSET ) {
+ while ((offset + PMID_LEN) < (bios_len - 1)) {
offset = offset + 1;
if( *( data + offset + 0 ) == 'P' && \
*( data + offset + 1 ) == 'M' && \
@@ -202,13 +207,13 @@ long chksum_pmid_get_offset( byte* data, long offset ) {
byte chksum_pmid_get_value( byte* data, long offset ) {
- check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" );
+ check((offset + PMID_CHKSUM) <= (bios_len - 1), "PMID checksum out of bounds" );
return( *( data + offset + PMID_CHKSUM ) );
}
void chksum_pmid_set_value( byte* data, long offset, byte value ) {
- check( offset + PMID_CHKSUM <= MAX_OFFSET, "PMID checksum out of bounds" );
+ check((offset + PMID_CHKSUM) <= (bios_len - 1), "PMID checksum out of bounds" );
*( data + offset + PMID_CHKSUM ) = value;
}
diff --git a/vbe.c b/vbe.c
index a9e7f31..d0eb2af 100644
--- a/vbe.c
+++ b/vbe.c
@@ -118,6 +118,29 @@ _vbebios_mode_list:
.word VBE_VESA_MODE_END_OF_LIST
#endif
+vesa_pm_start:
+ dw vesa_pm_set_window - vesa_pm_start
+ dw vesa_pm_set_display_strt - vesa_pm_start
+ dw vesa_pm_unimplemented - vesa_pm_start
+ dw 0
+
+ USE32
+vesa_pm_set_window:
+ mov ax, #0x4f05
+ int #0x10
+ ret
+
+vesa_pm_set_display_start:
+ mov ax, #0x4f07
+ int #0x10
+ ret
+
+vesa_pm_unimplemented:
+ mov ax, #0x014f
+ ret
+ USE16
+vesa_pm_end:
+
; DISPI ioport functions
dispi_get_id:
@@ -1055,14 +1078,28 @@ void vbe_biosfn_set_get_palette_data(AX)
}
/** Function 0Ah - Return VBE Protected Mode Interface
- *
- * Input:
- * AX = 4F0Ah
- * Output:
- * AX = VBE Return Status
+ * Input: AX = 4F0Ah VBE 2.0 Protected Mode Interface
+ * BL = 00h Return protected mode table
*
- * FIXME: incomplete API description, Input & Output
+ *
+ * Output: AX = Status
+ * ES = Real Mode Segment of Table
+ * DI = Offset of Table
+ * CX = Length of Table including protected mode code
+ * (for copying purposes)
*/
-void vbe_biosfn_return_protected_mode_interface(AX)
-{
-}
+ASM_START
+vbe_biosfn_return_protected_mode_interface:
+ test bx, bx
+ jnz _fail
+ mov di, #0xc000
+ mov es, di
+ mov di, # vesa_pm_start
+ mov cx, # vesa_pm_end
+ sub cx, di
+ mov ax, #0x004f
+ ret
+_fail:
+ mov ax, #0x014f
+ ret
+ASM_END
diff --git a/vgabios.c b/vgabios.c
index 5de9c5b..bef3b77 100644
--- a/vgabios.c
+++ b/vgabios.c
@@ -347,9 +347,14 @@ int10_test_vbe_07:
jmp int10_end
int10_test_vbe_08:
cmp al, #0x08
- jne int10_normal
+ jne int10_test_vbe_0A
call vbe_biosfn_set_get_dac_palette_format
jmp int10_end
+int10_test_vbe_0A:
+ cmp al, #0x0A
+ jne int10_normal
+ call vbe_biosfn_return_protected_mode_interface
+ jmp int10_end
#endif
int10_normal: