[ CHEAP ]   [ CASM ]   [ CSIM ]   [ CSIM-P ]   [ Impressum ]


Der virtuelle Prozessor CHEAP


Allgemeines

Um bei der anstehenden Entwicklung der beiden Module Assembler und Simulator auf ein sicheres Fundament bauen zu können, entschieden wir uns für die eindeutige Spezifikation eines virtuellen Prozessors.

Aus dieser Überlegung heraus entstand der sog. CHEAP oder auch Cheap and Horrible Easy Architecture Processor. Die interne Befehlsverarbeitung wurde dabei jedoch nur ganz allgemein definiert. Probleme wie Pipelining oder Sprungvorhersage sind somit nicht Gegenstand der Spezifikation. Diese beschränkt sich im wesentlichen auf die unten angeführten Themen.

Register

Dem Nutzer stehen insgesamt 32 Register mit einer Bitbreite von 32 zur Verfügung.

category code name purpose
general 00 .. 26 holds user defined values
special 27 TA holds init value of Timer Alpha
28 TB holds init value of Timer Beta
29 PC holds Program Counter
30 RE holds REturn value for latest unconditional jump and return
31 RI holds Return value for latest Interrupt service routine

Interrupts

Dem Nutzer stehen 16 verschieden priorisierte Interrupts zur Verfügung. Deren individuelle Abarbeitung definiert sich durch folgende Punkte.

priority device priority device
00 system 04 screen
01 timer alpha 05 reserved
02 timer beta 06 reserved
03 keyboard 07 .. 15 unused

Ports

Dem Nutzer stehen 4096 bidirektionale Ports mit einer Bitbreite von 32 zur Verfügung. Die folgende Übersicht zeigt einige simulierte Geräte und die jeweils verwendeten Ports. Sender verwenden ungerade, Empfänger dagegen gerade Portnummern.

port device
00 keyboard
01 virtual screen
02 multi purpose data in
03 multi purpose data out
04 random number generator

Timer

Dem Nutzer stehen 2 voneinander unabhängige Timer zur Verfügung. Die Initialisierung eines Timers erfolgt durch Zuweisen des gewünschten Initialwertes. Der Timer ist daraufhin aktiv und löst nach dem Verstreichen der auf Millisekundenbasis definierten Zeitspanne einen Interrupt aus. Der Timer Alpha besitzt dabei die höhere Priorität.

Peripherie

Tatstatur

Der Nutzer kann mittels Tastatur einzelne Zeichen an den Prozessor senden. Bei jedem Tastendruck wird ein Interrupt ausgelöst. Bis zur Abholung werden die Daten in einem 128 Zeichen fassenden Puffer aufbewahrt. Der Puffer kann synchron zum Prozessortakt ausgelesen werden.

Bildschirm

Der an den Prozessor angeschlossene Bildschirm arbeitet als zeichenorientiertes Ausgabegerät. Mit Einschränkung lassen sich Eigenschaften und Verhalten des Bildschirms mit denen einer Textkonsole eines IBM PC vergleichen. Es wird ein Textmodus mit 25 Zeilen und 80 Spalten bei 4 Bit Farbtiefe simuliert. Die Cursorpositionierung als auch die Farbauswahl erfolgt über die Interpretation von ANSI Escape Zeichenfolgen.

In der folgenden Übersicht werden beispielhaft zwei einfache Sequenzen aufgezeigt.

some escape sequences used for screen control
^[[30;47m  -- set foreground color to black and background to white
^[[4D      -- move cursor back by 4 columns
            

Die an den Bildschirm gesendeten Zeichen werden in einem variabel großen Puffer abgelegt. Die Interpretation und Darstellung der im Puffer liegenden Daten erfolgt ebenfalls mit einstellbarer Geschwindigkeit. Können keine weiteren Zeichen in den Puffer geschrieben werden, wird vom Bildschirm ein Interrupt ausgelöst.

Multi Purpose

Die an den Prozessor angeschlossenen Geräte Multi Purpose Data In sowie Multi Purpose Data Out können zum Senden bzw. Empfangen beliebiger Datenmengen genutzt werden. Der Datenaustausch erfolgt, ohne Interrupts oder Polling, taktsynchron zum Prozessor. Im CSIM können Dateien des Hostsystems als Quelle bzw. Ziel spezifiziert werden.

Zufallszahlengenerator

Für die Erzeugung von Zufallszahlen wird ein entsprechendes Gerät simuliert. Die vom Generator gelesenen Zahlen werden taktsynchron erzeugt und liegen im Wertebereich 0 .. 2 ** 32 - 1 bzw. 0 .. 4294967295.

Befehlssatz

Befehlstypen

Bei der Programmierung des CHEAP kommen fünf verschiedene Befehlstypen zum Einsatz.

  1. i-type: instruction register, immediate
  2. r-type: instruction register, register
  3. j-type: instruction immediate
  4. s-type: instruction register
  5. v-type: instruction

Datentransfer

Die folgende Tabelle gibt eine Übersicht über alle derzeit unterstützten Befehle zum Datentransfer.

oc sc tp mne param description
0030rLW rg1, rg2Load Word to [drg] from memory position in [srg]
0031rSW rg1, rg2Store Word from [srg] at memory position in [srg]
0001rPDIrg1, rg2Peripheral Data Input to [drg] from port in [srg]
01 iPDIrg1, immPeripheral Data Input to [drg] from port in [imm]
0002rPDOrg1, rg2Peripheral Data Output from [srg] to port in [srg]                  
02 iPDOrg1, immPeripheral Data Output from [srg] to port in [imm]

Arithmetik und Logik

Die folgende Tabelle gibt eine Übersicht über alle derzeit unterstützten Befehle zu Arithmetik und Logik.

oc sc tp mne param description
0003rHI rg1, rg2set the HIgher bits of [drg] to value in [srg]
03 iHI rg1, immset the HIgher bits of [drg] to value in [imm]
0004rSETrg1, rg2Set [drg] Equal To [srg]
04 iSETrg1, immSet [drg] Equal To [imm]
iSETrg1, labSet [drg] Equal To [lab]
0032rXCHrg1, rg2eXCHange values between [drg] and [drg]
0005rADDrg1, rg2ADD value to [drg], value in [srg]
05 iADDrg1, immADD value to [drg], value in [imm]
0006rSUBrg1, rg2SUBtract value from [drg], value in [srg]
06 iSUBrg1, immSUBtract value from [drg], value in [imm]
0007rMULrg1, rg2MULtiply value in [drg] by value in [srg]
07 iMULrg1, immMULtiply value in [drg] by value in [imm]
0008rDIVrg1, rg2DIVide value in [drg] by value in [srg]
08 iDIVrg1, immDIVide value in [drg] by value in [imm]
0009rMODrg1, rg2MODulo between value in [drg] and value in [srg]
09 iMODrg1, immMODulo between value in [drg] and value in [imm]
000ArPCArg1, rg2set [drg] equal to Program Counter and Add [srg]
0A iPCArg1, immset [drg] equal to Program Counter and Add [imm]
000BrPCSrg1, rg2set [drg] equal to Program Counter and Subtract [srg]
0B iPCSrg1, immset [drg] equal to Program Counter and Subtract [imm]
000CrANDrg1, rg2bitwise AND between [drg] and [srg]
0C iANDrg1, immbitwise AND between [drg] and [imm]
000DrOR rg1, rg2bitwise ORbetween [drg] and [srg]
0D iOR rg1, immbitwise ORbetween [drg] and [imm]
000ErXORrg1, rg2bitwise XORbetween [drg] and [srg]
0E iXORrg1, immbitwise XORbetween [drg] and [imm]
000FrSHLrg1, rg2SHift Left [drg] for value in [srg] times
0F iSHLrg1, immSHift Left [drg] for value in [imm] times
0010rSHRrg1, rg2SHift Right [drg] for value in [srg] times
10 iSHRrg1, immSHift Right [drg] for value in [imm] times
0011rRTLrg1, rg2RoTate Left [drg] for value in [srg] times
11 iRTLrg1, immRoTate Left [drg] for value in [imm] times
0012rRTRrg2, rg2RoTate Right [drg] for value in [srg] times
12 iRTRrg2, immRoTate Right [drg] for value in [imm] times
0013rFBSrg1, rg2in [drg] Force Bit [srg] from right to be Set
13 iFBSrg1, immin [drg] Force Bit [imm] from right to be Set
0014rCBSrg1, rg2in [drg] Check if Bit [srg] from right is Set
14 iCBSrg1, immin [drg] Check if Bit [imm] from right is Set
0015rCSTrg1, rg2Check if Source Smaller Than value in [drg], source in [srg]        
15 iCSTrg1, immCheck if Source Smaller Than value in [drg], source in [imm]
0016rCGTrg1, rg2Check if Source Greater Than value in [drg], source in [srg]
16 iCGTrg1, immCheck if Source Greater Than value in [drg], source in [imm]
0017rCE rg1, rg2Check if Source Equal to value in [drg], source in [srg]
17 iCE rg1, immCheck if Source Equal to value in [drg], source in [imm]

Ablaufsteuerung

Die folgende Tabelle gibt eine Übersicht über alle derzeit unterstützten Befehle zur Ablaufsteuerung.

oc sc tp mne param description
0018sJMPrg1 JuMP to memory position in [srg]
18 jJMPimm JuMP to memory position in [imm]
jJMPlab JuMP to memory position in [lab]
0019sJMRrg1 JuMp to memory position in [srg] and allow Return
19 jJMRlab JuMp to memory position in [lab] and allow Return
jJMRimm JuMp to memory position in [imm] and allow Return
001ArBEZrg1, rg2Branch if value in [srg] is Equal to Zero, memory position in [srg]
1A iBEZrg1, immBranch if value in [srg] is Equal to Zero, memory position in [imm]
iBEZrg1, labBranch if value in [srg] is Equal to Zero, memory position in [lab]
001BrBGZrg1, rg2Branch if value in [srg] is Greater than Zero, mem position in [srg]
1B iBGZrg1, immBranch if value in [srg] is Greater than Zero, mem position in [imm]
iBGZrg1, labBranch if value in [srg] is Greater than Zero, mem position in [lab]
001CrISPrg1, rg2advise ISr belonging to priority [srg] to start at Position in [srg]
1C iISPrg1, immadvise ISr belonging to priority [srg] to start at Position in [imm]
iISPrg1, labadvise ISr belonging to priority [srg] to start at Position in [lab]
0033vISD return from latest Interrupt Service and declare it Done
0034vIRD Interrupt Requests Disabled
0035vIRE Interrupt Requests Enabled when following operation is completed

Spezialbefehle

Die folgende Tabelle gibt eine Übersicht über alle derzeit unterstützten Befehle zur Lösung spezieller Aufgaben.

oc sc tp mne param description
001DsLDArg1LoaD All registers using data beginning at memory position in [srg]
1D jLDAimmLoaD All registers using data beginning at memory position in [imm]
jLDAlabLoaD All registers using data beginning at memory position in [lab]
001EsSVArg1SaVe All registers to memory beginning at position in [srg]
1E jSVAimmSaVe All registers to memory beginning at position in [imm]
jSVAlabSaVe All registers to memory beginning at position in [lab]
1F jDTAimmset DaTA span that specifies next count bytes as data, count in [imm]
jDTAlabset DaTA span that specifies following bytes as data, data end in [lab]

Binärdateien

Übersicht

Die nachfolgenden Tabellen geben Aufschluß über den Aufbau eines CHEAP Befehls. Es wird zwischen den im vorigen Abschnitt angesprochenen Befehlstypen unterschieden. Mit Hilfe dieser Übersicht ist es also möglich, manuell und am CASM vorbei, eigenen Maschinencode bzw. eigene Binärdateien zu definieren.

i-type
1F 1E 1D 1C1B 1A 19 1817 16 15 1413 12 11 10 0F 0E 0D 0C0B 0A 09 0807 06 05 0403 02 01 00
oc oc oc ococ rg rg rgrg rg im imim im im im im im im imim im im imim im im imim im im im

r-type
1F 1E 1D 1C1B 1A 19 1817 16 15 1413 12 11 10 0F 0E 0D 0C0B 0A 09 0807 06 05 0403 02 01 00
oc oc oc ococ rg rg rgrg rg rg rgrg rg rg sc sc sc sc scsc sc sc scsc sc sc scsc sc sc sc

j-type
1F 1E 1D 1C1B 1A 19 1817 16 15 1413 12 11 10 0F 0E 0D 0C0B 0A 09 0807 06 05 0403 02 01 00
oc oc oc ococ im im imim im im imim im im im im im im imim im im imim im im imim im im im

s-type
1F 1E 1D 1C1B 1A 19 1817 16 15 1413 12 11 10 0F 0E 0D 0C0B 0A 09 0807 06 05 0403 02 01 00
oc oc oc ococ rg rg rgrg rg -- ---- -- -- sc sc sc sc scsc sc sc scsc sc sc scsc sc sc sc

v-type
1F 1E 1D 1C1B 1A 19 1817 16 15 1413 12 11 10 0F 0E 0D 0C0B 0A 09 0807 06 05 0403 02 01 00
oc oc oc ococ -- -- ---- -- -- ---- -- -- sc sc sc sc scsc sc sc scsc sc sc scsc sc sc sc

Beispiel

Im Folgenden wird am Beispiel der Addition zweier Zahlen die manuelle Übersetzung von Assemblercode aufgezeigt. Die Ergebnisse können via Hex-Editor in eine Datei eingetragen werden und sind dann vom CHEAP interpretierbar.

asm to bin translation bin to hex translation
JMP  4
11000 00000 00000 00000000000000100

DW  10
00000 00000 00000 00000000000001010
DW  20
00000 00000 00000 00000000000010100
DW   0
00000 00000 00000 00000000000000000

SET r01, 1
00100 00001 00000 00000000000000001
LW  r02, r01
00000 00010 00001 00000000000110000
ADD r01, 1
00101 00001 00000 00000000000000001
LW  r03, r01
00000 00011 00001 00000000000110000

ADD r02, r03
00000 00010 00011 00000000000000101
ADD r01, 1
00101 00001 00000 00000000000000001
SW  r02, r01
00000 00010 00001 00000000000110001

JMP 4095
11000 00000 00000 00000111111111111
            
11000000000000000000000000000100
C0000004

00000000000000000000000000001010
0000000A
00000000000000000000000000010100
00000014
00000000000000000000000000000000
00000000

00100000010000000000000000000001
20400001
00000000100000100000000000110000
00820030
00101000010000000000000000000001
28400001
00000000110000100000000000110000
00C20030

00000000100001100000000000000101
00860005
00101000010000000000000000000001
28400001
00000000100000100000000000110001
00820031

11000000000000000000111111111111
C0000FFF
            

[ CHEAP ]   [ CASM ]   [ CSIM ]   [ CSIM-P ]   [ Impressum ]