Hallo,
ich versuche derzeit mit meinem OS höhere Auflösungen zu unterstützen. Dazu will ich die Bochs VBE Extension verwenden. Ich bin diesem
http://wiki.osdev.org/Bochs_VBE_Extensions Tutorial gefolgt, scheitere jedoch daran in Bochs eine Auflösung die größer 255 (sowohl X als auch Y) ist zu setzten. Ich benutze zum setzten des Videomodes 1 zu 1 die Funktion aus dem Tutorial.
Wenn ich z.B. eine Auflösung von 1024x768x32 versuche zu setzten wird die Bittiefe korrekt gesetzt die Auflösung jedoch auf 0x0. Wenn ich z.B. versuche die Auflösung auf 800x600x32 zu setzten wird die Auflösung auf 32x88 gesetzt. Wenn ich jedoch eine Auflösung unter 256 versuche zu setzten klappt alles problemlos (z.B. 255x255, 128x128 etc.).
Die Grenze von exakt 255 lässt mich darauf schließen, dass in irgendeiner Variable nicht genug Speicherplatz vorhanden ist. Ich konnte jedoch bisher nicht herausfinden in welcher.
Hier ist der derzeit einzige Code der ausgeführt wird:
#if !defined(__cplusplus)
#include <stdbool.h> /* C doesn't have booleans by default. */
#endif
#include <stddef.h>
#include <stdint.h>
#include "io.h"
#if defined(__cplusplus)
extern "C" /* Use C linkage for kernel_main. */
#endif
#define VBE_DISPI_BANK_ADDRESS 0xA0000
#define VBE_DISPI_BANK_SIZE_KB 64
#define VBE_DISPI_MAX_XRES 2560
#define VBE_DISPI_MAX_YRES 1600
#define VBE_DISPI_IOPORT_INDEX 0x01CE
#define VBE_DISPI_IOPORT_DATA 0x01CF
#define VBE_DISPI_INDEX_ID 0x0
#define VBE_DISPI_INDEX_XRES 0x1
#define VBE_DISPI_INDEX_YRES 0x2
#define VBE_DISPI_INDEX_BPP 0x3
#define VBE_DISPI_INDEX_ENABLE 0x4
#define VBE_DISPI_INDEX_BANK 0x5
#define VBE_DISPI_INDEX_VIRT_WIDTH 0x6
#define VBE_DISPI_INDEX_VIRT_HEIGHT 0x7
#define VBE_DISPI_INDEX_X_OFFSET 0x8
#define VBE_DISPI_INDEX_Y_OFFSET 0x9
#define VBE_DISPI_INDEX_VIDEO_MEMORY_64K 0xa
#define VBE_DISPI_ID0 0xB0C0
#define VBE_DISPI_ID1 0xB0C1
#define VBE_DISPI_ID2 0xB0C2
#define VBE_DISPI_ID3 0xB0C3
#define VBE_DISPI_ID4 0xB0C4
#define VBE_DISPI_ID5 0xB0C5
#define VBE_DISPI_DISABLED 0x00
#define VBE_DISPI_ENABLED 0x01
#define VBE_DISPI_GETCAPS 0x02
#define VBE_DISPI_8BIT_DAC 0x20
#define VBE_DISPI_LFB_ENABLED 0x40
#define VBE_DISPI_NOCLEARMEM 0x80
#define VBE_DISPI_BPP_4 0x04
#define VBE_DISPI_BPP_8 0x08
#define VBE_DISPI_BPP_15 0x0F
#define VBE_DISPI_BPP_16 0x10
#define VBE_DISPI_BPP_24 0x18
#define VBE_DISPI_BPP_32 0x20
#define VBE_DISPI_LFB_PHYSICAL_ADDRESS 0xE0000000
void BgaWriteRegister(unsigned short IndexValue, unsigned short DataValue)
{
outb(VBE_DISPI_IOPORT_INDEX, IndexValue);
outb(VBE_DISPI_IOPORT_DATA, DataValue);
}
unsigned short BgaReadRegister(unsigned short IndexValue)
{
outb(VBE_DISPI_IOPORT_INDEX, IndexValue);
return inb(VBE_DISPI_IOPORT_DATA);
}
int BgaIsAvailable(void)
{
return (BgaReadRegister(VBE_DISPI_INDEX_ID)/* == VBE_DISPI_ID4*/);
}
void BgaSetVideoMode(unsigned int Width, unsigned int Height, unsigned int BitDepth, int UseLinearFrameBuffer, int ClearVideoMemory)
{
BgaWriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);
BgaWriteRegister(VBE_DISPI_INDEX_XRES, Width);
BgaWriteRegister(VBE_DISPI_INDEX_YRES, Height);
BgaWriteRegister(VBE_DISPI_INDEX_BPP, BitDepth);
BgaWriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED |
(UseLinearFrameBuffer ? VBE_DISPI_LFB_ENABLED : 0) |
(ClearVideoMemory ? 0 : VBE_DISPI_NOCLEARMEM));
}
void BgaSetBank(unsigned short BankNumber)
{
BgaWriteRegister(VBE_DISPI_INDEX_BANK, BankNumber);
}
void kernel_main()
{
bool RunSystem = true;
BgaSetVideoMode (800, 600, VBE_DISPI_BPP_32, 1, 1);
while (RunSystem == true)
{
}
}
Ich bin momentan echt ratlos und habe zu dem Thema auch nichts in Google gefunden.