-
Diese Erfindung betrifft rechnergesteuerte Drucker,
die empfangene Daten in mehr als einem Protokoll oder "Sprache" interpretieren.
-
Diese Erfindung beinhaltet den Einbau
von Codeverkettungstabellen und -routinen in einen Drucker, um zu
ermöglichen,
dass heruntergeladener Code in den Code der Vorrichtung verkettet
wird. Der primäre
Zweck besteht darin, zu ermöglichen,
dass ein Drucker, der Code aufweist, um eine oder mehrere spezielle
Seitenbeschreibungssprachen zu interpretieren, zusätzlichen
Code empfängt,
der ermöglicht,
dass der Drucker eine unterschiedliche Seitenbeschreibungssprache
verarbeitet, wobei er viel von dem Interpretierercode verwendet,
der sich schon im Drucker befindet.
-
Die FR-A-2633410, gegen die die Ansprüche abgegrenzt
sind, offenbart einen Etikettendrucker mit einem Mikroprozessor
und einem EEPRom, das eine Tabelle von Adressen von optionalen Routinen
enthält.
Die Tabelle kann von einem Hauptrechner zur Modifikation heruntergeladen
werden, um die optionalen Routinen zu validieren oder zu annullieren.
-
Die EP-A-0469974 offenbart einen
Drucker, der Druckjobs empfängt,
die in einer beliebigen von mehreren Druckersteuersprachen codiert
sind. Die ankommenden Daten werden durch den Drucker unter Verwendung
von statistischen Techniken analysiert, um die verwendete PDL zu
detektieren und um die geeignete Emulation auszuwählen.
-
Der QMS 1660-Drucker, der von QMS,
Inc., hergestellt wird, empfängt
heruntergeladene Daten, was dazu führt, dass der Drucker neue
Daten interpretiert, aber wie dies durchgeführt wird, ist unbekannt. Das
Herunterladen von Routinen ist bekannt. In der Drucktechnik ist
es bekannt, Fontaufbereiter und kundenspezifische Operatoren herunterzuladen. Das
US-Patent No. 5,222,200 an Callister at al. offenbart einen Drucker,
der eingebetteten Code aufweist, um den Interpretierercode für die Sprache,
die empfangen wird, automatisch zu verwenden. Das US-Patent No.
5,179,690 an Ishikawa offenbart eine rechnergesteuerte Anzeigevorrichtung,
die ein Emulationssystem eingebettet aufweist, das Daten während einer
Emulation substituiert. Das US-Patent 5,353,388 an Motoyama offenbart
ein Dokumentenverarbeitungssystem, das auf Dokumente einwirkt, die
in unterschiedlichen Sprachen gespeichert sind.
-
Obwohl Druckercode auf eine Standardweise
kompiliert wird, bei der eine verfügbare Tabelle von Routinen
und ihre Stelle in dem Code vorliegt, der durch den Kompilierer
verwendet wird, wird diese im endgültigen Code nicht benötigt und
ist nicht Teil von ihm. Demgemäß umfasste
ein Druckercode vor dieser Erfindung keine Tabelle von Routinen
und ihre Stelle.
-
Die Erfindung stellt einen Drucker
und ein Verfahren zum Hinzufügen
einer Funktion zu einem vorhandenen Drucker bereit, wie in den Ansprüchen definiert.
-
Gemäß dieser Erfindung weist der
Druckercode eine Tabelle von Routinen und ihren Stellen auf. Da
eine solche Tabelle sehr lang ist, wird sie vorzugsweise komprimiert.
Zusätzlich
umfasst der Druckercode eine Verkettungsroutine, die im Wesentlichen Standard
sein kann. Zum Drucker heruntergeladene Daten, um einen zusätzlichen
Interpretierer zum Drucker hinzuzufügen, rufen die Verkettungsroutine
auf und stellen Befehle zur Verkettung bereit. Vorzugsweise liegen
die heruntergeladenen Daten in hohem Maße in Objektcodeform vor und
brauchen nur durch Hinzufügung
der Stelle von Routinen von der Routinetabelle im Drucker und durch
Speichern des fertiggestellten Code und der Adressen, an denen er
gespeichert ist, vervollständigt
zu werden. Die Routinetabelle im Drucker kann permanent im Drucker
installiert sein oder zu dem Zeitpunkt heruntergeladen werden, wenn
ein zusätzlicher
Interpretierer gebildet werden soll.
-
Es sollte ersichtlich sein, dass
der Begriff "Routine" im Kontext dieser
Erfindung das Speichern von Variablen umfasst, die durch verschiedene
funktionelle Routinen verwendet werden können. Variable können beliebige
Daten sein, die einer Änderung
unterworfen sind, wie z. B. Daten, die definieren, wenn die Bedienperson
eine Papiergrößenauswahl
eingegeben hat, oder Daten, die definieren, ob ein Drucken auf einer
Seite des Papiers oder auf beiden Seiten (als Duplex bezeichnet)
stattfinden soll.
-
Die Einzelheiten dieser Erfindung
werden nur anhand eines Beispiels in Verbindung mit der beigefügten Zeichnung
beschrieben, bei der 1 für einen
Drucker veranschaulichend ist und 2 ein Flussdiagramm
der Verkettung ist, die durch den Drucker vorgenommen wird.
-
Ein Drucker 1, der veranschaulichend
in 1 dargestellt ist,
ist ein Standard-Laserdrucker, der weitverbreitet durch den Rechtsnachfolger
dieser Erfindung verkauft wird, der den internen Code aufweist,
um PostScript(Schutzmarke)- und PCL(Schutzmarke)-Seitenbeschreibungssprachen sowie
PJL, einen Steuercodesatz, den Rücksetztcode
SIC (zum Setzen von Anfangsbedingungen) zu interpretieren und um
von heruntergeladenen Bitmaps zu drucken, die durch Windows-(Schutzmarke)-Software
erzeugt sind. Der Drucker 1 wird durch einen Mikroprozessor 3 gesteuert,
der einen Standard-Festwertspeicher oder ein ROM 5 und
Lese/Schreib-Speicher, DRAM, 7 aufweist. Heruntergeladener
Code kann zur Verwendung durch den Mikroprozessor 3 in
nichtflüchtigem
Direktzugriffsspeicher 9 gespeichert sein, der ein Flash-Speicher
oder Magnetplattenspeicher sein kann, wie es nun bekannt ist. Der
veranschaulichte Drucker 1 weist ein optisches System 11 auf,
das auf einer fotoleitenden Trommel 13 betriebsfähig ist.
Die Trommel 13 ist mit Toner beaufschlagt und überträgt das Tonerbild,
das durch ein optisches System 5 definiert ist, an einer Übertragungsstation 15 auf
Papier 17. Das Bild wird typischerweise durch Wärme an einer
Fixierstation 19 fixiert, und die fertiggestellte Druckseite
wird zur Ausgabeablage 21 abgegeben. Der Drucker 1 empfängt zu interpretierenden
Code und heruntergeladenen Code auf einem Kabel 23 und
weist eine Bedienperson-Steuertafel auf, die als Schalter 25 dargestellt ist.
-
Der Drucker 1 ist sowohl
mit einer Tabelle von Routinen als auch ihrer Adresse im ROM 5 konfiguriert.
Zusätzlich
ist Code zum Verketten von heruntergeladenen Codes im ROM 5 gespeichert.
Es sollte ersichtlich sein, dass der Begriff "Routine" im Kontext dieser Erfindung das Speichern
von Variablen umfasst, die durch mehr als eine funktionale Routine
verwendet werden können.
Variablen definieren Faktoren, die einer Änderung unterworfen sind, wie
z. B. eine Papierablageauswahl, Interrupteingabe von einer Bedienperson-Steuertafel
und jeglichen anderen solchen Faktor. Der Begriff "Symbol" wird manchmal verwendet,
um sowohl funktionale Routinen als auch Variablen zu umfassen. Diese
Terminologie ist hier unnötig,
da der Begriff "Routine" so verstanden wird,
dass er zugehörige
Variablen umfasst.
-
Der Code, der heruntergeladen werden
soll, um einen Interpretierer zum Drucker 1 hinzuzufügen, wird
zuerst aufbereitet. Dieser herunterladbare Code wird zuerst erzeugt,
indem ein Standardkompilierer und Linker verwendet wird. Der Kompilierer
führt die übliche Aufgabe
eines Kompilierens von allen Quellencodemodulen in Objektcodedateien
aus; dann kombiniert der Linker die Objektdateien in eine gemeinsame
Objektdateiformat(häufig
als COFF abgekürzt)-Datei.
Während
die Ausgabedateien der meisten Linker bereit sind (oder nahezu bereit)
ausgeführt zu
werden, ist die COFF-Datei für
einen heruntergeladenen Interpretierer gemäß dieser Erfindung bei weitem
nicht für
eine Ausführung
bereit. Viele von den Funktionen und Datenvariablen, die von dem
Interpretierer adressiert werden, sind im Drucker 1 resident
und sind zu diesem Zeitpunkt für
den Linker nicht verfügbar.
Diese werden "externe" Routinen genannt.
Die externen Routinen sind zu diesem Zeitpunkt nicht verfügbar, aber
sie sind in einem Abschnitt der COFF-Datei eingeschlossen, der "Relokalisierungstabellen" genannt wird, die
Vorschriften für weitere
Operationen der in Beziehung stehenden Daten, die Rohdaten genannt
werden, enthalten. Außerdem
kann auf die Funktionen und Daten, die zu dem Interpretierer selbst
gehören
(die als "interne" Routinen bezeichnet
werden), nicht vollständig
eingewirkt werden, weil ihre endgültige Anordnung davon abhängt, wo
sie genau durch den Mikroprozessor 3 gespeichert werden,
wenn der Interpretierer mit dem Drucker 1 integriert ist.
Folglich ist die COFF-Datei nur teilweise verkettet, und es wird
beträchtlich
mehr Datenverarbeitung erfordert, bevor der Interpretierer ausgeführt wird.
-
Ein kundenspezifisches Tool, der
COFF-Datei-Präprozessor,
wird als Nächstes
verwendet, um die teilweise verkettete COFF-Datei zu verarbeiten. Der
Präprozessor
beendet jegliche Arbeit, die nicht von dem Druckersystem abhängt, und
reorganisiert die Inhalte, so dass die Verarbeitung und die Betriebsmittel,
die von dem Drucker 1 erfordert. werden, minimiert sind.
Der Präprozessor
erzeugt eine separate Datei, die einfach als die "vorverarbeitete" Datei bekannt ist,
als seine Ausgabe, da sich die reorganisierte Datei nicht länger im
gemeinsamen Objektdateiformat befindet. Die folgende Liste stellt
die Hauptkomponenten einer COFF-Datei und ihre Reihenfolge in der
COFF-Datei dar: COFF-Datei-Header, Abschnitt 1-Rohdaten, Abschnitt
2-Rohdaten ........ Abschnitt n-Rohdaten,
Abschnitt 1-Relokalisierungstabellen, Abschnitt 2-Relokalisierungstabellen
........ Abschnitt n-Relokalisierungstabellen, Routinetabelle.
-
Die COFF-Datei-Header kennzeichnen
im Wesentlichen, wieviel Daten in sämtlichen Komponenten sind und
wo sie alle lokalisiert sind. Die Rohdatenabschnitte sind Sätze von
Programmcode, verschiedene Typen von Daten oder in einigen Fällen bloß Information.
Die Relokalisierungstabellen geben an, welche von den Rohdatenelementen
aufgelöst werden
müssen.,
und welche Routine in der Routinetabelle verwendet werden soll,
um sie aufzulösen. Die
Routinetabelle enthält
alle Routinenamen (Programmfunktionen und Variablennamen), auf die
in den Rohdatenabschnitten Bezug genommen wird, und eine Feststellung
darüber,
wo die Routine lokalisiert ist (einschließlich eines Vermerks, um anzuzeigen,
ob sie ein "externes" Symbol ist).
-
Der Präprozessor verwirft zu Beginn
jegliche Informationsabschnitte, da sie nur zur Dokumentation sind
und keinerlei Code oder Daten enthalten, die für eine Ausführung notwendig sind. Dies
wird erzielt, indem der Informationsabschnitt von Rohdaten nicht zur
vorverarbeiteten Ausgabedatei geschrieben wird und der Vermerk von
seinem Vorhandensein in den Headern gelöscht wird.
-
Der Präprozessor gewinnt nun nur die "externen" Routinen von der
Routinetabelle und schreibt diese reduzierte Tabelle von externen
Routinen zum Anfang der Ausgabedatei. Die externen Routinen sind
diejenigen, die im Speicher von Drucker 1 gespeichert sind
und benötigt
werden, um das endgültige
Verketten im Drucker 1 zum Zeitpunkt eines Herunterladens
auszuführen.
Die internen Routinen werden während
dieser Vorverarbeitungsphase verarbeitet. Die reduzierte Externroutinetabelle
ist viel kleiner als die COFF-Routinetabelle (typischerweise weniger
als 10%) und ihre Platzierung an den Anfang der Datei erleichtert
die Verarbeitung, die durch den Drucker 1 zum Zeitpunkt
eines Herunterladens erfordert wird.
-
Der Präprozessor beginnt nun seine
Relokalisationsverarbeitung. Ein Abschnitt von Rohdaten wird zusammen
mit den Relokalisationstabellen desselben Abschnitts wiedergewonnen
und in Verbindung mit der Routinetabelle der COFF-Datei (der nicht
reduzierten) verarbeitet. Jedes Relokalisierungstabellenelement
kennzeichnet ein Code- oder Datenelement im Rohdatenabschnitt, die
Ziffer des zugehörigen
Funktions- oder Datenvariablennamens in der Routinetabelle und den
Typ von Relokalisation, der erreicht werden soll. Wenn sich ein
Relokalisationstabellenelement auf einen Externroutinenamen bezieht,
kann es zu diesem Zeitpunkt nicht aufgelöst werden, und wird zur Ausgabedatei
weitergeleitet, um durch den Drucker 1 verarbeitet zu werden.
Wenn sich das Relokalisierungstabellenelement auf eine interne Routine
bezieht, löst
der Präprozessor
die Routine in Bezug zum zugehörigen
Rohdatenabschnitt auf. Die sich ergebende Auflösung wird in das Rohdatenelement
gemischt, und ein Vermerk wird zum Relokalisationstabellenelement
hinzugefügt,
um anzuzeigen, dass die Basisadresse davon, wo der Abschnitt schließlich durch
den Drucker 1 lokalisiert wird, mit dem Rohdatenelement
vermischt werden muss, um die endgültige Relokalisierung zu vervollständigen.
Man beachte, dass der interne Routinename nicht länger benötigt wird,
so dass er verworfen wird.
-
Wenn ein ganzer Abschnitt relokalisiert
worden ist, werden seine Rohdaten zur Ausgabedatei geschrieben,
gefolgt von seinen Relokalisierungstabellen. Wenn alle Abschnitte
verarbeitet sind, werden die Rohdaten und Relokalisierungstabellen
in der Ausgabedatei dazwischengeschrieben. Dies steht im Gegensatz
zur ursprünglichen
COFF-Datei, die alle Rohdatenabschnitte zusammen aufwies, gefolgt
von allen Relokalisierungstabellen. Da der Drucker 1 drei Dinge
benötigt,
um mit der Verarbeitung zu beginnen (Rohdaten, Relokalisierungstabelle
und Routinetabelle), ermöglicht
diese Reorganisation, dass der Drucker 1 seine Verarbeitung
etwas früher
beginnt. Das normale COFF-Dateiformat würde erfordern, dass die ganze
Datei heruntergeladen wird und in einem temporären Betriebsmittel beiseitegesetzt
wird, bevor mit einer Verarbeitung begonnen wird. Die reorganisierte
vorverarbeitete Ausgabedatei befindet sich in der Reihenfolge, die
im Folgenden dargestellt ist: vorverarbeiteter Dateiheader, Externroutinetabelle,
Abschnitt 1-Rohdaten, Abschnitt 1-Relokalisationstabellen, Abschnitt
2-Rohdaten, Abschnitt 2-Relokalisationstabellen........ Abschnitt
n-Rohdaten, Abschnitt
n-Relokalisationstabellen.
-
Dies vervollständigt die Aufbereitung von Code,
der zum Drucker 1 herunterzuladen ist. Der Drucker 1 weist
eine Routinetabelle im ROM 5 gespeichert auf, die jede
Routine enthält,
die ein derartiger Herunterladecode aufrufen könnte. Solche Routinen einschließlich Variablen
können
sich in einigen Anwendungen auf etwa 8.000 belaufen und etwa 15.000
oder mehr in anderen Anwendungen, abhängig von der Anzahl und Komplexität des Interpretierers
oder der Interpretierer, die zum Drucker 1 heruntergeladen
werden sollen. Dies sind die externen Routinen. Sämtliche
von diesen externen Routinen sind notwendigerweise vorhandene Routinen,
da es ein Zweck dieser Erfindung ist, einen maximalen Gebrauch von
Routinen zu machen, die bereits im Drucker 1 sind. Repräsentative
funktionale Routinen (wie von Variablen unterschieden), die in der
Routinetabelle gefunden werden, sind wie folgt:
-
Mathematische
Funktionen
-
- 1. Dividiere vorzeichenbehaftete Zahl durch
eine andere vorzeichenbehaftete Zahl.
- 2. Multipliziere Zahlen.
- 3. Dividiere vorzeichenlose Zahlen durch vorzeichenlose Zahlen.
- 4. Berechne Quadratwurzel von Zahlen, niedrigste Genauigkeit.
- 5. Berechne Quadratwurzel von Zahlen, doppelte Genauigkeit.
- 6. Berechne Exponent einer Zahl, niedrigste Genauigkeit.
- 7. Berechne Winkel, welchen mit Tangens einer gegebenen Zahl.
-
Zeichenmanipulationsdienste
-
- 1. Strlen – Bestimme
die Länge
einer Zeichenkette.
- 2. Strcmp – Vergleiche
eine Zeichenkette mit einer anderen.
- 3. Strncmp – Vergleiche
einen Teil einer Zeichenkette mit einem anderen.
- 4. Strncpy – Kopiere
einen Teil einer Zeichenkette zu einem anderen.
- 5. Strncat – Hänge einen
Teil einer Zeichenkette an einen anderen an.
- 6. Strcat – Hänge eine
Zeichenkette an eine andere an.
- 7. Memset – Setze
einen Speicherblock auf einen gegebenen Wert.
- 8. Memcpy – Kopieren
von Speicherblock.
-
Konvertierungen
-
- 1. Cnvfp2si – Konvertiere eine relle Gleitkommazahl
in eine vorzeichenbehaftete Ganzzahl.
- 2. Cnvfp2dp – Konvertiere
eine relle Gleitkommazahl in eine Ganzzahl doppelter Genauigkeit.
- 3. Cnvdp2ui – Konvertiere
eine Ganzzahl doppelter Genauigkeit in eine vorzeichenlose Ganzzahl.
- 4. Cnvdp2fp – Konvertiere
eine Ganzzahl doppelter Genauigkeit in eine relle Gleitkommazahl.
- 5. Cnvui2dp – Konvertiere
eine vorzeichenlose Ganzzahl in eine Ganzzahl doppelter Genauigkeit.
- 6. Cnvui2fp – Konvertiere
eine vorzeichenlose Ganzzahl in eine relle Gleitkommazahl.
- 7. Cnvsi2fp – Konvertiere
eine vorzeichenbehaftete Ganzzahl in eine relle Gleitkommazahl.
- 8. Cnvdp2si – Konvertiere
eine Ganzzahl doppelter Genauigkeit in eine vorzeichenbehaftete Ganzzahl.
- 9. Cnvsi2dp – Konvertiere
eine vorzeichenbehaftete Ganzzahl in eine Ganzzahl doppelter Genauigkeit.
- 10. Cnvfp2ui – Konvertiere
eine relle Gleitkommazahl in eine vorzeichenlose Ganzzahl.
-
Druckfunktionen
-
- 1. Führe
die X-, Y-Koordinaten eines Elementes zurück.
- 2. Erzeuge ein Liniensegment zwischen (0,0) und einem Punkt
P.
- 3. Mache einen Font überall
im System verfügbar.
- 4. Erzeuge einen Kreisbogen, der durch drei Punkte spezifiziert
ist.
- 5. Invertiere die Intensitäten
in einem Bild.
- 6. Drucke die Seite.
-
Obwohl die Routinen im Standarddrucker
im Allgemeinen in demselben Speicherblock gespeichert sind, gilt
dies nicht für
eine die Routinen kennzeichnende Tabelle, da es typischerweise keinen
Bedarf dafür
gibt, dass ein Standarddrucker eine solche Tabelle aufweist, nachdem
der Code kompiliert ist.
-
Das ROM 5 des Druckers 1 enthält auch
Code, um das endgültige
Verketten des heruntergeladenen Code auszuführen, was erfordert: Anwenden
der Routinen der Routinetabelle, wie durch die Relokalisationstabellen
gelenkt, sowie Bestimmen des verfügbaren Datenspeicherraums und
Speichern von verkettetem Code zu einem solchen Raum. Solche Funktionen
sind Standardtechniken und folglich werden sie nicht ausgearbeitet.
Demgemäß trägt der heruntergeladene
Code entweder einen Header, der den Verkettungsprozess des Mikroprozessors 3 aktiviert,
oder dieser wird von einer Steuertafel des Druckers 1 aktiviert.
-
In der gerade beschriebenen Ausführungsform
ist der resultierende Code im Drucker 1 ein neuer Interpretierer,
der möglichst
viel vorhandenen Code im Drucker 1 verwendet. Er verlangt
deshalb keinen übermäßigen Speicherraum.
Die Routinetabelle im Drucker 1 ist in Druckern nicht üblich und könnte große Mengen
an Speicher erfordern. Deshalb wird die Routinetabelle komprimiert,
wobei die bevorzugte Komprimierung wie folgt ist:
-
Komprimierung von Routinetabelle
-
Ein Dienstprogramm zur Komprimierung
erzeugt die komprimierte Routinetabelle, indem jede Systemroutine
gewonnen wird, die durch den heruntergeladenen Code benötigt werden
mag. Eine Speicherstelle von sämtlichen
solchen Routinen wird durch Überprüfung des
ursprünglichen
Betriebssystemcode des Druckers 1 gefunden. Der Name und die
Adresse sind in einer verhältnismäßig kleinen Kennzeichnungsziffer
codiert, und die Routinetabelle ist eine Datei, die sämtliche
codierten werte enthält. Das
Komprimierungsverfahren, das verwendet wird, verringert die Menge
an erforderlichem Speicher für die
Namen von etwa 14 Byte (ein Byte ist acht Bit) pro mittlerem Symbolnamen
auf etwa 2,5 Byte und von 4 Byte pro Adresse auf etwa 3 Byte. Für ein repräsentatives
System, das 10.000 Routinen enthält,
ist die Gesamtverringerung von 180.000 Byte auf 55.000 Byte.
-
Jeder Routinenamen in der Routinetabelle wird
durch eine Sequenz von Byte repräsentiert,
die in ASCII codiert sind, was ein Byte (d. h. acht Bit) für jedes
Zeichen ist. Das Komprimierungsprogramm reorganisiert die Namen
in Sätze
gemäß der Länge der ASCII-Codierung.
Jeder Satz von Symbolen wird dann separat verarbeitet. Bei der Verarbeitung
von jedem Satz von Routinen wird jede Routine mit drei Werten codiert
-- der erste ist ein 14 Bit-Wert, der zweite ist ein 8 Bit-Wert
und der dritte ist ein 8 Bit-Wert. Der 14 Bit-Wert ist die einfache
arithmetische Summe des "zugewiesenen
Werts" von jedem Zeichen
im Routinenamen. Der zweite codierte Wert ist eine logische Summe
(EXKLUSIV-ODER-Verknüpfung)
von jedem Zeichen in dem Namen, kombiniert mit der kumulativen arithmetischen
Summe der Zeichen bis zu diesem Punkt (d. h. das 1ste EXKLUSIV-ODER-verknüpft mit
Null, dann zu dem 1sten hinzugefügt,
das 2te dann EXKLUSIV-ODER-verknüpft
mit dem Ergebnis und die Summe des 1ten und 2ten dazu hinzugefügt usw.).
Der dritte codierte Wert ist eine alternierende arithmetische Summe
der Zeichen in den ungeradzahligen Positionen (1ste, 3te, 5te usw.)
mit einer logischen Summe der Zeichen in den gradzahligen Positionen
(d. h. das 1ste zu Null hinzugefügt,
dann das 2te EXKLUSIV-ODER-verknüpft
mit dem Ergebnis, dann das 3te dazu hinzugefügt usw.).
-
Die Codierverfahren sind das Ergebnis
von Versuch und Beobachtung. Das Ziel besteht darin, an einem codierten
Ergebnis anzulangen, das gegenüber
allen anderen Ergebnissen in dem Satz von allen Routinenamen einer
gegebene Länge
eindeutig ist. Die Menge an Speicher, die für ein codiertes Ergebnis erforderlich
ist, hängt
davon ab, wie schnell ein eindeutig codierter Wert erreicht werden
kann (wenn der 14 Bit-Wert für
einen gegebenen Namen eindeutig ist, ist kein weiteres Codieren
notwendig). Der "zugewiesene
Wert" jedes Zeichens,
der in der arithmetischen und logischen Summe verwendet wird, ist
ein willkürlicher
Wert, der für
jedes Zeichen anstelle seines ASCII-Zeichencode verwendet wird.
Die zugewiesenen Werte sind verteilt, statt dass sie sequenziell
sind, um die Wahrscheinlichkeit zu verringern, dass verschiedene
Kombinationen von Zeichen dieselbe Summe erzeugen.
-
Nachdem nach Ausführung die Codierungen für alle Routinen
einer gegebenen Länge
erzeugt sind, wird die Liste von Codierungen analysiert. Für jede Codierung,
wo der erste 14 Bit-Wert eindeutig ist, werden die Bit 00 an diese
Größe vorn
angehängt,
um sie zu einer 16 Größe zu machen
und um anzuzeigen, dass die Codierung 16-Bit ist. Die zwei acht
Bit-Codierungen werden verworfen. Für jede Codierung, wo der 22
Bit-Wert (erste Codierung und zweite Codierung) eindeutig ist, werden
die Bit 01 zu der Vorderseite dieser Größe hinzugefügt, um sie zu einer 24 Bit-Größe zu machen
und um anzuzeigen, dass die Codierung 24 Bit ist. Für jede Codierung,
wo der 30 Bit-Wert (erste Codierung und zweite Codierung und dritte
Codierung) eindeutig ist, werden die Bit 1 gefolgt von 0 an diese
Größe vorn
angehängt, um
sie zu einer 32 Bit-Größe zu machen
und um anzuzeigen, dass die Codierung 32 Bit ist. Für diejenigen
Codierungen, die nicht eindeutig sind, selbst aus 30 Bit, werden
die Bit 1 und 1 an die 14 Bit-Arithmetiksumme
vorn angehängt,
die zwei acht Bit-Codierungen werden verworfen, und die ASCII-Zeichen, die
den vollen Routinename umfassen, werden an ihrem Ort substituiert.
Der volle Routinename ist immer eindeutig, sonst würde ein
ursprünglicher
Code im Drucker 1 nicht richtig kompiliert und verkettet
haben.
-
Ergebnisse von diesen Codierverfahren sind:
etwa zweidrittel der Systemroutinen erfordern nur den ersten codierten
Wert (14 Bit-Arithmetiksumme), gut über 99 Prozent sind eindeutig,
wenn man das erste und zweite Codierverfahren verwendet, und praktisch
alle sind eindeutig, wenn man alle drei codierten Werte verwendet.
Typischerweise brauchen bloß höchstens
einer oder zwei den vollen Routinename spezifiziert aufzuweisen.
-
Das Codieren der Adressen von Routinen
ist ganz verschieden. Die Adressen können jegliche Zahl zwischen
0 und 4 Milliarden sein (eine vorzeichenlose 32-Bit-Hexadezimalzahl) und eignen sich nicht
gut für
Codierverfahren. Es wird etwas Raum mit dem folgenden Verfahren
gespart: Ein Satz von 64 "Basiswerten" wird als ein Ausgangspunkt
zum Verringern der Adressen hinunter zu kleinen Zahlen vorgesehen.
Für eine
gegebene Adresse wird der größte Basiswert
gefunden, der nicht größer als
die Adresse ist. Die Differenz zwischen der Adresse und dem Basiswert
wird gespeichert, wobei führende
Nullen entfernt sind. Die Differenz ist normalerweise eine verhältnismäßig kleine
Zahl mit einigen führenden Null-Byte.
-
Die gespeicherten komprimierten Daten
bestehen aus einem Steuerbyte gefolgt von den geeigneten signifikanten
Byte. Das Steuerbyte wiederum enthält zwei codierte Felder. Zwei
Bit definieren die Anzahl von signifikanten Byte, die dem Steuerbyte folgen
(00 für
1, 01 für
2, 10 für
3 und 11 für
4). Die anderen 6 Bit definieren, welcher von den 64 Basiswerten
beim Codieren verwendet wurde. Das anschließende Decodieren des Routinewerts
kehrt den Prozess um. Die ersten zwei Bit des Steuerbyte werden
verwendet, um die geeignete Anzahl von signifikanten Byte zu gewinnen,
führende
Null-Byte werden vorn angehängt,
und die resultierende Zahl wird mit dem Basiswertbetrag addiert,
der durch die niederwertigeren sechs Bit des Steuerbyte spezifiziert
ist. Die 64 Basiswerte sind Null und die nächsten 55 Inkremente von 10000
in hexadezimal (hex) (was 65.536 in dezimal ist) (d. h. Null, 10000
[hex], 20000 [hex] usw.). Diese variieren jeweils vom nächsten um 65.536
in dezimal, wobei der höchste
3.604.408 in dezimal ist. Diese sind die nächstgelegenen zu den Adressen
der funktionalen Routinen. Die Variablen sind durch viel höhere Adresszahlen
lokalisiert und um sich diesen anzupassen, werden sieben Inkremente,
beginnend mit 20000000 hex (was 536.870.912 in dezimal ist), die
von dem nächsten um
10000 hex (65.536 in dezimal) variieren, verwendet, wobei der höchste von
diesen sieben 537.264.128 dezimal ist. Schließlich ist eine Basis 28000000
hex (671.088.640 dezimal), um sich den allerhöchsten Zahlen anzupassen.
-
Dieses Codierverfahren reduziert
den mittleren Raum, der pro Routineadresse erforderlich ist, von
vier Byte auf drei. In der überwältigenden
Mehrheit von Fällen
enthält
der Unterschied zwischen der Routineadresse und dem nächstgelegenen
Basiswert zwei führende
Null-Byte und zwei signifikante Byte. Folglich sind drei Byte erforderlich,
um sie zu codieren, statt der vier Byte, die für den einfachen nichtcodierten
Wert erforderlich sein würden.
-
Verkettung durch den Drucker
-
Die Verkettungsschritte dieser bevorzugten Ausführungsform
sind in 2 veranschaulicht.
Zu Beginn empfängt
natürlich
der Drucker 1 die vorverarbeiteten Dateidaten, Funktion 20,
wobei mit der Externroutinetabelle angefangen wird und dann mit Rohdaten 1 und
ihren Relokalisationstabellen 1 begonnen wird, unmittelbar
gefolgt von anderen Rohdaten und ihren zugehörigen Relokalisationstabellen. Eine
Verkettung im Drucker 1 kann mit dem Empfang der Externroutinetabelle
und den Rohdaten 1 und Relokalisationstabellen 1 beginnen.
-
Die Daten werden in Funktion 22 auf
Rohdaten überprüft. Wenn
ja, wird in der nächsten
Funktion, Funktion 24, die Relokalisationstabelle auf Verwendung
einer externen Routine überprüft. Wenn
nein, werden die zugehörigen
Adressen mit den Rohdaten kombiniert, und sie werden im Drucker 1 in
Funktion 26 gespeichert. Wenn ja, wird in Funktion 28 der
Routinename verwendet, um ihre Größe (ein Anfangselement beim
Dekomprimieren) und die drei codierten Werte zu bestimmen, durch
welche die Stelle der Routine in der eingebetteten Tabelle im Drucker 1 gefunden
wird. Dann wird in Funktion 30 die Routine entsprechend
den Befehlen von ihren Relokalisationstabellen auf die Rohdaten
angewandt, und zugehörige
Adressen werden mit den Rohdaten kombiniert und im Drucker 1 gespeichert.
-
Bei jeder Beendigung von Funktion 30 und Funktion 26 kann
wieder Funktion 22 (obwohl nicht dargestellt) aufgerufen
werden, um empfangenen Code auf weitere Rohdaten zu überprüfen. Wenn
diese Operation von 22 ja ist, kehrt die Datenverarbeitung
zur Funktion 24 zurück.
Wenn nein, speichert die Datenverarbeitung in Funktion 32 den
ganzen Code in einer permanenten Stelle (normalerweise Flash-Speicher)
und schreitet zur Funktion 34 fort, bei der die heruntergeladene
vorverarbeitete Datei verworfen wird und die Datenverarbeitung beendet wird.
-
Schluss
-
Es wird angemerkt, dass die Erzeugung
des vorverarbeiteten Code ohne sofortige Zeit- oder Speichergrößenbeschränkungen
durchgeführt
wird und einmal für
wiederholte Wiederverwendung durchgeführt wird. Deshalb ist ein Optimieren
dieses Code zur Verwendung durch die Druckerdatenverarbeitung wünschenswert.
Natürlich
erfordert eine Aufbereitung des heruntergeladenen Code eine Kenntnis davon,
welche Routinen im Drucker sind, und dies ist für vorhandene Drucker bekannt.
Es mag wünschenswert
sein, Routinen insbesondere für
den Zweck hinzuzufügen,
dass sie in einem zusätzlichen Interpretierer
verwendet werden, gemäß dieser
Erfindung. Obwohl die Tabelle von Routinen Teil des ursprünglichen
Druckercode sein kann, kann sie auch zu jedem Zeitpunkt vor ihrer
Verwendung in den Drucker heruntergeladen werden. Andere Variationen sind
augenscheinlich und können
antizipiert werden.