From afe4d4d3a9b648a279b6be09f39ce9f5df466104 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Tue, 19 Mar 2019 18:37:22 -0500 Subject: [PATCH] Clean Control.cpp asm funcs (#707) --- Source/control.cpp | 331 +++++++++++++++++++++++++++++---------------- Source/control.h | 10 +- 2 files changed, 223 insertions(+), 118 deletions(-) diff --git a/Source/control.cpp b/Source/control.cpp index 632f9e27a..25fc99a72 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -21,15 +21,15 @@ BOOL chrbtnactive; char sgszTalkMsg[80]; BYTE *pPanelText; int frame_4B8800; // idb -char *pLifeBuff; -void *pBtmBuff; +BYTE *pLifeBuff; +BYTE *pBtmBuff; void *pTalkBtns; int pstrjust[4]; int pnumlines; // idb BOOL pinfoflag; int talkbtndown[3]; int pSpell; // weak -char *pManaBuff; +BYTE *pManaBuff; int infoclr; // weak int sgbPlrTalkTbl; // weak // should be char [4] void *pGBoxBuff; @@ -959,76 +959,155 @@ void __cdecl ClearPanel() void __fastcall DrawPanelBox(int x, int y, int w, int h, int sx, int sy) { - char *v6; // esi - char *v7; // edi - int v8; // edx - unsigned int v9; // ecx - char v10; // cf - unsigned int v11; // ecx + int nSrcOff, nDstOff; - v6 = (char *)pBtmBuff + 640 * y + x; - v7 = (char *)&gpBuffer[768 * sy + sx]; - v8 = h; - do { - v9 = w >> 1; - if (!(w & 1) || (*v7 = *v6, ++v6, ++v7, v9)) { - v10 = v9 & 1; - v11 = w >> 2; - if (!v10 || (*(_WORD *)v7 = *(_WORD *)v6, v6 += 2, v7 += 2, v11)) { - qmemcpy(v7, v6, 4 * v11); - v6 += 4 * v11; - v7 += 4 * v11; - } + /// ASSERT: assert(gpBuffer); + + nSrcOff = x + 640 * y; + nDstOff = sx + 768 * sy; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pBtmBuff + add esi, nSrcOff + mov edi, gpBuffer + add edi, nDstOff + xor ebx, ebx + mov bx, word ptr w + xor edx, edx + mov dx, word ptr h + label1: + mov ecx, ebx + shr ecx, 1 + jnb label2 + movsb + jecxz label4 + label2: + shr ecx, 1 + jnb label3 + movsw + jecxz label4 + label3: + rep movsd + label4: + add esi, 640 + sub esi, ebx + add edi, 768 + sub edi, ebx + dec edx + jnz label1 + } +#else + int wdt, hgt; + BYTE *src, *dst; + + src = &pBtmBuff[nSrcOff]; + dst = &gpBuffer[nDstOff]; + + for(hgt = h; hgt; hgt--, src += 640 - w, dst += 768 - w) { + wdt = w; + if(wdt & 1) { + dst[0] = src[0]; + src++; + dst++; + } + wdt >>= 1; + if(wdt & 1) { + dst[0] = src[0]; + dst[1] = src[1]; + src += 2; + dst += 2; } - v6 = &v6[-w + 640]; - v7 = &v7[-w + 768]; - --v8; - } while (v8); + wdt >>= 1; + while(wdt) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + src += 4; + dst += 4; + wdt--; + } + } +#endif } -void __fastcall SetFlaskHeight(char *buf, int min, int max, int c, int r) +void __fastcall SetFlaskHeight(BYTE *pCelBuff, int min, int max, int c, int r) { - char *v5; // esi - char *v6; // edi - int v7; // edx + int nSrcOff, nDstOff, w; - v5 = &buf[88 * min]; - v6 = (char *)&gpBuffer[768 * r + c]; - v7 = max - min; - do { - qmemcpy(v6, v5, 0x58u); - v5 += 88; - v6 += 768; - --v7; - } while (v7); -} - -void __fastcall DrawFlask(void *a1, int a2, int a3, void *a4, int a5, int a6) -{ - char *v6; // esi - _BYTE *v7; // edi - int v8; // edx - signed int v9; // ecx - char v10; // al - int v11; // [esp+Ch] [ebp-4h] - - v11 = a2; - v6 = (char *)a1 + a3; - v7 = (unsigned char *)a4 + a5; - v8 = a6; - do { - v9 = 59; - do { - v10 = *v6++; - if (v10) - *v7 = v10; - ++v7; - --v9; - } while (v9); - v6 = &v6[v11 - 59]; - v7 += 709; - --v8; - } while (v8); + /// ASSERT: assert(gpBuffer); + + nSrcOff = 88 * min; + nDstOff = c + 768 * r; + w = max - min; + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pCelBuff + add esi, nSrcOff + mov edi, gpBuffer + add edi, nDstOff + mov edx, w + label1: + mov ecx, 88 / 4 + rep movsd + add edi, 768 - 88 + dec edx + jnz label1 + } +#else + BYTE *src, *dst; + + src = &pCelBuff[nSrcOff]; + dst = &gpBuffer[nDstOff]; + + for(; w; w--, src += 88, dst += 768) + memcpy(dst, src, 88); +#endif +} + +void __fastcall DrawFlask(BYTE *pCelBuff, int w, int nSrcOff, BYTE *pBuff, int nDstOff, int h) +{ +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + __asm { + mov esi, pCelBuff + add esi, nSrcOff + mov edi, pBuff + add edi, nDstOff + mov edx, h + label1: + mov ecx, 59 + label2: + lodsb + or al, al + jz label3 + mov [edi], al + label3: + inc edi + loop label2 + add esi, w + sub esi, 59 + add edi, 768 - 59 + dec edx + jnz label1 + } +#else + int wdt, hgt; + BYTE *src, *dst; + + src = &pCelBuff[nSrcOff]; + dst = &pBuff[nDstOff]; + + for(hgt = h; hgt; hgt--, src += w - 59, dst += 768 - 59) { + for(wdt = 59; wdt; wdt--) { + if(*src) + *dst = *src; + src++; + dst++; + } + } +#endif } void __cdecl DrawLifeFlask() @@ -1135,9 +1214,9 @@ void __cdecl InitControlPan() v0 = 288 * 640; pBtmBuff = DiabloAllocPtr(v0); memset(pBtmBuff, 0, v0); - pManaBuff = (char *)DiabloAllocPtr(0x1E40); + pManaBuff = DiabloAllocPtr(0x1E40); memset(pManaBuff, 0, 0x1E40); - pLifeBuff = (char *)DiabloAllocPtr(0x1E40); + pLifeBuff = DiabloAllocPtr(0x1E40); memset(pLifeBuff, 0, 0x1E40); pPanelText = LoadFileInMem("CtrlPan\\SmalText.CEL", 0); pChrPanel = LoadFileInMem("Data\\Char.CEL", 0); @@ -2361,52 +2440,78 @@ LABEL_18: void __cdecl RedBack() { - int v0; // eax - char *v1; // edi - signed int v3; // edx - signed int v4; // ecx - char *v7; // edi - signed int v9; // edx - signed int v10; // ecx - int v12; // [esp+8h] [ebp-4h] - int _EAX; - char *_EBX; - - v0 = -(light4flag != 0); - _LOWORD(v0) = v0 & 0xF400; - v12 = v0 + 768 * 6; - if (leveltype == DTYPE_HELL) { - v7 = (char *)&gpBuffer[SCREENXY(0, 0)]; - _EBX = &pLightTbl[v12]; - v9 = 352; - do { - v10 = 640; - do { - _EAX = *v7; - if ((unsigned char)*v7 >= 32) - ASM_XLAT(_EAX, _EBX); - *v7++ = _EAX; - --v10; - } while (v10); - v7 += 128; - --v9; - } while (v9); + int idx; + + idx = light4flag ? 1536 : 4608; + + /// ASSERT: assert(gpBuffer); + +#if (_MSC_VER >= 800) && (_MSC_VER <= 1200) + if(leveltype != DTYPE_HELL) { + __asm { + mov edi, gpBuffer + add edi, SCREENXY(0, 0) + mov ebx, pLightTbl + add ebx, idx + mov edx, 352 + lx_label1: + mov ecx, 640 + lx_label2: + mov al, [edi] + xlat + stosb + loop lx_label2 + add edi, 768 - 640 + dec edx + jnz lx_label1 + } } else { - v1 = (char *)&gpBuffer[SCREENXY(0, 0)]; - _EBX = &pLightTbl[v12]; - v3 = 352; - do { - v4 = 640; - do { - _EAX = *v1; - ASM_XLAT(_EAX, _EBX); - *v1++ = _EAX; - --v4; - } while (v4); - v1 += 128; - --v3; - } while (v3); + __asm { + mov edi, gpBuffer + add edi, SCREENXY(0, 0) + mov ebx, pLightTbl + add ebx, idx + mov edx, 352 + l4_label1: + mov ecx, 640 + l4_label2: + mov al, [edi] + cmp al, 32 + jb l4_label3 + xlat + l4_label3: + stosb + loop l4_label2 + add edi, 768 - 640 + dec edx + jnz l4_label1 + } } +#else + int w, h; + BYTE *dst, *tbl; + + if(leveltype != DTYPE_HELL) { + dst = &gpBuffer[SCREENXY(0, 0)]; + tbl = (BYTE *)&pLightTbl[idx]; + for(h = 352; h; h--, dst += 768 - 640) { + for(w = 640; w; w--) { + *dst = tbl[*dst]; + dst++; + } + } + } else { + dst = &gpBuffer[SCREENXY(0, 0)]; + tbl = (BYTE *)&pLightTbl[idx]; + for(h = 352; h; h--, dst += 768 - 640) { + for(w = 640; w; w--) { + if(*dst >= 32) + *dst = tbl[*dst]; + dst++; + } + } + } +#endif } // 525728: using guessed type int light4flag; diff --git a/Source/control.h b/Source/control.h index 878490e75..d388d6c80 100644 --- a/Source/control.h +++ b/Source/control.h @@ -17,15 +17,15 @@ extern BOOL drawmanaflag; // idb extern BOOL chrbtnactive; extern BYTE *pPanelText; extern int frame_4B8800; // idb -extern char *pLifeBuff; -extern void *pBtmBuff; +extern BYTE *pLifeBuff; +extern BYTE *pBtmBuff; extern void *pTalkBtns; extern int pstrjust[4]; extern int pnumlines; // idb extern BOOL pinfoflag; extern int talkbtndown[3]; extern int pSpell; // weak -extern char *pManaBuff; +extern BYTE *pManaBuff; extern int infoclr; // weak extern void *pGBoxBuff; extern void *pSBkBtnCel; @@ -65,8 +65,8 @@ void __fastcall AddPanelString(char *str, BOOL just); void __cdecl ClearPanel(); void __fastcall DrawPanelBox(int x, int y, int w, int h, int sx, int sy); void __cdecl InitPanelStr(); -void __fastcall SetFlaskHeight(char *buf, int min, int max, int c, int r); -void __fastcall DrawFlask(void *a1, int a2, int a3, void *a4, int a5, int a6); +void __fastcall SetFlaskHeight(BYTE *pCelBuff, int min, int max, int c, int r); +void __fastcall DrawFlask(BYTE *pCelBuff, int w, int nSrcOff, BYTE *pBuff, int nDstOff, int h); void __cdecl DrawLifeFlask(); void __cdecl UpdateLifeFlask(); void __cdecl DrawManaFlask();