forked from chpatrick/IMPS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
216 lines (133 loc) · 4.65 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
IMPS-FANCY Assembler/Emulator 2011
Patrick Chilton pc2210
Ben Perry bp110
Jonathan Roitgrund jr1610
Daniel Woffinden daw10
Since including the emulator into one binary would defeat the point of adding
dynamic linking somewhat, the complete project (including demos) is included
in the file fancy.tar.gz, which can be extracted using
$ tar -xvf fancy.tar.gz
to get the code, and see below for compilation and usage instructions.
COMPILATION
Makefiles should be included, but it that fails:
EMULATOR:
gcc -c -o emulate.o emulate.c
gcc -c -o linker.o linker.c
gcc -c -o gltools.o gltools.c
gcc -c -o hardware.o hardware.c
gcc -lGL -lGLU -lSDL -lreadline emulate.o linker.o gltools.o hardware.o -o emulate
ASSEMBLER:
gcc -c -o assemble.o assemble.c
gcc -c -o hashtable.o hashtable.c
gcc -c -o opinfo.o opinfo.c
gcc assemble.o hashtable.o opinfo.o -o assemble
USAGE
options can be specified anywhere in command.
ASSEMBLER:
$ assemble [options] source dest
accepted options:
-v: verbose output
-q: suppress standard messages
EMULATOR:
$ emulate [options] binary
accepted options:
-d: debug mode
DEBUGGER:
If emulate is started with the -d options, it starts an interactive CLI
shell allowing you to step through the program for debugging purposes.
Commands:
step - perform one operation
dump - show register contents
stepd - step and dump
mem - memory dump using xxd
run - run until halted
exit - quit the debugger
PREPROCESSOR:
The assembler invokes the C preprocessor before assembling, allowing the
usual macros, includes, defines, etc.
DYNAMIC LINKER:
Label imports: label@filename
Label exports: ~label
For instance, jmp divider@test2.oout will jump to the location "divider" in
the binary "test2.oout" and ~divider will make the location "divider"
available for reference from other files.
Labels MUST be explicitly exported using the ~ operator for the linker
to find them.
See files linking.s and linked.s in demos/ for a concrete example.
GRAPHICS
Added "gpu" hardware call (see below), takes immediate value to determine function
0 initOpenGL
initialise OpenGL functions
1 glStartFrame
clears frame buffer (sets to black)
2 gl3dProjection
sets up 3d projection matrix
3 gl2dProjection
sets up 2d projection matrix
4 glStartPoly
starts drawing a polygon
5 glDrawVertex
adds vertex to current polygon
xyz = R20, R21, R22
RGB = R23, R24, R25
6 glDrawPixelRGB
draws pixel
xy = R20, R21
RGB = R23, R24, R25
7 glEnd
finish drawing a polygon
8 glPresentFrame
presents back buffer to screen
Rules for use
> a initOpenGL must precede any other calls
> each frame must begin with a glStartFrame and end with a glPresentFrame
> 3D instructions must follow a gl3DProjection, not a gl2DProjection, and
vice versa (though both can be used in a single frame)
> each 3D polygon consists of glDrawVertex calls preceded by a glStartPoly
call and followed by a glEnd call
DEMOS:
glDemo - 3D sine wave
glTrippy - 3D graphical effect
mandelbrot - 2D mandelbrot set (give it a couple of seconds to render)
ackermann - computes the 2 argument ackermann function
- ackermann2 is optimised to utilise tail recursion
- ackermann2-imps is an IMPS compliant version, without extensions
linking
linked - basic dynamic linking
stack
stack2 - push/pop/call tests
APPENDIX I: ADDED INSTRUCTIONS
"push", 18, R1TYPE
pushes $1 to the the stack, sp -= 4
"pop" , 19, R1TYPE
pops from the stack to $1, sp += 4
"mvsp", 20, R1TYPE
$1 = sp, ie creates a base pointer
"call", 21, JTYPE
pushes pc+4 to the head of the stack, sp -= 2 and jumps to A.
"ret" , 22, MISC
pops the value at the head of the stack to pc (jumps back to caller), sp += 2
"fadd", 23, RTYPE
$1 = $2 + $3 for floats
"fsub", 24, RTYPE
$1 = $2 - $3 for floats
"fmul", 25, RTYPE
$1 = $2 * $3 for floats
"fdiv", 26, RTYPE
$1 = $2 / $3 for floats
"itof", 27, R12TYPE
$1 = $2 converted from int to float
"ftoi", 28, R12TYPE
$1 = $2 converted from float to int
"shl" , 29, ITYPE
$1 = $2 << C
"shr" , 30, ITYPE
$1 = $2 >> C
"sb" , 31, ITYPE
memory[$2 + C] = $1
"gpu" , 32, JTYPE
GPU hardware call, see above
"fsin", 33, R12TYPE
$1 = sin($2) ($1, $2 :: float)
"tics", 34, R1TYPE
$1 = milliseconds since start :: int