/* ** mveasm.cpp ** ** Interplay Movie File (MVE) Player Library (32-Bit Linux Version) ** Written by Paul Allen Edelstein. Partial Linux port by Jeff Slutter. ** ** (c) 1997 Interplay Productions. All Rights Reserved. ** This file is confidential and consists of proprietary information ** of Interplay Productions. This file and associated libraries ** may not, in whole or in part, be disclosed to third parties, ** incorporated into any software product which is not being created ** for Interplay Productions, copied or duplicated in any form, ** without the prior written permission of Interplay Productions. ** Further, you may not reverse engineer, decompile or otherwise ** attempt to derive source code of this material. ** */ #include "mvelibl.h" #include "mvelibi.h" #include "byteswap.h" // rcg07272000 // need this for SIGTRAP on non-Intel platforms. Intel uses int $3. #if (!defined __i386__) #include #endif extern uint8_t *nf_buf_cur; extern uint8_t *nf_buf_prv; extern unsigned nf_new_x; extern unsigned nf_new_y; extern unsigned nf_new_w; extern unsigned nf_new_h; extern uint8_t nf_fqty; // Number of fields extern unsigned nf_new_row0; // SHEIGHT*width*2-width extern unsigned nf_width; // wqty * SWIDTH extern unsigned nf_new_line; // width - SWIDTH extern unsigned nf_back_right; // (SHEIGHT-1)*width extern int16_t snd_8to16[256]; void nfHPkDecomp(uint8_t *ops, uint8_t *comp, int x, int y, int w, int h); void nfPkConfig(void); unsigned sndDecompM16(uint16_t *dst, const uint8_t *src, unsigned len, unsigned prev); unsigned sndDecompS16(uint16_t *dst, const uint8_t *src, unsigned len, unsigned prev); void Trans16Blk(uint8_t *edi, uint8_t *idx); void call_hnfxycshift(uint32_t eax, uint8_t **medi, uint8_t **mesi, int nfpk_back_right); void call_hnfxypshift(uint32_t eax, uint8_t **medi, uint8_t **mesi, int nfpk_back_right, int DiffBufPtrs); void call_hnfshift(uint32_t meax, uint8_t **medi, uint8_t **mesi, int nfpk_back_right); //-------------------------------------------------------------------- // Sound Management //-------------------- // Decompresses a mono stream containing len samples // (src is len bytes, dst is len*2 bytes) // prev is the previous decompression state or zero. // Returns new decompression state. unsigned sndDecompM16(uint16_t *dst, const uint8_t *src, unsigned len, unsigned prev) { uint32_t i, eax, ebx; if (len == 0) return prev; eax = prev; ebx = 0; for (i = 0; i < len; i++) { ebx = *src; src++; eax += snd_8to16[ebx]; *dst = eax & 0xFFFF; dst++; } return eax; } // Decompresses a stereo stream containing len samples // (src is len*2 bytes, dst is len*4 bytes) // prev is the previous decompression state or zero // (It encodes the 16-bit states of the two stereo channels // in its low and high order 16-bit halves.) // Returns new decompression state. unsigned sndDecompS16(uint16_t *dst, const uint8_t *src, unsigned len, unsigned prev) { unsigned re = 0; uint32_t eax, edx, ebx, i; if (len == 0) { return prev; } eax = (prev & 0xFFFF); edx = ((prev & 0xFFFF0000) >> 16); ebx = 0; for (i = 0; i < len; i++) { ebx = *src; src++; eax += snd_8to16[ebx]; *dst = (eax & 0xFFFF); dst++; ebx = *src; src++; edx += snd_8to16[ebx]; *dst = (edx & 0xFFFF); dst++; } return (eax & 0xFFFF) | ((edx & 0xFFFF) << 16); } struct tNextFrame { uint8_t *comp; uint8_t *tbuf; int new_row, DiffBufPtrs, parms_sz; unsigned x, y, w, h; }; // NOTE: On exit ebx is nf_fqty void NF_DECOMP_INIT(bool HI_COLOR_FLAG, tNextFrame *nf) { nf->DiffBufPtrs = nf_buf_prv - nf_buf_cur; if (HI_COLOR_FLAG) { nf_new_x = nf->x << (LOG2_SWIDTH + 1); nf_new_w = nf->w << (LOG2_SWIDTH + 1); } else { nf_new_x = nf->x << LOG2_SWIDTH; nf_new_w = nf->w << LOG2_SWIDTH; } nf_new_y = (nf->y << LOG2_SHEIGHT) * nf_fqty; nf_new_h = (nf->h << LOG2_SHEIGHT) * nf_fqty; nf->new_row = nf_new_row0 - nf_new_w; // Move to correct place in current buffer nf->tbuf = nf_buf_cur; if (nf->x || nf->y) { nf->tbuf += nf_new_y * nf_width + nf_new_x; } } //---------------------------------------------------------------------- // signed 8-bit y * nf_width int32_t nfpk_ShiftY[256]; // Constant tables // 8-bit -8:7 x nf_width + -8:7 int16_t nfpk_ShiftP1[256]; int16_t nfpk_ShiftP2[256]; // Constant tables // mov eax, ebx/ecx // EBX = 0 // ECX = 1 uint8_t nfhpk_mov4l[64]; // mov ds:[edi+0/4/8/12], ebx/edx/ecx/ebp // EBX = 0 // EDX = 1 // ECX = 2 // EBP = 3 uint8_t nfhpk_mov8[1024]; // mov eax, ebx/edx/ecx/ebp // EBX = 0 // EDX = 1 // ECX = 2 // EBP = 3 uint8_t nfhpk_mov4[1024]; class initme { public: initme() { int x, y; int m4, m3, m2, m1; int8_t *ptr; uint8_t *uptr; // Do nfhpk_mov4l uptr = nfhpk_mov4l; for (m4 = 0; m4 < 2; m4++) for (m3 = 0; m3 < 2; m3++) for (m2 = 0; m2 < 2; m2++) for (m1 = 0; m1 < 2; m1++) { *uptr = m1; uptr++; *uptr = m2; uptr++; *uptr = m3; uptr++; *uptr = m4; uptr++; } // Do nfhpk_mov8 uptr = nfhpk_mov8; for (m4 = 0; m4 < 4; m4++) for (m3 = 0; m3 < 4; m3++) for (m2 = 0; m2 < 4; m2++) for (m1 = 0; m1 < 4; m1++) { *uptr = m1; uptr++; *uptr = m2; uptr++; *uptr = m3; uptr++; *uptr = m4; uptr++; } // Do nfhpk_mov4 uptr = nfhpk_mov4; for (m4 = 0; m4 < 4; m4++) for (m3 = 0; m3 < 4; m3++) for (m2 = 0; m2 < 4; m2++) for (m1 = 0; m1 < 4; m1++) { *uptr = m1; uptr++; *uptr = m2; uptr++; *uptr = m3; uptr++; *uptr = m4; uptr++; } // do nfpk_ShiftP1 ptr = (int8_t *)nfpk_ShiftP1; for (y = -8; y != 8; y++) { for (x = -8; x != 8; x++) { #ifdef OUTRAGE_BIG_ENDIAN *(ptr) = y; *(ptr + 1) = x; #else *(ptr) = x; *(ptr + 1) = y; #endif ptr += 2; } } // do nfpk_ShiftP2[] ptr = (int8_t *)nfpk_ShiftP2; for (y = 0; y != 8; y++) { for (x = 8; x != 15; x++) { #ifdef OUTRAGE_BIG_ENDIAN *(ptr) = y; *(ptr + 1) = x; #else *(ptr) = x; *(ptr + 1) = y; #endif ptr += 2; } } for (y = 8; y != 14; y++) { for (x = -14; x != 0; x++) { *(ptr) = x; *(ptr + 1) = y; ptr += 2; } for (x = 0; x != 15; x++) { *(ptr) = x; *(ptr + 1) = y; ptr += 2; } } for (x = -14; x != 0; x++) { *(ptr) = x; *(ptr + 1) = 14; ptr += 2; } for (x = 0; x != 12; x++) { *(ptr) = x; *(ptr + 1) = 14; ptr += 2; } } }; initme _initme; // nfPkConfig initializes tables used by nfPkDecomp // which are dependent on screen size. void nfPkConfig(void) { // Build ShiftY table int i, val, index; val = 0; index = 0; for (i = 0; i < 128; i++) { nfpk_ShiftY[index] = val; index++; val += nf_width; } val = nf_width; val = val << 7; val = -val; for (i = 0; i < 128; i++) { nfpk_ShiftY[index] = val; index++; val += nf_width; } } extern uint16_t nf_trans16_lo[256]; extern uint16_t nf_trans16_hi[256]; // NOTE: EAX is destroyed after this call (actually the value of // nf_trans16_hi[idx+1] void Trans16(uint16_t *dst, uint16_t *idx, bool mask) { *dst = nf_trans16_lo[*idx]; *dst |= nf_trans16_hi[*(idx + 1)]; } // HiColor version // void nfHPkDecomp(uint8_t *ops, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { tNextFrame nf; nf.w = w; nf.h = h; nf.x = x; nf.y = y; int nfpk_back_right, wcnt; uint8_t *bcomp; uint8_t *esi, *edi; uint8_t opcode; NF_DECOMP_INIT(1, &nf); nfpk_back_right = nf_back_right - SWIDTH * 2; esi = comp; edi = nf.tbuf; uint16_t swapped = (*(uint16_t *)esi); swapped = INTEL_SHORT(swapped); bcomp = swapped + esi; esi = esi + 2; wcnt = w >> 1; do { wcnt--; if (wcnt >= 0) { opcode = *ops; // al == opcode ops++; bool first_opcode = true; int opcode_to_use = opcode & 0xF; do_next_opcode: switch (opcode_to_use) { case 0: { // No change from previous buffer call_hnfshift(nf.DiffBufPtrs, &edi, &esi, nfpk_back_right); } break; case 1: { // No change (and copied to screen) (0) edi += SWIDTH * 2; } break; case 2: { uint32_t eax; eax = *bcomp; bcomp++; eax = nfpk_ShiftP2[eax]; call_hnfxycshift(eax, &edi, &esi, nfpk_back_right); } break; case 3: { // Near shift from newer part of current buffer #ifdef OUTRAGE_BIG_ENDIAN struct reg_word { uint16_t hax, ax; }; struct reg_byte { int8_t hah, hal, ah, al; }; #else struct reg_word { uint16_t ax, hax; }; struct reg_byte { int8_t al, ah, hal, hah; }; #endif union { uint32_t eax; reg_word word; reg_byte byte; } myeax; myeax.eax = *bcomp; bcomp++; myeax.word.ax = nfpk_ShiftP2[myeax.eax]; myeax.byte.al = -myeax.byte.al; myeax.byte.ah = -myeax.byte.ah; call_hnfxycshift(myeax.eax, &edi, &esi, nfpk_back_right); } break; case 4: { // Near shift from previous buffer #ifdef OUTRAGE_BIG_ENDIAN struct reg_word { uint16_t hax, ax; }; struct reg_byte { int8_t hah, hal, ah, al; }; #else struct reg_word { uint16_t ax, hax; }; struct reg_byte { int8_t al, ah, hal, hah; }; #endif union { uint32_t eax; reg_word word; reg_byte byte; } myeax; myeax.eax = 0; myeax.byte.al = *bcomp; bcomp++; myeax.word.ax = nfpk_ShiftP1[myeax.eax]; call_hnfxypshift(myeax.eax, &edi, &esi, nfpk_back_right, nf.DiffBufPtrs); } break; case 5: { uint16_t swapper = *(uint16_t *)(esi); uint32_t eax = INTEL_SHORT(swapper); esi += 2; call_hnfxypshift(eax, &edi, &esi, nfpk_back_right, nf.DiffBufPtrs); } break; case 6: { // Far shift from current buffer uint32_t val1, val2; uint16_t swapper = *(uint16_t *)(esi); val1 = INTEL_SHORT(swapper); esi += 2; val2 = ((val1 & 0xFF00) >> 8); // sign extend al into eax, and multiply by two if (val1 & 0x80) { val1 = ((val1 & 0x7F) << 1); val1 = (val1 & 0xFF) | 0xFFFFFF00; } else { val1 = ((val1 & 0x7F) << 1); } val1 += nfpk_ShiftY[val2]; call_hnfshift(val1, &edi, &esi, nfpk_back_right); } break; case 7: { bool donf23 = false; uint16_t val; int rep_count, max_repcount; val = *(uint16_t *)esi; val = INTEL_SHORT(val); if (val & 0x8000) { donf23 = true; } if (!donf23) { uint32_t colors[4]; max_repcount = 8; uint32_t temp_color; temp_color = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; temp_color = (nf_trans16_lo[*(esi + 0)] | nf_trans16_hi[*(esi + 1)]) | (temp_color << 16); colors[2] = temp_color; temp_color = ((temp_color & 0xFFFF0000) >> 16) | ((temp_color & 0xFFFF) << 16); colors[0] = (temp_color & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = temp_color; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; idx = rep_count + 4; color_idx = *(uint32_t *)(nfhpk_mov8 + ((*(esi + idx)) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; *(uint32_t *)(edi + 0) = w1; *(uint32_t *)(edi + 4) = w2; *(uint32_t *)(edi + 8) = w3; *(uint32_t *)(edi + 12) = w4; if (rep_count != (max_repcount - 1)) edi += nf_width; } esi += 12; edi -= nfpk_back_right; } else { uint32_t colors[2]; max_repcount = 4; uint32_t temp; temp = nf_trans16_lo[*(esi)] | nf_trans16_hi[*(esi + 1)]; colors[0] = (temp << 16) | temp; temp = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; colors[1] = (temp << 16) | temp; for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; // 4l,4h,5l,5h (nibbles) switch (rep_count) { case 0: idx = (*(esi + 4)) & 0xF; break; case 1: idx = ((*(esi + 4)) >> 4); break; case 2: idx = (*(esi + 5)) & 0xF; break; case 3: idx = ((*(esi + 5)) >> 4); break; } color_idx = *(uint32_t *)(nfhpk_mov4l + (idx * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; *(uint32_t *)(edi + 0) = w1; *(uint32_t *)(edi + nf_width) = w1; *(uint32_t *)(edi + 4) = w2; *(uint32_t *)(edi + nf_width + 4) = w2; *(uint32_t *)(edi + 8) = w3; *(uint32_t *)(edi + nf_width + 8) = w3; *(uint32_t *)(edi + 12) = w4; *(uint32_t *)(edi + nf_width + 12) = w4; if (rep_count != (max_repcount - 1)) edi = edi + nf_width * 2; } edi += nf_width; edi -= nfpk_back_right; esi += 6; } } break; case 8: { bool donf24 = false; bool donf40 = false; uint16_t val; int rep_count, max_repcount; val = *(uint16_t *)esi; val = INTEL_SHORT(val); if (val & 0x8000) { val = *(uint16_t *)(esi + 8); val = INTEL_SHORT(val); if (val & 0x8000) { donf40 = true; } else { donf24 = true; } } if (!donf24 && !donf40) { uint32_t colors[4]; max_repcount = 8; uint32_t tempcolor; tempcolor = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 0)] | nf_trans16_hi[*(esi + 1)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; switch (rep_count) { case 0: idx = 4; break; case 1: idx = 5; break; case 2: idx = 10; break; case 3: idx = 11; break; case 4: idx = 16; break; case 5: idx = 17; break; case 6: idx = 22; break; case 7: idx = 23; break; } color_idx = *(uint32_t *)(nfhpk_mov8 + (*(esi + idx) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; *(uint32_t *)(edi + 0) = w1; *(uint32_t *)(edi + 4) = w2; edi += nf_width; *(uint32_t *)(edi + 0) = w3; *(uint32_t *)(edi + 4) = w4; if (rep_count != (max_repcount - 1)) edi += nf_width; if (rep_count == 1) { tempcolor = nf_trans16_lo[*(esi + 8)] | nf_trans16_hi[*(esi + 9)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 6)] | nf_trans16_hi[*(esi + 7)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); } if (rep_count == 3) { edi -= nf_width * 8 - 8; tempcolor = nf_trans16_lo[*(esi + 14)] | nf_trans16_hi[*(esi + 15)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 12)] | nf_trans16_hi[*(esi + 13)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); } if (rep_count == 5) { tempcolor = nf_trans16_lo[*(esi + 20)] | nf_trans16_hi[*(esi + 21)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 18)] | nf_trans16_hi[*(esi + 19)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); } } esi += 24; edi -= (8 + nfpk_back_right); } if (donf24) { uint32_t colors[4]; max_repcount = 8; uint32_t tempcolor; tempcolor = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 0)] | nf_trans16_hi[*(esi + 1)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; switch (rep_count) { case 0: idx = 4; break; case 1: idx = 5; break; case 2: idx = 6; break; case 3: idx = 7; break; case 4: idx = 12; break; case 5: idx = 13; break; case 6: idx = 14; break; case 7: idx = 15; break; } color_idx = *(uint32_t *)(nfhpk_mov8 + (*(esi + idx) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; *(uint32_t *)(edi + 0) = w1; *(uint32_t *)(edi + 4) = w2; edi += nf_width; *(uint32_t *)(edi + 0) = w3; *(uint32_t *)(edi + 4) = w4; if (rep_count != (max_repcount - 1)) edi += nf_width; if (rep_count == 3) { edi -= nf_width * 8 - 8; tempcolor = nf_trans16_lo[*(esi + 10)] | nf_trans16_hi[*(esi + 11)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 8)] | nf_trans16_hi[*(esi + 9)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); } } esi += 16; edi -= (8 + nfpk_back_right); } if (donf40) { uint32_t colors[4]; max_repcount = 8; uint32_t tempcolor; tempcolor = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 0)] | nf_trans16_hi[*(esi + 1)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; switch (rep_count) { case 0: idx = 4; break; case 1: idx = 5; break; case 2: idx = 6; break; case 3: idx = 7; break; case 4: idx = 12; break; case 5: idx = 13; break; case 6: idx = 14; break; case 7: idx = 15; break; } color_idx = *(uint32_t *)(nfhpk_mov8 + (*(esi + idx) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; *(uint32_t *)(edi + 0) = w1; *(uint32_t *)(edi + 4) = w2; *(uint32_t *)(edi + 8) = w3; *(uint32_t *)(edi + 12) = w4; if (rep_count != (max_repcount - 1)) edi += nf_width; if (rep_count == 3) { tempcolor = nf_trans16_lo[*(esi + 10)] | nf_trans16_hi[*(esi + 11)]; tempcolor = (tempcolor << 16) | (nf_trans16_lo[*(esi + 8)] | nf_trans16_hi[*(esi + 9)]); colors[2] = tempcolor; tempcolor = ((tempcolor & 0xFFFF0000) >> 16) | ((tempcolor & 0xFFFF) << 16); colors[0] = (tempcolor & 0xFFFF0000) | (colors[2] & 0xFFFF); colors[1] = tempcolor; colors[3] = (colors[2] & 0xFFFF0000) | (colors[1] & 0xFFFF); } } esi += 16; edi -= nfpk_back_right; } } break; case 9: { bool donf41 = false; bool donf25 = false; bool donf57 = false; uint16_t val; int rep_count, max_repcount; val = *(uint16_t *)esi; val = INTEL_SHORT(val); if (val & 0x8000) { val = *(uint16_t *)(esi + 4); val = INTEL_SHORT(val); if (val & 0x8000) { donf57 = true; } else { donf41 = true; } } else { val = *(uint16_t *)(esi + 4); val = INTEL_SHORT(val); if (val & 0x8000) { donf25 = true; } } if (donf57) { uint16_t colors[4]; max_repcount = 8; colors[0] = nf_trans16_lo[*(esi)] | nf_trans16_hi[*(esi + 1)]; colors[1] = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; colors[2] = nf_trans16_lo[*(esi + 4)] | nf_trans16_hi[*(esi + 5)]; colors[3] = nf_trans16_lo[*(esi + 6)] | nf_trans16_hi[*(esi + 7)]; for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; idx = rep_count + 8; color_idx = *(uint32_t *)(nfhpk_mov4 + ((*(esi + idx)) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; if (rep_count % 2) { *(uint32_t *)(edi + 8) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + nf_width + 8) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + 12) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); *(uint32_t *)(edi + nf_width + 12) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); if (rep_count != (max_repcount - 1)) edi = edi + nf_width * 2; } else { *(uint32_t *)(edi + 0) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + nf_width) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + 4) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); *(uint32_t *)(edi + nf_width + 4) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); } } edi += nf_width; esi += 16; edi -= nfpk_back_right; } if (donf41) { uint32_t colors[4]; max_repcount = 8; colors[0] = nf_trans16_lo[*(esi)] | nf_trans16_hi[*(esi + 1)]; colors[0] = ((colors[0]) << 16) | colors[0]; colors[1] = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; colors[1] = ((colors[1]) << 16) | colors[1]; colors[2] = nf_trans16_lo[*(esi + 4)] | nf_trans16_hi[*(esi + 5)]; colors[2] = ((colors[2]) << 16) | colors[2]; colors[3] = nf_trans16_lo[*(esi + 6)] | nf_trans16_hi[*(esi + 7)]; colors[3] = ((colors[3]) << 16) | colors[3]; for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; idx = rep_count + 8; color_idx = *(uint32_t *)(nfhpk_mov8 + (*(esi + idx) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; *(uint32_t *)(edi + 0) = w1; *(uint32_t *)(edi + 4) = w2; *(uint32_t *)(edi + 8) = w3; *(uint32_t *)(edi + 12) = w4; if (rep_count != (max_repcount - 1)) edi += nf_width; } esi += 16; edi -= nfpk_back_right; } if (donf25) { uint32_t colors[4]; max_repcount = 4; colors[0] = nf_trans16_lo[*(esi)] | nf_trans16_hi[*(esi + 1)]; colors[0] = ((colors[0]) << 16) | colors[0]; colors[1] = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; colors[1] = ((colors[1]) << 16) | colors[1]; colors[2] = nf_trans16_lo[*(esi + 4)] | nf_trans16_hi[*(esi + 5)]; colors[2] = ((colors[2]) << 16) | colors[2]; colors[3] = nf_trans16_lo[*(esi + 6)] | nf_trans16_hi[*(esi + 7)]; colors[3] = ((colors[3]) << 16) | colors[3]; for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; idx = rep_count + 8; color_idx = *(uint32_t *)(nfhpk_mov4 + ((*(esi + idx)) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; *(uint32_t *)(edi + 0) = w1; *(uint32_t *)(edi + nf_width) = w1; *(uint32_t *)(edi + 4) = w2; *(uint32_t *)(edi + nf_width + 4) = w2; *(uint32_t *)(edi + 8) = w3; *(uint32_t *)(edi + nf_width + 8) = w3; *(uint32_t *)(edi + 12) = w4; *(uint32_t *)(edi + nf_width + 12) = w4; if (rep_count != (max_repcount - 1)) edi = edi + nf_width * 2; } edi += nf_width; esi += 12; edi -= nfpk_back_right; } if (!donf25 && !donf41 && !donf57) { uint16_t colors[4]; max_repcount = 16; colors[0] = nf_trans16_lo[*(esi)] | nf_trans16_hi[*(esi + 1)]; colors[1] = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; colors[2] = nf_trans16_lo[*(esi + 4)] | nf_trans16_hi[*(esi + 5)]; colors[3] = nf_trans16_lo[*(esi + 6)] | nf_trans16_hi[*(esi + 7)]; for (rep_count = 0; rep_count < max_repcount; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; idx = rep_count + 8; color_idx = *(uint32_t *)(nfhpk_mov4 + ((*(esi + idx)) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; if (rep_count % 2) { *(uint32_t *)(edi + 8) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + 12) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); if (rep_count != (max_repcount - 1)) edi += nf_width; } else { *(uint32_t *)(edi + 0) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + 4) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); } } esi += 24; edi -= nfpk_back_right; } } break; case 10: { // 2x2 4x4x2 (32 bytes) or 2x1 4x8x2 (24 bytes) or 1x2 4x8x2 (24 bytes) int val1; int rep_count; uint16_t colors[4]; bool do26 = false; bool do42 = false; uint16_t swapper = *(uint16_t *)esi; val1 = INTEL_SHORT(swapper); if (val1 & 0x8000) { swapper = *(uint16_t *)(esi + 16); val1 = INTEL_SHORT(swapper); if (val1 & 0x8000) { do42 = true; } else { do26 = true; } } // Load bx,dx,cx,bp with four colors colors[0] = nf_trans16_lo[*(esi)] | nf_trans16_hi[*(esi + 1)]; colors[1] = nf_trans16_lo[*(esi + 2)] | nf_trans16_hi[*(esi + 3)]; colors[2] = nf_trans16_lo[*(esi + 4)] | nf_trans16_hi[*(esi + 5)]; colors[3] = nf_trans16_lo[*(esi + 6)] | nf_trans16_hi[*(esi + 7)]; for (rep_count = 0; rep_count < 16; rep_count++) { uint32_t w1, w2, w3, w4; uint32_t color_idx; int idx; if (!do26 && !do42) { switch (rep_count) { case 0: idx = 8; break; case 1: idx = 9; break; case 2: idx = 10; break; case 3: idx = 11; break; case 4: idx = 20; break; case 5: idx = 21; break; case 6: idx = 22; break; case 7: idx = 23; break; case 8: idx = 32; break; case 9: idx = 33; break; case 10: idx = 34; break; case 11: idx = 35; break; case 12: idx = 44; break; case 13: idx = 45; break; case 14: idx = 46; break; case 15: idx = 47; break; } } else { switch (rep_count) { case 0: idx = 8; break; case 1: idx = 9; break; case 2: idx = 10; break; case 3: idx = 11; break; case 4: idx = 12; break; case 5: idx = 13; break; case 6: idx = 14; break; case 7: idx = 15; break; case 8: idx = 24; break; case 9: idx = 25; break; case 10: idx = 26; break; case 11: idx = 27; break; case 12: idx = 28; break; case 13: idx = 29; break; case 14: idx = 30; break; case 15: idx = 31; break; } } color_idx = *(uint32_t *)(nfhpk_mov4 + (*(esi + idx) * 4)); w1 = colors[color_idx & 0x000000FF]; w2 = colors[(color_idx & 0x0000FF00) >> 8]; w3 = colors[(color_idx & 0x00FF0000) >> 16]; w4 = colors[(color_idx & 0xFF000000) >> 24]; if (!do42) { *(uint32_t *)(edi + 0) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + 4) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); if (rep_count != 15) edi += nf_width; } else { if (rep_count % 2) { *(uint32_t *)(edi + 8) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + 12) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); if (rep_count != 15) edi += nf_width; } else { *(uint32_t *)(edi + 0) = (w1 & 0xFFFF) | ((w2 & 0xFFFF) << 16); *(uint32_t *)(edi + 4) = (w3 & 0xFFFF) | ((w4 & 0xFFFF) << 16); } } if (rep_count == 3 && !do42 && !do26) { // Load bx,dx,cx,bp with four colors colors[0] = nf_trans16_lo[*(esi + 12)] | nf_trans16_hi[*(esi + 13)]; colors[1] = nf_trans16_lo[*(esi + 14)] | nf_trans16_hi[*(esi + 15)]; colors[2] = nf_trans16_lo[*(esi + 16)] | nf_trans16_hi[*(esi + 17)]; colors[3] = nf_trans16_lo[*(esi + 18)] | nf_trans16_hi[*(esi + 19)]; } if (rep_count == 7) { if (!do42 && !do26) { edi -= nf_width * 8 - 8; // Load bx,dx,cx,bp with four colors colors[0] = nf_trans16_lo[*(esi + 24)] | nf_trans16_hi[*(esi + 25)]; colors[1] = nf_trans16_lo[*(esi + 26)] | nf_trans16_hi[*(esi + 27)]; colors[2] = nf_trans16_lo[*(esi + 28)] | nf_trans16_hi[*(esi + 29)]; colors[3] = nf_trans16_lo[*(esi + 30)] | nf_trans16_hi[*(esi + 31)]; } if (do26) { edi -= nf_width * 8 - 8; // Load bx,dx,cx,bp with four colors colors[0] = nf_trans16_lo[*(esi + 16)] | nf_trans16_hi[*(esi + 17)]; colors[1] = nf_trans16_lo[*(esi + 18)] | nf_trans16_hi[*(esi + 19)]; colors[2] = nf_trans16_lo[*(esi + 20)] | nf_trans16_hi[*(esi + 21)]; colors[3] = nf_trans16_lo[*(esi + 22)] | nf_trans16_hi[*(esi + 23)]; } if (do42) { // Load bx,dx,cx,bp with four colors colors[0] = nf_trans16_lo[*(esi + 16)] | nf_trans16_hi[*(esi + 17)]; colors[1] = nf_trans16_lo[*(esi + 18)] | nf_trans16_hi[*(esi + 19)]; colors[2] = nf_trans16_lo[*(esi + 20)] | nf_trans16_hi[*(esi + 21)]; colors[3] = nf_trans16_lo[*(esi + 22)] | nf_trans16_hi[*(esi + 23)]; } } if (rep_count == 11 && !do42 && !do26) { // Load bx,dx,cx,bp with four colors colors[0] = nf_trans16_lo[*(esi + 36)] | nf_trans16_hi[*(esi + 37)]; colors[1] = nf_trans16_lo[*(esi + 38)] | nf_trans16_hi[*(esi + 39)]; colors[2] = nf_trans16_lo[*(esi + 40)] | nf_trans16_hi[*(esi + 41)]; colors[3] = nf_trans16_lo[*(esi + 42)] | nf_trans16_hi[*(esi + 43)]; } } if (!do42 && !do26) { esi += 48; } else { esi += 32; } if (!do42) { edi -= (8 + nfpk_back_right); } else { edi -= nfpk_back_right; } } break; case 11: { // 8x8x16 (128 bytes) Trans16Blk(edi, esi); edi += nf_width; Trans16Blk(edi, esi + 16); edi += nf_width; Trans16Blk(edi, esi + 32); edi += nf_width; Trans16Blk(edi, esi + 48); edi += nf_width; Trans16Blk(edi, esi + 64); edi += nf_width; Trans16Blk(edi, esi + 80); edi += nf_width; Trans16Blk(edi, esi + 96); edi += nf_width; Trans16Blk(edi, esi + 112); esi += 128; edi -= nfpk_back_right; } break; case 12: { // low 4x4x16 (32 bytes) int i; uint32_t eax, ebx; for (i = 0; i < 4; i++) { eax = *(uint8_t *)(esi + i * 8 + 0); ebx = nf_trans16_lo[eax]; eax = *(uint8_t *)(esi + i * 8 + 1); ebx |= nf_trans16_hi[eax]; eax = ((ebx & 0xFFFF) << 16) | (ebx & 0xFFFF); *(uint32_t *)(edi + 0) = eax; *(uint32_t *)(edi + nf_width) = eax; eax = *(uint8_t *)(esi + i * 8 + 2); ebx = nf_trans16_lo[eax]; eax = *(uint8_t *)(esi + i * 8 + 3); ebx |= nf_trans16_hi[eax]; eax = ((ebx & 0xFFFF) << 16) | (ebx & 0xFFFF); *(uint32_t *)(edi + 4) = eax; *(uint32_t *)(edi + nf_width + 4) = eax; eax = *(uint8_t *)(esi + i * 8 + 4); ebx = nf_trans16_lo[eax]; eax = *(uint8_t *)(esi + i * 8 + 5); ebx |= nf_trans16_hi[eax]; eax = ((ebx & 0xFFFF) << 16) | (ebx & 0xFFFF); *(uint32_t *)(edi + 8) = eax; *(uint32_t *)(edi + nf_width + 8) = eax; eax = *(uint8_t *)(esi + i * 8 + 6); ebx = nf_trans16_lo[eax]; eax = *(uint8_t *)(esi + i * 8 + 7); ebx |= nf_trans16_hi[eax]; eax = ((ebx & 0xFFFF) << 16) | (ebx & 0xFFFF); *(uint32_t *)(edi + 12) = eax; *(uint32_t *)(edi + nf_width + 12) = eax; if (i != 3) edi = edi + nf_width * 2; } edi += nf_width; edi -= nfpk_back_right; esi += 32; } break; case 13: { // 2x2 4x4x0 (8 bytes) uint32_t temp, ebx, ecx; temp = nf_trans16_lo[(*esi)] | nf_trans16_hi[(*(esi + 1))]; ebx = ((temp & 0xFFFF) << 16) | (temp & 0xFFFF); temp = nf_trans16_lo[(*(esi + 2))] | nf_trans16_hi[(*(esi + 3))]; ecx = ((temp & 0xFFFF) << 16) | (temp & 0xFFFF); *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ecx; *(uint32_t *)(edi + 12) = ecx; *(uint32_t *)(edi + nf_width) = ebx; *(uint32_t *)(edi + nf_width + 4) = ebx; *(uint32_t *)(edi + nf_width + 8) = ecx; *(uint32_t *)(edi + nf_width + 12) = ecx; edi = edi + nf_width * 2; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ecx; *(uint32_t *)(edi + 12) = ecx; *(uint32_t *)(edi + nf_width) = ebx; *(uint32_t *)(edi + nf_width + 4) = ebx; *(uint32_t *)(edi + nf_width + 8) = ecx; *(uint32_t *)(edi + nf_width + 12) = ecx; edi = edi + nf_width * 2; temp = nf_trans16_lo[(*(esi + 4))] | nf_trans16_hi[(*(esi + 5))]; ebx = ((temp & 0xFFFF) << 16) | (temp & 0xFFFF); temp = nf_trans16_lo[(*(esi + 6))] | nf_trans16_hi[(*(esi + 7))]; ecx = ((temp & 0xFFFF) << 16) | (temp & 0xFFFF); *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ecx; *(uint32_t *)(edi + 12) = ecx; *(uint32_t *)(edi + nf_width) = ebx; *(uint32_t *)(edi + nf_width + 4) = ebx; *(uint32_t *)(edi + nf_width + 8) = ecx; *(uint32_t *)(edi + nf_width + 12) = ecx; edi = edi + nf_width * 2; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ecx; *(uint32_t *)(edi + 12) = ecx; *(uint32_t *)(edi + nf_width) = ebx; *(uint32_t *)(edi + nf_width + 4) = ebx; *(uint32_t *)(edi + nf_width + 8) = ecx; *(uint32_t *)(edi + nf_width + 12) = ecx; edi += nf_width; edi -= nfpk_back_right; esi += 8; } break; case 14: { // 8x8x0 (2 bytes) uint32_t ecx, ebx; ecx = nf_trans16_lo[*(esi)] | nf_trans16_hi[*(esi + 1)]; esi += 2; ebx = ((ecx & 0xFFFF) << 16) | (ecx & 0xFFFF); *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi += nf_width; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi += nf_width; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi += nf_width; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi += nf_width; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi += nf_width; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi += nf_width; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi += nf_width; *(uint32_t *)(edi + 0) = ebx; *(uint32_t *)(edi + 4) = ebx; *(uint32_t *)(edi + 8) = ebx; *(uint32_t *)(edi + 12) = ebx; edi -= nfpk_back_right; } break; case 15: { int i; i = 0; } break; } if (first_opcode) { first_opcode = false; opcode_to_use = (opcode >> 4); goto do_next_opcode; } // go back up continue; } else { edi += nf.new_row; h--; wcnt = w >> 1; } } while (h != 0); } void Trans16Blk(uint8_t *edi, uint8_t *idx) { *((uint16_t *)(edi + 0)) = nf_trans16_lo[*(idx + 0)] | nf_trans16_hi[*(idx + 1)]; *((uint16_t *)(edi + 2)) = nf_trans16_lo[*(idx + 2)] | nf_trans16_hi[*(idx + 3)]; *((uint16_t *)(edi + 4)) = nf_trans16_lo[*(idx + 4)] | nf_trans16_hi[*(idx + 5)]; *((uint16_t *)(edi + 6)) = nf_trans16_lo[*(idx + 6)] | nf_trans16_hi[*(idx + 7)]; *((uint16_t *)(edi + 8)) = nf_trans16_lo[*(idx + 8)] | nf_trans16_hi[*(idx + 9)]; *((uint16_t *)(edi + 10)) = nf_trans16_lo[*(idx + 10)] | nf_trans16_hi[*(idx + 11)]; *((uint16_t *)(edi + 12)) = nf_trans16_lo[*(idx + 12)] | nf_trans16_hi[*(idx + 13)]; *((uint16_t *)(edi + 14)) = nf_trans16_lo[*(idx + 14)] | nf_trans16_hi[*(idx + 15)]; } void call_hnfxycshift(uint32_t eax, uint8_t **medi, uint8_t **mesi, int nfpk_back_right) { uint32_t ebx; ebx = ((eax & 0xFF00) >> 8); if (eax & 0x80) { // we have to sign extend also eax = ((eax & 0x7F) << 1); eax = (eax & 0xFF) | 0xFFFFFF00; } else { eax = ((eax & 0x7F) << 1); } eax += nfpk_ShiftY[ebx]; call_hnfshift(eax, medi, mesi, nfpk_back_right); } void call_hnfxypshift(uint32_t eax, uint8_t **medi, uint8_t **mesi, int nfpk_back_right, int DiffBufPtrs) { uint32_t ebx; ebx = ((eax & 0xFF00) >> 8); if (eax & 0x80) { // we have to sign extend also eax = ((eax & 0x7F) << 1); eax = (eax & 0xFF) | 0xFFFFFF00; } else { eax = ((eax & 0x7F) << 1); } eax += nfpk_ShiftY[ebx]; eax += DiffBufPtrs; call_hnfshift(eax, medi, mesi, nfpk_back_right); } void call_hnfshift(uint32_t meax, uint8_t **medi, uint8_t **mesi, int nfpk_back_right) { uint8_t *esi, *edi, *saved_esi; int i; edi = *medi; saved_esi = esi = *mesi; esi = edi + meax; for (i = 0; i < 8; i++) { #define HNFSHIFT_WRITEOUT(x) *(uint32_t *)(edi + x) = *(uint32_t *)(esi + x); HNFSHIFT_WRITEOUT(0); HNFSHIFT_WRITEOUT(4); HNFSHIFT_WRITEOUT(8); HNFSHIFT_WRITEOUT(12); #undef HNFSHIFT_WRITEOUT if (i != 7) { esi += nf_width; edi += nf_width; } } edi -= nfpk_back_right; esi = saved_esi; *medi = edi; *mesi = esi; } //////////////////////////////////////////////// // Non-Implemented Functions //////////////////////////////////////////////// void nfHiColorDecomp(uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h); void nfHiColorDecompChg(uint16_t *chgs, uint16_t *parms, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h); void nfDecomp(uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h); void nfDecompChg(uint16_t *chgs, uint16_t *parms, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h); void nfPkPal(void); void nfPkDecomp(uint8_t *ops, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h); void nfPkDecompH(uint8_t *ops, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h); void nfPkDecompD(uint8_t *ops, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h); void mve_ShowFrameField(uint8_t *buf, unsigned bufw, unsigned bufh, unsigned sx, unsigned sy, unsigned w, unsigned h, unsigned dstx, unsigned dsty, unsigned field); void mve_ShowFrameFieldHi(uint8_t *buf, unsigned bufw, unsigned bufh, unsigned sx, unsigned sy, unsigned w, unsigned h, unsigned dstx, unsigned dsty, unsigned field); void mve_sfShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint16_t *chgs, unsigned dstx, unsigned dsty); void mve_sfHiColorShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint16_t *chgs, unsigned dstx, unsigned dsty); void mve_sfPkShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint8_t *ops, unsigned dstx, unsigned dsty); void mve_sfPkHiColorShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint8_t *ops, unsigned dstx, unsigned dsty); void MVE_SetPalette(uint8_t *p, unsigned start, unsigned count); void palLoadCompPalette(uint8_t *buf); void gfxMode(unsigned mode); void gfxLoadCrtc(uint8_t *crtc, uint8_t chain4, uint8_t res); void gfxGetCrtc(uint8_t *crtc); void gfxVres(uint8_t misc, uint8_t *crtc); void MVE_gfxWaitRetrace(int state); void MVE_gfxSetSplit(unsigned line); // rcg07272000 // need this on non-Intel platforms. Intel uses int $3. #if (defined __i386__) || defined(__x86_64__) #error #define int3() __asm__ __volatile__("int $3") #else #define int3() raise(SIGTRAP) #endif void nfHiColorDecomp(uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { int3(); } void nfHiColorDecompChg(uint16_t *chgs, uint16_t *parms, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { int3(); } void nfDecomp(uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { int3(); } void nfDecompChg(uint16_t *chgs, uint16_t *parms, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { int3(); } void nfPkPal(void) { int3(); } void nfPkDecomp(uint8_t *ops, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { int3(); } void nfPkDecompH(uint8_t *ops, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { int3(); } void nfPkDecompD(uint8_t *ops, uint8_t *comp, unsigned x, unsigned y, unsigned w, unsigned h) { int3(); } void mve_ShowFrameField(uint8_t *buf, unsigned bufw, unsigned bufh, unsigned sx, unsigned sy, unsigned w, unsigned h, unsigned dstx, unsigned dsty, unsigned field) { int3(); } void mve_ShowFrameFieldHi(uint8_t *buf, unsigned bufw, unsigned bufh, unsigned sx, unsigned sy, unsigned w, unsigned h, unsigned dstx, unsigned dsty, unsigned field) { int3(); } void mve_sfShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint16_t *chgs, unsigned dstx, unsigned dsty) { int3(); } void mve_sfHiColorShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint16_t *chgs, unsigned dstx, unsigned dsty) { int3(); } void mve_sfPkShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint8_t *ops, unsigned dstx, unsigned dsty) { int3(); } void mve_sfPkHiColorShowFrameChg(bool prvbuf, unsigned x, unsigned y, unsigned w, unsigned h, uint8_t *ops, unsigned dstx, unsigned dsty) { int3(); } void MVE_SetPalette(uint8_t *p, unsigned start, unsigned count) { int3(); } void palLoadCompPalette(uint8_t *buf) { int3(); } void gfxMode(unsigned mode) { int3(); } void gfxLoadCrtc(uint8_t *crtc, uint8_t chain4, uint8_t res) { int3(); } void gfxGetCrtc(uint8_t *crtc) { int3(); } void gfxVres(uint8_t misc, uint8_t *crtc) { int3(); } void MVE_gfxWaitRetrace(int state) { int3(); } void MVE_gfxSetSplit(unsigned line) { int3(); }