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 (280)
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
);
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);
143 extern int vmSaveState (FILE *fl
);
145 // !0: error; VM is deinitialized on error
146 extern int vmLoadState (FILE *fl
);