@1: Es gibt eine 70-tägige Testversion. Nach Ablauf der 70 Tage benötigst Du entweder eine kostenpflichtige Lizenz oder kannst das Produkt nicht mehr verwenden. Vielleicht kannst Du noch irgendwo eine alte WDSC 7.0-Version auftreiben, die war kostenlos.

@2.
Code:
 /Free
   W2Zeit = %Div(%Int(W1MINU): 60);
   Rest = %Rem(%Int(W1MINU): 60);
   HHMM = W2Zeit * 100 + Rest;
   
   //Oder
   HHMM = %Div(%Int(W1MINU): 60) * 100 + %Rem(%Int(W1MINU): 60);
 /End-Free
Sofern W1MINU ohne Nachkommastellen definiert ist, kann die Konvertierung mit %INT entfallen.

@3 Im Free Format wird komplett ohne Bezugszahlen gearbeitet. Stattdessen müssen/können bei Schreib/Leseoperationen die Built-In-Funktionen %EOF, %FOUND, %ERROR und %EQUAL verwendet werden.
Sofern Du Teile von alten Programme umsetzen willst, in denen die Bezugszahlen weiterhin verwendet werden, muss Du diese wie folgt umsetzen:
Code:
 /Free 
     Chain(N) (KeyFld1: KeyFld2: ... KeyFldN) MyFormat;
     *IN99 = Not %Found(MyFile);
 
     If %Found(MyFile);    //entspricht *IN99 = *OFF
         //Satz gefunden
     EndIf;
Bei den Built-In-Funktionen %FOUND oder %EOF solltest Du IMMER den Datei-Namen angeben, ansonsten wird die Einstellung der letzten Dateioperation ausgegeben.

@4. Bei SETLL werden sowohl die Built-In-Funktionen %EQUAL als auch %FOUND gesetzt.
%EQUAL wird auf *ON gesetzt, wenn mindestens ein Datensatz mit dem angegebenen Schlüssel vorhanden ist.
%FOUND wird auf *ON gesetzt, wenn ein folgender READ oder READE erfolgreich wäre, das heißt jedoch nicht zwangsläufig, dass ein Datensatz mit genau dem angegebenen Schlüssel vorhanden ist.
Wenn Du also einen CHAIN durch einen SETLL ersetzten willst, um festzustellen dass ein Datensatz vorhanden ist, musst Du die Built-in-Funktion %EQUAL prüfen und nicht %FOUND. Auch wenn in 95% aller Fälle beide Funktionen das gleiche Ergebnis liefern.

@5. Der OpCode COMP ist so alt, dass ich ihn das letzte Mal am Anfang meiner "RPG-Karriere" so ca. 1867 gesehen habe. Da die Position der Bezugszahl aus Deinem Code nicht ersichtlich ist, gehe ich davon aus, dass sie auf der letzten Position (Gleich) steht. In diesem Fall kannst du den Source-Code so wie in Deinem Beispiel übersetzen.

Du kannst das Ganze auch in einer Zeile machen:
Code:
/Free
   *IN88 = (W1KZ2A = 'X1');
/End-Free
Bei einem einstelligen Feld kannst Du auch nur eine Stelle, also entweder X oder 1 prüfen.

Da in Free Format eigentlich ohne Bezugszahlen (zumindest ohne *IN01-*IN99) gearbeitet wird, würde ich auch keine Bezugszahl setzten, sonder immer direkt die Bedingung (IF W1KZ2A = 'X1') prüfen.

@6: Am einfachsten macht man das in einer Datenstruktur:
Code:
D MyDS          DS
D   MyNum8                         8S 0
D   MyNum21                        2S 0     Overlay(MyNum8)   
D   MyNum22                        2S 0     Overlay(MyNum8: *Next)
 /Free
   MyNum8 = 12345678;
   Dsply MyNum21;
 /End-Free
Man kann natürlich auch ein Konstrukt aus diversen Built-in-Funktionen verwenden:
Code:
 /Free
    MyNum21 = %Dec(%Subst(%EditC(MyNum8: 'X'): 1: 2): 2: 0);
 /End-Free
@7: Der OpCode DO wird im Free-Format nicht unterstützt. Du musst einen der OpCodes DOW, DOU oder FOR verwenden.
Sofern Du eine Endlos-Schleife (DO *HIVAL) programmieren willst, musst Du eine Bedingung angeben, die nie wahr wird (z.B. DOU 0=1; )

@8: CABxx steht für compare and branch und ist nichts anderes als eine IF-Bedingung mit einem GOTO.
Im Free-Format werden allerdings weder CABxx noch GOTO noch TAG unterstützt.
In einer sauberen, gut strukturierten modularen Programmierung sind diese OpCodes auch nicht notwendig ... und der Quellcode bleibt trotzdem lesbar.

Birgitta