Zeigerkonvertierung real <-> protected Mode

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Zeigerkonvertierung real <-> protected Mode

Beitrag von Dosenware »

Grüße,

ich bräuchte eine Methode um in Borland Pascal die Zeiger zwischen real und Protected Mode zu konvertieren.

Ich könnte zwar über einen Dosinterrupt Speicher alokieren - gut für z.b. Soundblaster und Vesaaufrufe - aber den kann ich dannn wiederrum nicht selbst ansprechen.

Umgekehrt kann ich auch per z.b. getmem speicher alokieren - der liegt dann aber möglicherweise wieder außerhalb des Adressraumes der Soundblaster und selbst wenn nicht, gehts nicht. Ideen?
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Zeigerkonvertierung real <-> protected Mode

Beitrag von Dosenware »

Hmm,

erst per Int $21 AH=$48 Speicher alokieren (und für die Soundblaster ausrichten), dann per Int 31h AX=$0002 einen Diskriptor draus machen..

und zum Abschluss INT $31 AX=$0001 + INT $21 AH=$49 ma guggn...

http://www.ctyme.com/intr/rb-2934.htm
http://www.ctyme.com/intr/rb-5804.htm
http://www.ctyme.com/intr/rb-5803.htm
http://www.ctyme.com/intr/rb-2935.htm

kann ja nur schiefgehen...
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Zeigerkonvertierung real <-> protected Mode

Beitrag von Dosenware »

Läuft:

Code: Alles auswählen

unit DPMI;
interface
 var DPMI_active:boolean;                                               {wird beim Start Initialisiert}

 function Allocate_Dos_Memory_Block(size:word;var PoinTR:pointer;var Realseg:word):boolean;
                                                             {Reserviert Speicher im Bereich <1MB nötig für RM Ints und DMA,
                                                              liefert einen Pascal Pointer und das dazugehörige
                                                              RealMode Segment zurück}

 function Free_Dos_Memory_Block(var PoinTR:pointer):boolean; {gibt den Speicher wieder frei}

implementation

function Allocate_Dos_Memory_Block(size:word;var PoinTR:pointer;var Realseg:word):boolean;
 var helper:array[0..1]of word absolute PoinTR;              {muss nochmal nachschauen wie asm mit var Parametern funktioniert}
 var help2:word;                                             {wurden afair als Zeiger behandelt}
 var help3:word;
 var ret:boolean;
 begin
  asm
  mov ret,00
  mov ax,$0100
  mov bx,size
  shr bx,4
  int $31
  jc  @end
  mov ret,$FF
  mov help2,ax
  mov help3,dx
 @end:
  end;
  helper[1]:=help3;                                          {helper liegt per absolute auf der Gleichen Speicheradresse wie}
  helper[0]:=0;                                              {PoinTR - einfachere Typkonvertierung}
                                                             {Protected Mode Pointer in Pascal sind 16+16Bit->Selektor+Offset}
  realseg:=help2;                                            {Das Realmoderegister}
  Allocate_Dos_Memory_Block:=ret;                            {Rückgabecode - Bool: $00=false;$FF=true}
 end;

function Free_Dos_Memory_Block(var PoinTR:pointer):boolean;
 var helper:array[0..1]of word absolute PoinTR;
 var help2:word;
 var ret:boolean;
 begin
  help2:=helper[1];
  asm
  mov ret,00
  mov ax,$0101
  mov dx,help2
  int $31
  jc  @end
  mov ret,$FF
 @end:
  end;
  PoinTR:=nil;
  Free_Dos_Memory_Block:=ret;
 end;

begin
 asm
 mov ax,$0400                                                {Versionsabfrage für den DPMI Server}
 int $31
 mov DPMI_active,$FF                                         {bool: $FF=true; $00=false}
 cmp ax,90                                                   {BP7 hat einen DPMI Server in Version 0.90, darauf teste ich}
 jz @end
 mov DPMI_active,$00
@end:
 end;
end.

(*                                                                 {DPMI Server Installcheck}
function DPMI_active:boolean;assembler;                            {liefert aus irgendeinem Grund im realmode}
 asm                                                               {einen installierten DMPI zurück, aber im protected mode nichts}
 mov ax,$1687
 int $2F
 mov test,ax
 mov testproc,cl
 mov testmaj,dh
 mov testmin,dl
 end;

*)
Antworten