sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #20682
Re: Er du haj til borland pascal 7.0 i dos og c i Linux??
Jeg har vedlagt et par filer som jeg er rimelig sikker på virker...
Programmet skal dog sikkert køres som root for at det virker.
Du skal lige huske at kompilere programmet med '-O'.
Mvh.
Jimmy Dansbo
ALTO Danmark A/S
-----Original Message-----
From: ALM <alm@xxxxxxxx>
To: 'sslug-teknik@xxxxxxxx' <sslug-teknik@xxxxxxxx>
Date: 23. marts 2000 13:09
Subject: [TEKNIK] Er du haj til borland pascal 7.0 i dos og c i Linux??
>Hej slugger
>
>Kan du svare ja til subject, så vil jeg meget gerne have din hjælp
>til et problem jeg har.
>
>Følgende er der en Borland pascal unit jeg har lavet, til
>at styre et display jeg har via lpt1 porten.
>
>Displayet er af grafiktypen (240x64 punkter), men det regner jeg med
>selv
>at kunne lave, når denne unit er blevet oversat.
>
>Dette kunne jeg godt tænke mig at få lavet i C til linux.
>
>Men har er så mit problem,
>Jeg kender ikke en pind til C endnu.
>Så en oversættelse af følgende vil hjælpe mig meget godt igang.
>
>Jeg håber virkeligt at der er en venlig sjæl, der vil hjælpe mig...
>>>>>>>>>>>>> Klip end. >>>>>>>>>>>>>>>>>>>
>
>{###################################################
> # LCDTekst T6963 Routines in borland pascal 7.0 #
> ###################################################}
>
>Unit LCDTEKST;
>
>Interface
>Procedure WriteData (DataByte : Byte);
>Procedure WriteCommand (CommandByte : Byte);
>Procedure LCDClear;
>Procedure LCDGraphClear;
>Function ReadKeys : Byte;
>Procedure TextTest;
>Procedure LCDTextClear;
>Procedure LCDGotoXY(X,Y : Byte);
>Procedure LCDWrite(Tekst : String);
>
>Implementation
>Uses
> Graph, Crt;
>
>Type
> HiLo = (H, L);
> RW = (Read, Write);
>
>Const
> Data = $378; { LPT1 printer port}
> Status = Data + 1;
> Control = Data + 2;
>
>Var
> i,j,k,w : Word;
> d, OldValue : Byte;
> grDriver : Integer;
> grMode : Integer;
> ErrCode : Integer;
> X0, X1, X2 : Integer;
> Y0, Y1, Y2 : Integer;
> OldValueS : String;
> x, y : Byte;
> fColor : Word;
>
>{*********************************************************************}
>
>Procedure CE (Value: HiLo); {/CE is connected to C0-}
>Begin
> If Value = H Then Port[Control] := Port[Control] And (Not 1)
> else Port[Control] := Port[Control] Or 1;
>End;
>
>Procedure RD (Value : HiLo); {/RD is connected to C1-}
>Begin
> If Value = H Then Port[Control] := Port[Control] And (Not 2)
> else Port[Control] := Port[Control] Or 2;
>End;
>
>Procedure WR (Value : HiLo); {/WR is connected to C2+}
>Begin
> If Value = L Then Port[Control] := Port[Control] And (Not 4)
> else Port[Control] := Port[Control] Or 4;
>End;
>
>Procedure CD (Value : HiLo); {/CD is connected to C3-}
>Begin
> If Value = H Then Port[Control] := Port[Control] And (Not 8)
> else Port[Control] := Port[Control] Or 8;
>End;
>
>Procedure LPTMode (Mode : RW);
>Begin
> If Mode = Write Then Port[Control] := Port[Control] And (Not 32)
> else Port[Control] := Port[Control] Or 32;
>End;
>
>{*********************************************************************}
>
>Procedure Init;
>Begin
> LPTMode(Write);
> CE(H);
> RD(H);
> WR(H);
> CD(H);
>End;
>{*********************************************************************}
>
>Procedure CheckStatus;
>Var
> StatusByte : Byte;
>Begin
> Repeat
> Delay(1);
> LPTMode(Read);
> CD(H);
> WR(H);
> CE(L);
> RD(L);
> StatusByte := Port[Data];
> RD(H);
> CE(H);
> Until ((StatusByte And 1) = 1) And ((StatusByte And 2) = 2);
> LPTMode(Write);
>End;
>{*********************************************************************}
>
>Procedure WriteData (DataByte : Byte);
>Begin
> LPTMode(Write);
> CD(L);
> Port[Data] := DataByte;
> CE(L);
> WR(L);
> WR(H);
> CE(H);
> CD(H);
>End;
>{*********************************************************************}
>
>Procedure WriteCommand (CommandByte : Byte);
>Begin
> LPTMode(Write);
> CD(H);
> Port[Data] := CommandByte;
> CE(L);
> WR(L);
> WR(H);
> CE(H);
>End;
>{*********************************************************************}
>
>Procedure InitT6963;
>Begin
> Init;
>
> WriteCommand(128+32+16+2); {Auto Mode Off}
>
> WriteData($00); {Text home Address 0780h}
> WriteData($00);
> WriteCommand($40);
>
> WriteData($1E); {Text area for 240*64}
> WriteData($00);
> WriteCommand($41);
>
> WriteData($00); {Grapic home address}
> WriteData($02);
> WriteCommand($42);
>
> WriteData($1E); {Grapich area for 240*64}
> WriteData($00);
> WriteCommand($43);
>
> WriteCommand($81); {EXOR Text mode}
>
> WriteData($00); {Address pointer set}
> WriteData($00);
> WriteCommand($24);
>
> WriteCommand(97); {Cursor On, Blink on}
>
> WriteData(0);
> WriteData(0);
> WriteCommand(33);
>
> WriteCommand(7+32+128);
>
> WriteCommand(147);
>
> WriteCommand($98+4); {Set display mode (Graphics only)}
>End;
>{*********************************************************************}
>
>Function ReadKeys : Byte;
>Var
> OldValue : Byte;
> Maske, Eins : Byte;
>Begin
> Init;
> Eins := 1;
> For i := 1 to 4 Do Begin
> Port[Data] := (Not Eins);
> OldValue := Port[Status];
> If (OldValue And 16) <> 16 Then Begin ReadKeys := i+10; Exit End;
>{S4+}
> If (OldValue And 32) <> 32 Then Begin ReadKeys := i+20; Exit End;
>{S5+}
> If (OldValue And 64) <> 64 Then Begin ReadKeys := i+30; Exit End;
>{S6+}
> If (OldValue And 128) <> 128 Then Begin ReadKeys := i+40; Exit End;
>{S7-}
> Eins := Eins shl 1;
> End;
> ReadKeys := 0;
>End;
>{*********************************************************************}
>
>{*********************************************************************}
>
>
>
>{*********************************************************************}
>
>Procedure LCDClearSlow;
>Begin
> WriteCommand($B0); {Dato auto write on}
> WriteData($00); {Address pointer set}
> WriteData($00);
> WriteCommand($24);
> For i := 0 To 1919 Do WriteData(0);
> WriteCommand(128+32+16+2); {Auto Mode off}
>End;
>{*********************************************************************}
>
>Procedure LCDGraphClear;
>Begin
> WriteData($00); {Address pointer set}
> WriteData($02);
> WriteCommand($24);
> WriteCommand($B0); {Dato auto write on}
> LPTMode(Write);
> CD(L);
> CE(L);
> For i := 0 to 1919 Do Begin
> Port[Data] := 0;
> WR(L);
> WR(H);
> End;
> CE(H);
> CD(H);
> WriteCommand(128+32+16+2); {Auto Mode off}
>End;
>
>
>
>Procedure LCDTextClear;
>Begin
> WriteData($00); {Address pointer set}
> WriteData($00);
> WriteCommand($24);
> WriteCommand($B0); {Dato auto write on}
> LPTMode(Write);
> CD(L);
> CE(L);
> For i := 0 to 320 Do Begin
> Port[Data] := 0;
> WR(L);
> WR(H);
> End;
> CE(H);
> CD(H);
> WriteCommand(128+32+16+2); {Auto Mode off}
>End;
>
>Procedure LCDClear;
>Begin
> LCDGraphClear;
> LCDTextClear;
>End;
>{*********************************************************************}
>
>Procedure TextTest;
>Begin
> WriteData($00); {Address pointer set}
> WriteData($00);
> WriteCommand($24);
> WriteCommand($B0); {Dato auto write on}
> For j := 1 To 2 Do
> For i := 1 To 127 Do Begin
> WriteData(i);
> End;
> WriteCommand(128+32+16+2); {Auto Mode off}
>End;
>
>{*********************************************************************}
>Procedure LCDGotoXY(X,Y : Byte);
>Var
> Addr : Integer;
>Begin
> Addr := ( (Y-1) * 30 ) + X-1;
> WriteData(Addr Or 256);
> WriteData(Addr shr 8);
> WriteCommand($24);
>End;
>
>
>Procedure LCDWrite(Tekst : String);
>Var
> i,
> c : Byte;
>Begin
> i := 1;
> Repeat
> c := Ord(Tekst[i]) - $20;
> If c < 0 Then c := 0;
> WriteData(c);
> WriteCommand($c0);
> Inc(i);
> Until i >= Length(Tekst)+1;
>End;
>Begin
> InitT6963;
> LCDClear;
>End.
>
>
>>>>>>>>>>>>> Klip end. >>>>>>>>>>>>>>>>>>>
>
>
>Med venlig hilsen / Regards
>
>Allan Madsen
>Systemadministrator
>
>Dator A/S Tel. +45 96 53 10 00
>Stadionvej 2A Fax +45 96 53 10 10
>DK-9560 Hadsund e-mail alm@xxxxxxxx
>Denmark