HEXit – Jump-Table erzeugen

Dieses Beispiel zeigt, dass mit der Funktion Add Data und den Parameter Fill pattern quasi ein lauffähiger Maschinencode erzeugt werden kann. Der in diesem Beispiel generierte Code erzeugt eine Jump-Table, die es ermöglicht, die Interrupt-Vektoren im RAM nutzen zu können, um z.B. die Applikation im RAM ausführen zu lassen. Dazu müssen die Interrupt-Vektoren vom Flash-Memory ins RAM weitergeleitet werden.

Ein Jump-Table ermöglicht die Nutzung von Interrupt-Vektoren an einem anderen Adressbereich, als der vom Hersteller, der MCU, vorgegeben. Der hier beschriebene Jump-Table gilt für die Prozessorfamilie XC167. Der Befehl für die Interrupt-Vektoren lautet: JMPS . Für die vollständige Sprung-Tabelle werden 128 aufeinander folgende Befehle benötigt. Jeder Befehl ist 4 Byte lang. Der OP-Code für JMPS lautet 0xFA. Das Segment ist 0xE0, weil bei diesem Prozessor im Segment 0xE0 das interne Programm-RAM liegt.

Die Adresse wird nach jedem Sprungbefehl um 4 Byte erhöht. Der vollständiger Object code für den ersten Befehl lautet: 0xFA, 0xE0, 0x00, 0x00. Byte 3 ist das low-Byte des Sprungzieles und Byte 4 ist das high-Byte des Sprungzieles.

Die Start-Adresse ist 0x0000, die Länge beträgt 128*4 Byte = 512 Byte daraus ergibt sich die Endadresse 0x1FF.

Byte 0 und Byte 1 (FA und E0) sind Konstanten.
Das Low-Byte wird erzeugt, indem der Adresszähler mit FC logisch UND verknüpft wird.
Um das high-Byte der Adresse zu erhalten wird der Adresszähler 8 Bit nach rechts geschoben.
Das Pattern lautet: FA E0 &FC >8.
Der Datengenerator erzeugt den folgenden Datensatz:

Der erzeugte Opcode entspricht dem Quellcode:  
JMPS SEG_E0, 0000h
 JMPS SEG_E0, 0040h
 JMPS SEG_E0, 0044h
 JMPS SEG_E0, 0048h
 JMPS SEG_E0, 004Ch
 JMPS SEG_E0, 0050h
 …
 JMPS SEG_E0, 01FCh