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?
Zeigerkonvertierung real <-> protected Mode
Re: Zeigerkonvertierung real <-> protected Mode
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...
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...
Re: Zeigerkonvertierung real <-> protected Mode
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;
*)