Seite 1 von 1

Quickbasic 2 PB Übersetzer gesucht ;)

Verfasst: 11.06.2007 16:05
von Ghosty1967
Hallo Leute...

Ich möchte gerne ein existierendes QuickBasic-Programm in PB umsetzen,
da es in QuickBasic auf dem aktuellen Rechner mittlerweile dicke Tming-
Probleme gibt...
Allerdings komme ich mit der Übersetzung einiger Subs/Fuctionen nicht
weiter. da doch anscheinend viel Speicherhandling nötig ist und ich mich
da nicht rantreue. Könnte mir hier eventuell jemand helfen und den Code in PB4
umsetzen, falls möglich ?! :mrgreen:

Hier der zu übersetzende QuickBasic-Code

Code: Alles auswählen

FUNCTION IEEEINIT% STATIC
   SHARED IEEESEG AS INTEGER
   DEF SEG=0
   IEEESEG=PEEK(&H182)+256*PEEK(&H183)
   DEF SEG=IEEESEG
   IEEEINIT=IEEESEG
END FUNCTION

SUB INITIALIZE ( Addr AS INTEGER,  Level AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IEEESEG=IEEEINIT%
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Addr,Level,0%)
END SUB

SUB SEND ( Addr AS INTEGER, S AS STRING, Status AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Addr,S,Status,36%)
END SUB

SUB ENTER ( R AS STRING, L AS INTEGER, Addr AS INTEGER, Status AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (R,L,Addr,Status,39%) 
END SUB

SUB TRANSMIT ( Cmd AS STRING, Status AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Cmd,Status,30%)
END SUB

SUB RECEIVE ( R AS STRING, L AS INTEGER, Status AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (R,L,Status,33%)
END SUB

SUB SPOLL ( Addr AS INTEGER, Poll AS INTEGER, Status AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Addr,Poll,Status,12%)
END SUB

SUB PPOLL (Poll AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Poll,15%)
END SUB

SUB TARRAY ( D AS INTEGER, Count AS INTEGER, EOI AS INTEGER, Status AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   S%=0:O%=0
   S%=VARSEG(D) : O%=VARPTR(D)
   CALL ABSOLUTE (S,O,Count,EOI,Status,200%)
END SUB

SUB RARRAY ( D AS INTEGER, Count AS INTEGER, L AS INTEGER, Status AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   S%=0:O%=0
   S%=VARSEG(D) : O%=VARPTR(D)
   CALL ABSOLUTE (S,O,Count,L,Status,203%)
END SUB

FUNCTION SRQ% STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (S%,63%)
   SRQ%=S%
END FUNCTION

SUB SETPORT (Bd AS INTEGER, Port AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IEEESEG=IEEEINIT%
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Bd,Port,57%)
END SUB

SUB BOARDSELECT (Bd AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Bd,60%) 
END SUB

SUB DMACHANNEL (C AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (C,45%)
END SUB

SUB SETTIMEOUT (T AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (T,48%)
END SUB

SUB SETOUTPUTEOS (E1 AS INTEGER, E2 AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (E1,E2,54%)
END SUB

SUB SETINPUTEOS (E AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (E,51%)
END SUB

FUNCTION LISTENER.PRESENT% (Addr AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (Addr,Present%,84%)
   LISTENER.PRESENT%=Present%
END FUNCTION

FUNCTION BOARD.PRESENT% STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (BP%,87%)
   BOARD.PRESENT%=BP%
END FUNCTION  

SUB ENABLE.488EX (E AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (E,90%)
END SUB

SUB ENABLE.488SD (E AS INTEGER, T AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (E,T,93%)
END SUB

FUNCTION GPIBFEATURE% (F AS INTEGER) STATIC
   SHARED IEEESEG AS INTEGER
   IF IEEESEG=0 THEN EXIT SUB
   DEF SEG=IEEESEG
   CALL ABSOLUTE (F,R%,96%)
   GPIBFEATURE% = R%
END SUB

const   IEEEListener = 0,   IEEE488SD = 1,   IEEEDMA = 2,   IEEEIOBASE = 100,   IEEETIMEOUT = 200,   IEEEINPUTEOS = 201,   IEEEOUTPUTEOS1 = 202,   IEEEOUTPUTEOS2 = 203,   IEEEBOARDSELECT = 204,   IEEEDMACHANNEL = 205

Viele, vielen Dank... :allright:

Re: Quickbasic 2 PB Übersetzer gesucht ;)

Verfasst: 11.06.2007 19:12
von PureBasic4.0
Ghosty1967 hat geschrieben:QuickBasic
Ja, ja. Das waren noch Zeiten....

Hättest du vor ca. 1/2 Jahr gefragt, wäre ich noch fit in Q(uick)Basic gewesen... Jetzt hab ich's vollkommen vernachlässigt... die guten alten Zeiten /:->

Verfasst: 12.06.2007 09:57
von Tafkadasom2k5
@Ghosty: Schreib das Meiste so um, wie du es vermuten würdest

Code: Alles auswählen

[auskommentierter Originalcode]
[PureBasic-Code]
Und dann werde ich mal sehen, was sich da korrigieren lässt. ist wirklich nicht allzu schwer.

Verfasst: 12.06.2007 17:19
von mk-soft
SUB XYZ() -> Procedure XYZ()
...
END SUB -> EndProcedure

FUNCTION XYZ() -> Procedure XYZ()
...
XYZ = Value -> ProcedureReturn Value ; Verlast die Routine!
END FUNCTION -> EndProcedure

Der Type von Rückgabewert einer Funktion wird folgendermassen definiert

LONG -> Procedure.l xyz()
String -> Procedure.s xyz()

Weiters findest du in der Hilfe

FF :wink:

Verfasst: 13.06.2007 12:00
von Ghosty1967
Danke mk-soft...
SUB XYZ() -> Procedure XYZ()
...
END SUB -> EndProcedure

FUNCTION XYZ() -> Procedure XYZ()
...
XYZ = Value -> ProcedureReturn Value ; Verlast die Routine!
END FUNCTION -> EndProcedure

Der Type von Rückgabewert einer Funktion wird folgendermassen definiert

LONG -> Procedure.l xyz()
String -> Procedure.s xyz()
:mrgreen: Das mit den Procedure, Functionen usw. bekomme ich ohne
Probs hin... wo ich Probleme habe ist mit dem Speichergedöns
(PEEK, POKE, DEF SEG usw.) irgendwie habe ich da eine totale Blockade
in der Denke und bräuchte hier halr Hilfe!

Verfasst: 13.06.2007 13:38
von Laurin
Wenn ich mich richtig erinnere, dann ruft man mit Call Absolute doch ein Assemblerprogramm im Speicher auf, oder?

Das ist meiner Meinung nach etwas High Level für einen PB-Anfänger. Kann man das ganze nicht anders lösen?

Verfasst: 13.06.2007 13:44
von Tafkadasom2k5
Ja, aber das "ABSOLUTE" ist ier norgendwo deklariert. Mit CALL kann man nämlich auch Functions/Precedures aufrufen, die noch nicht deklariert wurden.

Verfasst: 13.06.2007 16:08
von mk-soft
Kommt alles noch aus der 16bit Generation.

Datensegmente und Codesegmente konnten nur 64kB Groß sein.
Der Adressbus war 20 Bit breit.
Somit arbeitete man mit Segment und Offset.

Segment.. [0000-0000-0000-0000]xxxx)
+
Offset...... (xxxx[0000-0000-0000-0000]
=
Adresse... [0000-0000-0000-0000-0000]

Mit DEF SEG wurde somit das Segment gesetzt.

FF :wink:

P.S. Am besten überlegen was der Code machen soll und alles neu schreiben und nicht übersetzen.

Verfasst: 14.06.2007 17:01
von Kekskiller
Dei Begriffe im Code kommen mir doch bekann vor.
Werft mal nen Blick hier rein: http://de.wikipedia.org/wiki/IEC-625-Bus
Scheint so als ob Funktionen und Prozeduren zum Managen eines IEC-625-Busses oder so ähnlich sind. Musste alte Firmenhardware zum Laufen bekommen oder watt :mrgreen: ?

Verfasst: 15.06.2007 06:30
von Ghosty1967
Genau so schauts aus, handelt sich um eine Messanwendung mit
GPIB (IEEE) Steuerung.