Autor Thema: VESA-Mode Cpp Kernel problem  (Gelesen 4303 mal)

mcBernie

  • Beiträge: 1
    • Profil anzeigen
Gespeichert
« am: 12. March 2007, 14:55 »
Hi leute, ich hab ein kleines problem bzw eine frage.

Ich hab da einen Kernel, welcher vom realmode zum pmode springt und dann weiter in eine prozedur springt welche in c++ geschrieben ist,

wärend der kernel noch im rmode ist schalte ich schnell noch vesa (vbe) ein und will wenn ich dann in meiner c prozedur bin, inhalte auf dem bildschirm bringen.

Dafür habe ich ja beim initalisieren von VESA daten in die Vesastruktur geladen (ähm nahme ist mir gerade entfallen)

aber wie finde ich die adresse dieser struktur heraus?

Also das ist die struktur:
Mode_Info:
ModeInfo_ModeAttributes dw 1
ModeInfo_WinAAttributes db 1
ModeInfo_WinBAttributes db 1
ModeInfo_WinGranularity         dw 1
ModeInfo_WinSize     dw 1
ModeInfo_WinASegment dw 1
ModeInfo_WinBSegment dw 1
ModeInfo_WinFuncPtr dd 1
ModeInfo_BytesPerScanLine dw 1
ModeInfo_XResolution dw 1
ModeInfo_YResolution dw 1
ModeInfo_XCharSize db 1
ModeInfo_YCharSize db 1
ModeInfo_NumberOfPlanes db 1
ModeInfo_BitsPerPixel db 1
ModeInfo_NumberOfBanks db 1
ModeInfo_MemoryModel db 1
ModeInfo_BankSize db 1
ModeInfo_NumberOfImagePages db 1
ModeInfo_Reserved_page db 1
ModeInfo_RedMaskSize db 1
ModeInfo_RedMaskPos db 1
ModeInfo_GreenMaskSize db 1
ModeInfo_GreenMaskPos db 1
ModeInfo_BlueMaskSize db 1
ModeInfo_BlueMaskPos db 1
ModeInfo_ReservedMaskSize db 1
ModeInfo_ReservedMaskPos db 1
ModeInfo_DirectColorModeInfo db 1
ModeInfo_PhysBasePtr dd 1
ModeInfo_OffScreenMemOffset dd 1
ModeInfo_OffScreenMemSize dw 1

und das die prozedur vorm umschalten in den realmode:
;VESA MODE STARTEN
mov bx, 4108h ; VesaModus festlegen und in register ablegen
mov ax, 4f01h ; 4f = Statusflag, 01 VesaFunktion
mov di, Mode_Info; Ziel Index = Bereich Mode_info
int 10h; Grafik Interrupt um auf VESA zuzugreifen

mov ax, 4f02h ;funktion 2 von VESA, einschalten des Grafikmodus
int 10h; Grafik Interrupt um Grafikmodus zu initalisieren

Also kurz und knapp nochmal:
Wie kann ich auf Variabeln die im ASM code stehen von c++ aus zugreifen?

und sagt mal nebenbei, zeichen tue ich doch einfach wenn ich auf den speicherbereich vom video memory schreibe... oder?

danke für eure hilfe  :-P






Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #1 am: 24. March 2007, 22:39 »
Hallo,

also die Adresse deiner Struktur steckt ja im Namen Mode_Info drin. Das ist sozusagen die Adresse. Um im Kernel später die Adresse zu haben, hast du zwei Möglichkeiten, entweder du übergibst beim Aufruf des Kernels die Adresse von Mode_Info, oder du erstellst die Mode_Info Struktur an einer ganz bestimmten Adresse, wie zB 0x5000.
Du übergibst beim Aufruf der VESA-Funktion 01 ja nur eine Adresse, an die die geforderten Informationen abgelegt werden sollen. Dort kannst du dann immer die Daten abholen, weil sich im eigentlichen Kernel (im PM) die Daten nicht wegkopieren... So kannst du eine Struktur anlegen, mit der du dann die Daten von zB 0x5000 auslesen kannst.


typedef struct
{
  short ModeInfo_ModeAttributes;
  ...
  short ModeInfo_OffScreenMemSize;
} SVESA_INFOBLOCK;

SVESA_INFO *ModeInformation = (*SVESA_INFO)0x5000;


so kannst du in jeder Funktion über den globalen Pointer ModeInformation, der auf die bereits gefüllte Struktur an der Adresse 0x5000 zeigt, an Informationen kommen..


short MAX_X;
unsigned long BildschirmSpeicher;

MAX_X = ModeInformation->ModeInfo_XResolution;
BildschirmSpeicher = ModeInformation->ModeInfo_PhysBasePtr;


eine Frage habe ich aber auch selbst. Wie alt bist du denn, bzw. zu welcher Schule gehst du???

Gruß Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

 

Einloggen