Das Format der DatenFenster-Module (*.dfm)


Fixkomma Zahlen Ausgaben
Flieskomma Zahlen Ausgaben
String Ausgabe
Bit Ausgabe
Verzweigungsbefehle
Allgemeine Befehle
Rechenbefehle
Dump Angabe
Spezielle Marken


Fixkomma Zahlen Ausgaben



BYTE     : Gibt 1 Byte Fixkomma Zahlen aus
WORD     : Gibt 2 Byte Fixkomma Zahlen aus
RWORD : Gibt 3 Byte Fixkomma Zahlen aus
DWORD : Gibt 4 Byte Fixkomma Zahlen aus
QWORD : Gibt 8 Byte Fixkomma Zahlen aus

Syntax :

Befehl "Name" [Anzahl|Marke] [UNTIL-Dump] [#Flags]

Name :  Name der Datenzeile. Dieser Name wird im Datenfenster angezeigt.
Anzahl : Anzahl der Zeilen die ausgelesen werden. 
Ist Anzahl nicht angegeben so wird Anzahl=1 angenommen. 
Ist ein UNTIL-Dump angegeben so wird die Ausgabe abgebrochen, wenn der UNTIL-Dump vor der Anzahl an Werten gefunden wird. Es wird dann die Länge des Dumps zum Offset auch hinzu gezählt.
Marke : Ist eine Marke angegeben so wird die Anzahl der Zeichen aus der Marke eingelesen. z:B.:

    :LEN BYTE "Länge"
         BYTE "Daten" LEN

UNTIL-Dump : Ist ein Dump angegeben so wird die Zahlenausgabe abgebrochen wenn ausgehend vom aktuellen Offset
der Dump gefunden wird. UNTIL-Dumps werden nicht in Zwischenbereichen von Zahlen gesucht. 
(z.B. bei DWORD alle beginnt der Vergleich alle vier Bytes) 
Ist Anzahl nicht angegeben so wird eine maximale Länge von 4096 Bytes angenommen.
Flags : Bestimmt die Ausgabeart der Zahlen:

     
B = Binär ausgeben ( 0b1010 )
      O = Octal ausgeben ( 0o1234 )
      D = Dezimal (signed) ausgeben ( -1234 )
      H = HexaDezimal ausgeben ( 0xFF0 )
      S = Signed Dezimal Zahl ( -1234 )
      U = Unsigned Dezimal Zahl ( 1234 )
      C = Als Zeichen ausgeben ( 'A' )
      X = Im Assembler Format ( 11b 4Fh)
      K = Keine Formatangabe ( 11 4F )
     
P = Ein '@' Präfix vor die Zahl setzen
      M = Im Motorola Format ausgeben
      N = Nicht ausgeben
     
I = Suffix an Text anhängen ( "...[00]")
     
J = HEX-Suffix an Text anhängen ( "...[0Fh]")
     
2-16  = Standard Breite für die Zahlenausgabe
     
>XXX = Die Ausgabe auch in die Zeile mit der Marke XXX machen
     
"1:Eins:2:Zwei:?:XXX" = Zusatztext für Zahl

Zusatztexte müssen immer am Ende der Zeile stehen ohne Leerzeichen nach den Flags, der letzte Wert kann ein
? sein und steht für den Default-Text. 

Wird kein Flag angegeben so ist
D der Standard
Es können auch mehrere Ausgabeflags angegeben werden, dann werden die Zahlen in mehreren Formaten ausgegeben.

 
Der letzte gefundene Wert wird als Markenwert gespeichert.

Beispiele:

Memory: 00 01 02 03 04 05 06

BYTE
"Werte" 3            ;Ausgabe 0 1 2 und 2 wird zum Markenwert, Offset+=3
BYTE "Werte"              ;Ausgabe 0      Offset+=1
WORD "Werte"   UNTIL 02   ;Ausgabe 256    Offset+=3
WORD "Werte"   UNTIL 02+0 ;Ausgabe 256    Offset+=2
WORD "Werte" 1 UNTIL 02   ;Ausgabe 256    Offset+=2
BYTE "Werte" #HX          ;Ausgabe 0x0 0h Offset+=1
BYTE "Werte" #P           ;Ausgabe @0     Offset+=1
BYTE "Werte" VAL 3  #I    ;Ausgabe 0      Offset+=1  "Werte[005]" wenn VAL==5



Flieskomma Zahlen Ausgaben


FLOAT 
: Gibt 4 Byte Flieskomma Zahlen aus
DOUBLE : Gibt 8 Byte Flieskomma Zahlen aus

Syntax :

Befehl "Name" [Anzahl|Marke] [UNTIL-Dump] [#Flags]

Name :  Name der Datenzeile. Dieser Name wird im Datenfenster angezeigt.
Anzahl : Anzahl der Zeilen die ausgelesen werden. 
Ist Anzahl nicht angegeben so wird Anzahl=1 angenommen. 
Ist ein UNTIL-Dump angegeben so wird die Ausgabe abgebrochen, wenn der UNTIL-Dump vor der Anzahl an Werten gefunden wird. Es wird dann die Länge des Dumps auch zum Offset hinzu gezählt.
Marke : Ist eine Marke angegeben so wird die Anzahl der Zeichen aus der Marke eingelesen. z.B.:

    :LEN BYTE  "Länge"
         FLOAT "Daten" LEN

UNTIL-Dump : Ist ein Dump angegeben so wird die Zahlenausgabe abgebrochen wenn ausgehend vom aktuellen Offset
der Dump gefunden wird. UNTIL-Dumps werden nicht in Zwischenbereichen von Zahlen gesucht. 
(z.B. bei DWORD alle beginnt der Vergleich alle vier Bytes) 
Ist Anzahl nicht angegeben so wird eine maximale Länge von 4096 Bytes angenommen.
Flags : Bestimmt die Ausgabeart der Zahlen:

     
N = Nicht ausgeben
     
I = Suffix an Text anhängen ( "...[00]")
     
J = HEX-Suffix an Text anhängen ( "...[0Fh]")
 




Der letzte gefundene Wert wird in DWORD umgewandelt und als Marken-Wert gespeichert.


String Ausgabe


STRING   : C -String mit '\0' abgeschlossen
STRING_D : Dos-String mit '$' abgeschlossen
STRING_B : Byte-String die Länge steht am Anfang im ersten BYTE
STRING_P : Pascal-String die Länge steht am Anfang im ersten WORD
STRING_K : String-Kette ,eine Kette von C-Strings mit "\0\0" beendet

Syntax :

Befehl "Name" [Anzahl|Marke] [UNTIL-Dump] [#Flags]

Name :  Name der Datenzeile. Dieser Name wird im Datenfenster angezeigt.
Anzahl : Länge des Strings in Zeichen. ( mit '\0' und Längenangaben ) 
Ist Anzahl nicht angegeben so wird die normale String-Länge
genommen. 

Ist ein UNTIL-Dump angegeben so wird die Ausgabe abgebrochen, wenn der UNTIL-Dump vor der Anzahl an Werten gefunden wird. Es wird dann die Länge des Dumps zum Offset hinzu gezählt.
Marke : Ist eine Marke angegeben so wird die Stringlänge der Zeichen aus der Marke eingelesen. z:B.:

    :LEN BYTE   "Länge"
         STRING "Daten" LEN

UNTIL-Dump : Ist ein Dump angegeben so wird die Zahlenausgabe abgebrochen wenn ausgehend vom aktuellen Offset
der Dump gefunden wird. UNTIL-Dumps werden nicht in Zwischenbereichen von Zahlen gesucht. 
(z.B. bei DWORD alle beginnt der Vergleich alle vier Bytes) 
Ist Anzahl nicht angegeben so wird eine maximale Länge von 4096 Bytes angenommen.
Flags : Bestimmt die Ausgabeart der Zahlen:

     
U = Unicode String 
     
M = Unicode String im Motorola Format ausgeben
     
V = Spezialzeichen nur als "\x??" ausgeben
     
F = Der Text ist im UTF8 Format     
     
I = Suffix an Text anhängen ( "...[00]")
     
J = HEX-Suffix an Text anhängen ( "...[0Fh]")
     
>XXX = Die Ausgabe auch in die Zeile mit der Marke XXX machen

Wird kein Flag angegeben so ist
D der Standard
Es können auch mehrere Ausgabeflags angegeben werden, dann werden die Zahlen in mehreren Formaten ausgegeben.

Beispiele:

Memory: "Hallo\0...."

STRING "Text"               ; ergibt "Hallo" Offset+=6
STRING "Text" 8             ; ergibt "Hallo" Offset+=8
STRING "Text" 4             ; ergibt "Hall"  Offset+=4
STRING "Text"   UNTIL 'o'   ; ergibt "Hall"  Offset+=5
STRING "Text"   UNTIL 'o'+0 ; ergibt "Hall"  Offset+=4
STRING "Text" 8 UNTIL 'o'   ; ergibt "Hall"  Offset+=5
STRING "Text" 4 UNTIL 'o'   ; ergibt "Hall"  Offset+=4
STRING "Text" VAL 3  #I     ; ergibt "Hallo" Offset+=6  "Text[005]" wenn VAL==5



Bit Ausgabe

BIT  : Bits Ausgeben
REST : Restlichen Bits ausgeben


Syntax :

BIT "Name" [Bitzahl] [#Flags]

Name :  Name der Datenzeile. Dieser Name wird im Datenfenster angezeigt.
Bitzahl : Anzahl der Bits die ausgelesen werden sollen.
Flags : Bestimmt die Ausgabeart der Zahlen:

    
N = Nicht ausgeben

Syntax :

REST "Name" [RasterBreite] [RasterVerschub] [#Flags]

Name :  Name der Datenzeile. Dieser Name wird im Datenfenster angezeigt.
RasterBreite: Anzahl der Byte auf die gerundet werden soll. 
z.B. RasterBreite
=4 und Offset=0 BitOffset=17 so werden 15 Bits genommen auf 4 Byte
RasterVerschub: Ist Byte-Verschub der zum Offset addiert wird. 
Wäre beim vorigen Beispiel RasterVerschub=1 wären nur 7 Bits Addiert worden.
Flags : Bestimmt die Ausgabeart der Zahlen:

    
G = Globales Offset für die Berechnung nehmen.
     
>XXX= Die Ausgabe auch in die Zeile mit der Marke XXX machen



Verzweigungsbefehle

IF [!] UNTIL-Dump GOTO|CALL Marke

Gehe zur Marke oder rufe Marke auf wenn Dump gefunden wird,
bzw. wenn das !-Flag gesetzt ist, wenn Dump nicht gefunden wird.

IF [!] Marke1 VglOp Zahl GOTO|CALL Marke2 [#Flags]

Gehe zur Marke oder rufe Marke auf wenn der Vergleich richtig ist,
bzw. wenn das !-Flag gesetzt ist, wenn Vergleich nicht richtig ist.

IF [!] Marke1 VglOp Zahl EXIT|RETURN [#Flags]

Beende den Aufruf oder den Call wenn der Vergleich richtig ist,
bzw. wenn das !-Flag gesetzt ist, wenn Vergleich nicht richtig ist.
Auch ein Dump statt dem Vergleich ist möglich.

IF [!] Marke1 VglOp Zahl SEEK|MOV|ADD Marke2 [Zahl2] [#Flags]

Führt einen Versuch aus, oder speichert Zahl2 in Marke2.
Auch ein Dump statt dem Vergleich  ist möglich.

VglOp Funktion
== Marke1 gleich Zahl
!= Marke1 ungleich Zahl
>= Marke1 größer gleich Zahl
<= Marke1 kleiner gleich Zahl
> Marke1 größer Zahl
< Marke1 kleiner Zahl
& (Marke1 & Zahl) ungleich 0

D = Marke1 um 1 verringern wenn kein Dump vorhanden ist
U = Marke1 um 1 erhöhen wenn kein Dump vorhanden ist
G = Globales Offset verwenden. (Nur für Absolut- und Rasterverschub) (nur bei SEEK)
R = Rasterverschub den Offset auf den Anfang des nächsten Byterasters. (nur bei SEEK)
N = Beim Rasterverschub 0 addieren wenn man sich auf einen Byteraster befindet. (nur bei SEEK)
A
= Absolutverschub zu Adresse. (nur bei SEEK)
B = Prüft Bereichsgrenzen. (nur bei SEEK).
M = Zum letzten Auftreten der Marke springen (nur bei SEEK).
2..2048 = Den Verschubwert (Marke2) mit N multiplizieren  (nur bei SEEK).

GOTO Marke 

Springe zur Marke.


CALL
Marke #Flags

Rufe eine Unterfunktion Marke auf. Bei einer Unterfunktion wird der lokale Offset auf 0 gesetzt.Mit dem Flag  G wird das globales beibehalten und das lokale Offset nicht auf 0 gesetzt.

RETURN

Beende eine Unterfunktion ( für CALL oder LOOP )

EXIT

Beendet die Ausgabe in das Datenfenster.


LOOP
[Anzahl|Marke] Marke2 #Flags

Schleifenaufruf durchführen. Mit Return wird das Ende der Schleife bestimmt.

Anzahl :  Die Schleife soll Anzahl-mal wiederholt werden.
Marke : Die Schleife mit dem Wert der Marke n-mal wiederholen.
Marke2 : Unterfunktion die aufgerufen wird. (der lokale Offset wird dabei auf 0 gesetzt)

Flag  G wird das globales beibehalten und das lokale Offset nicht auf 0 gesetzt.


TEXT  "Text..."   [#Flags]

        Einen Text in das Datenfenster ausgeben. Dabei wird nur die Typspalte gefüllt
        und die Spalte Inhalt bleibt leer. Diese Zeile kann später mit PRINT oder einem
        Befehl mit dem Flags "#...>XXX" gefüllt werden.

   Flags :

                
>XXX = Die Ausgabe auch in die Zeile mit der Marke XXX machen
 


PRINT ["Name"] Marke [Länge]  [#Flags]

Den Wert der Marke ausgeben. Für Flags siehe unter Zahlenausgabe .
Wenn eine Länge angegeben ist wird der Offset von der Marke benutzt.

Flags :

       
>XXX = Die Ausgabe auch in die Zeile mit der Marke XXX machen
 

SPRINT ["Name"] Marke1 Marke2 [Länge]  [#Flags]

Den Wert der Marke1 in der bestehenden Ausgebe bei Marke2 ausgeben.
Für Flags siehe unter Zahlenausgabe . Wenn eine Länge angegeben ist
wird der Offset von der Marke1 benutzt. Eine Ausgabezeile mit Marke2
am Begin, muss zuvor mindestens einmal ausgegeben worden sein.

Z = Keine Ausgabe machen aber den Wert in die Size-Spalte schreiben

Beispiele:


    TEXT   "Text"                   ; Einen beliebigen Text ausgeben
:A
  MOV    A 0                      ; A = 0
:B  PRINT  "Wert ausgeben" A   #D   ; Den Wert A in einer Zeile ausgeben
:C  ADD    A 1                      ; A = A + 1
   
LOOP   5 C                      ; Fünfmal zu C springen
   
SPRINT "Wert ausgeben" A B #D   ; Den Wert A in der Zeile B ändern
   
GOTO   D                        ; Zu D springen
:D  EXIT                            ; Die Ausführung beenden

 


Allgemeine Befehle


MODUL "ModulName" 

Modul-Name angeben. Damit wird der Name des aktuellen Moduls angegeben. Man kann jedes Modul in weiter Blöcke unterteilen. 


BLOCK "BlockName" [NotFilter] [AndFilter]

Neuen Einsprung-Block für einen Block definieren. Man kann mehrere Blöcke je Datei definieren.

Der Block wird nur geladen wenn der NotFilter&GlobaleFlags Null ist und AndFilter&GlobaleFlags ungleich Null ist.


DOWN ["Name"] [Marke] [Zahl] [#Flags]

Eine Ebene absteigen. Damit wird ein neuer Baumzweig zum Einblenden im Datenfenster begonnen. Ist ein Name angegeben, so wird einen neue Textzeile im Datenfenster erzeugt.

Flags :

I = Suffix an Text anhängen ( "...[00]")
J = HEX-Suffix an Text anhängen ( "...[0Fh]")

UP  

Eine Ebene aufsteigen. Damit wird ein Baumzweig im Datenfenster geschlossen. Ist ein Name angegeben, so wird einen neue Textzeile im Datenfenster erzeugt.


OFFSET ["Name"] [Marke] [Zahl] [#Flags]

Aktuelles Offset+Zahl ausgeben. Wenn eine Marke angeben ist wird der Offset der Markenposition benutzt statt dem aktuellen Offset.

Flags : 

G = Globales Offset ausgeben.
N = Nicht ausgeben
>XXX= Die Ausgabe auch in die Zeile mit der Marke XXX machen
... und alle Format Flags wie bei der Fix-Komma-Ausgabe

LEN [ "Name"] [Zahl] [#Flags]

Die Größe des restliche Speicher ausgeben. Er wird berechnet vom aktuellen Offset bis zum Ende des Datenbereiches. Zur Länge wird die angegebene Zahl addiert.

Flags : 

G = Länge von letzten CALL-Offset bis zum Ende berechnen.
A = Gesamte Länge des Datenbereiches verwenden.
>XXX= Die Ausgabe auch in die Zeile mit der Marke XXX machen
 



SEEK  [Anzahl] [Marke] [#Flags]

Verschiebt den aktuellen Offset um Anzahl an Bytes, um den Wert von Marke oder beiden.

Flags : 

G = Globales Offset verwenden. (Nur für Absolut- und Rasterverschub)
R = Rasterverschub den Offset auf den Anfang des nächsten Byterasters.
N = Beim Rasterverschub 0 addieren wenn man sich auf einen Byteraster befindet.
A
= Absolutverschub zu Addresse.
B = Prüft Bereichsgrenzen. Wenn der Bereich außerhalb der erlaubten Grenzen ist wird der Offset an den Anfang des Speichers
M = Zum letzten Auftreten der Marke springen.
2..2048 = Den Verschubwert mit N multipliziern.

z.B. Offset=7 GlobalOffset=16


SEEK 1      ; Offset= 8 Global-Offset=17
SEEK 10 #R  ; Offset=10 Global-Offset=19
SEEK 10 #RG ; Offset=11 Global-Offset=20
SEEK 10 #A  ; Offset=10 Global-Offset=19
SEEK 10 #AG ; Offset= 1 Global-Offset=10
SEEK #3  ; Offset=10 Global-Offset=19


z.B. Offset=4 

SEEK 4  #R  ; Offset=8
SEEK 4  #RN ; Offset=4

RVA ["Name"] SecMarke [Marke|Zahl] [#Flags]

Rechnet einen Datei-Offset in einen RVA-Offset um, oder umgekehrt.
Bei SecMarke sind die Umrechnungssegmente, mit denen Marke oder
Zahl umgerechnet wird.  Wenn keine Marke|Zahl nicht angegeben ist,
Wird ein DWORT.

Flags : 

R = Datei-Offset in RVA-Offset umrechnen.
G = Zu Marke|Zahl auf globalen Offset umrechnen.
F = Den umgerechneten Wert ausgeben.
A = Das Ergebnis auch in Marke speichern.
N = Nicht ausgeben
... und alle Format Flags wie bei der Fix-Komma-Ausgabe


:SEC
 
STRING "Begin der Section-Tabelle"  #N
...

; z.B. Offset=3 GlobalOffset=16

:
NUM  RVA  "Offset in Datei   " SEC 100  #X    ; Rechnet 100 um
      RVA
 
"Offset in Speicher" SEC NUM #XG   ; Rechnet 100+16 um
      RVA
 
"Offset in Speicher" SEC NUM #XR   ; Rechnet 100 zurück
 

 


Rechenbefehle

ADD   : Zahlen addieren
SUB   : Zahlen subtrahieren
MUL   : Zahlen multiplizieren
DIV   : Zahlen dividieren
MOD   : Zahlen modulo Operation
AND   : Zahlen und verknüpfen
OR    : Zahlen oder verknüpfen
XOR   : Zahlen xor verknüpfen
MOV   : Zahlen umkopieren
BIN   : Binär schieben

Syntax:

Befehl ZielMarke QuellMarke Zahl : Format 1 ( Nicht bei MOV )
Befehl ZielMarke QuellMarke      : Format 2
Befehl ZielMarke Zahl            : Format 3

Flags : 

A = Das Ergebnis in der Marke der Zeile speichern.
O = Statt der Werte der Marken deren Offsets benutzen.
G = Mit den globalen Offsets rechnen.

Beispiele:

   ADD  A B 2    ; A = B + 2
   SUB  A B      ; A = A - B
   MUL  A   2    ; A = A * 2
   MOV  A B      ; A = B
   BIN  A B      ; A = (1<<B)
   BIN  A B -1   ; A = (1<<B)-1
   MOV  A   2    ; A = 2
:C MUL  A   2    ; A = A * 2
:C MUL  A   2 #A ; C = A * 2


Dump Angabe

UNTIL [>[Marke][+-Zahl]] Angaben... [+Länge] [*]



Angaben:

F1 Hex Bytes
? Nicht geprüftes Byte
~10101111 Byte binär angegeben
~1??10??0 Byte binär angegeben mit nicht geprüften Bits
'A' Byte Zeichen Zeichen
"xyz\n123" Zeichen Folge
+Länge Die Dump-Länge die zum Offset addiert wird
* Dump Ende

 

Beispiel:



Memory "Hallo"


UNTIL 'H'         ; Dump wird  gefunden Offset+=1
UNTIL 'H'+0       ; Dump wird  gefunden Offset+=0
UNTIL ? 'o'       ; Dump wird  gefunden Offset+=2
UNTIL ? 'o' +1 *  ; Dump wird  gefunden Offset+=1
UNTIL FF    +1 *  ; Dump nicht gefunden Offset+=0
UNTIL ~11111111   ; Dump nicht gefunden Offset+=0
UNTIL "Hall"      ; Dump wird  gefunden Offset+=4
UNTIL "HALL"      ; Dump nicht gefunden Offset+=0
UNTIL >8    'H'   ; Dump wird  gefunden Offset+=1 der Vergleich beginnt 8   Byte versetzt
UNTIL >X-8  'H'   ; Dump wird  gefunden Offset+=1 der Vergleich beginnt X-8 Byte versetzt



Spezielle Marken

:LOCAL? ...      : Die Werte dieser Marken werden vor jedem Scann auf Null gesetzt. (0..3 ist möglich)
:PARAM? ...      : Die Werte dieser Marken können Global gesetzt werden. (0..3 ist möglich)
 

Beispiel:


Memory "Hallo"

ADD  A LOCAL1 2    ; A = LOCAL1 + 2
ADD  A PARAM3 5    ; A = PARAM3 + 5