Mikroprozessor INS 8070 (SC/MP III)

Themenmenü:

 

Home / Extras / INS8070

Die folgenden Hinweise sollen Besitzern eines Philips/Schuco MC 6400 Mikrocomputer Master Lab zusätzliche Informationen zur CPU geben. Das Anleitungsbuch zum MC 6400 beschreibt ja nur einen kleinen Teil des Befehlssatzes und der Adressierungsarten.


Bemerkungen zum Prozessor

Im Text der Anleitung zum MC 6400 Mikrocomputer befindet sich kein Hinweis auf den eingesetzten Mikroprozessor. Vor Jahren hatte ich im Internet nach verschiedenen Mikroprozessoren gesucht und schließlich auf einer japanischen Seite zum SonnenscheibeINS8070 einen Befehlssatz entdeckt, der mit der Beschreibung im Handbuch zum MC 6400 übereinstimmte. Eine anschließende Suche auf den Seiten des Herstellers Union JackNational Semiconductor blieb jedoch ohne Erfolg. Man gewinnt dort den Eindruck, dieser Prozessor wäre niemals hergestellt worden.

Die weitere Recherche brachte aber doch noch ein Datenblatt zur [PDF]INS8070-Series Microprocessor Family zu Tage. Es scheint das einzige erhalten gebliebene Exemplar zu sein. Jedenfalls findet man die gleiche Datei auf mehreren Webseiten. Der Scan ist schlecht. Die Ausklappseite mit der Befehlsübersicht ist nicht vollständig.

INS 8070D

Dass es sich definitiv um einen INS8070 handelt, wurde mir kurz nach der Erstveröffentlichung dieser Seite von Michael Schülke bestätigt. Es ist auch bei Vergrößerung des Fotos auf Seite 23 in der Anleitung zu erkennen. Michael Schülke hat außerdem einen kompletten Scan der erwähnten Ausklappseite mit der [PDF]Befehlsübersicht und eine Kurzbeschreibung der [Bild]Busbelegung im MC 6400 zur Verfügung gestellt.

Der INS8070 Mikroprozessor wird oft als SC/MP III bezeichnet. Er darf jedoch nicht mit dem eigentlichen SC/MP Prozessor in P-Kanal-Technologie oder mit dessen direktem Nachfolger INS8060 (SC/MP II) in N-Kanal-Technologie verwechselt werden. Die wesentlichen Unterschiede zwischen diesen Prozessoren sind:

SC/MP und INS8060 (SC/MP II) INS8070 (SC/MP III)
Hat kein T-Register. Zusätzliches T-Register vorhanden.
Der Datenbus wird auch zur Ausgabe der 4 höchstwertigen Adressbits und von 4 zusätzlichen Flags genutzt. Reiner 16 Bit Adress- und 8 Bit Datenbus. Die 4 zusätzlichen Flags im Datenbus gibt es nicht.
Kein Stack. 16 Bit Stack pointer.
Befehle zum direkten Setzen bzw. Rücksetzen des IE und CY/L Flags im S-Register vorhanden. Das S-Register kann nur über den Akkumulator oder mit AND bzw. OR Befehlen manipuliert werden.
Befehle SIO und DLY um mit dem E-Register eine einfache serielle Ein/Ausgabe auf den Pins SIN und SOUT zu realisieren. Das E-Register kann zusammen mit dem Akku als 16 Bit Register EA benutzt werden. Die Pins SIN und SOUT gibt es nicht.
Unterprogramme sind mangels CALL, JSR und RET Befehlen nur umständlich zu realisieren. 16 kurze CALL Befehle (1 Byte), ein JSR Befehl (3 Bytes) und RET vorhanden.
Nur 8 Bit Addition und Subtraktion. Auch 16 Bit Berechnungen, inkl. Multiplikation und Division.

Der INS8070 Prozessor war nur ein Mitglied einer größeren Prozessor-Familie. Zu dieser Familie gehörten:

  • INS8070 mit 64 Byte RAM ohne ROM
  • INS8072 mit 64 Byte RAM und 2.5 KB ROM
  • INS8073 mit 64 Byte RAM und 2.5 KB ROM, das ROM enthält einen Tiny BASIC Interpreter
  • INS8074 mit 64 Byte RAM und 4 KB ROM
  • INS8075 mit 64 Byte RAM und 4 KB ROM, das ROM enthält einen N2BASIC Interpreter

Die 64 Byte RAM liegen in jedem Prozessor auf den Adressen FFC0h...FFFFh. Das ROM beginnt immer an der Adresse 0000h. Bei 2,5 KB ROM liegt die letzte ROM Adresse somit auf 09FFh und bei 4 KB ROM auf 0FFFh.

Im MC 6400 kommt das Grundmodell INS8070 ohne ROM zum Einsatz. Das Betriebssystem ist in einem externen 4 KB EPROM vom Typ [PDF]2732 untergebracht. In diesem EPROM ist nur gut die Hälfte vom Betriebssystem belegt. Mit einem geeigneten Programmiergerät könnten durchaus die Programme auf Kassette in das EPROM übertragen werden.

Als Arbeitsspeicher (RAM) kommen im MC 6400 zwei ICs des Typs [PDF]2114 zum Einsatz. Sie liegen hinter dem EPROM auf den Adressen 1000h...13FFh.

^ Seitenanfang


Die für den Programmierer zugänglichen Register

Akkumulator (A)
Der 8 Bit Akkumulator ist das wichtigste Arbeitsregister in der INS8070 CPU. Mit ihm können alle arithmetischen und logischen Operationen an 8 Bit Daten durchgeführt werden. Er enthält auch das Ergebnis dieser Operationen. Sein Inhalt kann geschoben, rotiert und auf dem Stack abgelegt oder von dort geholt werden.
Erweiterungs-Register (E)
Das 8 Bit E-Register dient als schneller Zwischenspeicher für Operationen mit 2 Argumenten oder zur Verbreiterung des Akkumulators zum 16 Bit Register EA.
Akkumulator mit doppelter Genauigkeit (EA)
Der 16 Bit Akkumulator EA ist aus dem Akkumulator (Bits 0-7) und dem E-Register (Bits 8-15) zusammengesetzt. Mit ihm können alle arithmetischen und logischen Operationen an 16 Bit Daten durchgeführt werden. Er enthält auch das Ergebnis dieser Operationen. Sein Inhalt kann geschoben, rotiert und mit anderen 16 Bit Registern ausgetauscht werden. Ebenso ist das Ablegen und Holen vom Stack möglich.
Temporäres Register (T)
Das 16 Bit T-Register dient als schneller Zwischenspeicher für 16 Bit Daten. Es wird außerdem für den Multiplikator bzw. Divisor bei den MPY und DIV Befehlen benötigt. Der Multiplikand bzw. Dividend steht dabei im 16 Bit Akkumulator EA. Das T-Register kann nur direkt aus dem Speicher geladen oder mit EA ausgetauscht werden.
Status Register (S)
Das 8 Bit S-Register ist bitweise zu betrachten und enthält folgende Informationen:
Bit 7 6 5 4 3 2 1 0
Name CY/L OV SB SA F3 F2 F1 IE
Im MC 6400 sind die Bits F1, F2, F3, SA und SB auf eine Klemmleiste geführt und können somit sehr einfach zur Steuerung von elektronischen Geräten auf der Experimentierbox B genutzt werden. Die einzelnen Bits haben folgende Bedeutung:
CY/L Carry / Link (Übertrags- bzw. Verkettungs-Bit)
Dieses Bit wird von Additions- bzw. Subtraktions-Operationen gesetzt, wenn eine Übertragsbedingung (Carry) auftritt. Es kann auch als Link-Bit in Schiebe- und Rotationsbefehle mit dem Akkumulator eingebunden werden.
OV Overflow (Überlauf)
Wird bei einer Zweierkomplement Überlauf-Bedingung gesetzt.
SA, SB Sense A, B (Eingang A und B)
Diese Bits sind, CPU intern, über eine Schmitt-Trigger-Schaltung mit den Pins 38 (SA) und 39 (SB) verbunden und können per Software abgefragt, aber nicht beschrieben werden.
F1, F2, F3 Flags 1...3 (Ausgänge 1-3)
Diese Bits sind, CPU intern, elektronisch gepuffert mit den Pins 34 (F1), 35 (F2) und 36 (F3) verbunden und können per Software abgefragt und beschrieben werden.
IE Interrupt Enable (Interrupt-Freigabe)
Wenn dieses Bit gesetzt ist, sind die Leitungen SA und SB für Interrupts freigegeben. Bei einer Interrupt-Anforderung über SA wird dann über die Speicheradressen 0004 bis 0006 ein Sprung zur Service-Routine ausgeführt. Im Betriebssystem des MC 6400 steht an dieser Stelle ein Sprung zur Adresse 12FF. Eine eigene Interrupt-Service-Routine für SA kann also ab Adresse 1300 eingetippt werden. Für die Interrupt-Service-Routine SB steht in den Speicheradressen 0007 bis 0009 ein Sprungbefehl zur Adresse 137F, sodass ab Adresse 1380 eine eigene Interrupt-Service-Routine für SB geschrieben werden kann. Enthält das IE-Bit eine Null, sind die Interrupts gesperrt. Nach einem Hardware-Reset wird das IE-Bit automatisch auf Null gesetzt.
Program Counter - Programmzähler (PC)
Der Programmzähler ist ein 16 Bit Register, das die Adresse der aktuell ausgeführten Anweisung enthält. Er wird im Gegensatz zu den meisten anderen Mikroprozessoren vor dem nächsten Speicherzugriff weitergezählt. Im Falle von Verzweigungs- oder Sprung-Befehlen sowie bei Unterprogramm-Aufruf (CALL, JSR) und Rückkehr (RET) wird der Programmzähler automatisch mit der neuen Adresse beschrieben. Sein Inhalt kann auch mit dem EA-Register ausgetauscht und auf dem Stack abgelegt oder von dort geholt werden.
Pointer - Zeiger Register (SP, P2, P3)
Die drei 16 Bit Zeiger-Register können unter Programmkontrolle beliebig manipuliert werden. Über diese Zeiger können beispielsweise bis zu 256 Speicher- oder Ein/Ausgabe-Adressen angesprochen werden, ohne den Zeiger selbst zu verändern. Siehe Adressierungsart: Zeiger-Relativ

Der Stapelzeiger SP (stack pointer) wird überwiegend dazu verwendet, um auf das Ende des Stapelbereichs im RAM zu verweisen. Die Befehle CALL, JSR, RET, PUSH, POP und PLI arbeiten grundsätzlich mit dem SP-Register. Unter Programmkontrolle kann der Stapel an einem beliebigen Platz im Arbeitsspeicher angelegt werden und eine beliebige Länge erreichen.

Die Register P2 und P3 können ebenfalls als Zeiger auf andere Stapelbereiche benutzt werden. Die Adressierungsart "Auto-Indiziert" basiert auf diesem Prinzip.

^ Seitenanfang


Adressierungsarten

Der INS8070 Mikroprozessor unterscheidet folgende Adressierungsarten:

Implizit
Die CPU kennt bereits alle Informationen aus dem Befehlsbyte und braucht keine weiteren Bytes zur Bestimmung der Operandenadresse. Diese Befehle werden in der Regel besonders schnell (in max. 7 Zyklen) abgearbeitet. Ausnahmen sind MPY und DIV, bei denen ein CPU internes Mikroprogramm abläuft, sowie Befehle die auf den Stapel zugreifen, wie PUSH, POP, RET. Alle 1 Byte Befehle, außer CALL und SSM, sind implizit.
Beispiel: Angenommen, an der Adresse 1000h steht der Befehl LD A, E
1000: 40
Der Akkumulator wird mit dem Wert geladen, der sich aktuell im Register E befindet.
Unmittelbar
Bei der unmittelbaren Adressierung wird das zweite Befehlsbyte (bei 16 Bit Registern auch das dritte Befehlsbyte) unmittelbar als Wert verwendet.
Beispiel: Angenommen, an der Adresse 1000h steht der Befehl LD A, = 8
1000: C4 08
Der Akkumulator wird mit dem Wert 08h geladen.
Absolut
Bei der absoluten Adressierung wird das zweite und dritte Befehlsbyte als Adresse ausgewertet. Diese Adressierung wird nur von den Befehlen JMP und JSR genutzt. Die Adresse gibt an, wo der Programmablauf fortgesetzt werden soll. Mit der absoluten Adressierung kann die CPU auf den vollen Adressraum von 64 KB zugreifen (Adressen 0000...FFFF).
Beispiel: Angenommen, an der Adresse 1000h steht der Befehl JMP 11FFh
1000: 24 FF 11
Der Programmablauf wird an der Adresse 1200h fortgesetzt (11FF+1). Diese Besonderheit bei der Adressierung von Sprungzielen ist allen Mikroprozessoren der SC/MP Familien zu eigen. Sie wird im Kapitel 10 der Anleitung zum Master Lab MC 6400 genau beschrieben.
Indirekt
Diese Adressierung wird nur von den CALL Befehlen genutzt. Im Gegensatz zu den gerade beschriebenen absoluten Sprüngen muss für die indirekten Ein-Byte CALL Befehle ab der Adresse 0020h eine Sprungtabelle im Speicher errichtet werden. Der CALL 0 Befehl holt sich die Adresse des Unterprogramms aus den Speicherzellen 0020h und 0021h; CALL 1 aus 0022h und 0023h usw. bis CALL F aus 003Eh und 003Fh. Im MC 6400 gehört diese Sprungtabelle zum Betriebssystem im EPROM und kann deshalb nicht verändert werden. Die Funktion dieser 16 Unterprogramme ist im Handbuch genau erklärt.
Direkt
Bei der direkten Adressierung wird das zweite Befehlsbyte als Datenadresse verwendet. Mit der direkten Adressierung kann die CPU also nur auf 256 Speicheradressen zugreifen. Die INS8070 CPU addiert bei der direkten Adressierung immer den festen Wert FF00h zu der Adresse. Somit kann mit der direkten Adressierung nur auf die Speicherplätze FF00h...FFFFh zugegriffen werden. Im MC 6400 stehen in diesem Bereich nur die 64 Byte RAM aus der CPU zur Verfügung (FFC0h...FFFFh).
In einer Ausbaustufe des MC 6400 war eine Erweiterung dieses Bereichs geplant. Diese Ergänzung kam jedoch nicht in den Handel.
Beispiel: Angenommen, an der Adresse 1000h steht der Befehl LD A, D9h
1000: C5 D9
Der Akkumulator wird mit dem Wert geladen, der in der Speicheradresse FFD9h steht.
PC-Relativ
Hierbei wird die effektive Datenadresse aus dem aktuellen Inhalt des PC-Registers plus dem im Befehl angegebenen Offset berechnet. Der Offset ist das zweite Befehlsbyte und wird von der CPU als Zweierkomplementzahl von -128...+127 ausgewertet.
Beispiel: Angenommen, an der Adresse 1000h steht der Befehl LD A, 10, PC
1000: C0 0A
Zu dem Zeitpunkt, an dem die CPU den Offset 0Ah liest, hat der PC den Inhalt 1001h. Dazu wird nun die 0Ah addiert, was 100Bh als effektive Datenadresse ergibt. Der Akkumulator wird also mit dem Wert geladen, der in der Speicheradresse 100Bh steht.
Zeiger-Relativ
Diese Adressierungsart entspricht der gerade vorgestellten PC-relativen Adressierung. Nur wird hier eines der Register SP, P2 oder P3 anstatt dem PC verwendet.
Beispiel: Angenommen, an der Adresse 1000h steht der Befehl LD A, 11, P2 und das P2-Register enthält den Wert 1234h.
1000: C2 0B
Hier wird jetzt der Offset 0Bh zu zum Inhalt des P2-Registers (1234h) addiert, was die effektive Adresse 123Fh ergibt. Der Akkumulator wird also mit dem Wert geladen, der in der Speicheradresse 123Fh steht. Der Inhalt des P2-Registers wird jedoch nicht verändert und bleibt somit 1234h.
In gleicher Weise kann auch der Stapelzeiger SP und das P3-Register verwendet werden.
Auto-Indiziert
Diese Adressierung funktioniert ähnlich, wie die gerade beschriebene Zeiger-relative Adressierung. Nur wird bei positivem Offset zuerst auf die Daten zugegriffen und danach der Offset zum Zeiger addiert, während bei negativem Offset zuerst die Adressberechnung durchgeführt und dann auf die Daten zugegriffen wird.
1. Beispiel: Angenommen, an der Adresse 1000h steht der Befehl LD  A, @12, P2 und das P2-Register enthält den Wert 1234h.
1000: C6 0C
Dann wird der Akkumulator zuerst mit dem Wert geladen, der in Speicheradresse 1234h steht. Anschließend wird der Offset 0C zum Inhalt des P2-Registers addiert. Das P2-Register enthält nach diesem Befehl also den Wert 1240h.
2. Beispiel: Angenommen, an der Adresse 1000h steht der Befehl LD  A, @-5, P3 und das P3-Register enthält den Wert 1234h.
1000: C7 FB
Hier wird zuerst der Offset FBh (entspricht -5 dezimal) zur Adresse 1234h im P3-Register addiert, was die effektive Adresse 122Fh ergibt. Diese Adresse bleibt auch im P3-Register gespeichert. Dann wird der Akkumulator mit dem Wert geladen, der in Speicheradresse 122Fh steht.
Indiziert
Diese Adressierung wird nur vom SSM Befehl genutzt. Auf eine allgemeine Beschreibung kann deshalb verzichtet werden. Der Datenzugriff erfolgt hierbei über den Zeiger P2 oder P3.

^ Seitenanfang


Der Befehlssatz

In den folgenden Tabellen sind die in der Anleitung zum Philips/Schuco Microcomputer Master Lab behandelten Befehle durch grüne Schrift markiert. Die Sternchen in der Spalte "Status" haben folgende Bedeutung:

  * Der Befehl beeinflusst das CY/L Flag im Statusregister
 ** Der Befehl beeinflusst das CY/L und OV Flag im Statusregister
*** Der Befehl beeinflusst alle Flags des Statusregisters, außer SA und SB

Bei den auto-indizierten Adressierungen gilt in der Spalte "Wirkung" die erste Zeile für negative und die zweite Zeile für positive Offsets.

^ Seitenanfang


Datentransfer-Befehle

Mnemonic Hex-Code Zyklen Status Adressierung Wirkung
LD A,S 06 3   implizit A:=(S)
LD S,A 07 3 *** implizit S:=(A)
LD T,EA 09 4   implizit T:=(EA)
LD EA,T 0B 4   implizit EA:=(T)
LD SP,=XXYY 25 YY XX 8   unmittelbar SP:=XXYY
LD P2,=XXYY 26 YY XX 8   unmittelbar P2:=XXYY
LD P3,=XXYY 27 YY XX 8   unmittelbar P3:=XXYY
LD EA,PC 30 4   implizit EA:=(PC)
LD EA,SP 31 4   implizit EA:=(SP)
LD EA,P2 32 4   implizit EA:=(P2)
LD EA,P3 33 4   implizit EA:=(P3)
LD A,E 40 4   implizit A:=(E)
LD PC,EA 44 5   implizit PC:=(EA)
LD SP,EA 45 5   implizit SP:=(EA)
LD P2,EA 46 5   implizit P2:=(EA)
LD P3,EA 47 5   implizit P3:=(EA)
LD E,A 48 4   implizit E:=(A)
LD EA,XX,PC 80 XX 10   PC relativ EA:=((PC)+XX)
LD EA,XX,SP 81 XX 10   SP relativ EA:=((SP)+XX)
LD EA,XX,P2 82 XX 10   P2 relativ EA:=((P2)+XX)
LD EA,XX,P3 83 XX 10   P3 relativ EA:=((P3)+XX)
LD EA,=XXYY 84 YY XX 8   unmittelbar EA:=XXYY
LD EA,XX 85 XX 10   direkt EA:=(FF00+XX)
LD EA,@XX,P2 86 XX 11   auto-
indiziert
P2:=(P2)+XX, EA:=((P2))
EA:=((P2)), P2:=(P2)+XX
LD EA,@XX,P3 87 XX 11   auto-
indiziert
P3:=(P3)+XX, EA:=((P3))
EA:=((P3)), P3:=(P3)+XX
LD T,XX,PC A0 XX 10   PC relativ T:=((PC)+XX)
LD T,XX,SP A1 XX 10   SP relativ T:=((SP)+XX)
LD T,XX,P2 A2 XX 10   P2 relativ T:=((P2)+XX)
LD T,XX,P3 A3 XX 10   P3 relativ T:=((P3)+XX)
LD T,=XXYY A4 YY XX 8   unmittelbar T:=XXYY
LD T,XX A5 XX 10   direkt T:=(FF00+XX)
LD T,@XX,P2 A6 XX 11   auto-
indiziert
P2:=(P2)+XX, T:=((P2))
T:=((P2)), P2:=(P2)+XX
LD T,@XX,P3 A7 XX 11   auto-
indiziert
P3:=(P3)+XX, T:=((P3))
T:=((P3)), P3:=(P3)+XX
LD A,XX,PC C0 XX 7   PC relativ A:=((PC)+XX)
LD A,XX,SP C1 XX 7   SP relativ A:=((SP)+XX)
LD A,XX,P2 C2 XX 7   P2 relativ A:=((P2)+XX)
LD A,XX,P3 C3 XX 7   P3 relativ A:=((P3)+XX)
LD A,=XX C4 XX 5   unmittelbar A:=XX
LD A,XX C5 XX 7   direkt A:=(FF00+XX)
LD A,@XX,P2 C6 XX 8   auto-
indiziert
P2:=(P2)+XX, A:=((P2))
A:=((P2)), P2:=(P2)+XX
LD A,@XX,P3 C7 XX 8   auto-
indiziert
P3:=(P3)+XX, A:=((P3))
A:=((P3)), P3:=(P3)+XX
ST EA,XX,PC 88 XX 10   PC relativ ((PC)+XX):=(EA)
ST EA,XX,SP 89 XX 10   SP relativ ((SP)+XX):=(EA)
ST EA,XX,P2 8A XX 10   P2 relativ ((P2)+XX):=(EA)
ST EA,XX,P3 8B XX 10   P3 relativ ((P3)+XX):=(EA)
ST EA,XX 8D XX 10   direkt (FF00+XX):=(EA)
ST EA,@XX,P2 8E XX 11   auto-
indiziert
P2:=(P2)+XX, ((P2)):=(EA)
((P2)):=(EA), P2:=(P2)+XX
ST EA,@XX,P3 8F XX 11   auto-
indiziert
P3:=(P3)+XX, ((P3)):=(EA)
((P3)):=(EA), P3:=(P3)+XX
ST A,XX,PC C8 XX 7   PC relativ ((PC)+XX):=(A)
ST A,XX,SP C9 XX 7   SP relativ ((SP)+XX):=(A)
ST A,XX,P2 CA XX 7   P2 relativ ((P2)+XX):=(A)
ST A,XX,P3 CB XX 7   P3 relativ ((P3)+XX):=(A)
ST A,XX CD XX 7   direkt (FF00+XX):=(A)
ST A,@XX,P2 CE XX 8   auto-
indiziert
P2:=(P2)+XX, ((P2)):=(A)
((P2)):=(A), P2:=(P2)+XX
ST A,@XX,P3 CF XX 8   auto-
indiziert
P3:=(P3)+XX, ((P3)):=(A)
((P3)):=(A), P3:=(P3)+XX
XCH A,E 01 5   implizit A<->E
XCH PC,EA 4C 7   implizit PC<->EA
XCH EA,SP 4D 7   implizit EA<->SP
XCH EA,P2 4E 7   implizit EA<->P2
XCH EA,P3 4F 7   implizit EA<->P3

Anmerkung:

In der Gruppe der unmittelbaren Ladebefehle für die Pointer scheint der Befehlscode 24 zum laden des Program Counters zu fehlen. Dieser Befehlscode ist weiter unten bei den Verzeigungsbefehlen als JMP Befehl gelistet. Denn das ist genau die Wirkung die ein ummittelbares laden des PC Registers zur Folge hat.

^ Seitenanfang


Arithmetische Befehle

Mnemonic Hex-Code Zyklen Status Adressierung Wirkung
ADD A,E 70 4 ** implizit A:=(A)+(E)
ADD EA,XX,PC B0 XX 10 ** PC relativ EA:=(EA)+((PC)+XX)
ADD EA,XX,SP B1 XX 10 ** SP relativ EA:=(EA)+((SP)+XX)
ADD EA,XX,P2 B2 XX 10 ** P2 relativ EA:=(EA)+((P2)+XX)
ADD EA,XX,P3 B3 XX 10 ** P3 relativ EA:=(EA)+((P3)+XX)
ADD EA,=XXYY B4 YY XX 10 ** unmittelbar EA:=(EA)+XXYY
ADD EA,XX B5 XX 10 ** direkt EA:=(EA)+(FF00+XX)
ADD EA,@XX,P2 B6 XX 11 ** auto-
indiziert
P2:=(P2)+XX, EA:=(EA)+((P2))
EA:=(EA)+((P2)), P2:=(P2)+XX
ADD EA,@XX,P3 B7 XX 11 ** auto-
indiziert
P3:=(P3)+XX, EA:=(EA)+((P3))
EA:=(EA)+((P3)), P3:=(P3)+XX
ADD A,XX,PC F0 XX 7 ** PC relativ A:=(A)+((PC)+XX)
ADD A,XX,SP F1 XX 7 ** SP relativ A:=(A)+((SP)+XX)
ADD A,XX,P2 F2 XX 7 ** P2 relativ A:=(A)+((P2)+XX)
ADD A,XX,P3 F3 XX 7 ** P3 relativ A:=(A)+((P3)+XX)
ADD A,=XX F4 XX 7 ** unmittelbar A:=(A)+XX
ADD A,XX F5 XX 7 ** direkt A:=(A)+(FF00+XX)
ADD A,@XX,P2 F6 XX 8 ** auto-
indiziert
P2:=(P2)+XX, A:=(A)+((P2))
A:=(A)+((P2)), P2:=(P2)+XX
ADD A,@XX,P3 F7 XX 8 ** auto-
indiziert
P3:=(P3)+XX, A:=(A)+((P3))
A:=(A)+((P3)), P3:=(P3)+XX
SUB A,E 78 4 ** implizit A:=(A)-(E)
SUB EA,XX,PC B8 XX 10 ** PC relativ EA:=(EA)-((PC)+XX)
SUB EA,XX,SP B9 XX 10 ** SP relativ EA:=(EA)-((SP)+XX)
SUB EA,XX,P2 BA XX 10 ** P2 relativ EA:=(EA)-((P2)+XX)
SUB EA,XX,P3 BB XX 10 ** P3 relativ EA:=(EA)-((P3)+XX)
SUB EA,=XXYY BC YY XX 10 ** unmittelbar EA:=(EA)-XXYY
SUB EA,XX BD XX 10 ** direkt EA:=(EA)-(FF00+XX)
SUB EA,@XX,P2 BE XX 11 ** auto-
indiziert
P2:=(P2)+XX, EA:=(EA)-((P2))
EA:=(EA)-((P2)), P2:=(P2)+XX
SUB EA,@XX,P3 BF XX 11 ** auto-
indiziert
P3:=(P3)+XX, EA:=(EA)-((P3))
EA:=(EA)-((P3)), P3:=(P3)+XX
SUB A,XX,PC F8 XX 7 ** PC relativ A:=(A)-((PC)+XX)
SUB A,XX,SP F9 XX 7 ** SP relativ A:=(A)-((SP)+XX)
SUB A,XX,P2 FA XX 7 ** P2 relativ A:=(A)-((P2)+XX)
SUB A,XX,P3 FB XX 7 ** P3 relativ A:=(A)-((P3)+XX)
SUB A,=XX FC XX 7 ** unmittelbar A:=(A)-XX
SUB A,XX FD XX 7 ** direkt A:=(A)-(FF00+XX)
SUB A,@XX,P2 FE XX 8 ** auto-
indiziert
P2:=(P2)+XX, A:=(A)-((P2))
A:=(A)-((P2)), P2:=(P2)+XX
SUB A,@XX,P3 FF XX 8 ** auto-
indiziert
P3:=(P3)+XX, A:=(A)-((P3))
A:=(A)-((P3)), P3:=(P3)+XX
MPY EA,T 2C 37 ** implizit EA:=[(EA)*(T)]31:16,
T:=[(EA)*(T)]15:0
DIV EA,T 0D 41 ** implizit EA:=[(EA)/(T)]15:0,
T:=undefiniert
ILD A,XX,PC 90 XX 8   PC relativ A:=++((PC)+XX)
ILD A,XX,SP 91 XX 8   SP relativ A:=++((SP)+XX)
ILD A,XX,P2 92 XX 8   P2 relativ A:=++((P2)+XX)
ILD A,XX,P3 93 XX 8   P3 relativ A:=++((P3)+XX)
ILD A,XX 95 XX 8   direkt A:=++(FF00+XX)
ILD A,@XX,P2 96 XX 9   auto-
indiziert
P2:=(P2)+XX, A:=++((P2))
A:=++((P2)), P2:=(P2)+XX
ILD A,@XX,P3 97 XX 9   auto-
indiziert
P3:=(P3)+XX, A:=++((P3))
A:=++((P3)), P3:=(P3)+XX
DLD A,XX,PC 98 XX 8   PC relativ A:=--((PC)+XX)
DLD A,XX,SP 99 XX 8   SP relativ A:=--((SP)+XX)
DLD A,XX,P2 9A XX 8   P2 relativ A:=--((P2)+XX)
DLD A,XX,P3 9B XX 8   P3 relativ A:=--((P3)+XX)
DLD A,XX 9D XX 8   direkt A:=--(FF00+XX)
DLD A,@XX,P2 9E XX 9   auto-
indiziert
P2:=(P2)+XX, A:=--((P2))
A:=--((P2)), P2:=(P2)+XX
DLD A,@XX,P3 9F XX 9   auto-
indiziert
P3:=(P3)+XX, A:=--((P3))
A:=--((P3)), P3:=(P3)+XX

^ Seitenanfang


Logische Befehle

Mnemonic Hex-Code Zyklen Status Adressierung Wirkung
AND S,=XX 39 XX 5 *** unmittelbar S:=(S)&XX
AND A,E 50 4   implizit A:=(A)&(E)
AND A,XX,PC D0 XX 7   PC relativ A:=(A)&((PC)+XX)
AND A,XX,SP D1 XX 7   SP relativ A:=(A)&((SP)+XX)
AND A,XX,P2 D2 XX 7   P2 relativ A:=(A)&((P2)+XX)
AND A,XX,P3 D3 XX 7   P3 relativ A:=(A)&((P3)+XX)
AND A,=XX D4 XX 7   unmittelbar A:=(A)&XX
AND A,XX D5 XX 7   direkt A:=(A)&(FF00+XX)
AND A,@XX,P2 D6 XX 8   auto-
indiziert
P2:=(P2)+XX, A:=(A)&((P2))
A:=(A)&((P2)), P2:=(P2)+XX
AND A,@XX,P3 D7 XX 8   auto-
indiziert
P3:=(P3)+XX, A:=(A)&((P3))
A:=(A)&((P3)), P3:=(P3)+XX
OR S,=XX 3B XX 5 *** unmittelbar S:=(S)|XX
OR A,E 58 4   implizit A:=(A)|(E)
OR A,XX,PC D8 XX 7   PC relativ A:=(A)|((PC)+XX)
OR A,XX,SP D9 XX 7   SP relativ A:=(A)|((SP)+XX)
OR A,XX,P2 DA XX 7   P2 relativ A:=(A)|((P2)+XX)
OR A,XX,P3 DB XX 7   P3 relativ A:=(A)|((P3)+XX)
OR A,=XX DC XX 7   unmittelbar A:=(A)|XX
OR A,XX DD XX 7   direkt A:=(A)|(FF00+XX)
OR A,@XX,P2 DE XX 8   auto-
indiziert
P2:=(P2)+XX, A:=(A)|((P2))
A:=(A)|((P2)), P2:=(P2)+XX
OR A,@XX,P3 DF XX 8   auto-
indiziert
P3:=(P3)+XX, A:=(A)|((P3))
A:=(A)|((P3)), P3:=(P3)+XX
XOR A,E 60 4   implizit A:=(A)^(E)
XOR A,XX,PC E0 XX 7   PC relativ A:=(A)^((PC)+XX)
XOR A,XX,SP E1 XX 7   SP relativ A:=(A)^((SP)+XX)
XOR A,XX,P2 E2 XX 7   P2 relativ A:=(A)^((P2)+XX)
XOR A,XX,P3 E3 XX 7   P3 relativ A:=(A)^((P3)+XX)
XOR A,=XX E4 XX 7   unmittelbar A:=(A)^XX
XOR A,XX E5 XX 7   direkt A:=(A)^(FF00+XX)
XOR A,@XX,P2 E6 XX 8   auto-
indiziert
P2:=(P2)+XX, A:=(A)^((P2))
A:=(A)^((P2)), P2:=(P2)+XX
XOR A,@XX,P3 E7 XX 8   auto-
indiziert
P3:=(P3)+XX, A:=(A)^((P3))
A:=(A)^((P3)), P3:=(P3)+XX

^ Seitenanfang


Verzweigungsbefehle

Mnemonic Hex-Code Zyklen Status Adressierung Wirkung
BND XX 2D XX ?   PC relativ siehe: BND
BNZ XX 7C XX 5   PC relativ wenn (A)<>0 dann PC:=(PC)+XX
BNZ XX,P2 7E XX 5   P2 relativ wenn (A)<>0 dann PC:=(P2)+XX
BNZ XX,P3 7F XX 5   P3 relativ wenn (A)<>0 dann PC:=(P3)+XX
BP XX 64 XX 5   PC relativ wenn (A)>0 dann PC:=(PC)+XX
BP XX,P2 66 XX 5   P2 relativ wenn (A)>0 dann PC:=(P2)+XX
BP XX,P3 67 XX 5   P3 relativ wenn (A)>0 dann PC:=(P3)+XX
BRA XX 74 XX 5   PC relativ PC:=(PC)+XX
BRA XX,P2 76 XX 5   P2 relativ PC:=(P2)+XX
BRA XX,P3 77 XX 5   P3 relativ PC:=(P3)+XX
BZ XX 6C XX 5   PC relativ wenn (A)=0 dann PC:=(PC)+XX
BZ XX,P2 6E XX 5   P2 relativ wenn (A)=0 dann PC:=(P2)+XX
BZ XX,P3 6F XX 5   P3 relativ wenn (A)=0 dann PC:=(P3)+XX
CALL 0 10 17   indirekt (--(SP)):=(PC), PC:=(20h)
CALL 1 11 17   indirekt (--(SP)):=(PC), PC:=(22h)
CALL 2 12 17   indirekt (--(SP)):=(PC), PC:=(24h)
CALL 3 13 17   indirekt (--(SP)):=(PC), PC:=(26h)
CALL 4 14 17   indirekt (--(SP)):=(PC), PC:=(28h)
CALL 5 15 17   indirekt (--(SP)):=(PC), PC:=(2Ah)
CALL 6 16 17   indirekt (--(SP)):=(PC), PC:=(2Ch)
CALL 7 17 17   indirekt (--(SP)):=(PC), PC:=(2Eh)
CALL 8 18 17   indirekt (--(SP)):=(PC), PC:=(30h)
CALL 9 19 17   indirekt (--(SP)):=(PC), PC:=(32h)
CALL A 1A 17   indirekt (--(SP)):=(PC), PC:=(34h)
CALL B 1B 17   indirekt (--(SP)):=(PC), PC:=(36h)
CALL C 1C 17   indirekt (--(SP)):=(PC), PC:=(38h)
CALL D 1D 17   indirekt (--(SP)):=(PC), PC:=(3Ah)
CALL E 1E 17   indirekt (--(SP)):=(PC), PC:=(3Ch)
CALL F 1F 17   indirekt (--(SP)):=(PC), PC:=(3Eh)
JMP XXYY 24 YY XX 8   absolut PC:=XXYY
JSR XXYY 20 YY XX 15   absolut (--(SP)):=(PC), PC:=XXYY
RET 5C 10   implizit PC:=((SP)++)
SSM P2 2E ?   indiziert siehe: SSM
SSM P3 2F ?   indiziert siehe: SSM
NOP 00 3   implizit (PC)++

Anmerkungen:

  • Der Befehlscode 24 des JMP Befehls entspricht LD PC,=XXYY
  • Der Befehlscode 20 des JSR Befehls entspricht PLI PC,=XXYY
  • Der Befehlscode 5C des RET Befehls entspricht POP PC

In guten Assemblern für die INS 8070 Serie können jeweils beide Schreibweisen synonym verwendet werden.

BND
Ausgeschrieben heißt der BND Befehl: "Branch if Not Digit". Auf Deutsch etwa: "Verzweige, wenn es keine Ziffer ist". Der BND Befehl prüft, ob der Inhalt des Akkumulators einer ASCII-Ziffer (30h...39h) entspricht. Ist dies nicht der Fall, bleibt der Akkumulator unverändert und es wird ein PC relativer Sprung entsprechend dem dem zweiten Befehlsbyte ausgeführt. Ansonsten wird die ASCII-Ziffer im Akkumulator in eine Dezimalzahl (0...9) umgewandelt und die Programmausführung hinter dem BND Befehl fortgesetzt.

Für diesen Befehl ist die Anzahl der Zyklen nicht angegeben, weil sie vom Inhalt des Akkumulators abhängig ist.

SSM
Im vollen Wortlaut heißt der SSM Befehl: "Search and Skip if character Matched". Auf Deutsch etwa: "Suche und Überspringe bei einem passenden Zeichen". Der SSM Befehl durchsucht einen 256 Byte großen Speicherbereich nach dem gleichen Wert, der aktuell im Akkumulator enthalten ist. Die Suche beginnt ab der Speicheradresse, die im Register P2 (Befehlsbyte 2E) oder P3 (Befehlsbyte 2F) steht. Das Register P2 oder P3 wird dabei nach jedem Test automatisch um 1 weitergezählt. Sobald ein dem Akkumulator entsprechender Wert gefunden ist, wird die Programmausführung 2 Byte hinter dem SSM Befehl fortgesetzt. In diesem Fall enthält das Register P2 oder P3 die um 1 erhöhte Adresse, an der der Wert gefunden wurde. Wird in den 256 Speicherplätzen kein dem Akkumulator entsprechender Wert gefunden, so wird die Programmausführung direkt nach dem SSM Befehl fortgesetzt.

Für diesen Befehl ist die Anzahl der Zyklen nicht angegeben, weil sie davon abhängt, wie viele Speicherplätze getestet werden müssen.

^ Seitenanfang


Stapelbefehle

Mnemonic Hex-Code Zyklen Status Adressierung Wirkung
PUSH EA 08 8   implizit (--(SP)):=(EA)
PUSH A 0A 5   implizit (--(SP)):=(A)
PUSH PC 54 8   implizit (--(SP)):=(PC)
PUSH P2 56 8   implizit (--(SP)):=(P2)
PUSH P3 57 8   implizit (--(SP)):=(P3)
POP A 38 6   implizit A:=((SP)++)
POP EA 3A 9   implizit AE:=((SP)++)
POP P2 5E 10   implizit P2:=((SP)++)
POP P3 5F 10   implizit P3:=((SP)++)
PLI P2,=XXYY 22 YY XX 15   unmittelbar (--(SP)):=(P2), P2:=XXYY
PLI P3,=XXYY 23 YY XX 15   unmittelbar (--(SP)):=(P3), P3:=XXYY

Anmerkungen:

Es erscheint auf den ersten Blick etwas seltsam, dass es zwar den Befehl PUSH PC gibt, aber keinen POP PC. Der dazu gehörende Befehlscode 5C ist weiter oben bei den Verzeigungsbefehlen als RET Befehl gelistet. Denn das ist genau die Wirkung die das Rückholen einer Adresse vom Stack in den PC zur Folge hat.

Die PLI Befehle (Push and Load Immediate) sind für die beiden Pointer PC und SP nicht definiert. Die dazu gehörenden Befehlscodes wären 20 und 21. Der Befehlscode 20 ist weiter oben bei den Verzeigungsbefehlen als JSR Befehl gelistet. Denn das ist genau die Wirkung die der Befehl PLI PC,=XXYY bewirken würde. Das Retten der augenblicklichen Programmadresse auf den Stack und unmittelbares laden einer neuen Programmadresse. Der PLI Befehlscode 21 für den Stapelzeiger SP ist aber tatsächlich undefiniert. Siehe Ungesichertes Wissen.

^ Seitenanfang


Schiebe- und Rotations-Befehle

Mnemonic Hex-Code Zyklen Status Adressierung Wirkung
SR A 3C 3   implizit 0 nach rechts in A schieben
SRL A 3D 3   implizit L nach rechts in A schieben
SR EA 0C 4   implizit 0 nach rechts in EA schieben
SL A 0E 3   implizit 0 nach links in A schieben
SL EA 0F 4   implizit 0 nach links in EA schieben
RR A 3E 3   implizit A nach rechts rotieren
RRL A 3F 3 * implizit A nach rechts durch L rotieren

^ Seitenanfang


Ungesichertes Wissen

Im Befehlssatz des INS8070 sind nur 192 von 256 möglichen Befehlsbytes definiert. Undefiniert sind die Befehlsbytes der leeren Felder in folgender Tabelle:

0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_
_0 NOP CALL 0 JSR XXYY LD EA,PC LD A,E AND A,E XOR A,E ADD A,E
_1 XCH A,E CALL 1   LD EA,SP        
_2   CALL 2 PLI P2,=XXYY LD EA,P2        
_3   CALL 3 PLI P3,=XXYY LD EA,P3        
_4   CALL 4 JMP XXYY   LD PC,EA PUSH PC BP XX BRA XX
_5   CALL 5 LD SP,=XXYY   LD SP,EA      
_6 LD A,S CALL 6 LD P2,=XXYY   LD P2,EA PUSH P2 BP XX,P2 BRA XX,P2
_7 LD S,A CALL 7 LD P3,=XXYY   LD P3,EA PUSH P3 BP XX,P3 BRA XX,P3
_8 PUSH EA CALL 8   POP A LD E,A OR A,E   SUB A,E
_9 LD T,EA CALL 9   AND S,=XX        
_A PUSH A CALL A   POP EA        
_B LD EA,T CALL B   OR S,=XX        
_C SR EA CALL C MPY EA,T SR A XCH PC,EA RET BZ XX BNZ XX
_D DIV EA,T CALL D BND XX SRL A XCH EA,SP      
_E SL A CALL E SSM P2 RR A XCH EA,P2 POP P2 BZ XX,P2 BNZ XX,P2
_F SL EA CALL F SSM P3 RRL A XCH EA,P3 POP P3 BZ XX,P3 BNZ XX,P3
 
  8_ 9_ A_ B_ C_ D_ E_ F_
_0 LD EA,XX,PC ILD A,XX,PC LD T,XX,PC ADD EA,XX,PC LD A,XX,PC AND A,XX,PC XOR A,XX,PC ADD A,XX,PC
_1 LD EA,XX,SP ILD A,XX,SP LD T,XX,SP ADD EA,XX,SP LD A,XX,SP AND A,XX,SP XOR A,XX,SP ADD A,XX,SP
_2 LD EA,XX,P2 ILD A,XX,P2 LD T,XX,P2 ADD EA,XX,P2 LD A,XX,P2 AND A,XX,P2 XOR A,XX,P2 ADD A,XX,P2
_3 LD EA,XX,P3 ILD A,XX,P3 LD T,XX,P3 ADD EA,XX,P3 LD A,XX,P3 AND A,XX,P3 XOR A,XX,P3 ADD A,XX,P3
_4 LD EA,=XXYY   LD T,=XXYY ADD EA,=XXYY LD A,=XX AND A,=XX XOR A,=XX ADD A,=XX
_5 LD EA,XX ILD A,XX LD T,XX ADD EA,XX LD A,XX AND A,XX XOR A,XX ADD A,XX
_6 LD EA,@XX,P2 ILD A,@XX,P2 LD T,@XX,P2 ADD EA,@XX,P2 LD A,@XX,P2 AND A,@XX,P2 XOR A,@XX,P2 ADD A,@XX,P2
_7 LD EA,@XX,P3 ILD A,@XX,P3 LD T,@XX,P3 ADD EA,@XX,P3 LD A,@XX,P3 AND A,@XX,P3 XOR A,@XX,P3 ADD A,@XX,P3
_8 ST EA,XX,PC DLD A,XX,PC   SUB EA,XX,PC ST A,XX,PC OR A,XX,PC   SUB A,XX,PC
_9 ST EA,XX,SP DLD A,XX,SP   SUB EA,XX,SP ST A,XX,SP OR A,XX,SP   SUB A,XX,SP
_A ST EA,XX,P2 DLD A,XX,P2   SUB EA,XX,P2 ST A,XX,P2 OR A,XX,P2   SUB A,XX,P2
_B ST EA,XX,P3 DLD A,XX,P3   SUB EA,XX,P3 ST A,XX,P3 OR A,XX,P3   SUB A,XX,P3
_C       SUB EA,=XXYY   OR A,=XX   SUB A,=XX
_D ST EA,XX DLD A,XX   SUB EA,XX ST A,XX OR A,XX   SUB A,XX
_E ST EA,@XX,P2 DLD A,@XX,P2   SUB EA,@XX,P2 ST A,@XX,P2 OR A,@XX,P2   SUB A,@XX,P2
_F ST EA,@XX,P3 DLD A,@XX,P3   SUB EA,@XX,P3 ST A,@XX,P3 OR A,@XX,P3   SUB A,@XX,P3

Bisher sind zu jedem Mikroprozessor immer wieder "geheime" Befehle bekannt geworden. Es ist also zu vermuten, dass auch beim INS8070 einige der undefinierten Bytes durchaus sinnvolle Aufgaben erledigen.

^ Seitenanfang

©2003-2015 · Norbert Schneider · Impressum · Stand: Jul 15