ndr-nkc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

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