Mikroprozessor INS 8070 (SC/MP 3)

Hauptmenü: Home | Baukästen | Einzelteile | Literatur | Versuche | Extras | Links

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. Selbst überprüfen konnte ich diese Angaben jedoch nicht, da mir dieser Computer nicht zur Verfügung steht.

Zur Klarstellung: Ich bin nicht daran interessiert, mich tiefer in dieses Gebiet einzuarbeiten oder gar einen MC 6400 käuflich zu erwerben. Sollten Anwender des MC 6400 jedoch feststellen, dass die hier gegebenen Informationen fehlerhaft sind, bin ich gerne bereit, entsprechende Korrekturen durchzuführen oder weiterführende Links aufzunehmen.


Bemerkungen zum Prozessor

Im Text der Anleitung zum MC 6400 Mikrocomputer befindet sich kein Hinweis auf den eingesetzten Mikroprozessor. Ich hatte 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 3 bezeichnet. Er darf jedoch nicht mit dem eigentlichen SC/MP Prozessor in P-Kanal-Technologie oder mit dessen direktem Nachfolger INS8060 (SC/MP 2) in N-Kanal-Technologie verwechselt werden. Die wesentlichen Unterschiede zwischen diesen Prozessoren sind:

SC/MP und INS8060 (SC/MP 2) INS8070 (SC/MP 3)
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 ist nur ein Mitglied einer größeren Prozessor-Familie. Zu dieser Familie gehören:

  • 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 beim 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 die Erweiterung dieses Bereichs auf die vollen 256 Byte geplant. Diese Ergänzung kam meines Wissens aber 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" 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 10   auto-indiziert P2:=(P2)+XX, EA:=((P2))
EA:=((P2)), P2:=(P2)+XX
LD @EA,XX(P3) 87 XX 10   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 10   auto-indiziert P2:=(P2)+XX, T:=((P2))
T:=((P2)), P2:=(P2)+XX
LD @T,XX(P3) A7 XX 10   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 7   auto-indiziert P2:=(P2)+XX, A:=((P2))
A:=((P2)), P2:=(P2)+XX
LD @A,XX(P3) C7 XX 7   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 10   auto-indiziert P2:=(P2)+XX, ((P2)):=(EA)
((P2)):=(EA), P2:=(P2)+XX
ST @EA,XX(P3) 8F XX 10   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 7   auto-indiziert P2:=(P2)+XX, ((P2)):=(A)
((P2)):=(A), P2:=(P2)+XX
ST @A,XX(P3) CF XX 7   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

^ 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 10 ** auto-indiziert P2:=(P2)+XX, EA:=(EA)+((P2))
EA:=(EA)+((P2)), P2:=(P2)+XX
ADD @EA,XX(P3) B7 XX 10 ** 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 7 ** auto-indiziert P2:=(P2)+XX, A:=(A)+((P2))
A:=(A)+((P2)), P2:=(P2)+XX
ADD @A,XX(P3) F7 XX 7 ** 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 10 ** auto-indiziert P2:=(P2)+XX, EA:=(EA)-((P2))
EA:=(EA)-((P2)), P2:=(P2)+XX
SUB @EA,XX(P3) BF XX 10 ** 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 7 ** auto-indiziert P2:=(P2)+XX, A:=(A)-((P2))
A:=(A)-((P2)), P2:=(P2)+XX
SUB @A,XX(P3) FF XX 7 ** auto-indiziert P3:=(P3)+XX, A:=(A)-((P3))
A:=(A)-((P3)), P3:=(P3)+XX
MPY EA,T 2C 37 ** implizit EA:=[(EA)*(T)]32:16,
T:=[(EA)*(T)]15:0
DIV EA,T 0D 41 ** implizit EA:=[(EA)/(T)]15:0,
T:=(EA)%(T)
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 8   auto-indiziert P2:=(P2)+XX, A:=++((P2))
A:=++((P2)), P2:=(P2)+XX
ILD @A,XX(P3) 97 XX 8   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 8   auto-indiziert P2:=(P2)+XX, A:=--((P2))
A:=--((P2)), P2:=(P2)+XX
DLD @A,XX(P3) 9F XX 8   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 7   auto-indiziert P2:=(P2)+XX, A:=(A)&((P2))
A:=(A)&((P2)), P2:=(P2)+XX
AND @A,XX(P3) D7 XX 7   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 7   auto-indiziert P2:=(P2)+XX, A:=(A)|((P2))
A:=(A)|((P2)), P2:=(P2)+XX
OR @A,XX(P3) DF XX 7   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 7   auto-indiziert P2:=(P2)+XX, A:=(A)^((P2))
A:=(A)^((P2)), P2:=(P2)+XX
XOR @A,XX(P3) E7 XX 7   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 PCL:=((SP)++), PCH:=((SP)++)
SSM (P2) 2E ?   indiziert siehe: SSM
SSM (P3) 2F ?   indiziert siehe: SSM
NOP 00 3   implizit (PC)++
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

^ 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

Paul Robson schreibt auf seiner Union JackSeite über den SC/MP Prozessor, dass bei den relativen Adressierungsarten mit dem Offset -128 (80h) der tatsächliche Offset aus dem E-Register geholt wird. Möglicherweise funktioniert das auch mit dem INS8070 Prozessor im MC 6400.

Im Befehlssatz des INS8070 sind nur 192 von 256 möglichen Befehlsbytes definiert. Undefiniert sind die in folgender Tabelle durch ein Minuszeichen markierten Befehlsbytes:

0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ A_ B_ C_ D_ E_ F_
_0 NOP CALL JSR LD LD AND XOR ADD LD ILD LD ADD LD AND XOR ADD
_1 XCH CALL - LD - - - - LD ILD LD ADD LD AND XOR ADD
_2 - CALL PLI LD - - - - LD ILD LD ADD LD AND XOR ADD
_3 - CALL PLI LD - - - - LD ILD LD ADD LD AND XOR ADD
_4 - CALL JMP - LD PUSH BP BRA LD - LD ADD LD AND XOR ADD
_5 - CALL LD - LD - - - LD ILD LD ADD LD AND XOR ADD
_6 LD CALL LD - LD PUSH BP BRA LD ILD LD ADD LD AND XOR ADD
_7 LD CALL LD - LD PUSH BP BRA LD ILD LD ADD LD AND XOR ADD
_8 PUSH CALL - POP LD OR - SUB ST DLD - SUB ST OR - SUB
_9 LD CALL - AND - - - - ST DLD - SUB ST OR - SUB
_A PUSH CALL - POP - - - - ST DLD - SUB ST OR - SUB
_B LD CALL - OR - - - - ST DLD - SUB ST OR - SUB
_C SR CALL MPY SR XCH RET BZ BNZ - - - SUB ST OR - SUB
_D DIV CALL BND SRL XCH - - - ST DLD - SUB ST OR - SUB
_E SL CALL SSM RR XCH POP BZ BNZ ST DLD - SUB ST OR - SUB
_F SL CALL SSM RRL XCH POP BZ BNZ ST DLD - SUB ST OR - SUB

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. Was ich persönlich als erstes ausprobieren würde, wäre die Überprüfung, ob die Befehlsbytes 02, 03, 04 und 05 zum gezielten Setzen und Rücksetzen der Flags CY/L und IE genutzt werden können. Im SC/MP hatten sie jedenfalls diese Funktion.

^ Seitenanfang

©2003-2010 · Norbert Schneider · Impressum · Stand: Nov 10