Autor Beitrag
Snakebyte
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 09.11.04 14:15 
Hallo,

ich habe mir aus einem älteren Pascalpogramm ein paar Quelltext-passagen rauskopiert und versucht diese in ein Delphi-pogramm einzufügen. Es geht um die ansteuerung des Gameports am rechner. Der fehler liegt im Befehl "PORT".(Rot markiert!!)

Fehlermeldung: "Undefinierter Bezeichner"
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
CONST gameadr=$201;     {Gameport-Adresse}
TYPE  Bit=0..1;
VAR   allesch: Byte;
      Schalter0, Schalter1, Schalter2, Schalter3,
      ReglerS0, ReglerS1, ReglerS2, ReglerS3: Boolean;
      E1, E2, E3, E4, E5, E6, E7, E8: Bit;


  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
                                      
  allesch := PORT [gameadr];      // <---
  Schalter0 := (allesch AND 16)=0;         
  Schalter1 := (allesch AND (16 shl 1))=0
  Schalter2 := (allesch AND (16 shl 2))=0
  Schalter3 := (allesch AND (16 shl 3))=0;

Wie heißt dieser Befehl in Delphi??--oder--Wie mache ich das Delphi pascal-befehle nimmt? Habt ihr noch andere Ideen für ansteuerung des Gameports??(Falls der text Rotz ist!!!)

Vielen Dank

Max Schulz

Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.
Moderiert von user profile iconTino: Überflüssige Absätze entfernt.
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Di 09.11.04 14:26 
Ab Win2K kannst du nicht mehr direkt auf die Ports zugreifen. Such mal im Forum zu Beiträgen über den Parallelport, da ist das Problem meistens erklärt.

Gruß,
Jörg

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
Snakebyte Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 09.11.04 14:33 
Ich programiere nur unter W98!!!
Klappt ja auch sonst alles.
Das pascallprog. läuft top.
Nur der besch... Port befehl haut nicht hin..
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Di 09.11.04 14:42 
Probier mal den Assemblercode aus diesem Beitrag.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
Snakebyte Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 09.11.04 15:09 
Danke für den Tipp.
Doch leider sehe ich bei diesem Quelltext nicht durch.
Was machen die ganzen funktionen im einzelnen?
Und die Port-Stellen sehen ja im grunde so aus wie meinen!
-------------------------------------------------------------------------------------
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
{$IFDEF Win32}  
FUNCTION PortIn(Addr: WORD): BYTE; AssemblerStdCall;  
  ASM  
    mov dx, Addr // Adresse ins DX-Register schreiben  
    in al, dx    // Port lesen. (AL entspricht Result)  
  END;  
{$ELSE}  
FUNCTION PortIn(Addr: WORD): BYTE;  
BEGIN  
  Portin := Port[Addr];  // <---
END;  
{$ENDIF}  

 
{$IFDEF Win32}  
PROCEDURE PortOut(Addr: Word; Data: Byte); AssemblerStdCall;  
  ASM  
    mov dx, Addr    // Adresse nach DX  
    mov al, Data    // Datenbyte nach AL  
    out dx, al      // Port schreiben  
  END;  
{$ELSE}  
PROCEDURE PortOut(Addr: WORD; Data: BYTE);  
BEGIN  
  Port[Addr] := Data;  
END;  
{$ENDIF}


Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Di 09.11.04 15:24 
Eigentlich brauchst du nur das:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
FUNCTION PortIn(Addr: WORD): BYTE; AssemblerStdCall;  
ASM  
  mov dx, Addr // Adresse ins DX-Register schreiben  
  in al, dx    // Port lesen. (AL entspricht Result)  
END;  

PROCEDURE PortOut(Addr: Word; Data: Byte); AssemblerStdCall;  
ASM  
  mov dx, Addr    // Adresse nach DX  
  mov al, Data    // Datenbyte nach AL  
  out dx, al      // Port schreiben  
END;

Was genau passiert, steht ja dahinter. Probier das mal aus, und sag mir mal, obs ging. ;-)

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!