now more likly to spit out errors on things going wrong (closed some loopholes) and should also be a bit faster.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@238 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
5f2f91725a
commit
40d4aaf9e8
1 changed files with 21 additions and 9 deletions
|
@ -457,11 +457,12 @@ static void inline QVM_Goto(qvm_t *vm, int addr)
|
||||||
*/
|
*/
|
||||||
static void inline QVM_Call(qvm_t *vm, int addr)
|
static void inline QVM_Call(qvm_t *vm, int addr)
|
||||||
{
|
{
|
||||||
|
vm->sp--;
|
||||||
|
if (vm->sp < (unsigned long*)(vm->ss)) Sys_Error("QVM Stack underflow");
|
||||||
|
|
||||||
if(addr<0)
|
if(addr<0)
|
||||||
{
|
{
|
||||||
// system trap function
|
// system trap function
|
||||||
vm->sp--;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
long *fp;
|
long *fp;
|
||||||
|
|
||||||
|
@ -474,7 +475,6 @@ static void inline QVM_Call(qvm_t *vm, int addr)
|
||||||
if(addr>vm->len_cs)
|
if(addr>vm->len_cs)
|
||||||
Sys_Error("VM run time error: program jumped off to hyperspace\n");
|
Sys_Error("VM run time error: program jumped off to hyperspace\n");
|
||||||
|
|
||||||
vm->sp--;
|
|
||||||
vm->sp[0]=(long)(vm->pc-vm->cs); // push pc /return address/
|
vm->sp[0]=(long)(vm->pc-vm->cs); // push pc /return address/
|
||||||
vm->pc=vm->cs+addr*2;
|
vm->pc=vm->cs+addr*2;
|
||||||
}
|
}
|
||||||
|
@ -510,6 +510,15 @@ static void inline QVM_Return(qvm_t *vm, long size)
|
||||||
fp=(long*)(vm->ds+vm->bp);
|
fp=(long*)(vm->ds+vm->bp);
|
||||||
vm->bp+=size;
|
vm->bp+=size;
|
||||||
|
|
||||||
|
if(vm->bp>vm->len_ds+vm->len_ss/2)
|
||||||
|
Sys_Error("VM run time error: freed too much stack\n");
|
||||||
|
|
||||||
|
if(fp[1]>vm->len_cs)
|
||||||
|
if (vm->cs+fp[1]) //this being false causes the program to quit.
|
||||||
|
Sys_Error("VM run time error: program returned to hyperspace\n");
|
||||||
|
if(fp[1]<0)
|
||||||
|
Sys_Error("VM run time error: program returned to negative hyperspace\n");
|
||||||
|
|
||||||
vm->pc=vm->cs+fp[1]; // restore PC
|
vm->pc=vm->cs+fp[1]; // restore PC
|
||||||
fp[1] = fp[0];
|
fp[1] = fp[0];
|
||||||
}
|
}
|
||||||
|
@ -568,10 +577,10 @@ int QVM_Exec(register qvm_t *qvm, int command, int arg0, int arg1, int arg2, int
|
||||||
|
|
||||||
QVM_Call(qvm, 0);
|
QVM_Call(qvm, 0);
|
||||||
|
|
||||||
do
|
for(;;)
|
||||||
{
|
{
|
||||||
// fetch next command
|
// fetch next command
|
||||||
op=*qvm->pc++;
|
op=*qvm->pc++;
|
||||||
param=*qvm->pc++;
|
param=*qvm->pc++;
|
||||||
qvm->cycles++;
|
qvm->cycles++;
|
||||||
|
|
||||||
|
@ -592,6 +601,12 @@ int QVM_Exec(register qvm_t *qvm, int command, int arg0, int arg1, int arg2, int
|
||||||
break;
|
break;
|
||||||
case OP_LEAVE:
|
case OP_LEAVE:
|
||||||
QVM_Return(qvm, param);
|
QVM_Return(qvm, param);
|
||||||
|
|
||||||
|
if (!qvm->pc)
|
||||||
|
{
|
||||||
|
// pick return value from stack
|
||||||
|
return qvm->sp[0];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case OP_CALL:
|
case OP_CALL:
|
||||||
param = *qvm->sp;
|
param = *qvm->sp;
|
||||||
|
@ -817,10 +832,7 @@ int QVM_Exec(register qvm_t *qvm, int command, int arg0, int arg1, int arg2, int
|
||||||
*(signed long*)&qvm->sp[0]=(signed long)(*(float*)&qvm->sp[0]);
|
*(signed long*)&qvm->sp[0]=(signed long)(*(float*)&qvm->sp[0]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while(qvm->pc);
|
}
|
||||||
|
|
||||||
// pick return value from stack
|
|
||||||
return qvm->sp[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue