Fixed OP_BLOCK_COPY implementation based on ioquake3 code.
This commit is contained in:
parent
ee7b1bc5ad
commit
e2e32bca15
|
|
@ -465,31 +465,25 @@ nextInstruction2:
|
||||||
programCounter += 1;
|
programCounter += 1;
|
||||||
goto nextInstruction;
|
goto nextInstruction;
|
||||||
|
|
||||||
case OP_BLOCK_COPY:
|
case OP_BLOCK_COPY:
|
||||||
{
|
{
|
||||||
int *src, *dest;
|
int src = r0;
|
||||||
int i, count, srci, desti;
|
int dest = r1;
|
||||||
|
size_t n = r2;
|
||||||
|
|
||||||
count = r2;
|
if ((dest & dataMask) != dest
|
||||||
// MrE: copy range check
|
|| (src & dataMask) != src
|
||||||
srci = r0 & dataMask;
|
|| ((dest + n) & dataMask) != dest + n
|
||||||
desti = r1 & dataMask;
|
|| ((src + n) & dataMask) != src + n)
|
||||||
count = ((srci + count) & dataMask) - srci;
|
{
|
||||||
count = ((desti + count) & dataMask) - desti;
|
Com_Error(ERR_DROP, "OP_BLOCK_COPY out of range!");
|
||||||
|
}
|
||||||
|
|
||||||
src = (int *)&image[ r0&dataMask ];
|
Com_Memcpy(vm->dataBase + dest, vm->dataBase + src, n);
|
||||||
dest = (int *)&image[ r1&dataMask ];
|
programCounter += 4;
|
||||||
if ( ( (intptr_t)src | (intptr_t)dest | count ) & 3 ) {
|
opStack -= 2;
|
||||||
Com_Error( ERR_DROP, "OP_BLOCK_COPY not dword aligned" );
|
}
|
||||||
}
|
goto nextInstruction;
|
||||||
count >>= 2;
|
|
||||||
for ( i = count-1 ; i>= 0 ; i-- ) {
|
|
||||||
dest[i] = src[i];
|
|
||||||
}
|
|
||||||
programCounter += 4;
|
|
||||||
opStack -= 2;
|
|
||||||
}
|
|
||||||
goto nextInstruction;
|
|
||||||
|
|
||||||
case OP_CALL:
|
case OP_CALL:
|
||||||
// save current program counter
|
// save current program counter
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user