====================================================================== 8. Tip's bei der Konvertierung von Sourcen von PDS nach PowerBASIC 3.x ====================================================================== (von Mark Junker@2:2437/47.21 / mjs@prg.hannover.sgh-net.de) Generell kann man sagen, daá PDS-Sourcen in PB3-Sourcen konvertiert werden k”nnen. Ausnahmen sind z.B. Sourcen, die auf Fremd-Bibliotheken zurckgreifen oder in einer TYPE-Struktur dimensionierte Elemente be- nutzen. Also, folgendes verhindert eine Umsetzung: - Fremd-Bibliotheken (wie z.B. die VESA-LIB und was es sonst noch so gibt ...) - In einer TYPE-Struktur dimensionierte Elemente Beispiel: TYPE tTest TestElement1 AS LONG TestElement2(2 to 7) AS INTEGER TestElement3 AS LONG END TYPE - Es darf kein COMMON vorkommen, wohl aber alle Varianten des COMMON SHARED- Befehls. Ausnahmen: - Wenn COMMON benutzt wird, um Parameter an eine mit CHAIN aufgerufene Datei zu uebergeben. - Wenn es egal ist, wenn die hinter COMMON angegebenen Variablen in allen Prozeduren verfgbar sind. - Arrays mit mehr als 8 Dimensionen - es gibt noch kein ausreichend flexibles REDIM PRESERVE - Mehr als 16 Parameter bei Aufruf einer Prozedur Wenn diese Bedingungen erfllt sind, dann sind folgende Dinge bei einer Konvertierung zu beachten: Basic PDS: ³PowerBASIC 3: ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SSEG ³STRSEG SADD ³STRPTR SSEGADD ³STRPTR32 ³STRPTR32 gibt es erst ab PB3.2 VARSEG/VARPTR ³ACHTUNG: PB3 liefert VORZEICHENLOSE ³Werte zurck, PDS dagegen VORZEICHEN- ³BEHAFTETE. ³Dies kann per $OPTION SIGNED OFF ³ge„ndert werden. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Offset bei einer per OPEN ge- ³In PB f„ngt eine Datei - je nach ”ffneten Datei f„ngt bei '1' an! ³Wahl - bei Null (Standard) oder bei ³Eins an. Dieses kann mit folgendem ³Befehl eingestellt werden: ³OPTION BINARY BASE 1 ³fr den Anfang bei '1' ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ DIM SHARED VarName% ³Dieser Befehl kann auf zweifache ³Art und Weise umgesetzt werden: ³- DIM VarName% ³ SHARED VarName% ³- DIM VarName AS SHARED INTEGER ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ SHARED VarName() AS STRING*3 ³Hier tritt das Problem ³mit den Strings fester Laenge auf, wenn ³sie nicht im Haupt-Programm geSHARED ³werden koennen. ³Hinter SHARED drfen zu Variablen ³keine Typen-Angaben ('AS xxx') stehen. ³Also: SHARED VarName as string ³Wird zu: SHARED VarName$ ³ oder: SHARED VarName :'in SUBs ! ³ ³Bei FIXED-LENGTH-STRING-Arrays kann ³man sie SHAREn, indem man folgenden ³Befehl benutzt: ³DIM VarName(MIN,DimNum) AS STRING*3 ³oder ³DIM VarName(MAX,DimNum) AS STRING*3 ³wobei 'DimNum' die Anzahl der ³Dimensionen des Arrays ist und im ³Source direkt eine Zahl eingetragen ³sein muá. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ COMMON SHARED /Block/ VarN% ³Alle drei Varianten des COMMON- COMMON SHARED VarN% ³Befehls muessen leider im Haupt- ³Programm durch ein PUBLIC und in dem ³externen Modul (unter PB: UNIT) durch ³ein EXTERNAL ersetzt werden. Dabei muá ³beachtet werden, daá die Variablen- ³Namen eindeutig sein MšSSEN. Sie sind ³also UNABHŽNGIG vom DATENTYP !!! ³Alle Typen-Angaben 'AS xxx' sind in ³PB3 unzul„áig. ³Die Block-Angabe (/Block/) f„llt bei ³PB weg, da hier alles Namens-Abh„ngig ³ist. (-> Inkompatibilit„t !) ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ COMMON VarN% ³Kann nur dann umgesetzt werden, wenn ³die hinter COMMON angegebene Variable ³an ein, mit dem CHAIN-Befehl, ³aufgerufenes Programm uebergeben werden ³soll oder aber das COMMON i.E. auch ³ein COMMON SHARED sein k”nnte. ³Es sind hier, wie auch bei COMMON ³SHARED alle Typen-Angaben ('AS xxx') ³zu einer Variable zu entfernen. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ '$INCLUDE: 'filename.ext' ³$INCLUDE "filename.ext" '$DYNAMIC ³$DYNAMIC '$STATIC ³$STATIC ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ CONST VarName$ = "xyz" ³Hier muá im Programm direkt CONST VarName# = 1.23 ³berall der Variablen-Name CONST VarName! = 1.23 ³durch den dazugeh”rigen Wert er- CONST VarName@ = 1.23 ³setzt werden. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ CONST VarName% = 123 ³Wird beidemale zu: CONST VarName& = 123 ³%VarName = 123 ³Wird ein Konstanten-Name doppelt, aber ³mit unterschiedlichem Datentypen ³verwendet so ist im gesamten Source ³einer der beiden Namen zu „ndern. ³Im Programm muss dann auch ueberall ³'VarName%' oder 'VarName&' durch ³'%VarName' ersetzt werden. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ IF x THEN : ' Test ³In PB braucht nur der ':' entfernt zu irgendwas ³werden und schon l„át es sich hier END IF ³problemlos kompilieren. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ DIM x AS STRING*3 ³Dieser FIXED-LENGTH-STRING kann CALL Test(x) ³in PB nicht problemlos an eine END ³Prozedur uebergeben werden, da SUB Test(x$) ³PB hier einen VARIABLE-LENGTH- END SUB ³STRING erwartet oder im Kopf der ³SUB-Prozedur anstelle des 'x$' ³ein 'x AS STRING*3'. Man muá ³hier bei PB also ggf. den Umweg ³ber einen temporaeren String gehen: ³dummy$=x ³CALL Test(dummy$) ³x=dummy$ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Ideal ist es, fr das Problem der Konstanten-Konvertierung einen Konverter zu schreiben, denn dies drfte den L”wen-Anteil bei der Konvertierung groáer Programme ausmachen. Im gleichen Zuge kann man natrlich auch die Sache mit den COMMON SHAREDs und den DIM SHAREDs und natrlich auch den META-Statements, sowie SSEG/SADD/SSEGADD ersetzen. Wenn Interrupt-Aufrufe mit einem CALL INTERRUPT oder CALL INTERRUPTX gemacht werden, so kann man entweder in ASM die Routine 'INTERRUPTX' nachbilden und alle Aufrufe von 'INTERRUPT' nach 'INTERRUPTX' konvertieren oder man setzt es direkt in INLINE-ASM um oder aber man benutzt die PowerBASIC-eigene 'CALL INTERRUPT'-Routine, wobei man dann alle Registerzuweisungen konvertieren muá ...