|
Die Bibliotheksfunktion des Grundprogramms
Durch die Bibliotheksfunktion kann das Grundprogramm recht einfach erweitert werden. Speziell kodierte Programme können über die Funktion "Bibliothek" auf der zweiten Seite des Menüs gelistet und gestartet werden. Diese Funktion wird zum Beispiel von Pascal/S genutzt.
- Jedes Programm, das die Bibliotheksfunktion nutzen soll, muss mit einem speziellen Header (Signatur) beginnen, in dem die notwendigen Angaben für das Grundprogramm umgesetzt werden.
- Solche Headerinformationen müssen immer an einer durch 1024 (0x400) teilbaren Adresse beginnen, da das Grundprogramm den Speicher beim Start der Bibliotheksfunktion nur an diesen Adressen nach einer Kennung durchsucht.
- Jeder Bibliothekseintrag belegt immer genau 32 Bytes, es können in einem Header auch mehrere Einträge unmittelbar hintereinander vorgenommen werden.
- Bibliotheksprogramme sollten relokativ programmiert sein, damit sie an einer beliebigen Adresse eingesetzt werden können. (weitere Erläuterungen unten)
- Bibliotheksprogramme sollten keine absoluten Adressen des Grundprogrammes verwenden, damit diese mit späteren Versionen des Grundprogrammes kompatibel bleiben.
Aufbau des Headers
Offset |
Beispiel |
Funktion |
000000 |
DC.L $55AA0180 |
Magisches Langwort Kennung für den Beginn eines Bibliothekeintrags. Vor der Definition des Headers muss mit einer entsprechenden ORG-Anweisung oder OFFSET-Anweisung die Übersetzungsadresse auf einen durch 1024 teilbaren Wert eingestellt werden. (z.B. $9C00) |
000004 |
DC.B 'PROGNAME' |
Name des Programms Dieser Name wird von der Bibliotheksfunktion des Grundprogramms angezeigt. Der Name muss immer aus genau 8 Zeichen bestehen, kann jedoch bei kürzeren Namen mit Leerzeichen aufgefüllt werden. |
00000C |
DC.L start |
Startadresse des Programms Hier verwendet man am besten ein Label, welches an der Stelle definiert wird, wo der Programmcode umgesetzt ist. |
000010 |
DC.L ende-start |
Länge des Programms Der Label "ende" wird dabei hinter dem RTS-Befehl codiert, so dass der Assembler die korrekte Differenz ausrechnen kann. Die Länge des Programms wird vom Grundprogramm nur angezeigt, jedoch nicht weiter verwendet. |
000014 |
DC.B wert |
Absolute oder relative Adressen Der Wert 0 zeigt der Bibliotheksfunktion an, dass die Startadresse als absolute Adresse angegeben ist. Der Wert 1 zeigt der Bibliotheksfunktion an, dass die Startadresse relativ ab dem Beginn des Readers angegeben ist. |
000015 |
DC.B wert |
CPU-Byte Wert 0 = Für alle CPU's geeignet Wert 1 = Nur für 68008 geeignet Wert 2 = Nur für 68000/68010 geeignet Wert 4 = Nur für 68020 geeignet |
000016 |
DC.B 0,0 |
Keine Verwendung Reserviert für Erweiterungen. |
000018 |
DC.L 0,0 |
Keine Verwendung Abstand zum nächsten Eintrag, falls verwendet. |
Unmittelbar nach einem Header dürfen weitere Headerangaben folgen, die sich nicht an die 1024 Bytes Grenze halten müssen. Das ist insbesonderesinnvoll, wenn viele kleine Programme die Pibliotheksfunktion nutzen sollen.
Absolute und relative Adressierung
Die übliche Verwendung der Bibliotheksfunktion ist eine Zusammenstellung von Programmen und Routinen, die in einem EPROM abgelegt werden und an einer beliebigen Adresse auf einer Speicherkarte verwendet werden soll. In diesem Fall verbietet sich die Nutzung von absoluter Adressierung, da ein solches Programm nur an der Adresse ausgeführt werden können, für diese es übersetzzt wurde.
Die folgende Tabelle stellt die Programmiertechniken der absoluten und relativen Adressierung gegenüber. Auf der rechten Seite sind für übliche Programmkonstrukte Ersatzcodierungen angegeben, die an einer beliebigen Speicheradresse ausführbar sind.
Funktion |
Absolute Adressierung |
Relative Adressierung |
Zugriff auf Tabellen und Konstanten im verschiebbaren Speicherbereich (zum Beispiel im EPROM). |
LEA TABELLE, A0 ... TABELLE: DB.B ... |
LEA TABELLE(PC), A0 ... TABELLE: DC.B ... |
Zugriff auf Variablen und Felder im verschiebbaren Speicherbereich (zum Beispiel RAM hinter dem EPROM).
Benötigt ein freies Adressregister. BASIS muss ebenso wie ORG definiert werden. |
MOVE ALPHA, D0 ADD #1,D0 MOVE D0, ALPHA ... ALPHA: DB.W 0 |
BASIS EQU 0 ... LEA BASIS, A5 MOVE ALPHA(A5), D0 ADD #1, D0 MOVE D0, ALPHA(A5) ... ALPHA: DC.W 0 |
Zugriff auf Variablen und Felder in festem Speicherbereich. |
MOVE ALPHA, D0 ADD #1,D0 MOVE D0, ALPHA ... ALPHA: DB.W 0 |
MOVE ALPHA, D0 ADD #1,D0 MOVE D0, ALPHA ... ORG $A000 OFFSET 0 ALPHA: DB.W 0 |
Sprünge über mehr als +/- 32 kByte |
JSR LABEL |
JSR LABEL(PC) |
Absolute und relative Adressierung mit 2 Programmen
Durch die Anweisung ORG $9C00 wird das Programm an eine feste Adresse im Speicher übersetzt. Dadurch werden auch absolute Adressen in den Bibliotheks-Header eingesetzt, da die Labels PROG1 und PROG2 bereits die effektiven Werte tragen.
Bibliotheksfunktion absolute Programmierung |
ORG $9C00
DC.L $55AA0180 ; Kennung
DC.B 'PROG1 ' ; Programmname 1
DC.L PROG1 ; Startadresse Programm 1
DC.L PROG2-PROG1 ; Länge Programm 1
DC.B 0 ; Absolute Adressierung verwenden
DC.B 0,0,0 ; reserviert
DC.L 0,0 ; reserviert
DC.L $55AA0180 ; weitere Kennung
DC.B 'PROG2 ' ; Programmname 2
DC.L PROG2 ; Startadresse Programm 2
DC.L ENDE-PROG2 ; Länge Programm 2
DC.B 0 ; Absolute Adressierung verwenden
DC.B 0,0,0 ; reserviert
DC.L 0,0 ; reserviert
PROG1:
MOVE #90, D0 ; Beispielroutine 1
ADD #1, D0
RTS
PROG2:
MOVE #90, D0 ; Beispielroutine 2
SUB #1, D0
RTS
ENDE:
END
|
Durch die Anweisung ORG $0 wird das Programm so übersetzt, als wolle man es ab der Adresse 00000 ablegen. Durch die Anweisung OFFSET $9C00 wird der Assembler angewiesen, den generierten Maschinencode ab der Adresse 09C00 abzulegen. Im Bibliothekskopf wird angegen, dass es sich um ein Programm mit relativer Adressierung handelt. Zu beachten ist besonders, dass alle Adressangaben relativ zu der ersten Programmkennung angegeben werden müssen. Aus diesem Grund muss beim zweiten Programm von der Startadresse 32 (entspricht der Länge eines Headers) abgezugen werden. Bei einem dritten Programm müssten demnach 64 abgezogen werden.
Bibliotheksfunktion relative Programmierung |
ORG $0 ; *)siehe Text
OFFSET $9C00 ; *)siehe Text
DC.L $55AA0180 ; Kennung
DC.B 'PROG1 ' ; Programmname 1
DC.L PROG1 ; Startadresse Programm 1
DC.L PROG2-PROG1 ; Länge Programm 1
DC.B 1 ; Relative Adressierung verwenden
DC.B 0,0,0 ; reserviert
DC.L 0,0 ; reserviert
DC.L $55AA0180 ; weitere Kennung
DC.B 'PROG2 ' ; Programmname 2
DC.L PROG2-32 ; Startadresse Programm 2, *)siehe Text
DC.L ENDE-PROG2 ; Länge Programm 2
DC.B 1 ; Relative Adressierung verwenden
DC.B 0,0,0 ; reserviert
DC.L 0,0 ; reserviert
PROG1:
MOVE #90, D0 ; Beispielroutine 1
ADD #1, D0
RTS
PROG2:
MOVE #90, D0 ; Beispielroutine 2
SUB #1, D0
RTS
ENDE:
END
|
|