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


Der Simulator CSIM-P


Allgemeines

Mit dem CSIM-P wird das Verhalten eines CHEAP bei Verarbeitung von durch CASM erzeugten Maschinencode simuliert. Die Entwicklung der Anwendung erfolgte unter Einsatz von Red Hat Linux 7.1 und SunOS 5.9. Das verwendete Makefile gibt Auskunft über die im Detail eingesetzten Werkzeuge. Die Arbeit an der Anwendung wurde zu einem sehr frühen Entwicklungszeitpunkt eingestellt. Diesem Unstand ist auch der niedrige Bedienungskomfort anzulasten. Zur Überprüfung der Ausgabe des CASM kann das Werkzeug nur unter gewissen Einschränkungen eingesetzt werden. Es empfiehlt sich daher in den meisten Fällen die Verwendung des CSIM.

Übersetzen und Aufruf

Das Übersetzen sollte auf allen Linux-Rechnern durch Ausführen des make Kommandos im entsprechenden Ordner möglich sein. Zuvor sollte jedoch der Include-Pfad zu den ncurses-Headerfiles angepasst werden. Der Inhalt des verwendeten Makefiles ist nachfolgend aufgeführt.

makefile used to make CSIM
all: Makefile csim.pas
        gpc --automake -s -I/pub/projekte/GNU_PASCAL/ncurses/include -ocsim csim.pas
        rm crt.gpi crt.o crtc.o gpc.gpi gpc.gpm gpc.o gpc_bp.gpi gpc_delphi.gpi\
           gpc_ep.gpi gpc_sp.gpi elapsecs.o
            

Der Aufruf des fertigen Simulators ist dann denkbar einfach. Mit dem optionalen Parameter --step wird ein Schrittmodus erzwungen, bei dem jeder Befehl erst nach betätigen der Tabulatortaste abgearbeitet wird.

command line used to start CSIM
./csim binary [-s|--step]|[-d|--delay]
            

Arbeitsweise

Zu Beginn der Simulation wird die Binärdatei in den virtuellen CHEAP-Hauptspeicher eingelesen. Ein Hexdump gibt Auskunft über dessen Inhalt. Alle Register werden mit dem Wert Null initialisiert.

Durch betätigen von Enter beginnt die eigentliche Simulation. Wurde der Schrittbetrieb aktiviert, muß die Tabulatortaste gedrückt werden, ehe der erste Befehl abgearbeitet wird. Die übrigen Tasten werden bei Betätigung als Eingabe für das laufende Programm interpretiert und an dieses weitergereicht.

Zu jedem interpretierten Befehl wird nun eine Zeile mit Statusinformationen ausgegeben. Eine solche Zeile kann wie folgt schematisiert werden.

CSIM instruction info, scheme CSIM instruction info, example
instr/type [rg1<value>|imm [, rg2<value>|imm]]
            
add/oc r1[2], 1
            

Die Simulation wird abgebrochen, wenn der simulierte Program Counter den Wert 4095 annimmt. Da die CHEAP-Anwendungen ohne die Zwischenschicht eines Betriebssystems auf dem Prozessor laufen, entschied man sich für diese Herangehensweise, um das Ende eines Programmes zu definieren.

Wurde das Programm beendet, gibt ein weiterer Hexdump Auskunft über den aktuellen Inhalt des CHEAP-Hauptspeichers. Durch das abgelaufene Programm vollzogene Änderungen können somit noch einmal im Gesamtbild nachvollzogen werden.

Beispiele für Simulationen

Addition zweier Zahlen

Bei dem unten aufgezeigten Programm sind die Zahlen 10 bzw. 0Ah und 20 bzw. 14h im Speicher an Offset 1 und 2 abgelegt. Die Zahlen werden ausgelesen und addiert. Das Ergebnis der Addition wird an Offset 3 im Speicher abgelegt.


source hexdump instruction infos final hexdump
C0 00 00 04     
00 00 00 0A
00 00 00 14
00 00 00 00
20 40 00 01
00 82 00 30
28 40 00 01
00 C2 00 30
00 86 00 05
28 40 00 01
00 82 00 31
C0 00 0F FF
            
jmp/oc 4             
set/oc r1[0], 1
lw /sc r2[0], r1[1]
add/oc r1[1], 1
lw /sc r3[0], r1[2]
add/sc r2[10], r3[20]
add/oc r1[2], 1
sw /sc r2[30], r1[3]
jmp/oc 4095
            
C0 00 00 04     
00 00 00 0A
00 00 00 14
00 00 00 1E
20 40 00 01
00 82 00 30
28 40 00 01
00 C2 00 30
00 86 00 05
28 40 00 01
00 82 00 31
C0 00 0F FF
            

Buchstaben zu Großbuchstaben

Bei dem unten aufgezeigten Programm wird eine beliebige am Programmende definierte Zeichenkette zu einer Zeichenkette in Großbuchstaben umgewandelt. Zeichen, die keine Buchstaben darstellen, bleiben unangetastet. Die in der Binärdatei definierte Zeichenkette kann dort geändert werden. Die Endekennung erfolgt wie üblich durch eine binäre Null.


source hexdump instruction infos final hexdump
20 40 00 0D
01 02 00 30
D1 00 0F FF
01 48 00 04
A9 40 00 60
D1 40 00 0A
01 48 00 04
B1 40 00 7C
D1 40 00 0A
31 00 00 20
01 02 00 31
28 40 00 01
C0 00 00 01
00 00 00 3E  = >
00 00 00 20  =
00 00 00 63  = c
00 00 00 68  = h
00 00 00 65  = e
00 00 00 61  = a
00 00 00 70  = p
00 00 00 41  = A
00 00 00 73  = s
00 00 00 6D  = m
00 00 00 20  =
00 00 00 3C  = <
00 00 00 00
            
set/oc r1[0], 13
lw /sc r4[0], r1[13]
bez/oc r4[62], 4095
set/sc r5[0], r4[62]
cst/oc r5[62], 96
bez/oc r5[0], 10
sw /sc r4[62], r1[13]
add/oc r1[13], 1
jmp/oc 1
lw /sc r4[62], r1[14]
bez/oc r4[32], 4095
set/sc r5[0], r4[32]
cst/oc r5[32], 96
bez/oc r5[0], 10
sw /sc r4[32], r1[14]
add/oc r1[14], 1
jmp/oc 1

:
some more loops
:

lw /sc r4[32], r1[24]
bez/oc r4[60], 4095
set/sc r5[0], r4[60]
cst/oc r5[60], 96
bez/oc r5[0], 10
sw /sc r4[60], r1[24]
add/oc r1[24], 1
jmp/oc 1
lw /sc r4[60], r1[25]
bez/oc r4[0], 4095
            
20 40 00 0D
01 02 00 30
D1 00 0F FF
01 48 00 04
A9 40 00 60
D1 40 00 0A
01 48 00 04
B1 40 00 7C
D1 40 00 0A
31 00 00 20
01 02 00 31
28 40 00 01
C0 00 00 01
00 00 00 3E  = >
00 00 00 20  =
00 00 00 43  = C
00 00 00 48  = H
00 00 00 45  = E
00 00 00 41  = A
00 00 00 50  = P
00 00 00 41  = A
00 00 00 53  = S
00 00 00 4D  = M
00 00 00 20  =
00 00 00 3C  = <
00 00 00 00
            

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