LURE: Converted the AnimationDecoder::decode_data routine to remove GOTO usage
This commit is contained in:
parent
f169e17eca
commit
77326a5e27
1 changed files with 108 additions and 102 deletions
|
@ -372,92 +372,54 @@ uint32 AnimationDecoder::decode_data(MemoryBlock *src, MemoryBlock *dest, uint32
|
||||||
currData <<= 4;
|
currData <<= 4;
|
||||||
dx = 1;
|
dx = 1;
|
||||||
|
|
||||||
for (;;) {
|
// Main loop
|
||||||
carry = false;
|
bool loopFlag = true;
|
||||||
rcl(currData, carry);
|
while (loopFlag) {
|
||||||
if (--bitCtr == 0) {
|
for (;;) {
|
||||||
GET_BYTE;
|
carry = false;
|
||||||
bitCtr = 8;
|
|
||||||
}
|
|
||||||
if (carry) goto loc_1441;
|
|
||||||
tableOffset = BX_VAL(0);
|
|
||||||
|
|
||||||
loc_1439:
|
|
||||||
dx ^= 1;
|
|
||||||
if ((dx & 1) != 0) {
|
|
||||||
SET_HI_BYTE(dx, tableOffset << 4);
|
|
||||||
*pDest = dx >> 8;
|
|
||||||
} else {
|
|
||||||
*pDest++ |= tableOffset;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
|
|
||||||
loc_1441:
|
|
||||||
rcl(currData, carry);
|
|
||||||
if (--bitCtr == 0) {
|
|
||||||
GET_BYTE;
|
|
||||||
bitCtr = 8;
|
|
||||||
}
|
|
||||||
if (!carry) {
|
|
||||||
rcl(currData, carry);
|
rcl(currData, carry);
|
||||||
if (--bitCtr == 0) {
|
if (--bitCtr == 0) {
|
||||||
GET_BYTE;
|
GET_BYTE;
|
||||||
bitCtr = 8;
|
bitCtr = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!carry) {
|
if (!carry) {
|
||||||
tableOffset = BX_VAL(0x10);
|
tableOffset = BX_VAL(0);
|
||||||
} else {
|
break;
|
||||||
tableOffset = BX_VAL(0x20);
|
|
||||||
}
|
}
|
||||||
goto loc_1439;
|
|
||||||
}
|
|
||||||
|
|
||||||
rcl(currData, carry);
|
|
||||||
if (--bitCtr == 0) {
|
|
||||||
GET_BYTE;
|
|
||||||
bitCtr = 8;
|
|
||||||
}
|
|
||||||
if (!carry) {
|
|
||||||
tableOffset = BX_VAL(0x30);
|
|
||||||
goto loc_1439;
|
|
||||||
}
|
|
||||||
|
|
||||||
SET_HI_BYTE(dx, currData >> 12);
|
|
||||||
carry = false;
|
|
||||||
for (int ctr = 0; ctr < 4; ++ctr) {
|
|
||||||
rcl(currData, carry);
|
rcl(currData, carry);
|
||||||
if (--bitCtr == 0) {
|
if (--bitCtr == 0) {
|
||||||
GET_BYTE;
|
GET_BYTE;
|
||||||
bitCtr = 8;
|
bitCtr = 8;
|
||||||
}
|
}
|
||||||
}
|
if (!carry) {
|
||||||
|
rcl(currData, carry);
|
||||||
|
if (--bitCtr == 0) {
|
||||||
|
GET_BYTE;
|
||||||
|
bitCtr = 8;
|
||||||
|
}
|
||||||
|
|
||||||
byte dxHigh = dx >> 8;
|
if (!carry) {
|
||||||
if (dxHigh == BX_VAL(0)) {
|
tableOffset = BX_VAL(0x10);
|
||||||
tempReg1 = bitCtr;
|
} else {
|
||||||
tempReg2 = dx;
|
tableOffset = BX_VAL(0x20);
|
||||||
decode_data_2(src, pSrc, currData, bitCtr, dx, carry);
|
}
|
||||||
|
|
||||||
SET_LO_BYTE(dx, dx >> 8);
|
|
||||||
decode_data_2(src, pSrc, currData, bitCtr, dx, carry);
|
|
||||||
SET_HI_BYTE(bitCtr, dx & 0xff);
|
|
||||||
SET_LO_BYTE(bitCtr, dx >> 8);
|
|
||||||
dx = tempReg2;
|
|
||||||
|
|
||||||
if (bitCtr == 0)
|
|
||||||
// Exit out of infinite loop
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (dxHigh == BX_VAL(0x10)) {
|
rcl(currData, carry);
|
||||||
tempReg1 = bitCtr;
|
if (--bitCtr == 0) {
|
||||||
decode_data_2(src, pSrc, currData, bitCtr, dx, carry);
|
GET_BYTE;
|
||||||
bitCtr = dx >> 8;
|
bitCtr = 8;
|
||||||
|
}
|
||||||
|
if (!carry) {
|
||||||
|
tableOffset = BX_VAL(0x30);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (dxHigh == BX_VAL(0x20)) {
|
SET_HI_BYTE(dx, currData >> 12);
|
||||||
SET_HI_BYTE(dx, currData >> 10);
|
carry = false;
|
||||||
|
for (int ctr = 0; ctr < 4; ++ctr) {
|
||||||
for (v = 0; v < 6; ++v) {
|
|
||||||
rcl(currData, carry);
|
rcl(currData, carry);
|
||||||
if (--bitCtr == 0) {
|
if (--bitCtr == 0) {
|
||||||
GET_BYTE;
|
GET_BYTE;
|
||||||
|
@ -465,48 +427,92 @@ loc_1441:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tempReg1 = bitCtr;
|
byte dxHigh = dx >> 8;
|
||||||
bitCtr = dx >> 8;
|
if (dxHigh == BX_VAL(0)) {
|
||||||
|
tempReg1 = bitCtr;
|
||||||
|
tempReg2 = dx;
|
||||||
|
decode_data_2(src, pSrc, currData, bitCtr, dx, carry);
|
||||||
|
|
||||||
} else if (dxHigh == BX_VAL(0x30)) {
|
SET_LO_BYTE(dx, dx >> 8);
|
||||||
SET_HI_BYTE(dx, currData >> 11);
|
decode_data_2(src, pSrc, currData, bitCtr, dx, carry);
|
||||||
|
SET_HI_BYTE(bitCtr, dx & 0xff);
|
||||||
|
SET_LO_BYTE(bitCtr, dx >> 8);
|
||||||
|
dx = tempReg2;
|
||||||
|
|
||||||
for (v = 0; v < 5; ++v) {
|
if (bitCtr == 0) {
|
||||||
rcl(currData, carry);
|
// End of decompression
|
||||||
if (--bitCtr == 0) {
|
loopFlag = false;
|
||||||
GET_BYTE;
|
break;
|
||||||
bitCtr = 8;
|
|
||||||
}
|
}
|
||||||
|
} else if (dxHigh == BX_VAL(0x10)) {
|
||||||
|
tempReg1 = bitCtr;
|
||||||
|
decode_data_2(src, pSrc, currData, bitCtr, dx, carry);
|
||||||
|
bitCtr = dx >> 8;
|
||||||
|
|
||||||
|
} else if (dxHigh == BX_VAL(0x20)) {
|
||||||
|
SET_HI_BYTE(dx, currData >> 10);
|
||||||
|
|
||||||
|
for (v = 0; v < 6; ++v) {
|
||||||
|
rcl(currData, carry);
|
||||||
|
if (--bitCtr == 0) {
|
||||||
|
GET_BYTE;
|
||||||
|
bitCtr = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tempReg1 = bitCtr;
|
||||||
|
bitCtr = dx >> 8;
|
||||||
|
|
||||||
|
} else if (dxHigh == BX_VAL(0x30)) {
|
||||||
|
SET_HI_BYTE(dx, currData >> 11);
|
||||||
|
|
||||||
|
for (v = 0; v < 5; ++v) {
|
||||||
|
rcl(currData, carry);
|
||||||
|
if (--bitCtr == 0) {
|
||||||
|
GET_BYTE;
|
||||||
|
bitCtr = 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tempReg1 = bitCtr;
|
||||||
|
bitCtr = dx >> 8;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
tableOffset = dx >> 8;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
tempReg1 = bitCtr;
|
if ((dx & 1) == 1) {
|
||||||
bitCtr = dx >> 8;
|
*pDest++ |= tableOffset;
|
||||||
|
--bitCtr;
|
||||||
|
dx &= 0xfffe;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
SET_HI_BYTE(dx, tableOffset << 4);
|
||||||
tableOffset = dx >> 8;
|
tableOffset |= dx >> 8;
|
||||||
goto loc_1439;
|
|
||||||
|
v = bitCtr >> 1;
|
||||||
|
while (v-- > 0) *pDest++ = tableOffset;
|
||||||
|
|
||||||
|
bitCtr &= 1;
|
||||||
|
if (bitCtr != 0) {
|
||||||
|
*pDest = tableOffset & 0xf0;
|
||||||
|
dx |= 1; //dx.l
|
||||||
|
}
|
||||||
|
|
||||||
|
bitCtr = tempReg1;
|
||||||
|
tableOffset &= 0x0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((dx & 1) == 1) {
|
if (loopFlag) {
|
||||||
*pDest++ |= tableOffset;
|
dx ^= 1;
|
||||||
--bitCtr;
|
if ((dx & 1) != 0) {
|
||||||
dx &= 0xfffe;
|
SET_HI_BYTE(dx, tableOffset << 4);
|
||||||
|
*pDest = dx >> 8;
|
||||||
|
} else {
|
||||||
|
*pDest++ |= tableOffset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_HI_BYTE(dx, tableOffset << 4);
|
|
||||||
tableOffset |= dx >> 8;
|
|
||||||
|
|
||||||
v = bitCtr >> 1;
|
|
||||||
while (v-- > 0) *pDest++ = tableOffset;
|
|
||||||
|
|
||||||
bitCtr &= 1;
|
|
||||||
if (bitCtr != 0) {
|
|
||||||
*pDest = tableOffset & 0xf0;
|
|
||||||
dx |= 1; //dx.l
|
|
||||||
}
|
|
||||||
|
|
||||||
bitCtr = tempReg1;
|
|
||||||
tableOffset &= 0x0f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return number of bytes written
|
// Return number of bytes written
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue