Die Programmierung des Hohner-Computer 9000 Magnetplattensystems
Dieser Beitrag entstand gemeinsam mit Jürgen Held, der ab 1970 als Programmierer bei Hohner in der Vertriebsstelle in Kassel arbeitete. Da er ursprünglich eine Ausbildung zum Maschinenschlosser absolviert hatte, eignete er sich die Programmierkenntnisse zunächst in Kursen an. Ab 1971 war er dann einer der ersten Entwickler von Anwendungsprogrammen für das neue System 9000 mit Festplatte.
Jürgen Held blieb bis Mitte 1976 bei Hohner. Nach einer einjährigen Weiterbildung zum Organisationsprogrammierer und DV-Organisator arbeitete er viele Jahre mit Computern der Firma CTM-Systeme.
Projektmanagement
Ansprechpartner der Kunden waren immer die Händler vor Ort. Deren Verkäufer machten zunächst eine grobe Ist-Aufnahme der Anforderungen. Sie taten sich am Anfang sehr schwer damit, die Anforderungen für ein Magnetplattensystem zu begreifen.
In der Regel übernahm die Organisation, Programmierung und Einführung in das System ein erfahrener Programmierer und wurde evtl. von einem Kollegen unterstützt.
Die Händler waren demzufolge eher das, was man heute als "Systemhaus" bezeichnet. Sie verkauften nicht nur die Hardware, sondern hatten auch die Kapazitäten, um die zugehörige Anwendungssoftware dafür zu entwickeln. Diese wurde dann vor der Auslieferung auf der Kundenanlage vorgeführt und getestet.
Um mit der technischen Entwicklung schrittzuhalten mussten die Mitarbeiter der Händler sich für jede neue Systemgeneration weiterbilden. Um einen Programmierer fit zu machen für das System 9000, genügte eine ca. einwöchige Schulung, die bei GDC in Kassel angeboten wurde.
Ein System 9000 kostete typischerweise etwa 100000 DM.
Die Entwicklungsumgebung
Programme wurden zunächst auf Papier in einem dafür vorgesehenen Formular als Maschinensprache von Hand geschrieben. Dabei wurden die 20 Bit jedes Befehls in Form von 5 Hexadezimalziffern in die Spalten ganz rechts eingetragen. Das auf diese Art ausgearbeitete Programm wurde dann über die Zehnertastatur des Computers eingegeben und dort im "Lebendspeicher" (RAM) abgelegt.
Dort konnte es dann direkt ausgeführt werden. Das Debugging unterstützte dabei ein sogenanntes "Testtableau", das im obigen Bild zu sehen ist. Damit konnte man einen Programmstopp (Breakpoint) einstellen, also eine Adresse, an der das Programm angehalten wurde. Über die Bedienelemente des Testtableau konnte man dann den Speicher untersuchen und so herausfinden, ob das Programm so funktioniert, wie es soll. Das Testtableau kostete etwa 4000 Mark.
Die Programme wurden jeweils im Kundenauftrag individuell erstellt. Dabei liefen die Programme bei den älteren Systemen direkt auf der Hardware. Ein Betriebssystem im heutigen Sinne gab es nicht. Das änderte sich beim System 9000. Die Magnetplatte erforderte eine komplexe Ansteuerung, die über eine Reihe von fertigen Programmroutinen bereitgestellt wurde. Diese wurden dann von den Anwendungsprogrammen genutzt - heute würde man das als "API" des Betriebssystems bezeichnen.
Programme ausliefern
Das fertige Programm konnte beim System 9000 auf der Magnetplatte gespeichert und von dort ausgeführt werden.
Bei den Vorgängersystemen ohne Magnetplatte wurden fertige Programme "gefädelt". Ein gefädeltes Programm war in einem Modul untergebracht, das dann in den jeweiligen Computer eingeschoben werden konnte. Somit konnte ein Computer auch schnell von einem auf ein anderes Programm umgebaut werden.
Im Bild ist so ein Modul zu sehen. Auf der rechten Seite befindet sich die Speichermatrix, bestehend aus Ferritringen. Jede Zeile der Matrix besteht aus 20 Ringen, weil die Befehlsworte 20 Bit groß sind. In jeder Zeile gibt es 32 (?) horizontal verlaufende Drähte. Jeder gehört zu einem gespeicherten Befehl. Ist ein Bit 1, so wird der Draht duch den Ring hindurchgeführt, ist das Bit 0, so geht der Draht am Ring vorbei.
Um nun einen Befehl auszulesen, lässt man durch den zugehörigen horizontalen Draht einen Strom fließen. Dort, wo der Draht durch einen Ring hindurchgeht, wird dieser magnetisiert und induziert in einer vertikal durch die Ringe verlegten Leseleitung eine Spannung, die gemessen werden kann. Wo der Draht am Ring vorbeigeht, entsteht keine Spannung.
Das abgebildete Modul hat 16 Zeilen und fasst daher 16 x 32 = 512 Befehle.
Das Fädeln eines Programmes musste in Handarbeit und mit äußerster Sorgfalt gemacht werden.
So ganz konnte auch beim System 9000 nicht auf ein gefädeltes Programm verzichtet werden. Das Betriebssystem wurde in dieser Form mitgeliefert.
Die Aufgaben
Während Magnetkontencomputer fast ausschließlich für die Buchhaltung eingesetzt wurden, war das System 9000 deutlich vielfältiger verwendbar. Es kam daher in den unterschiedlichsten Unternehmen zum Einsatz. Herr Held erinnert sich noch an Steuerberater, die Krögerwerft in Rendsburg und die Großbäckerei Flüggebrot aus Kiel als Kunden.
Man konnte den Magnetplatten-Computer beispielsweise für Aufgaben nutzen, die man heute mit einem ERP-System erledigt. Die Anwendung gliederte sich dabei in zahlreiche Programme, die jeweils eine Aufgabe erledigten. Das war der Tatsache geschuldet, dass der Lebendspeicher nur 4000 Maschinesprachebefehle fasste. So ein Programm konnte also z.B. der Pflege von Kunden- oder Artikelstammdaten dienen, eine Fakturierung durchführen oder die Finanzbuchhaltung erledigen.
Die Computer hatten noch keinen Bildschirm, dafür aber oberhalb der Tastatur ein doppeltes Druckwerk. Eines davon wurde zur Bedienerführung genutzt. Trozdem musste der Anwender viele Arbeitsschritte ohne direktes Feedback quasi "blind" ausführen, z.B. den Start des gewünschten Programms. Erst danach konnte das Programm durch gedruckte Anweisungen eine rudimentäre Bedienerführung gewährleisten. Während der Arbeit am Computer entstand so ein gedrucktes Protokoll aller Bedienschritte. Das zweite Druckwerk konnte dann z.B. zum Druck von Rechnungen oder anderen Belegen verwendet werden.
Die Technik
Magnetplatte:
Die Datenhaltung der Programme und auch die Speicherung der Programme selbst erfolgte beim System 9000 auf der Magnetplatte. Ein Dateisystem im heutigen Sinne gab es allerdings noch nicht. Die Daten wurden in Form von Datensätzen variabler Länge gespeichert. Dabe wurde allerdings darauf geachtet, dass eine ganzzahlige Anzahl von Datensätzen auf eine Spur der Magnetplatte passte, weil Datensätze nicht spurübergreifend gespeichert werden konnten und man keinen Platz verschenken wollte. Jeder Datensatz hatte eine zwanzigstellige Identifikation. Alle Datensätze wurden dabei mit aufsteigender Identifikation auf der Platte abgelegt. Einen Datensatz einzufügen führte dabei dazu, dass der gesamte dahinter befindliche Magnetplatteninhalt verschoben werden musste, um Platz zu schaffen. Das konnte schon mal Stunden dauern.
Dem Magnetplattensystem war dabei der Inhalt der Datensätze egal. Um z.B. Kunden-, Artikel- und Rechnungsdaten sauber zu trennen, wurde mit Nummernkreisen gearbeitet. Veränderliche Daten landeten dabei möglichst weit hinten auf der Platte.
Die Magnetplatteneinheit wurde von der Firma DFE (Didic Frech Elektronik) für Hohner entwickelt. Das Unternehmen hatte seinen Sitz in Blankenloch, das heute Stadtteil von Stutensee in der Nähe von Karlsruhe ist.
Mit der Magnetplatte entstand auch die Notwendigkeit einer Datensicherung. Allerdings hatte die Magnetplatte gemessen an anderen verfügbaren Speichermedien eine erheblich höhere Kapazität. Bei der GDC wurde daher ein Sicherungsverfahren ausgeknobelt. Dabei machte man sich zunutze, dass die Magnetplatteneinheit aus einer Festplatte mit 5 MB Kapazität und einem Wechselplattenlaufwerk gleicher Kapazität bestand. Um nun eine Fest- und eine Wechselplatte zu sichern, benötigte man zwei weitere Wechselplatten. Nun wurde
- zuerst die Festplatte auf eine der beiden leeren Wechselplatten kopiert.
- Dann die zu sichernde Wechselplatte auf die Festplatte, deren vorheriger Inhalt dabei überschrieben wurde.
- Danach dann der Festplatteninhalt auf die zweite leere Wechselplatte.
- Und zu guter letzt dann der Inhalt der ersten Sicherungs-Wechselplatte zurück auf die Festplatte.
Magnetkonten:
Wurde der Computer als Buchungsmaschine eingesetzt, war eine Magnetkonteneinheit erforderlich. Buchhalter verwenden für Ihre Arbeit seit jeher Kontoblätter. Auf diesen tragen sie Einnahmen oder Ausgaben (Haben / Soll) des Unternehmens ein, rechnen die einzelnen Positionen zusammen und bestimmen so den neuen Saldo. Früher wurde dies manuell gemacht. Ein Magnetkonto ist ein aus leichtem Karton gefertigtes Kontenblatt, meist in DIN A4-Größe. Auf der Rückseite des Blattes befindet sich am Rand ein Magnetstreifen. Auf diesem ist u.a. der letzte Saldo gespeichert und bis wohin das Kontenblatt bereits beschrieben ist. Werden nun Positionen über die Tastatur eingegeben, werden diese automatisch mit dem vom Magnetstreifen gelesenen Saldo verrechnet, die Daten auf das Kontenblatt gedruckt und der neue Saldo auf den Magnetstreifen geschrieben. Das reduziert die erforderlichen Bearbeitungsschritte und macht sie weniger fehleranfällig.
Lochstreifen und Lochkarten:
Lochkarten hatten ihren Ursprung in den elektromechanischen Tabelliermaschinen, die in den 70er Jahren noch weit verbreitet waren. Die mittlere Datentechnik wurde häufig genutzt, um Tabelliermaschinen abzulösen und allene deswegen mussten Lochkarten einlesbar sein.
Lochkarten bestehen aus einem Stück Karton in genormter Größe und mit einem genau definierten Bereich, in dem Löcher platziert werden. Dadurch haben Lochkarten auch eine bestimmte Kapazität von meist 80 oder 128 alphanumerischen Zeichen oder Ziffern. Sie sind gut geeignet für Daten, die aus Datensätzen bestehen.
Für beliebig strukturierte Daten wie z.B. Programmcode ist ein Lochstreifen besser geeignet.
Für Lochkarten gab es mechanische Datenerfassungsgeräte, aber auch frühe Bildschirmterminals konnten Daten auf Lochkarten schreiben. Damit waren Lochkarten und Lochstreifen ein praktisches Datenaustauschformat für kleine Datenvolumen.
Die Maschinensprache des System 9000
Die Hohner-Computer waren eine Eigenentwicklung, wurden also von keinem anderen System abgeleitet. Die Maschinensprache aller Systeme war grundsätzlich gleich, allerdings jeweils um Befehle für die systemspezifischen Hardwarekomponenten erweitert. Dadurch war der fertige Code immer nur auf der Maschine lauffähig, für die er entwickelt worden war. Bei einem Umstieg auf ein anderes Hohner-System musste die Software daher komplett neu erstellt werden.
Die Hohner-Computer implementieren eine Harvard-Architektur, bei der (im Gegensatz zur populäreren Von-Neumann-Architektur) Befehle und Daten in getrennten Speichern aufbewahrt werden und auch jeweils eine eigene Adressierung haben.
Das System 9000 arbeitet mit 20 Bit langen Befehlsworten, die jeweils in einen 8 Bit langen OP-Teil und einen 12 Bit langen AD-Teil aufgeteilt sind. "OP" steht dabei für "Operation", d.h. dass der OP-Teil den auszuführenden Befehl definiert. "AD" steht für Adresse. Dieser Teil des Befehls wird nochmals in drei mal vier Bit unterteilt, "l", "m" und "r" (links, Mitte, rechts) genannt.
Bemerkenswert ist die wechselnde Funktion von l, m und r. Dadurch der Prozessor nicht eindeutig als 1-, 2- oder 3-Adressmaschine definierbar. Gegenüber modernen Prozessoren ist auffällig, dass Peripheriegeräte wie Drucker, Konteneinzugsgeräte oder Massenspeicher direkt mit Maschinensprachebefehlen angesprochen werden können. Das System 9000 konnte also zum Teil mit einem Maschinensprachebefehl Funktionen auslösen, für die ein moderner PC Dutzende Befehle, das Betriebssystem und Treibersoftware benötigt.
Der Arbeitsspeicher ist in Worten zu je 4 Bit organisiert. So ein Wort kann im BCD-Format eine Dezimalziffer speichern. Sechzehn Worte fassen also eine 16stellige Dezimalzahl und werden als "Register" bezeichnet. In der Maschinensprache gibt es bei den Arithmetikbefehlen jeweils Quell- und Zielregister als Parameter. Die Befehle gibt es jeweils in einer Variante mit 8 Bit großer Quellregister- und 4 Bit großer Zielregisteradresse und umgekehrt mit 4 Bit großer Quellregister- und 8 Bit großer Zielregisteradresse. Da man mit 4 Bit nur Zahlenwerte von 0 - 15 darstellen kann, haben die ersten 16 Register (also 16 x 16 x 4 Bit = 128 Byte) eine besondere Rolle, weil immer entweder Quelle oder Ziel einer Operation eines dieser Register sein muss. Mit 8 Bit kann man Zahlen von 0 - 255 darstellen und hat damit Zugriff auf die ersten 256 Register (also 256 x 16 x 4 Bit = 2048 Byte). Sofern der Arbeitsspeicher größer als 2 KiB ist, kann er vom Computer nicht mehr direkt adressiert werden.
Es gibt die folgenden Befehle:
OP- und AD-Teil sind jeweils Hexadezimal angegeben.
Befehl | OP-Teil | AD-Teil | Erläuterung | ||
l | m | r | |||
Leerbefehl | |||||
LER | 0.0 | 0 | 0 | 1 | Leerbefehl, wird ohne Auswirkung durchlaufen |
Transportbefehle | |||||
ERN | 0.1 | ZR | NKS | Eingabetransport (?) NKS = Nachkommastellen | |
TR | 0.2 | ZR | QR | Transfer QR -> ZR | |
TR | 0.3 | QR | ZR | Transfer QR -> ZR | |
Arithmetik | |||||
ADD | 0.4 | ZR | QR | ZR = QR + ZR | |
ADD | 0.5 | QR | ZR | ZR = QR + ZR | |
MIN | 0.6 | ZR | QR | ZR = ZR - QR | |
MIN | 0.7 | QR | ZR | ZR = ZR - QR | |
MUL | 0.8 | ZR | QR | AKKU = QR x ZR | |
MUL | 0.9 | QR | ZR | AKKU = QR x ZR | |
DIV | 0.A | ZR | QR | AKKU = ZR / QR | |
DIV | 0.B | QR | ZR | AKKU = ZR / QR | |
VGV | 0.C | ZR | QR | Vergleiche Register | |
VGV | 0.D | QR | ZR | Vergleiche Register | |
VGN | 0.E | R | 0 | Vergleiche Register mit Null | |
LOR | 0.F | R | 0 | Lösche Register | |
VZW | 0.F | R | 1 | Vorzeichenwechsel im Register | |
RSR | 1.0 | R | n | Rechtsshift des Registers um n Stellen | |
LSR | 1.1 | R | n | Linksshift des Registers um n Stellen | |
LSV | 1.2 | R | n | Linksshift des Registers um n Stellen Abweichende Überlaufbehandlung | |
RU1 | 1.3 | R | n | Rundung des Registers auf die n. Stelle | |
RU2 | 1.4 | R | n | Rundung des Registers auf die n. Stelle Rundung auf 5: 0-2 ab, 3-7 auf 5, 8-9 auf | |
RP1 | 1.5 | R | n | Inkrementieren der n. Stelle des Registers | |
Konstantentransporte | |||||
KA | 1.6 | Wert | AKKU = Wert | ||
SOA | 1.7 | Addr | Substituierter OP-Teil nach Akku AKKU = OP-Teil des Befehls an der angegebenen Adresse | ||
SAA | 1.8 | Addr | Substituierter AD-Teil nach Akku AKKU = AD-Teil des Befehls an der angegebenen Adresse | ||
SBA | 1.9 | Addr | Substituierter Befehl nach Akku AKKU = Befehl an der angegebenen Adresse | ||
Datenspeicherprogrammierung | |||||
SD | 1.A | Addr | Springe in Datenspeicher Programm wird an Adresse im Datenspeicher fortgesetzt | ||
SF | 1.B | Addr | Springe in Festwertspeicher Programm wird an Adresse im Festwertspeicher fortgesetzt | ||
Unterprogrammsprünge | |||||
SR | 1.C | Addr | Springe in Unterprogramm | ||
SH | 1.D | Offset | Springe zurück ins Hauptprogramm Der Offset bezieht sich auf gespeicherte Rücksprungadresse | ||
Vorbefehle | |||||
PAV | 1.E | n | Pufferanfang-Vorbefehl Definiert, wie viele 4-Bit-Worte (0 - 511) vom Magnetstreifen gelesen oder auf ihn geschrieben werden sollen. | ||
ZVK | 1.E | n | Zähler-Vorbefehl Bei einem nachfolgenden LEK-Befehl sollen n Zeichen überlesen werden | ||
AVK | 1.E | Addr | Adress-Vorbefehl Bei einem nachfolgenden Befehl LOK, LMK, LIK, LAK oder LHK soll ab der Adresse aus dem Kartenpuffer gelesen werden. | ||
Sprungbefehle | |||||
SP | 2.0 | Addr | Unbedingter Sprung zur Adresse | ||
S1 | 2.1 | Addr | Sprung zur Adresse, wenn M1 == 1 | ||
S2 | 2.2 | Addr | Sprung zur Adresse, wenn M2 == 1 | ||
S3 | 2.3 | Addr | Sprung zur Adresse, wenn M3 == 1 | ||
S4 | 2.4 | Addr | Sprung zur Adresse, wenn M4 == 1 | ||
S5 | 2.5 | Addr | Sprung zur Adresse, wenn M5 == 1 | ||
S6 | 2.6 | Addr | Sprung zur Adresse, wenn M6 == 1 | ||
S7 | 2.7 | Addr | Sprung zur Adresse, wenn M7 == 1 | ||
S8 | 2.8 | Addr | Sprung zur Adresse, wenn M8 == 1 | ||
S9 | 2.9 | Addr | Sprung zur Adresse, wenn M9 == 1 | ||
SC | 2.A | Addr | Sprung zur Adresse, wenn MC == 1 | ||
SK | 2.B | Addr | Sprung zur Adresse, wenn MK == 1 | ||
SU | 2.C | Addr | Sprung zur Adresse, wenn MU == 1 | ||
Indexabhängige Sprungbefehle | |||||
SIG | 2.D | Wert | Sprung zum übernächsten Befehl, wenn IDX >= Wert | ||
SIK | 2.E | Wert | Sprung zum übernächsten Befehl, wenn IDX <= Wert | ||
SIU | 2.F | Addr | Sprung zur Adresse, wenn IDX <> 0 | ||
Indexbefehle | |||||
IVG | 3.0 | 1 | m | r | Vergleich der Indexregister m und r |
IKP | 3.0 | 2 | 0 | r | Komplementiere Indexregister r |
IAD | 3.0 | 3 | m | r | Indexregister addieren: IDX.m = IDX.m + IDX.r |
ILS | 3.0 | 4 | m | n | Indexregister m um n Stellen nach links schieben |
ILZ | 3.0 | 5 | m | n | Indexregister m um n Stellen nach links rotieren |
ITR | 3.1 | QR | ZR | Indexregistertransport ZR = QR Für QR gibt es eine spezielle Codierung | |
ISP | 3.2 | Addr | Substituierter OP-Teil nach Indexregister IDX = OP-Teil des Befehls an der angegebenen Adresse | ||
ISA | 3.3 | Addr | Substituierter AD-Teil nach Indexregister IDX = AD-Teil des Befehls an der angegebenen Adresse | ||
IK | 3.4 | Wert | IDX = Wert | ||
IP1 | 3.5 | 0 | 0 | 1 | IDX = Position von Drucker 1 |
IR | 3.6 | n | R | p | Index rechts laden n: 1-4: 1-4 Dezimalstellen transportierend, 9-C: 1-4 Dezimalstellen addierend R: Register p: Registerposition |
IM | 3.7 | n | R | p | Index Mitte laden |
IL | 3.8 | n | R | p | Index links laden |
DEZ | 3.9 | n | R | p | Dezimalwandlung aus Index |
Vorbefehle | |||||
SVB | 3.A | Addr | Schreibmaschinen-Vorbefehl für SMF, SA1, SMK, DT,LT und DLT Absolute Anfangsadresse | ||
DVB | 3.B | Farbe | n | Druckvorbefehl für DZ, LZ, DLZ, DT, LT und DLT Farbe: 8=Rot, 4=Schwarz n: Anzahl Zeichen | |
DVB | 3.B | Farbe | DSU | 0 | Druckvorbefehl für SVB und SMF Farbe: 8=Rot, 4=Schwarz DSU: bis DSU-Stelle. 0 => 255, 1 => 511, 3 => 1023, 7 => 2047, F => 4095 |
[...] | |||||
Programmbefehle | |||||
PZL | 3.E | Addr | Programmzähler mit Adresse der PPT-Angabe laden (000-00F) | ||
WRT | 3.F | 0 | Bedingung | Warte auf Bedingung (Bedingungen separat definiert) | |
MES | 3.F | M | Bedingung | Setze Merker gemäß Bedingung (Bedingungen separat definiert) | |
Funktionsbefehle | |||||
SMF | 4.0 | 1 | Pos | Schreibmaschinenfreigabe ab aktueller Kugelkopfposition Pos: rechte Begrenzung | |
SA1 | 4.0 | 3 | Pos | dito mit Stanzen von Lochstreifen und Streifenkarten | |
SMK | 4.0 | 5 | Pos | dito mit Stanzen von Lochkarten | |
TB1 | 4.1 | 1 | Pos | Tabulation Drucker 1 an Pos | |
KVS | 4.2 | 0 | 0 | 0 | Streifenkartenvorschub bis zum Führungsloch |
DZ | 4.2 | 1 | Code | Drucke Zeichen mit angegebenem Code auf Drucker 1 | |
LZ | 4.2 | 2 | Code | Loche Zeichen mit angegebenem Code | |
DLZ | 4.2 | 3 | Code | Drucke und Loche Zeichen mit angegebenem Code | |
DT | 4.3 | Offset | Typ | 1 | Drucke aus Tabelle auf Drucker 1 Offset 0-2 gegenüber mit SVB angegebener Adresse Typ: 0: Alpha aus Festwertspeicher, 1: Hex aus Festwertspeicher, 2: Alpha aus Datenspeicher, 3: Hex aus Datenspeicher |
LT | 4.3 | Offset | Typ | 2 | Loche aus Tabelle |
DLT | 4.3 | Offset | Typ | 3 | Drucke und Loche aus Tabelle |
UMS | 4.4 | Addr | Umspeicherungsbefehl Monitor | ||
PRÜ | 4.5 | R | 0 | Prüfziffer des Registers berechnen und im R6 links der KGA abstellen | |
HEX | 4.6 | 0 | Addr | Drucke Hex ab Adresse | |
Befehle für die Konteneinzugsgeräte 68 und 70 | |||||
Zi1 | 4.7 | 5 | n | Zeilenschaltung 1. Schacht um n Zeilen | |
Zi2 | 4.7 | 6 | n | Zeilenschaltung 2. Schacht um n Zeilen | |
ZiB | 4.7 | 7 | n | Zeilenschaltung beide Schächte um n Zeilen | |
Si1 | 4.7 | 9 | n | Stanzung 1. Schacht n Mal | |
Si2 | 4.7 | A | n | Stanzung 2. Schacht n Mal | |
SiB | 4.7 | B | n | Stanzung beide Schächte n Mal | |
EM1 | 4.8 | 1 | n | Einzug mit Schuppe 1. Schacht mit Zeilenposition n | |
EM2 | 4.8 | 2 | n | Einzug mit Schuppe 2. Schacht mit Zeilenposition n | |
EMB | 4.8 | 3 | n | Einzug mit Schuppe beide Schächte mit Zeilenposition n | |
EO1 | 4.8 | 5 | n | Einzug ohne Schuppe 1. Schacht mit Zeilenposition n | |
EO2 | 4.8 | 6 | n | Einzug ohne Schuppe 2. Schacht mit Zeilenposition n | |
EOB | 4.8 | 7 | n | Einzug ohne Schuppe beide Schächte mit Zeilenposition n | |
Ai1 | 4.8 | 9 | n | Auswurf 1. Schacht, n: Positionsangabe | |
Ai2 | 4.8 | A | n | Auswurf 2. Schacht, n: Positionsangabe | |
AiB | 4.8 | B | n | Auswurf beide Schächte, n: Positionsangabe | |
Magnetkontenbefehle | |||||
EML | 4.8 | 5 | n | Einzug mit Lesen, n: Positionsangabe | |
EMV | 4.8 | 5 | n | Einzug mit Vergleichslesen, n: Positionsangabe | |
AMS | 4.8 | 9 | n | Auswurf mit Schreiben, n: Positionsangabe | |
Programmbefehle | |||||
SUB | 4.9 | Addr | Substitution. Befehl an der angegebenen Adresse wird ersatzweise ausgeführt | ||
Druckregisterbefehle | |||||
DD | 4.A | n | p | Drucke aus Druckregister mit n Nachkommastellen ab Position p | |
LD | 4.B | n | 0 | 0 | Loche aus Druckregister mit n Nachkommastellen |
DLD | 4.C | n | p | Drucke und loche aus Druckregister mit n Nachkommastellen ab Position p | |
Datenspeichererweiterung | |||||
HRA/AHR | 4.D | Addr | für Einsatz bei 4K 20-Bit-Speicher, muss durch BVB vorbereitet werden | ||
HRA/AHR | 4.E | Addr | für Einsatz bei 4K 12-Bit-Speicher, muss durch BVB vorbereitet werden | ||
HRA/AHR | 4.F | Addr | für Einsatz bei 4K 4-Bit-Speicher, muss durch BVB vorbereitet werden | ||
Befehle für Lochstreifen und Lochstreifenkarten | |||||
LNZ | 5.1 | l | R | n | Lese n numerische Zeichen ins Register R. l: 0 oder 1 |
BEK | 5.1 | 2 | 0 | 0 | Bringe eine Karte in die Lesestation |
BEK | 5.1 | 2 | Code | Bewege Karte oder Datenträger zum codierten Zeichen | |
WFK | 5.1 | 3 | 0 | 0 | Werfe Karte aus der Lesestation |
WFK | 5.1 | 3 | Code | Werfe Karte aus der Lesestation bis zum codierten Zeichen | |
LPA | 5.1 | o | n | Schreibe n Alphazeichen "0" in den Puffer ab der zuvor mit SVB bestimmten Position. o: Offset 4 => 0, 5 => 1, 6 => 2 | |
LPH | 5.1 | 7 | n | Schreibe n Hexzeichen "Null" in den Puffer ab der zuvor mit SVB bestimmten Position. | |
LNO | 5.2 | 0 | R | n | Lese numerisch ohne Vorzeichen n Zeichen nach Register R |
LNM | 5.2 | 1 | R | n | Lese numerisch mit Vorzeichen n Zeichen nach Register R |
LIE | 5.2 | 2 | R | 0 | Lese ein Zeichen im effektiv gelochten Code ins Indexregister Rnach Register R |
LIA | 5.2 | 3 | R | 0 | Lese ein Zeichen im DZ-Code ins Indexregister Rnach Register R |
LAP | 5.2 | o | n | Lese n Alphazeichen in den Puffer ab der zuvor mit SVB bestimmten Position. o: Offset 4 => 0, 5 => 1, 6 => 2 | |
LHP | 5.2 | 7 | n | Lese n Hexzeichen in den Puffer ab der zuvor mit SVB bestimmten Position. | |
LOK | 5.3 | 0 | R | n | Lese numerisch ohne Vorzeichen n Zeichen aus dem Kartenpuffer nach Register R |
LMK | 5.3 | 1 | R | n | Lese numerisch mit Vorzeichen n Zeichen aus dem Kartenpuffer nach Register R |
LEK | 5.3 | 2 | n | Lese n Zeichen einer Karte in den Kartenpuffer | |
LiK | 5.3 | 3 | R | 0 | Lese ein Zeichen aus dem Kartenpuffer nach Indexregister R |
LAK | 5.3 | o | n | Lese n Alphazeichen aus Kartenpuffer in den Zielpuffer. o: Offset 4 => 0, 5 => 1, 6 => 2 | |
LHK | 5.3 | 7 | n | Lese n Hexzeichen aus Kartenpuffer in den Zielpuffer. | |
Befehle für Lochkarten mit IBM 024 und 026 | |||||
LKO | 5.4 | 0 | R | n | Lese numerisch ohne Vorzeichen n Zeichen von der Karte nach Register R |
LKM | 5.4 | 1 | R | n | Lese numerisch mit Vorzeichen n Zeichen von der Karte nach Register R |
LKi | 5.4 | 3 | R | 0 | Lese ein Zeichen ab der aktuellen Kartenposition nach Indexregister R |
LKA | 5.4 | o | n | Lese n Alphazeichen ab der aktuellen Kartenposition in den Zielpuffer. o: Offset 4 => 0, 5 => 1, 6 => 2 | |
LKH | 5.4 | 7 | n | Lese n Hexzeichen ab der aktuellen Kartenposition in den Zielpuffer. | |
KLN | 5.5 | 0 | R | n | Loche den Inhalt von Register R numerisch mit n Stellen |
KLZ | 5.5 | 1 | Code | Loche das Zeichen mit dem Code ab der aktuellen Kartenposition | |
KLD | 5.5 | 1 | n | Dupliziere n Zeichen ab der aktuellen Kartenposition. (n muss um 128 vergrößert werden) | |
KPI | 5.5 | 2 | R | Schreibe Kartenposition ins Indexregister R | |
KSP | 5.5 | 2 | p | Transportiere Karte an Position p. (p muss um 128 erhöht werden) | |
KLA | 5.5 | o | n | Loche n Alpha-Zeichen aus Tabelle o: Offset 4 => 0, 5 => 1, 6 => 2 | |
KLH | 5.5 | 4 | n | Loche n Hex-Zeichen aus Tabelle | |
Formulartransportbefehl | |||||
LEP | 5.6 | Lep | n | Transportiere Leporello um n Zeilen Lep: Auswahl 0 => keiner, 1 => Leporello 1, 2 => Leporello 2, 3 => beide | |
Magnetplattenbefehle | |||||
6.0 | x | 0 | Read Buffer | ||
6.1 | x | 1 | Write Buffer | ||
6.2 | 0 | Sek | LW | Read Binary Pattern (Sek=Sektoren, LW: 0=Wechselplatte, 1=Festplatte) | |
6.3 | 0 | Sek | LW | Write Binary Pattern | |
6.4 | 0 | 0 | LW | Initialisieren (Löschen) | |
6.5 | x | Sek | LW | Write Data Set | |
6.6 | x | Sek | LW | Insert Data Set | |
6.7 | x | Sek | LW | Read Data Set | |
6.8 | x | Sek | LW | Erase Data Set | |
6.9 | 4 | 7 | B | Error Indication |
Zeichencodierung
Code | Funktion | Code | Funktion | Code | Funktion |
---|---|---|---|---|---|
0.0 | 0 | 2.0 | W | 4.0 | |
0.1 | 1 | 2.1 | X | 4.1 | |
0.2 | 2 | 2.2 | Y | 4.2 | m² |
0.3 | 3 | 2.3 | Z | 4.3 | m³ |
0.4 | 4 | 2.4 | / | 4.4 | m |
0.5 | 5 | 2.5 | . | 4.5 | g |
0.6 | 6 | 2.6 | , | 4.6 | kg |
0.7 | 7 | 2.7 | DZ Komma für Locher | 4.7 | t |
0.8 | 8 | 2.8 | : | 4.8 | ∅ |
0.9 | 9 | 2.9 | ; | 4.9 | 1/ |
0.A | A | 2.A | + | 4.A | _ |
0.B | B | 2.B | - | 4.B | St |
0.C | C | 2.C | ◊ | 4.C | @ |
0.D | D | 2.D | ◊ | 4.D | ' |
0.E | E | 2.E | * | 4.E | Zeile IBM |
0.F | F | 2.F | * | 4.F | BS |
1.0 | G | 3.0 | ! | 5.0 | /3 |
1.1 | H | 3.1 | ? | 5.1 | /4 |
1.2 | I | 3.2 | " | 5.2 | /8 |
1.3 | J | 3.3 | = | 5.3 | £ |
1.4 | K | 3.4 | # | 5.4 | Ω |
1.5 | L | 3.5 | ( | 5.5 | l |
1.6 | M | 3.6 | ) | ||
1.7 | N | 3.7 | $ | ||
1.8 | O | 3.8 | & | ||
1.9 | P | 3.9 | °/ | ||
1.A | Q | 3.A | % | ||
1.B | R | 3.B | ‰ | ||
1.C | S | 3.C | TAB | ||
1.D | T | 3.D | ZLR | ||
1.E | U | 3.E | LT | ||
1.F | V | 3.F | EN Tabellenende |
Belegung des Arbeitsspeichers
Der Speicher ist in 256 Register gegliedert, von denen jedes wiederum 16 Datenworte hat. Die ersten drei Register (0.0 - 0.2) haben Worte von je 12 Bit, alle übrigen haben nur 4 Bit große Worte. Somit sind die ersten drei Register jeweils 24 Byte groß, die übrigen jeweils 8 Byte. Die Register haben also zusammen etwas mehr als 2 KiB Kapazität.
Register | Wort | Name | Funktion |
---|---|---|---|
0.0 | 0 | XI0 | Indexregister 0 |
0.0 | 1 | XI1 | Indexregister 1 |
0.0 | 2 | XI2 | Indexregister 2 |
0.0 | 3 | XI3 | Indexregister 3 |
0.0 | 4 | XPS0 | Befehlszähler 0 (Hauptprogramm) |
0.0 | 5 | XPS1 | Befehlszähler 1 (1. Unterprogramm Keller) |
0.0 | 6 | XPS2 | Befehlszähler 2 (2. Unterprogramm Keller) |
0.0 | 7 | XPS3 | Befehlszähler 3 (3. Unterprogramm Keller) |
0.0 | 8 | XOP | OP-Teil des Makrobefehls |
0.0 | 9 | XAD | AD-Teil des Makrobefehls |
0.0 | A | XQUA | Quellregister Anfangsadresse Speicher |
0.0 | B | XQUE | Quellregister Endeadresse Speicher |
0.0 | C | XZIA | Zielregister Anfangsadresse Speicher |
0.0 | D | XZIE | Zielregister Endeadresse Speicher |
0.0 | E | XEZ | Eingabezeiger |
0.0 | F | XDZ | Datenspeicherzeiger und Makrospeicherzeiger |
0.1 | 0 | XSMV | SM-Vorbefehl-Speicher |
0.1 | 1 | XDRV | DR-Vorbefehl-Speicher |
0.1 | 2 | XSO1 | Sollwertspeicher der Tabulation Drucker 1 |
0.1 | 3 | XSO2 | Sollwertspeicher der Tabulation Drucker 2 |
0.1 | 4 | XMK1 | Merkerspeicher 1 |
0.1 | 5 | XMAG | Magnetzustände Tastatur |
0.1 | 6 | XUHR | Uhrspeicher |
0.1 | 7 | XSIM | Arbeitsspeicher des SIM-PR |
0.1 | 8 | XUP0 | UP-Keller für Mikroprogramm |
0.1 | 9 | XUP1 | UP-Keller für Mikroprogramm |
0.1 | A | XUP2 | UP-Keller für Mikroprogramm |
0.1 | B | XHZ0 | X-Hilfszelle 0 |
0.1 | C | XHZ1 | X-Hilfszelle 1 |
0.1 | D | XHZ2 | X-Hilfszelle 2 |
0.1 | E | XHZ3 | X-Hilfszelle 3 |
0.1 | F | XANF | Anfangsadresse für Datenspeicherprogrammierung |
0.2 | 0 | YBS0 | Blockadresse für Programmstufe 0 |
0.2 | 1 | YBS1 | Blockadresse für Programmstufe 1 |
0.2 | 2 | YBS2 | Blockadresse für Programmstufe 2 |
0.2 | 3 | YBS3 | Blockadresse für Programmstufe 3 |
0.2 | 4 | YPSZ | Programmstufenzähler |
0.2 | 5 | YBVB | Blockwechsel-Vorbefehl-Speicher |
0.2 | 6 | YIN0 | Index-Vorbefehl-Speicher 0 |
0.2 | 7 | YIN1 | Index-Vorbefehl-Speicher 1 |
0.2 | 8 | YSOR | Sortimat-Speicher |
0.2 | 9 | YABR | Abrufphasen-Speicher |
0.2 | A | YPRZ | Programmzähler |
0.2 | B | YHZ0 | Y-Hilfszelle 0 |
0.2 | C | YHZ1 | Y-Hilfszelle 1 |
0.2 | D | YHZ2 | Y-Hilfszelle 2 |
0.2 | E | YHZ3 | Y-Hilfszelle 3 |
0.2 | F | YMKI | Interner Merkerspeicher |
0.3 | 0-F | Eingaberegister | |
0.4 | 0-F | Makro-Akkuregister | |
0.5 | 0-F | Makro-Hilfsregister | |
0.6 | 0-F | Druckregister 1 | |
0.7 | 0-F | Druckregister 2 | |
0.8 | 0-F | Register 8 | |
0.9 | 0-F | Register 9 | |
0.A | 0-F | Register 10 | |
0.B | 0-F | Register 11 | |
0.C | 0-F | Register 12 | |
0.D | 0-F | Register 13 | |
0.E | 0-F | Register 14 | |
0.F | 0-F | Register 15 | |
1.0 | 0-F | Register 16 | |
... | 0-F | ... | |
F.F | 0-F | Register 255 |