TI-990 - TI-990
Der TI-990 war eine Serie von 16-Bit- Minicomputern, die in den 1970er und 1980er Jahren von Texas Instruments (TI) verkauft wurden . Der TI-990 war ein Ersatz für die früheren Minicomputersysteme von TI, den TI-960 und den TI-980. Es hatte mehrere einzigartige Funktionen und war einfacher zu programmieren als seine Vorgänger. Zu seinen Kernkonzepten gehörte die Fähigkeit, Multiprogramming einfach zu unterstützen, indem ein per Software umschaltbarer Satz von Prozessorregistern verwendet wurde , der es ermöglichte, schnelle Kontextwechsel zwischen Programmen durchzuführen .
Später implementierte TI den TI-990 in einer Single-Chip-Implementierung, dem TMS9900 , unter den ersten 16-Bit- Mikroprozessoren . Für den Einsatz in Low-End-Modellen des TI-990 gedacht, behielt es das Speichermodell und das Hauptspeicherregistersystem des 990 bei. Dieses Design wurde schließlich im Texas Instruments TI-99/4A viel weiter verbreitet , wo Details seines Speichermodells im Minicomputer-Stil erhebliche Nachteile aufwiesen.
Merkmale
Arbeitsbereiche
Beim TI-990 werden Register im Speicher abgelegt und über ein festes Register namens Workspace Pointer angesprochen. Das Konzept hinter dem Workspace besteht darin, dass der Hauptspeicher auf den neuen Halbleiter-RAM-Chips basierte, die TI entwickelt hatte und mit der gleichen Geschwindigkeit wie die CPU lief. Dies bedeutete, dass es keine Rolle spielte, ob die "Register" echte Register in der CPU waren oder im Speicher dargestellt wurden. Wenn der Arbeitsbereichszeiger mit einer Speicheradresse geladen wird, ist diese Adresse der Ursprung der "Register".
Es gibt drei harte Register im 990; den Arbeitsbereichszeiger (WP), den Programmzähler (PC) und das Statusregister (ST). Ein Kontextwechsel beinhaltete das Sichern und Wiederherstellen nur der harten Register.
Erweiterter Betrieb
Der TI-990 verfügte über die Möglichkeit, erweiterte Operationen durch die Verwendung von Plug-in-Hardware zu ermöglichen. Wenn die Hardware nicht vorhanden ist, fängt die CPU ab, damit die Software die Funktion ausführen kann. Der Operationscode (XOP) erlaubt 15 angeschlossene Geräte an einem System. Obwohl die Vorrichtung 15 vereinbarungsgemäß dafür reserviert ist, als Systemaufrufeintrag für Benutzerprogramme verwendet zu werden, um Systemdienste anzufordern.
Orthogonaler Befehlssatz
Der TI-990 verwendet einen ziemlich orthogonalen Befehlssatz . Die grundlegenden Befehlsformate erlaubten Ein-, Zwei- und Dreiwortbefehle. Die CPU des Modells 990/12 ermöglichte einen Vier-Wort-Befehl mit den Operationen im erweiterten Modus.
Architektonische Details
Allgemeine Registeradressierungsart
(R ist ein allgemeines Register, 0 bis 15.)
- 0. Register - der Wert ist zu oder von einem Register: OPR R ; R enthält Operanden
- 1. Indirektes Register - Register wird als Speicheradresse zum Lesen oder Schreiben verwendet: OPR *R ; R enthält Adresse
- 2. Indiziert: OPR @MEM(R); R enthält Indexwert, R0 wird bei der Indizierung nicht verwendet und ermöglicht eine direkte Speicheradressierung
- 3. Autoinkrement: OPR *R+ ; R enthält Adresse der Adresse, dann inkrementiere R um die Länge des Operandentyps
Mehrere Register hatten spezielle Verwendungen, die ihre Verwendung vorbehalten, das Register und ihre Verwendungen sind:
- R0 - Verschiebungszähler, Zähler im erweiterten Modus, Gleitkomma AC-0
- R1 - Gleitkomma AC-1
- R2 - Gleitkomma AC-2
- R3 - Gleitkomma AC-3
- R11 - XOP-Zeiger (Kernel-Modus), Rückverknüpfung
- R12 - CRU-Basisadresse (Kernel-Modus)
- R13 - Gespeicherter Arbeitsbereichszeiger
- R14 - Zähler für gespeicherte Programme
- R15 - Gespeicherter Status
TI-990 Anleitung
Die Befehlssätze 990/4, 990/5, 990/9 bestanden aus 69 Befehlen, der 990/10 hatte 72 Befehle, der 990/10A hatte 77 Befehle und der 990/12 hatte 144 Befehle. Die Anweisungen sind in Typen unterteilt, die ähnliche Eigenschaften haben.
Der erste Teil des Wortes gibt die auszuführende Operation an, die restlichen beiden Teile geben Auskunft zum Auffinden der Operanden.
- MOV (Wort bewegen)
- MOVB (Byte verschieben)
- A (Wort hinzufügen)
- AB (Byte hinzufügen)
- S (Wort subtrahieren)
- SB (Byte subtrahieren)
- C (Wort vergleichen)
- CB (vergleiche Byte)
- SZC (Nullen entsprechendes Wort setzen)
- SZCB (Nullen entsprechend Byte setzen)
- SOC (einen entsprechenden Wort setzen)
- SOCB (einen entsprechenden Byte setzen)
Der erste Teil des Wortes gibt die auszuführende Operation an, der zweite Teil ist ein relativer Versatz zum Zielort für JMP-Befehle oder der relative Versatz für die CRU-Bit-Adressierung.
- JMP (bedingungslos springen)
- JLT (Sprung wenn kleiner als Null)
- JLE (Sprung wenn kleiner oder gleich Null)
- JEQ (Sprung wenn Null)
- JHE (Sprung wenn logisch größer oder gleich Null)
- JGT (Sprung wenn größer als Null)
- JNE (Sprung wenn ungleich Null)
- JNC (Sprung wenn Carry Clear)
- JOC (Sprung wenn Carry gesetzt)
- JNO (Sprung wenn Überlauf gelöscht)
- JOP (Sprung bei ungerader Parität - nur relevant nach Byte-Operationen)
- JL (Sprung wenn logisch kleiner als Null)
- JH (Sprung wenn logisch größer als Null)
- SBO (CRU-Bit auf eins setzen)
- SBZ (CRU-Bit auf Null setzen)
- TB (CRU-Bit testen)
Ein Teil des Wortes spezifiziert die Operation, der zweite Teil stellt das Register bereit, der dritte Teil liefert Informationen zum Auffinden des zweiten Operanden.
- COC (vergleichen Sie die entsprechenden)
- CZC (vergleiche entsprechende Nullen)
- XOR (exklusiv oder)
- XOP (erweiterter Betrieb)
Der erste Teil des Wortes gibt die auszuführende Operation an, der zweite Teil ist die Bitbreite der Operation, der dritte Teil liefert Informationen zum Auffinden des zweiten Operanden.
- LDCR (CRU laden)
- STCR (CRU speichern)
Der erste Teil des Wortes gibt die auszuführende Operation an, der zweite Teil ist der Schiebezähler, der dritte Teil spezifiziert das zu verschiebende Register.
- SRA (Rechtsverschiebungsarithmetik)
- SRL (logisch nach rechts verschieben)
- SLA (nach links verschieben Arithmetik)
- SRC (nach rechts kreisförmig verschieben)
Der erste Teil spezifiziert die auszuführende Operation, der zweite Teil liefert Informationen zum Auffinden des zweiten Operanden.
- BLWP (Zweig- und Ladearbeitsbereichszeiger)
- B (Filiale)
- X ( ausführen )
- CLR (klares Wort)
- NEG (Zweierkomplement negiert)
- INV (Einer-Komplement)
- INC (Inkrement)
- INCT (Inkrement um zwei)
- DEZ (verringern)
- DECT (Verringerung um zwei)
- BL (Zweig und Link)
- ABS (Absolutwert)
- SWPB (Bytes tauschen)
- SETO (Wort auf Einsen setzen)
- LDS (Fernstrahlquelle, 990/10, 990/10A, 990/12)
- LDD (Fernziel, 990/10, 990/10A, 990/12)
- BIND (Zweig indirekt, 990/10A, 990/12)
- MPYS (mehrfach signiert, 990/10A, 990/12)
- DIVS (geteilt signiert, 990/10A, 990/12)
- AR (real hinzufügen, 990/12)
- CIR (Integer in Real umwandeln, 990/12)
- SR (Real abziehen, 990/12)
- MR (multiplizieren reell, 990/12)
- DR (real teilen, 990/12)
- LR (Last real, 990/12)
- STR (Store real, 990/12)
- AD (Doppeltes hinzufügen, 990/12)
- CID (Integer in Double umwandeln, 990/12)
- SD (Doppeltes subtrahieren, 990/12)
- MD (mehrfach doppelt, 990/12)
- DD (Doppelzimmer teilen, 990/12)
- LD (Doppelbelastung, 990/12)
- STD (doppelt speichern, 990/12)
Das Wort spezifizierte die auszuführende Operation.
- IDLE (CPU-Leerlauf)
- RSET (CPU-Reset)
- RTWP (Return-Workspace-Zeiger)
- CKON (Uhr an)
- CKOF (Uhr aus)
- LREX (ROM laden und ausführen)
- EMD (Mikrodiagnose ausführen, 990/12)
- EINT (Freigabe-Interrupt, 990/12)
- DINT (Interrupt deaktivieren, 990/12)
- CRI (Real in Integer umwandeln, 990/12)
- CDI (double in integer umwandeln, 990/12)
- NEGR (negiert reell, 990/12)
- NEGD (doppelt negieren, 990/12)
- CRE (Real in Extended Integer umwandeln, 990/12)
- CDE (Konvertieren von Double in Extended Integer, 990/12)
- CER (erweiterte ganze Zahl in reelle Zahl umwandeln, 990/12)
- CED (erweiterte ganze Zahl in Double umwandeln, 990/12)
- XIT (Gleitkomma verlassen - nop, 990/12)
Der erste Teil spezifiziert die Operation, der zweite Teil spezifiziert das Register oder die Maske. Der dritte Teil, falls vorhanden, gibt einen unmittelbaren Operanden in einem zweiten Wort an.
- LIMI (Interruptmaske sofort laden)
- LI (sofort laden)
- KI (sofort hinzufügen)
- ANDI (und sofort)
- ORI (oder sofort)
- CI (Vergleich sofort)
- STWP (Arbeitsbereichszeiger speichern)
- STST (Geschäftsstatus)
- LWPI (Workspace-Zeiger sofort laden)
- BLSK (Sofortige Push-Link auf Stack verzweigen, 990/12)
Ein Teil des Wortes spezifiziert die Operation, der zweite Teil stellt das Register bereit, der dritte Teil liefert Informationen zum Auffinden des zweiten Operanden.
- MPY (ohne Vorzeichen multiplizieren)
- DIV (Unsigned Divide)
Der erste Teil spezifiziert die Operation, der zweite Teil spezifiziert die Map-Datei (0=Kernel, 1=Benutzer) und der dritte spezifiziert ein Register. Diese Anweisung wird vom 990/10, 990/10A und 990/12 unterstützt.
- LMF (Map-Datei laden)
Das erste Wort ist der Opcode; der erste Teil des zweiten Wortes ist das Byte-Zählfeld, der zweite Teil ist der Zieloperand und der dritte Teil ist der Quelloperand. Diese Anweisungen werden vom 990/12 unterstützt.
- NRM (normalisieren)
- RTO (richtiger Test für Einser)
- LTO (linker Test für Einser)
- CNTO (zähle eins)
- BDC (Umwandlung von Binär in Dezimal)
- DBC (Dezimal-Binär-Konvertierung)
- SWPM (Mehrfach tauschen)
- XORM (xoder mehrfach)
- ORM (oder mehrere)
- ANDM (und mehrere)
- SM (Vielfaches subtrahieren)
- AM (mehrere hinzufügen)
Der erste Teil des ersten Wortes ist der Opcode, der zweite Teil des ersten Wortes bezeichnet ein Prüfpunktregister; der erste Teil des zweiten Wortes ist das Byte-Zählfeld, der zweite Teil ist der Zieloperand und der dritte Teil ist der Quelloperand. Diese Anweisungen werden vom 990/12 unterstützt.
- SNEB (Suchstring für ungleiches Byte)
- CRC (Cyclic Redundancy Code Berechnung)
- TS (String übersetzen)
- CS (String vergleichen)
- SEQB (Suchstring nach gleichem Byte)
- MOVS (String verschieben)
- MVSR (String umgekehrt verschieben)
- MVSK (String vom Stapel verschieben)
- POPS (Pop-String vom Stack)
- PSHS (String zum Stack drücken)
Das erste Wort ist der Opcode; der erste Teil des zweiten Wortes ist das Byte-Zählfeld, der zweite Teil ist der Verschiebungszähler und der dritte Teil ist der Quelloperand. Diese Anweisungen werden vom 990/12 unterstützt.
- SRAM (arithmetisches Vielfaches nach rechts verschieben)
- SLAM (nach links verschieben arithmetisches Vielfaches)
Das erste Wort ist der Opcode; der erste Teil des zweiten Wortes ist das Positionsfeld und der zweite Teil ist der Quelloperand. Diese Anweisungen werden vom 990/12 unterstützt.
- TMB (Speicherbit testen)
- TCMB (Speicherbit testen und löschen)
- TSMB (Merkerbit testen und setzen)
Der erste Teil des ersten Wortes ist der Opcode, der zweite Teil des ersten Wortes gibt eine Breite an; der erste Teil des zweiten Wortes ist die Position, der zweite Teil ist der Quelloperand. Diese Anweisung wird vom 990/12 unterstützt.
- IOF (Reihenfolge der Felder invertieren)
Der erste Teil des ersten Wortes ist der Opcode, der zweite Teil des ersten Wortes gibt eine Breite an; der erste Teil des zweiten Wortes ist die Position, der zweite Teil ist der Zieloperand und der dritte Teil ist der Quelloperand. Diese Anweisungen werden vom 990/12 unterstützt.
- INSF (Feld einfügen)
- XV (Auszugswert)
- XF (Feld extrahieren)
Das erste Wort ist der Opcode; der erste Teil des zweiten Wortes ist das Wertefeld und der zweite Teil ist das Register und der dritte Teil ist der relative Offset. Diese Anweisungen werden vom 990/12 unterstützt.
- SRJ (Wert vom Register subtrahieren und springen)
- ARJ (Wert hinzufügen, um zu registrieren und zu springen)
Der erste Teil des Wortes ist der Opcode und der zweite Teil ist die Registerspezifikation. Diese Anweisungen werden vom 990/12 unterstützt.
- STPC (PC im Register speichern)
- LIM (Interruptmaske aus Register laden)
- LST (Statusregister laden)
- LWP (Arbeitsbereichszeiger laden)
- LCS (Lastkontrollspeicher)
Das erste Wort ist der Opcode; der erste Teil des zweiten Wortes ist der Zieloperand und der zweite Teil ist der Quelloperand. Diese Anweisung wird vom 990/12 unterstützt.
- MOVA (Adresse umziehen)
Das erste Wort ist der Opcode; der erste Teil des zweiten Wortes ist das Bedingungscodefeld, der zweite Teil ist der Zieloperand und der dritte Teil ist der Quelloperand. Diese Anweisungen werden vom 990/12 unterstützt.
- SLSL (logische Adresse der Suchliste)
- SLSP (physikalische Adresse der Suchliste)
Der erste Teil des ersten Wortes ist der Opcode, der zweite Teil des ersten Wortes gibt die Ziellänge an; der erste Teil des zweiten Wortes gibt die Quelllänge an, der zweite Teil ist der Zieloperand und der dritte Teil ist der Quelloperand. Diese Anweisung wird vom 990/12 unterstützt.
- EP (Präzision erweitern)
Programmierbeispiel in Assembler
Ein komplettes " Hallo, Welt! "-Programm im TI-990-Assembler, um unter DX10 zu laufen :
IDT 'HELLO' TITL 'HELLO - hello world program' * DXOP SVC,15 Define SVC TMLUNO EQU 0 Terminal LUNO * R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 * DATA WP,ENTRY,0 * * Workspace (On the 990 we can "preload" registers) * WP DATA 0 R0 DATA 0 R1 DATA >1600 R2 - End of program SVC DATA >0000 R3 - Open I/O opcode DATA >0B00 R4 - Write I/O opcode DATA >0100 R5 - Close I/O opcode DATA STRING R6 - Message address DATA STRLEN R7 - Message length DATA 0 R8 DATA 0 R9 DATA 0 R10 DATA 0 R11 DATA 0 R12 DATA 0 R13 DATA 0 R14 DATA 0 R15 * * Terminal SVC block * TRMSCB BYTE 0 SVC op code (0 = I/O) TRMERR BYTE 0 Error code TRMOPC BYTE 0 I/O OP CODE TRMLUN BYTE TMLUNO LUNO TRMFLG DATA 0 Flags TRMBUF DATA $-$ Buffer address TRMLRL DATA $-$ Logical record length TRMCHC DATA $-$ Character count * * Message * STRING TEXT 'Hello world!' BYTE >D,>A STRLEN EQU $-STRING EVEN PAGE * * Main program entry * ENTRY MOVB R3,@TRMOPC Set open opcode in SCB SVC @TRMSCB Open terminal MOVB @TRMERR,R0 Check for error JNE EXIT MOVB R4,@TRMOPC Set write opcode MOV R6,@TRMBUF Set buffer address MOV R7,@TRMLRL Set logical record length MOV R7,@TRMCHC and character count SVC @TRMSCB Write message MOVB @TRMERR,R0 Check for error JNE CLOSE CLOSE MOVB R5,@TRMOPC Set close opcode SVC @TRMSCB Close terminal EXIT SVC R2 Exit program * END
Sie können das oben Genannte selbst auf einem TI-990-Simulator ausprobieren. Sim990 von Dave Pitts simuliert den TI-990 und enthält Software-Kits für native Betriebssysteme (einschließlich DX10).
Das folgende Programm ist eine eigenständige Version, die auf dem seriellen Terminal gedruckt wird, das an die CRU-Adresse 0 angeschlossen ist. Es veranschaulicht die CRU-E/A- und Arbeitsbereichsverknüpfung für die PRINT-Subroutine.
IDT 'HELLO' TITL 'HELLO - hello world program' * R0 EQU 0 R1 EQU 1 R2 EQU 2 R3 EQU 3 R4 EQU 4 R5 EQU 5 R6 EQU 6 R7 EQU 7 R8 EQU 8 R9 EQU 9 R10 EQU 10 R11 EQU 11 R12 EQU 12 R13 EQU 13 R14 EQU 14 R15 EQU 15 * * Terminal CRU bits * TRMCRU EQU >0 Terminal device address XMIT EQU 8 DTR EQU 9 RTS EQU 10 WRQ EQU 11 RRQ EQU 12 NSF EQU 13 * PAGE * * Main program entry * ENTRY LWPI WP Load our workspace pointer BLWP @PRINT Call our print routine DATA STRING DATA STRLEN IDLE * WP BSS 32 Main program workspace * * Message * STRING TEXT 'Hello world!' BYTE >D,>A STRLEN EQU $-STRING EVEN PAGE * * Print a message * PRINT DATA PRWS,PRENT PRENT EQU $ MOV *R14+,R2 Get buffer address MOV *R14+,R1 Get message length SBO DTR Enable terminal ready SBO RTS PRI010 LDCR *R2+,8 Send out a character TB WRQ Wait until done JNE $-2 SBZ WRQ DEC R1 JGT PRI010 RTWP * PRWS DATA 0,0,0,0,0,0,0,0 DATA 0,0,0,0,TRMCRU,0,0,0 * END ENTRY
TI-990-Modelle
Die TI-990-Prozessoren wurden je nach dem ursprünglichen Design, auf dem sie basieren, und dem verwendeten E/A-Bus in mehrere natürliche Gruppen eingeteilt.
Alle Modelle unterstützten die Communications Register Unit (CRU), bei der es sich um einen seriellen, bitadressierbaren E/A-Bus handelt. Außerdem wurde von höherwertigen Modellen der TILINE I/O Bus unterstützt, der dem beliebten UNIBUS von DEC ähnlich ist . Die TILINE unterstützte auch eine Master/Slave-Beziehung, die mehrere CPU-Boards in einem gemeinsamen Chassis mit Arbitrationskontrolle ermöglichte.
TILINE/CRU-Modelle
Die folgenden Modelle verwendeten die TILINE als ihren hauptsächlichen Massenspeicherbus:
- TI-990/5 — TMS-9900- Mikroprozessor mit 64 KB Speicher
- TI-990/10 – TTL-Prozessor mit Unterstützung für Speicherzuordnung für 2 MByte ECC-Speicher
- TI-990/10A – TMS-99000-Mikroprozessor mit Unterstützung für die Speicherzuordnung für 1 MByte Speicher
- TI-990/12 – Schottky-TTL-Prozessor mit Speicherzuordnung zu 2 MByte ECC-Speicher, Workspace-Caching, Hardware-Gleitkomma, Anweisungen im erweiterten Modus und beschreibbarem Steuerspeicher
Nur CRU-Modelle
Die folgenden Modelle verwendeten die CRU als Hauptbus:
- TI-990/4 — TMS-9900- Mikroprozessor mit 56 KB Speicher
- TI-990/9 — Die ursprüngliche TTL-Implementierung
Betriebssysteme
Für den TI-990 . waren mehrere Betriebssysteme verfügbar
Von TI:
Von Dritten:
Quellen
Externe Links
- Dave Pitts' TI 990-Seite — Enthält einen Simulator, Cross-Assembler, Cross-Linker, Dienstprogramme und Betriebssystem-Images.
- Übersetzer von SCI 990 in COBOL
- ti990.co.uk im Internetarchiv Site, die die Konservierung und Restaurierung von Minicomputern der TI 990-Serie detailliert beschreibt