Some changes. QC execution has been tweeked a little. It needs further work still.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@925 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
0b3fc5c57f
commit
d7bb31a516
66 changed files with 2345 additions and 2036 deletions
|
@ -179,7 +179,7 @@ reeval:
|
|||
OPC->_float = (float)(!(OPA->function & ~0xff000000));
|
||||
break;
|
||||
case OP_NOT_ENT:
|
||||
OPC->_float = (float)(PROG_TO_EDICT(OPA->edict) == (edictrun_t *)sv_edicts);
|
||||
OPC->_float = (float)(PROG_TO_EDICT(progfuncs, OPA->edict) == (edictrun_t *)sv_edicts);
|
||||
break;
|
||||
|
||||
case OP_EQ_F:
|
||||
|
@ -385,7 +385,7 @@ reeval:
|
|||
|
||||
//get a pointer to a field var
|
||||
case OP_ADDRESS:
|
||||
ed = PROG_TO_EDICT(OPA->edict);
|
||||
ed = PROG_TO_EDICT(progfuncs, OPA->edict);
|
||||
#ifdef PARANOID
|
||||
NUM_FOR_EDICT(ed); // make sure it's in range
|
||||
#endif
|
||||
|
@ -404,7 +404,7 @@ reeval:
|
|||
case OP_LOAD_ENT:
|
||||
case OP_LOAD_S:
|
||||
case OP_LOAD_FNC:
|
||||
ed = PROG_TO_EDICT(OPA->edict);
|
||||
ed = PROG_TO_EDICT(progfuncs, OPA->edict);
|
||||
#ifdef PARANOID
|
||||
NUM_FOR_EDICT(ed); // make sure it's in range
|
||||
#endif
|
||||
|
@ -413,7 +413,7 @@ reeval:
|
|||
break;
|
||||
|
||||
case OP_LOAD_V:
|
||||
ed = PROG_TO_EDICT(OPA->edict);
|
||||
ed = PROG_TO_EDICT(progfuncs, OPA->edict);
|
||||
#ifdef PARANOID
|
||||
NUM_FOR_EDICT(ed); // make sure it's in range
|
||||
#endif
|
||||
|
@ -531,7 +531,7 @@ reeval:
|
|||
else
|
||||
{
|
||||
i -= externs->numglobalbuiltins;
|
||||
if (i > current_progstate->numbuiltins)
|
||||
if (i >= current_progstate->numbuiltins)
|
||||
{
|
||||
if (newf->first_statement == -0x7fffffff)
|
||||
((builtin_t)newf->profile) (progfuncs, (struct globalvars_s *)current_progstate->globals);
|
||||
|
@ -572,8 +572,8 @@ reeval:
|
|||
static char buffer[1024*1024*8];
|
||||
int size = sizeof buffer;
|
||||
progfuncs->save_ents(progfuncs, buffer, &size, 0);
|
||||
}*/
|
||||
|
||||
}
|
||||
*/
|
||||
s = PR_LeaveFunction (progfuncs);
|
||||
st = &pr_statements[s];
|
||||
if (pr_depth == prinst->exitdepth)
|
||||
|
@ -692,26 +692,11 @@ reeval:
|
|||
case OP_LOADP_ENT:
|
||||
case OP_LOADP_S:
|
||||
case OP_LOADP_FNC:
|
||||
#ifdef PRBOUNDSCHECK
|
||||
if (OPB->_int < 0 || OPB->_int >= pr_edict_size/4)
|
||||
{
|
||||
Host_Error("Progs attempted to read an invalid field in an edict (%i)\n", OPB->_int);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
ptr = (eval_t *)(((int)(OPA->_int)) + OPB->_int);
|
||||
OPC->_int = ptr->_int;
|
||||
break;
|
||||
|
||||
case OP_LOADP_V:
|
||||
#ifdef PRBOUNDSCHECK
|
||||
if (OPB->_int < 0 || OPB->_int + 2 >= pr_edict_size/4)
|
||||
{
|
||||
Host_Error("Progs attempted to read an invalid field in an edict (%i)\n", OPB->_int);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
ptr = (eval_t *)(((int)(OPA->_int)) + OPB->_int);
|
||||
OPC->vector[0] = ptr->vector[0];
|
||||
OPC->vector[1] = ptr->vector[1];
|
||||
|
@ -763,7 +748,7 @@ reeval:
|
|||
break;
|
||||
|
||||
case OP_THINKTIME:
|
||||
externs->thinktimeop(progfuncs, (struct edict_s *)PROG_TO_EDICT(OPA->edict), OPB->_float);
|
||||
externs->thinktimeop(progfuncs, (struct edict_s *)PROG_TO_EDICT(progfuncs, OPA->edict), OPB->_float);
|
||||
break;
|
||||
|
||||
|
||||
|
@ -904,43 +889,120 @@ reeval:
|
|||
|
||||
|
||||
|
||||
case OP_BITAND_IF:
|
||||
OPC->_int = (OPA->_int & (int)OPB->_float);
|
||||
break;
|
||||
case OP_BITOR_IF:
|
||||
OPC->_int = (OPA->_int | (int)OPB->_float);
|
||||
break;
|
||||
case OP_BITAND_FI:
|
||||
OPC->_int = ((int)OPA->_float & OPB->_int);
|
||||
break;
|
||||
case OP_BITOR_FI:
|
||||
OPC->_int = ((int)OPA->_float | OPB->_int);
|
||||
break;
|
||||
|
||||
case OP_MUL_IF:
|
||||
OPC->_float = (OPA->_int * OPB->_float);
|
||||
break;
|
||||
case OP_MUL_FI:
|
||||
OPC->_float = (OPA->_float * OPB->_int);
|
||||
break;
|
||||
|
||||
case OP_MUL_IF:
|
||||
case OP_MUL_FI:
|
||||
case OP_MUL_VI:
|
||||
case OP_DIV_IF:
|
||||
case OP_DIV_FI:
|
||||
case OP_BITAND_IF:
|
||||
case OP_BITOR_IF:
|
||||
case OP_BITAND_FI:
|
||||
case OP_BITOR_FI:
|
||||
case OP_AND_I:
|
||||
case OP_OR_I:
|
||||
case OP_AND_IF:
|
||||
case OP_OR_IF:
|
||||
case OP_AND_FI:
|
||||
case OP_OR_FI:
|
||||
case OP_NOT_I:
|
||||
case OP_NE_IF:
|
||||
case OP_NE_FI:
|
||||
case OP_GSTOREP_I:
|
||||
case OP_GSTOREP_F:
|
||||
case OP_GSTOREP_ENT:
|
||||
case OP_GSTOREP_FLD: // integers
|
||||
case OP_GSTOREP_S:
|
||||
case OP_GSTOREP_FNC: // pointers
|
||||
case OP_GSTOREP_V:
|
||||
case OP_GADDRESS:
|
||||
case OP_GLOAD_I:
|
||||
case OP_GLOAD_F:
|
||||
case OP_GLOAD_FLD:
|
||||
case OP_GLOAD_ENT:
|
||||
case OP_GLOAD_S:
|
||||
case OP_GLOAD_FNC:
|
||||
case OP_BOUNDCHECK:
|
||||
PR_RunError(progfuncs, "Extra opcode not implemented\n");
|
||||
break;
|
||||
case OP_MUL_VI:
|
||||
OPC->vector[0] = OPA->vector[0] * OPB->_int;
|
||||
OPC->vector[1] = OPA->vector[0] * OPB->_int;
|
||||
OPC->vector[2] = OPA->vector[0] * OPB->_int;
|
||||
break;
|
||||
case OP_MUL_IV:
|
||||
OPC->vector[0] = OPB->_int * OPA->vector[0];
|
||||
OPC->vector[1] = OPB->_int * OPA->vector[1];
|
||||
OPC->vector[2] = OPB->_int * OPA->vector[2];
|
||||
break;
|
||||
|
||||
case OP_DIV_IF:
|
||||
OPC->_float = (OPA->_int / OPB->_float);
|
||||
break;
|
||||
case OP_DIV_FI:
|
||||
OPC->_float = (OPA->_float / OPB->_int);
|
||||
break;
|
||||
|
||||
case OP_AND_I:
|
||||
OPC->_int = (OPA->_int && OPB->_int);
|
||||
break;
|
||||
case OP_OR_I:
|
||||
OPC->_int = (OPA->_int || OPB->_int);
|
||||
break;
|
||||
|
||||
case OP_AND_IF:
|
||||
OPC->_int = (OPA->_int && OPB->_float);
|
||||
break;
|
||||
case OP_OR_IF:
|
||||
OPC->_int = (OPA->_int || OPB->_float);
|
||||
break;
|
||||
|
||||
case OP_AND_FI:
|
||||
OPC->_int = (OPA->_float && OPB->_int);
|
||||
break;
|
||||
case OP_OR_FI:
|
||||
OPC->_int = (OPA->_float || OPB->_int);
|
||||
break;
|
||||
|
||||
case OP_NOT_I:
|
||||
OPC->_int = !OPA->_int;
|
||||
break;
|
||||
|
||||
case OP_NE_IF:
|
||||
OPC->_int = (OPA->_int != OPB->_float);
|
||||
break;
|
||||
case OP_NE_FI:
|
||||
OPC->_int = (OPA->_float != OPB->_int);
|
||||
break;
|
||||
|
||||
case OP_GSTOREP_I:
|
||||
case OP_GSTOREP_F:
|
||||
case OP_GSTOREP_ENT:
|
||||
case OP_GSTOREP_FLD: // integers
|
||||
case OP_GSTOREP_S:
|
||||
case OP_GSTOREP_FNC: // pointers
|
||||
case OP_GSTOREP_V:
|
||||
case OP_GADDRESS:
|
||||
case OP_GLOAD_I:
|
||||
case OP_GLOAD_F:
|
||||
case OP_GLOAD_FLD:
|
||||
case OP_GLOAD_ENT:
|
||||
case OP_GLOAD_S:
|
||||
case OP_GLOAD_FNC:
|
||||
pr_xstatement = st-pr_statements;
|
||||
PR_RunError(progfuncs, "Extra opcode not implemented\n");
|
||||
break;
|
||||
|
||||
case OP_BOUNDCHECK:
|
||||
if ((unsigned int)OPA->_int < (unsigned int)st->c || (unsigned int)OPA->_int >= (unsigned int)st->b)
|
||||
{
|
||||
pr_xstatement = st-pr_statements;
|
||||
PR_RunError(progfuncs, "Progs boundcheck failed. Value is %i.", OPA->_int);
|
||||
}
|
||||
break;
|
||||
case OP_PUSH:
|
||||
OPC->_int = (int)&localstack[localstack_used+pr_spushed];
|
||||
pr_spushed += OPA->_int;
|
||||
if (pr_spushed + localstack_used >= LOCALSTACK_SIZE)
|
||||
{
|
||||
pr_spushed = 0;
|
||||
pr_xstatement = st-pr_statements;
|
||||
PR_RunError(progfuncs, "Progs pushed too much");
|
||||
}
|
||||
break;
|
||||
case OP_POP:
|
||||
pr_spushed -= OPA->_int;
|
||||
if (pr_spushed < 0)
|
||||
{
|
||||
pr_spushed = 0;
|
||||
pr_xstatement = st-pr_statements;
|
||||
PR_RunError(progfuncs, "Progs poped more than it pushed");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (st->op & 0x8000) //break point!
|
||||
|
@ -960,7 +1022,7 @@ PR_RunError(progfuncs, "Extra opcode not implemented\n");
|
|||
fakeop.op &= ~0x8000;
|
||||
st = &fakeop; //a little remapping...
|
||||
#else
|
||||
st->op &= ~0x8000;
|
||||
st->op &= ~0x8000; //just remove the breakpoint and go around again, but this time in the debugger.
|
||||
#endif
|
||||
|
||||
goto reeval; //reexecute
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue