TI-990 - TI-990

TI-990 Programmierer-Panel

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.

Anleitung Typ 1

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)
Anleitung Typ 2

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)
Anleitung für Typ 3

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)
Anleitung Typ 4

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)
Anleitung Typ 5

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)
Anleitung für Typ 6

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)
Anleitung Typ 7

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)
Anleitung für Typ 8

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)
Anleitung für Typ 9

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)
Anweisung vom Typ 10

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)
Anleitung für Typ 11

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)
Typ 12 Anweisungen

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)
Anweisungen für Typ 13

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)
Anweisungen für Typ 14

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)
Anweisung Typ 15

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)
Anweisungen für Typ 16

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)
Anleitung Typ 17

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)
Anleitung Typ 18

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)
Anweisung Typ 19

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)
Anleitung Typ 20

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)
Anweisung Typ 21

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:

  • TX990/TXDS
  • DX10
  • Verteiltes DNOS- Netzwerkbetriebssystem

Von Dritten:

Quellen

Externe Links