AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zum Parallelport-Tutorial

Ein Thema von Capable · begonnen am 22. Jan 2005 · letzter Beitrag vom 22. Jan 2005
Antwort Antwort
Capable

Registriert seit: 22. Jan 2005
10 Beiträge
 
#1

Re: Ansteuern des Parallelports

  Alt 22. Jan 2005, 19:56
guten tag allerseits,

ich hab den alten thread hier mal ausgegraben, da ich noch einige fragen habe. manche werden euch wahrscheinlich etwas eigenartig vorkommen, aber das liegt daran, dass ich gerade erst in der schule delphi lerne und noch nicht so der spezialist bin.

also es geht los:

---------------------------------------------------

1. Frage

Code:
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

Code:
// Werte holen aus dem Register des Ports (NUR UNTER WINDOWS 9X)
  asm
    mov dx, Port
    in al, dx
    Mov Value, AL
  end;

2. Frage

Code:
procedure TEureForm.ZBButtonClick(Sender: TObject); assembler;
begin
  [b]port[/b](1); //hier weisen wir x einen Wert zu (siehe Tabelle unten)
end;
muss hier nicht hinter das port ein Out?

3. Frage

Code:
Function LesePort( [b]Port : Word[/b] ) : Byte;
Const
  LPT_DataRegister = $378;
  LPT_StatusRegister = $379;
  LPT_KontrollRegister = $37A;

Var
  Value: Byte;
  [b]Port: Word;[/b]
wird hier port nicht zwei mal deklariert, bzw. der integer zugeordnet? (delphi meint: redeclaration...)


4. Frage

bedeutet $378 das gleiche wie 378h ?

5. Frage

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

378 --> 278
379 --> 279
37A --> 27A

6. Frage

wie kann ich den Wert der Variable Port aus word in einen string umwandeln und in einer showmessage darstellen?

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


8. Frage

wie binde ich den Einlese-Code in mein Form ein? anders gefragt: wird die funktion automatisch beim öffnen ausgeführt oder muss ich sie noch durch ein ereignis (onclick) mit (z.B.) einem Button ausführen?

wieso verwendet man eine funktion und keine prozedur?


-----------------------------------------

ich weiß, das war viel. allerdings brauche ich im moment eure hilfe, da ich allein nicht weiter komme. schön, dass es hier menschen gibt, die ihr wissen gerne teilen und sich um nachkömmlinge kümmern.
danke!

Capable
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Frage zum Parallelport-Tutorial

  Alt 22. Jan 2005, 20:58
Hallo Capable und herzlich willkommen in der DP.

Aufgrund der Masse Deiner Fragen habe ich einen neuen Thread daraus gemacht. Üblicherweise gilt hier die Regel: Eine Frage pro Thread. Nur so können wir ein Mindestmaß an Übersicht gewährleisten.
Wäre super, wenn Du dies künftig beherzigen könntest.

Die Fragen von Capable beziehen sich auf das folgende Tutorial: http://www.delphipraxis.net/internal...ect.php?t=5722
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Frage zum Parallelport-Tutorial

  Alt 22. Jan 2005, 21:02
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz