; Stand: 22.09.2025 ; Achtung! Wird immer wieder mal geändert/erweitert! * There is no byte order as it is a purely word based machine ! * * Characters are stored in little-endian order within a word ! * Word order: low word, high word (memory) Rx, Rx+1 (registers) * Opcode 00000 00 HALT 01-03 illegal 04 HALT 05-07 illegal * Opcode 00001 - Addition 08xy ADD Rx, Ry Rx <-- Rx + Ry 09xc ADD Rx, #c Rx <-- Rx + c 0900 NOP 0Axy ADD Rx, (Ry) 0Bx0 addr ADD Rx, addr Rx <-- Rx + [addr] 0Bxy offs ADD Rx, offs(Ry) 0Cxy ADDL Rx, Ry (Rx,Rx+1) <-- (Rx,Rx+1) + (Ry,Ry+1) 0D -- 0E 0F * Opcode 00010 - Transfer nach Speicher 10 -- ([0] <-- $FFFF, Sprung nach 2) 11 -- 12xy MOV (Ry), Rx [Ry] <-- Rx 13x0 addr MOV addr, Rx [addr] <-- Rx 13xy offs MOV offs(Ry), Rx [Ry + offs] <-- Rx 14 -- 15 -- 16xy MOVL (Ry), Rx [Ry] <-- (Rx,Rx+1) 17x0 addr MOVL addr, Rx [addr,addr+1] <-- (Rx,Rx+1) 17xy offs MOVL offs(Ry), Rx [Ry + offs] <-- (Rx,Rx+1) * Opcode 00011 - Transfer nach Register 18xy MOV Rx, Ry Rx <-- Ry 18Fy JMP Ry R15 <-- Ry 19xc MOV Rx, #c Rx <-- c 19Fc JMP c R15 <-- c (0<=c<=15) 1Axy MOV Rx, (Ry) Rx <-- [Ry] 1AFy JMP (Ry) R15 <-- [Ry] 1AFF addr JMP addr R15 <-- addr (eigentlich R15 <-- [R15]) 1Bx0 addr MOV Rx, addr Rx <-- [addr] 1BF0 addr JMP (addr) R15 <-- [addr] 1Bxy offs MOV Rx, offs(Ry) Rx <-- [Ry + offs] 1BFy offs JMP offs(Ry) R15 <-- [Ry + offs] 1Cxy MOVL Rx, Ry (Rx,Rx+1) <-- (Ry,Ry+1) 1D -- 1Exy MOVL Rx, (Ry) 1Fx0 addr MOVL Rx, addr 1Fxy offs MOVL Rx, offs(Ry) * Opcode 00100 - Transfer negativ nach Register 20xx NEG Rx Rx <-- -Rx 20xy MOV Rx, -Ry Rx <-- -Ry 21xc MOV Rx, #-c Rx <-- -c 22 23 24xx NEGL Rx (Rx,Rx+1) <-- -(Rx,Rx+1) 24xy MOVL Rx, -Ry (Rx,Rx+1) <-- -(Ry,Ry+1) 25 -- 26xy 27x0 27xy offs * Opcode 00101 - Subtraktion 28xy SUB Rx, Ry Rx <-- Rx - Ry 29xc SUB Rx, #c Rx <-- Rx - c 2Axy SUB Rx, (Ry) 2Bx0 addr SUB Rx, addr Rx <-- Rx - [addr] 2Bxy offs SUB Rx, offs(Ry) 2Cxy SUBL Rx, Ry (Rx,Rx+1) <-- (Rx,Rx+1) - (Ry,Ry+1) 2D -- 2Exy SUBL Rx, (Ry) 2Fx0 addr SUBL Rx, addr 2Fxy offs SUBL Rx, offs(Ry) * Opcode 00110 - Intersektion 30xy TEST Rx, Ry skip if (Rx & Ry) == 0 31xc TEST Rx, #c skip if (Rx & c) == 0 32xy TEST Rx, (Ry) 33x0 addr TEST Rx, addr 33xy offs TEST Rx, offs(Ry) 34xy AND Rx, Ry Rx <-- Rx & Ry 35xc AND Rx, #c Rx <-- Rx & c 36xy AND Rx, (Ry) Rx <-- Rx & [Ry] 37x0 addr AND Rx, addr Rx <-- Rx & [addr] 37xy offs AND Rx, offs(Ry) Rx <-- Rx & [Ry + offs] * Opcode 00111 - Subtrahieren mit Prüfen ? 38xy SLT Rx, Ry Skip wenn Rx < Ry 39xc SLT Rx, #c Skip wenn Rx < c 3A 3B 3C illegal * Opcode 01000 - vermutlich Unterbrechbarkeit und Schreibsperre 40 illegal 41ab erzeugt Trap im PZ1, ansonsten Wechsel zurück nach PZ1 a und b beliebig und werden von der CPU ignoriert 4112 USA Unterbrechbarkeit/Schreibsperre Aus 4121 USE Unterbrechbarkeit/Schreibsperre Ein 42-43 illegal - Umspeichern-Transfer 47x0 addr MOVM addr, Rx [addr..] <-- Rx..R14 47xy offs MOVM offs(Ry), Rx * Opcode 01001 - Lade Konstante 48-4A illegal 4Bx0 val MOV Rx, #val Rx <-- val 4Bxx val ADD Rx, #val Rx <-- Rx + val 4Bxy val MOV Rx, Ry+#val Rx <-- Ry + val 4BF0 addr JMS addr [addr] <-- R15; R15 <-- addr+2 - Bringe-Transfer 4Fx0 addr MOVM Rx, addr Rx..R14 <-- [addr..] 4Fxy offs MOVM Rx, offs(Ry) * Opcode 01010 50-57 illegal * Opcode 01011 - vermutlich Programmzustand wechseln oder Makroaufruf 58 illegal 59xx PZW xx xx für CPU beliebig; Rx wird hart auf R15 gesetzt ! alles nur geraten ! 5901 + 4 Parameter XAUSBI 5902 + 3 Parameter XEINCO 5903 + 3 Parameter XAUSCO 5906 + 6 Parameter 5910 + 7 Parameter 5921 - 0 Parameter 5970 + 1 Parameter 5971 + (1)2 Parameter 5976 + 2 Parameter kein Rücksprung 597E + 3 Parameter 597F - 0 Parameter kein Rücksprung 5A-5F illegal * Opcode 01100 - ? 60-67 illegal * Opcode 01101 - Bit setzen 69xc SETB Rx, #c set bit number 'c' in Rx; c=0..15 6C-6F illegal * Opcode 01110 - Bit löschen 71xc CLRB Rx, #c clear bit number 'c' in Rx; c=0..15 74-77 illegal * Opcode 01111 - Bit testen/skip 79xc TSTB Rx, #c skip if bit number 'c' is set 7C-7F illegal * Opcode 10000 80 illegal * Opcode 10001 - Schieben rechts 88 89xc SHR Rx, #c+1 Rx SHR (c+1); c=0..15 8A -- 8B -- 8C 8Dxc SHRL RX, #c+1 (Rx,Rx+1) SHR (c+1) 8E -- 8F -- * Opcode 10010 - Rotieren rechts 90 91xc ROR Rx, #c+1 Rx ROR (c+1); c=0..15 92 -- 93 -- 94 95xc RORL Rx, #c+1 96 97 * Opcode 10011 - Schieben links 98xy SHL Rx, Ry 99xc SHL Rx, #c+1 Rx SHL (c+1); c=0..15 9A -- 9B -- 9C 9Dxc SHLL Rx, #c+1 9E -- 9F -- * Opcode 10100 - Multiplikation A0-A3 illegal A4xy MUL Rx, Ry (Rx+1,Rx) <-- Rx * (Ry*2) A5xc MUL Rx, #(c*2) muss genauer getestet werden! * Opcode 10101 - Division A8-AB illegal ACxy DIV Rx, Ry Rx <-- (Rx / (Ry*2)); Rx+1 <-- Rest muss genauer getestet werden! * Opcode 10110 B0 illegal * Opcode 10111 B8 illegal * Opcode 11000 C0 illegal * Opcode 11001 - PKA C8dr OUT d, Rr d=3: select device/subdevice/function d=4: IO_DATA (write data byte) STROBE_1 d=5: IO_CTRL (write control byte) STROBE_2 d=6: SK: load byte counter d=7: SK: load address counter * Opcode 11010 - PKE D0dr IN d, Rr d=0: IO_DATA (start read) d=1: IO_CTRL (read status byte) d=2: Status von SK_EIN nach Bit 0 einlesen d=4: read BUSIN lines (control or data depending on function) * Opcode 11011 D8 illegal * Opcode 11100 E0xy JP Rx, Ry E1 illegal E3x0 addr JP Rx, addr jump to addr if Rx positive E3xy offs JP Rx, offs(Ry) E3xF offs JPR Rx, offs E4-E7 illegal * Opcode 11101 E8xy JZ Rx, Ry E9 illegal EBx0 addr JZ Rx, addr jump to addr if Rx zero EBxy offs JZ Rx, offs(Ry) jump to Ry+offs if Rx zero EBxF offs JZR Rx, offs jump to PC+offs if Rx zero EC-EF illegal * Opcode 11110 F0xy JNZ Rx, Ry F1 illegal F3x0 addr JNZ Rx, addr jump to addr if Rx non-zero F3F0 addr JMP addr F3xy offs JNZ Rx, offs(Ry) F3xF offs JNZR Rx, offs F4-F7 illegal * Opcode 11111 F8xy JN Rx, Ry F9 illegal FBx0 addr JN Rx, addr jump to addr if Rx negative FBxy offs JN Rx, offs(Ry) FBxF offs JNR Rx, offs FC-FF illegal ------------- useful macros: CALL addr, Rx - save return address in Rx and jump to addr 18xF MOV Rx, PC 09x6 ADD Rx, #6 1AFF addr JMP addr ------------- Geräteadressen: - E/A Status und Steuerung ("feste DAD") Device 0: Sudevice 0: Funktion 0: Schnellkanal-Transfer ; siehe A26301-F9001-X-0-98 Blatt 9 und 17 Funktion 2: INTERRUPT / Interrupt-Status abfragen (alle Geräte) (Aussenden Identifikationsbyte) Ergebnis: Bit 7: Device 0 Bit 6: Device 1 Bit 5: Device 2 Bit 4: Device 3 Bit 3: Device 4 Bit 2: Device 5 Bit 1: Device 6 Bit 0: Device 7 ?? Funktion 3: TERMINATION PENDING / Endemeldung abfragen (alle Geräte) Ergebnis: Bit 7: Device 0 Bit 6: Device 1 Bit 5: Device 2 Bit 4: Device 3 Bit 3: Device 4 Bit 2: Device 5 Bit 1: Device 6 Bit 0: Device 7 - Interne Geräte (FS, LSL, LSS) ("variable DAD") Device 0: Sudevice 1: Lochstreifenleser (Modul LE3+LE4) * Funktion 0: Urladen (Default nach RESET) * Funktion 1: Steuerbyte (schreiben) 7: 1=reset 4: 1=Übertragung über Schnellkanal [3: 1=Karte wechseln (Lochkartenleser)] [2: 1=Nullstellung (Lochkartenleser)] 1: 1=Vorschub rückwärts (nur Leser 38) 0: 1=Vorschub vorwärts * Funktion 1: Statusbyte (lesen) 7: Paritätsbit 5: (1=Leser nicht bereit) 3: 1=Daten bereit (im Eingabe-Register) (1=MPX Datenanforderung) 2: 1=normale Übertragung, 0=Schnellkanal (1=Schnellkanal-Transfer beendet) 0: (1=Befehl angenommen) Funktion 2: lese Eingabe-Register 2: Lochstreifenstanzer/Datenschreiber (Modul LA1) * Funktion 1: Steuerbyte (schreiben) 7: 0=enable 5: 4: [3: 1=Karte trennen (Kartenstanzer)] 2: 2: 1=Nullstellung (Lochkartenstanzer) 1: 1=Rücksetzen um ein Zeichen 0: 1=Vorschub vorwärts * Funktion 2: lade Ausgabe-Register 3: Fernschreiber Eingabe (Modul FS1) Funktion 1: Steuerbyte (schreiben) 7: 1=reset 6: 1=Anruf rücksetzen 5: 1=aktiviere Eingabe Funktion 1: Statusbyte (lesen) 4: 1=Empfänger bereit 3: 1=Daten bereit (im Eingabe-Register) 0: 1=Fernschreiber aktiv (identisch zu Subdev 4 Fkt 2) Funktion 2: Lese Eingabe-Register Subdevice 4: Fernschreiber Ausgabe (Modul FS2) Funktion 1: Steuerbyte (schreiben) 7: 1=reset 5: 1=aktiviere Ausgabe Funktion 1: Statusbyte (lesen) 3: 1=Sender bereit 0: 1=Fernschreiber aktiv (identisch zu Subdev 3 Fkt 2) Funktion 2: Lade Ausgabe-Register 5: Lochstreifenleser (Modul LE3)