ScummVM API documentation
code.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 *
21 * Based on the original sources
22 * Faery Tale II -- The Halls of the Dead
23 * (c) 1993-1996 The Wyrmkeep Entertainment Co.
24 */
25
26#ifndef SAGA2_CODE_H
27#define SAGA2_CODE_H
28
29namespace Saga2 {
30
31// types of operations for code generation
32// note that the macros listed below depend on the ordering of this
33// table to determine things like unary-op, binary-op, etc.
34
35enum op_types {
36 kOpUndefined = 0,
37
38 // internal operations
39
40 kOpNextblock, // continue execution at next block
41 kOpDup, // duplicate 16-bit value on stack
42 kOpDrop, // drop 16-bit value on stack
43
44 // primary values
45
46 kOpZero, // push a zero on the stack
47 kOpOne, // push a one on the stack
48 kOpConstint, // constant integer
49 kOpConstid, // constant id reference
50 kOpStrlit, // string literal
51 kOpSym, // symbol address
52 kOpSymref, // symbol contents
53 kOpClassref, // reference to "this"
54 kOpDeref, // dereference of an ID
55
56 // references within this module
57
58 kOpGetflag, // read from flag bit (mode)
59 kOpGetbyte, // read from byte field (mode)
60 kOpGetint, // read from integer field (mode)
61 kOpGetstr, // read from string field (mode)
62 kOpGetid, // read from id field (mode)
63
64 kOpPutflag, // put to flag bit (mode)
65 kOpPutbyte, // put to byte field (mode)
66 kOpPutint, // put to integer field (mode)
67 kOpPutstr, // put to string field (mode)
68 kOpPutid, // put to id field (mode)
69
70 kOpPea, // push effective address onto stack
71
72 // 'void' versions consume their arguments
73
74 kOpPutflagV, // put to flag bit (mode)
75 kOpPutbyteV, // put to byte field (mode)
76 kOpPutintV, // put to integer field (mode)
77 kOpPutstrV, // put to string field (mode)
78 kOpPutidV, // put to id field (mode)
79
80 // function call
81
82 kOpCallNear, // call function in same segment
83 kOpCallFar, // call function in other segment
84 kOpCcall, // call C function
85 kOpCcallV, // call C function ()
86 kOpCallMember, // call member function
87 kOpCallMemberV, // call member function ()
88
89 kOpEnter, // enter a function
90 kOpReturn, // return from function
91 kOpReturn_v, // return nothing from function
92
93 // branches
94
95 kOpJmp,
96 kOpJmpTrueV, // test arg and consume
97 kOpJmpFalseV, // test arg and consume
98 kOpJmpTrue, // test arg and don't consume
99 kOpJmpDalse, // test arg and don't consume
100 kOpJmpSwitch, // switch statement (integer)
101 kOpJmpStrswitch, // switch statement (string)
102 kOpJmpRandom, // random jump
103
104 // unary operators
105
106 kOpNegate,
107 kOpNot,
108 kOpCompl,
109
110 kOpIncV, // increment, don't push
111 kOpDecV, // decrement, don't push
112 kOpPostinc,
113 kOpPostdec,
114
115 // arithmetic
116
117 kOpAdd,
118 kOpSub,
119 kOpMul,
120 kOpDiv,
121 kOpMod,
122
123 // conditional
124
125 kOpConditional,
126 kOpComma,
127
128 // comparison
129
130 kOpEq,
131 kOpNe,
132 kOpGt,
133 kOpLt,
134 kOpGe,
135 kOpLe,
136
137 // string comparison
138
139 kOpStrEq,
140 kOpStrNe,
141 kOpStrGt,
142 kOpStrLt,
143 kOpStrGe,
144 kOpStrLe,
145
146 // shift
147
148 kOpRsh,
149 kOpLsh,
150
151 // bitwise
152
153 kOpAnd,
154 kOpOr,
155 kOpXor,
156
157 // logical
158
159 kOpLand,
160 kOpLor,
161 kOpLxor,
162
163 // string functions
164
165 kOpStrcat, // string concatenation
166 kOpStrformat, // string formatting
167
168 // assignment operators -- none of these are actually compiled into
169 // code (they become get/put type operations)
170
171 kOpAssign,
172 // none of these are even used currently...
173 kOpAsplus,
174 kOpAsminus,
175 kOpAstimes,
176 kOpAsdiv,
177 kOpAsmod,
178 kOpAsrshift,
179 kOpAslshift,
180 kOpAsand,
181 kOpAsor,
182
183 // Special ops
184
185 kOpSpeak,
186 kOpDialogBegin,
187 kOpDialogEnd,
188 kOpReply,
189 kOpAnimate,
190
191// New opcodes
192
193 kOpJmp_seedrandom, // seeded random jump
194 kOpSymrefX, // get the export number of the symbol
195
196 kOpLast /* about 90 so far */
197};
198
199// addressing modes for get and put
200
201enum addr_types {
202
203 // Offset reference to the thread structure
204
205 skAddrThread = 0,
206
207 // Offset reference to the stack
208
209 skAddrStack,
210
211 // Implicit reference to the currently executing segment
212
213 skAddrNear,
214
215 // Implicit reference to data segment
216
217 skAddrData,
218
219 // This addressing mode references any external segment
220 // using a 16-bit segment number and a 16-bit segment offset
221 // which immediately follow the instruction.
222
223 skAddrFar,
224
225 // This addressing mode is used for segment-array addressing
226 // it's a 16-bit segment followed by a 16-bit object number,
227 // followed by a (byte or bit) offset within the object
228
229 skAddrArray,
230
231 // This addressing mode uses a 16-bit segment number
232 // and a 16-bit offset which have been put on the stack.
233
234// skAddrIndirect, // use SEG:offset on stack
235// skAddrIndirectIndex, // use SEG:index:offset on stack
236
237 // This addressing mode is used for dereferencing objects.
238 // It consists of an _embedded_ address for retrieving the
239 // object number, followed by a 16-bit segment number for
240 // the dereferenced objects, followed by a 16-bit index
241 // into the dereferenced object.
242
243 // REM: We also need a "far deref" for computing the
244 // dereferenced object's segment number.
245
246 skAddrDeref,
247
248 // Addressing mode used for class member functions. It
249 // specified that the address is relative to whatever
250 // object the 1st argument is referrring to.
251
252 skAddrThis // relative to arg 1
253};
254
255#define IS_CONST(x) ((x) >= kOpConstint && (x) <= kOpConststr)
256#define IS_ADDRESS(x) ((x) == kOpSym)
257#define IS_UNOP(x) ((x) >= kOpNegate && (x) <= kOpPostdec)
258
259#define IS_BINOP(x) ((x) >= kOpAdd && (x) <= kOpStrcat)
260#define IS_ASOP(x) ((x) >= kOpAssign && (x) <= kOpAsor)
261
262// #define IS_UNOP2(x) ((x) == kOpGetarray || (x) == kOpPutarray)
263// #define CONST(op) ((op) >= kOpConstflag && (op) <= kOpConststr)
264
265// Flags for special statements
266
267#define SPEAKF_NOANIMATE (1<<0) // speaker should animate
268#define SPEAKF_ASYNC (1<<1) // async speech.
269
270#define REPLYF_ONCE (1<<0) // 'once' flag
271#define REPLYF_SUMMARY (1<<1) // response is only a summary
272#define REPLYF_CONDITION (1<<2) // response has a condition
273
274#define ANIMATEF_REPEAT (1<<0)
275
276// BasicBlock describes a block of generated code
277
278#ifdef COMPILE_H
279
280typedef struct _BasicBlock {
281 struct _BasicBlock *next; // pointer to next block
282
283 short label; // label for this block
284
285 struct _BasicBlock *from[2], // where we could have come from
286 *jumpto, // where to go if jump
287 *fallto; // where to go if fall through
288
289 struct _Statement *first_st, // statement list for this bblock
290 *last_st; // it's a circular list
291
292 ENode *test_expr; // test expression for jump
293 char in_flags, // flags for entering this block
294 jump_type; // where to go after this block
295
296 uint16 start_offset, // offset in module of this block
297 jump_offset; // offset of module of jump at end
298
299 int16 source_file, // source line of statement
300 source_line; // source file of statement
301 } BasicBlock;
302
303// Various flags for the block
304
305#define BBLOCK_CLABEL (1<<0) /* bblock begins with a 'C' label */
306#define BBLOCK_INTLABEL (1<<1) /* bblock begins with internal label */
307#define BBLOCK_FIRST (1<<2) /* first bblock in the function */
308#define BBLOCK_MANY (1<<3) /* many guys jump to here */
309#define BBLOCK_CASE (1<<4) /* case stmts might not have 'from' ptr */
310
311// Jump types
312
313enum jump_types {
314 kJumpNever = 0, /* never jump */
315 kJumpFalse, /* jump on expression if false */
316 kJumpTrue, /* jump on expression if true */
317 kJumpAlways, /* jump always */
318 kJumpCjump, /* 'c' goto stm, jumpto is a label # */
319 kJumpReturn, /* block ends with a 'return' statement */
320 kJumpSwitch, /* jumps to lots of places */
321};
322#endif
323/*
324 // Module describes all the code associated with a particular
325 // compilation unit.
326
327struct Module {
328 uint16 exportCount, // number of symbols exported
329 importCount; // number of symbols imported
330 uint16 exportOffset, // start of export table
331 importOffset; // start of import table
332
333 // Q: Should ModuleName be somewhere else, like in the main program?
334
335 uint16 staticSize; // size of static data
336 uint16 stringOffset; // unused in this version
337// int16 moduleName; // offset to name of module
338
339 // Followed by list of exports
340 // Followed by list of imports
341 // Followed by symbol names, each NULL-terminated
342 // Followed by actual code blocks
343
344};
345
346 // Exports: Each Export contains the offset to find the name of
347 // the object. After that is the offset to find the object itself.
348
349 // The first Export is always the module entry point
350
351struct ModuleExport { // an exported symbol
352 uint16 symbolOffset, // offset in module of symbol name
353 objectOffset; // where to find object
354};
355
356 // Imports: Each Import contains the offset to find the name of
357 // the object. After that is a blank pointer, which will be filled
358 // in with the real address of the object. When addressing the
359 // imported object, the code in this module will refer to this
360 // ModuleImport entry, and indirectly locate the referenced object.
361
362struct ModuleImport { // a module xref
363 uint16 symbolOffset; // where, from here, to find name
364 void *objectPointer; // NULL pointer, filled in on load
365};
366*/
367
368} // end of namespace Saga2
369
370#endif