32Bit in 16Bit Assembler (in Pascal)
32Bit in 16Bit Assembler (in Pascal)
Grüße,
ich bastel grad an einem Programm in dem ich 32bitig auf einen 32Bit Port schreiben und lesen muss. (konkret sind es $CF8 und $CFC)
Jetzt die Frage:
Wie bekomme ich das mit dem intigrierten Assembler von BP7 hin?
Gibt es eine Möglichkeit ein 32Bit Register mit 16 Bit Registern/Werten zu füllen/lesen (quasi AX=mov ah,bl + mov al,cl )?
Oder muss ich über den Speicher gehen? Wie Adressiere ich dann eine Variable?
Afair ging da was mit Hilfe von "db".
PS. eine Testmöglichkeit, ob der Prozessor 32bit fähig ist wäre auch super.
Vielen Dank schoneinmal.
ich bastel grad an einem Programm in dem ich 32bitig auf einen 32Bit Port schreiben und lesen muss. (konkret sind es $CF8 und $CFC)
Jetzt die Frage:
Wie bekomme ich das mit dem intigrierten Assembler von BP7 hin?
Gibt es eine Möglichkeit ein 32Bit Register mit 16 Bit Registern/Werten zu füllen/lesen (quasi AX=mov ah,bl + mov al,cl )?
Oder muss ich über den Speicher gehen? Wie Adressiere ich dann eine Variable?
Afair ging da was mit Hilfe von "db".
PS. eine Testmöglichkeit, ob der Prozessor 32bit fähig ist wäre auch super.
Vielen Dank schoneinmal.
Re: 32Bit in 16Bit Assembler (in Pascal)
Wenn Du in die Zeile vor "out dx,ax" eine Zeile "db 66h" einfügst, mutiert der Out-Befehl out "out dx,eax".
Das gleiche gilt für shl und shr, also (ungetestet):
Das gleiche gilt für shl und shr, also (ungetestet):
Code: Alles auswählen
Procedure Out32(Port: Word; Value: Longint); Assembler;
asm
mov dx, [port]
mov ax, [value + 2]
db 66h
shl ax, 16
mov ax, [value]
db 66h
out dx,ax
end;
Function In32(Port: Word) : Longint; Assembler;
asm
mov dx, [port]
db 66h
in ax, dx
db 66h
mov dx,ax
db 66h
shr dx,16
end;
Re: 32Bit in 16Bit Assembler (in Pascal)
Und für die Erkennung des Prozessortyps, wirf einen Blick auf https://swag.outpostbbs.net/HARDWARE/0013.PAS.html
Re: 32Bit in 16Bit Assembler (in Pascal)
Vielen lieben Dank 

Re: 32Bit in 16Bit Assembler (in Pascal)
Grüße,
nächste Frage:
Alle 4 Varianten mag der Compiler leider nicht, Ideen wie sich das umsetzen lässt?
/Grüße
nächste Frage:
Code: Alles auswählen
type x=Record
long:longint;
wordarr:array[0..1]of word;absolute long;
bytearr:array[0..3]of byte;absolute x.long;
long2:longint absolute long;
long3:longint absolute x.long;
end;
/Grüße
Re: 32Bit in 16Bit Assembler (in Pascal)
Was Du willst is das, was in C eine union ist, und das macht man in Pascal mit einer Fallunterscheidung via "case" im Record. Ursprünglich mal so gedacht:
wobei es dann ein Element "selector" gibt, und wenn es 1 ist, dann sollst Du in l nach einem Longint gucken, wogegen wenn es 2 ist, sollst Du in was nach 2 Words gucken. Die Regeln, wann welches Element gültig ist, werden vom Compiler aber nicht durchgesetzt, so dass Du auch auf l und wa zugreifen kannst, selbst wenn selector weder 1 noch 2 ist. Und deshalb ist das Selektor-Feld an sich auch nicht zwingend, so dass auch folgendes geht:
In diesem Fall ist die Syntax sehr ähnlich zum obigen Fall, nur dass das Selektorfeld entfällt, wenn man ihm keinen Namen gibt. Dann macht es eigentlich auch keinen Sinn, einen Typ dafür und Werte dafür anzugeben, aber so ist die Syntax halt.
Code: Alles auswählen
type x = Record
case selector:integer of
1: (l : LongInt);
2: (wa : array[0..1] of word);
end;
Code: Alles auswählen
type x = Record
case integer of
1: (l : LongInt);
2: (wa : array[0..1] of word);
end;
Re: 32Bit in 16Bit Assembler (in Pascal)
Jupp, funktioniert - auch wenn es schade ist das der Compiler die "absolute" Variante nicht mag, da wäre dann die Syntax wenigstens einheitlich und würde mehrere "Universalspeicher" zulassen.