non-working demo feature
[awish.git] / src / vm.h
blob66c4f9f637fcdd98c38c4e579b83c0a0797c85f3
1 /*
2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation, either version 3 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #ifndef _VM_H_
16 #define _VM_H_
19 #define VM_STACK_SIZE (1024)
20 #define VM_VARS_SIZE (127)
22 #define VM_MAX_THREADS (280)
25 enum {
26 VM_ADD,
27 VM_SUB,
28 VM_MUL,
29 VM_DIV,
30 VM_MOD,
31 VM_BOR,
32 VM_XOR,
33 VM_AND,
35 VM_JEQ,
36 VM_JNE,
37 VM_JLT,
38 VM_JLE,
39 VM_JGT,
40 VM_JGE,
42 VM_JMP,
44 VM_BSR,
46 VM_BRK,
47 VM_END,
48 VM_NEW,
50 VM_SET,
51 VM_GET,
53 VM_PSH,
54 VM_POP,
55 VM_SWP,
56 VM_PCK,
57 VM_ROL,
58 VM_DPT,
60 VM_TID,
61 VM_KIL,
62 VM_SUS,
63 VM_RES,
64 VM_STA,
66 VM_RXC,
67 VM_WXC,
69 VM_RET,
71 VM_RST,
73 VM_MGF,
74 VM_MGB,
75 VM_MSF,
76 VM_MSB,
78 VM_LASTOP
82 extern const char *vmOpNames[];
84 extern unsigned char vmCode[65536];
85 extern int vmCodeSize;
86 extern int vmGVars[VM_VARS_SIZE];
89 // <0: BRK; >0: END; 0: continue
90 typedef int (*VMRSTCB) (int tid, int opcode, int argc, int argv[], int *argp[]);
92 extern VMRSTCB vmRSTCB; // argv[0] is ALWAYS fid
95 typedef int (*VMMapGetCB) (int tid, int fg, int x, int y);
96 typedef void (*VMMapSetCB) (int tid, int fg, int x, int y, int tile);
98 extern VMMapGetCB vmMapGetCB;
99 extern VMMapSetCB vmMapSetCB;
102 // initialize VM, init main thread
103 extern int vmInitialize (void); // glovals, code and codesize must be set
104 extern void vmDeinitialize (void);
106 extern void vmExecuteAll (void);
108 // <0: BRK; >0: END; 0: ok
109 // maxinst<0: any number of instructions
110 extern int vmExecuteBSR (int tid, int pc, int maxinst);
112 // <0: BRK; >0: END
113 extern int vmExecuteOne (int tid);
115 extern int vmIsThreadAlive (int tid);
117 extern int vmNewThread (int pc); // returns thread id or -1
118 extern int vmKillThread (int tid);
119 extern int vmIsSuspendedThread (int tid);
120 extern int vmSuspendThread (int tid);
121 extern int vmResumeThread (int tid);
123 extern int vmGetTVar (int tid, int idx);
124 extern int vmSetTVar (int tid, int idx, int value);
125 extern int vmGetPC (int tid);
126 extern int vmSetPC (int tid, int pc);
128 extern int vmGetSP (int tid);
129 extern int vmSetSP (int tid, int value);
130 extern int vmGetStack (int tid, int idx); // <0: from stack top; >=0: from bottom (0: latest pushed item)
131 extern int vmSetStack (int tid, int idx, int value);
133 extern int vmPush (int tid, int value);
134 extern int vmPop (int tid);
136 extern int vmLoadArgs (int tid, int argc, int argv[], int *argp[], int aargc, int aargv[], int *aargp[]); // max 3 aargs
139 extern int vmLastThread (void);
142 // !0: error
143 extern int vmSaveState (FILE *fl);
145 // !0: error; VM is deinitialized on error
146 extern int vmLoadState (FILE *fl);
149 #endif