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/>.
19 #define VM_STACK_SIZE (1024)
20 #define VM_VARS_SIZE (127)
22 #define VM_MAX_THREADS (512)
94 typedef struct VMLabelInfo
{
95 struct VMLabelInfo
*next
;
103 extern const char *vmOpNames
[];
105 extern unsigned char vmCode
[65536];
106 extern int vmCodeSize
;
107 extern int vmGVars
[VM_VARS_SIZE
];
110 // <0: BRK; >0: END; 0: continue
111 typedef int (*VMRSTCB
) (int tid
, int opcode
, int argc
, int argv
[], int *argp
[]);
113 extern VMRSTCB vmRSTCB
; // argv[0] is ALWAYS fid
116 typedef int (*VMMapGetCB
) (int tid
, int fg
, int x
, int y
);
117 typedef void (*VMMapSetCB
) (int tid
, int fg
, int x
, int y
, int tile
);
119 extern VMMapGetCB vmMapGetCB
;
120 extern VMMapSetCB vmMapSetCB
;
123 // initialize VM, init main thread
124 extern int vmInitialize (void); // glovals, code and codesize must be set
125 extern void vmDeinitialize (void);
127 extern void vmExecuteAll (void);
129 // <0: BRK; >0: END; 0: ok
130 // maxinst<0: any number of instructions
131 extern int vmExecuteBSR (int tid
, int pc
, int maxinst
);
134 extern int vmExecuteOne (int tid
);
136 extern int vmIsThreadAlive (int tid
);
138 extern int vmNewThread (int pc
); // returns thread id or -1
139 extern int vmKillThread (int tid
);
140 extern int vmIsSuspendedThread (int tid
);
141 extern int vmSuspendThread (int tid
);
142 extern int vmResumeThread (int tid
);
144 extern int vmGetTVar (int tid
, int idx
);
145 extern int vmSetTVar (int tid
, int idx
, int value
);
146 extern int vmGetPC (int tid
);
147 extern int vmSetPC (int tid
, int pc
);
149 extern int vmGetSP (int tid
);
150 extern int vmSetSP (int tid
, int value
);
151 extern int vmGetStack (int tid
, int idx
); // <0: from stack top; >=0: from bottom (0: latest pushed item)
152 extern int vmSetStack (int tid
, int idx
, int value
);
154 extern int vmPush (int tid
, int value
);
155 extern int vmPop (int tid
);
157 extern int vmLoadArgs (int tid
, int argc
, int argv
[], int *argp
[], int aargc
, int aargv
[], int *aargp
[]); // max 3 aargs
160 extern int vmLastThread (void);
164 extern int vmSaveState (FILE *fl
);
166 // !0: error; VM is deinitialized on error
167 extern int vmLoadState (FILE *fl
);
171 //extern int vmLoadCodeFile (ResFile *resfile, int pc, int idx);
172 extern int vmLoadCodeFileFromDump (const void *data
, int datasize
, int pc
);
175 extern void vmFreeLabels (void);
176 extern void vmFreeLabelsUntilMark (const char *name
);
178 extern VMLabelInfo
*vmLabelAddMark (const char *name
);
179 extern VMLabelInfo
*vmAddLabel (const char *name
, int type
, int value
, int pub
);
181 extern VMLabelInfo
*vmFindLabel (const char *name
);
183 extern int vmFindPC (const char *name
);
184 extern int vmFindVarIndex (const char *name
);
185 extern int vmFindGVarIndex (const char *name
);
186 extern int vmFindTVarIndex (const char *name
);
187 extern int vmFindSVarIndex (const char *name
);
188 extern int vmFindConst (const char *name
);
189 extern VMLabelInfo
*vmFindMark (const char *name
);