Autor Thema: Problem beim setzten der Auflösung mit Bochs  (Gelesen 2257 mal)

Swoerm

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« am: 28. March 2016, 23:32 »
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.

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 29. March 2016, 00:34 »
Hallo,

ich hab mich zwar nicht wirklich mit dieser Bochs VBE Extension beschäftigt, aber nach dem Überfliegen von http://wiki.osdev.org/Bochs_VBE_Extensions vermute ich, dass das Problem hier liegen könnte:

outb(VBE_DISPI_IOPORT_INDEX, IndexValue);
outb(VBE_DISPI_IOPORT_DATA, DataValue);

Du schreibst mit outb ein Byte in den IO-Port, nach dem was hier steht sind die BGA Register aber 16 Bit groß:
Zitat
writing the data value to the 16-bit IO-port VBE_DISPI_IOPORT_DATA (0x01CF)

Ich hoffe das hilft dir weiter.

Swoerm

  • Beiträge: 2
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 29. March 2016, 01:00 »
Vielen, vielen Dank!
Es funktioniert endlich!  :-D
Auf das einfachste kommt man nicht. Ich dachte als ich den Code kopierte das die Funktion zu der von mir verwendeten äquivalent ist und hatte die Sache mit den unterschiedlichen Registergrößen ganz übersehen.  :roll:
Nochmals vielen Dank.

 

Einloggen