|  | Die Bibliotheksfunktion des GrundprogrammsDurch 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 Headers 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 AdressierungDie ü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 ProgrammenDurch die AnweisungORG $9C00wird das Programm an eine feste Adresse im Speicher übersetzt. Dadurch werden auch absolute Adressen in den Bibliotheks-Header eingesetzt, da die LabelsPROG1undPROG2bereits 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 $0wird das Programm so übersetzt, als wolle man es ab der Adresse 00000 ablegen. Durch die AnweisungOFFSET $9C00wird 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
 |  
 
 |