Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#18

Re: Ansteuern des Parallelports

  Alt 22. Jan 2005, 21:00
Moin!

Zitat von Capable:
1. Frage

Delphi-Quellcode:
procedure PortOut(x:byte);
begin
  asm //erklärt dem Compiler, dass Assembler Code anfängt
   mov [b]dx[/b],378h //378h ist die Adresse von LPT 1
   mov al,x //x müssen wir noch einen Wert zuweisen
   out [b]dx[/b],al
  end;
end;
wieso wird hier zwei mal dx verwendet?

hier hingegen nicht

Delphi-Quellcode:
// Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm
    mov dx, Port // 1. Verwendung DX DX mit der Portadresse laden/füllen
    in al, dx // 2. Verwendung DX ein Byte von dem Port in DX auslesen und in AL schreiben
    Mov Value, AL // und AL in die Variable Value schreiben
  end;
Wieso? Wird es doch auch?

Zitat von Capable:
2. Frage

muss hier nicht hinter das port ein Out?
Ja, muss. Es wird anscheinend PortOut() angesprochen und ein Port() gibt es nicht.

Zitat von Capable:
3. Frage

... wird hier port nicht zwei mal deklariert, bzw. der integer zugeordnet? (delphi meint: redeclaration...)
Ja, die Deklaration von Value und Port macht an der Stelle überhaupt keinen Sinnn - entferne sie einfach beide.

Zitat von Capable:
4. Frage

bedeutet $378 das gleiche wie 378h ?
Ja, 378h bedeutet das gleiche wie $378. Wenn du in Delphi Zahlen ohne irgendwas angibst, so sind es dezimale Zahlen. Mit dem $ davor werden die Zahlen danach als hexadezimale Zahlen gewertet. Dies gilt für Delphi und Pascal - in C z.B. müsste man ein 0x vor der Zahl schreiben - aber da es so viele Sprachen gibt, gibt es auch eine allgemeine Schreibweise die einfach hinter der Zahl einen Buchstaben angibt um eine bestimmte Schreibweise zu kennzeichnen:

h = hexadezimal
d = dezimal
o = oktal
b = binär

Dies wird z.B. direkt so vom Turbo Assembler von Borland verwendet.

Zitat von Capable:
5. Frage

muss ich bei LPT2 einfach die drei jeweils durch die 2 austauschen? also,

378 --> 278
379 --> 279
37A --> 27A
Nein, das ist nicht gesagt. Die Reihenfolge der LPT Ports und deren Adressen hängt vor allem davon ab wie sie gefunden werden vom BIOS bzw. von Windows. Parallelports können auf den folgenden Adressen zu finden sein:

3BCh, 378h, 278h und PCI Portadressen (also Portadressen > 1000h)

Bei den meisten Rechnern wo ein 2. Parallelport mit einer ISA Karte nachgerüstet ist, da wird es 278h sein. Bei solchen wo eine MDA Karte mit drinne steckt, da wird es 3BCh sein.

Zitat von Capable:
6. Frage

wie kann ich den Wert der Variable Port aus word in einen string umwandeln und in einer showmessage darstellen?
In welcher Darstellungsform? Als Hexadezimalzahl oder als Dezimalzahl?

Delphi-Quellcode:
Begin
  ShowMessage('Portadresse: ' + IntToHex(Port, 3) + ' hexadezimal' + #13#10 +
              'Portadresse: ' + IntToStr(Port) + ' dezimal');
End;
Zitat von Capable:
7. Frage

Code:
 // Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm
    mov dx, Port
 [b]in al, dx[/b]
    Mov Value, AL
  end;
wieso heißt es nicht in dx,al
Weil es so ist bei einem x86 kompatiblen Assembler und hier im Syntax von Borland. Hier ist es so festgelegt, das als erstes immer das Ziel einer Operation und danach die Quelle angegeben wird.

Code:
In Ziel, Quelle  einlesen, also ins Ziel schreiben und vom Port lesen
Out Ziel, Quelle  schreiben, also in den Port schreiben.
Genauso bei Move:

Code:
mov Ziel, Quelle
mov dx,  $378
Zitat von Capable:
8. Frage

wieso verwendet man eine funktion und keine prozedur?
Weil eine Funktion einen Rückgabewert hat im Gegensatz zu einer Procedure. Daher gibt das PortIn() auch was zurück (den eingelesenen Wert) und PortOut() besteht aus einer Procedure, weil es nichts zurück gibt.

Den anderen Teil der 8. Frage kann dir ein anderer erklären - war genug erstmal für mich.

@flomei:

Erklär mal bitte auch, das es eine Basisadresse gibt und dann die Register immer nur ein fester Offset von dieser Basisadresse ist.

MfG
Muetze1
  Mit Zitat antworten Zitat