Skip to content

StartFlic equivalent match (review carefully)#858

Open
jeff-1amstudios wants to merge 4 commits into
dethrace-labs:mainfrom
jeff-1amstudios:match-startflic
Open

StartFlic equivalent match (review carefully)#858
jeff-1amstudios wants to merge 4 commits into
dethrace-labs:mainfrom
jeff-1amstudios:match-startflic

Conversation

@jeff-1amstudios

Copy link
Copy Markdown
Collaborator

Match result

---
+++
@@ -0x495d0a,21 +0x47af10,21 @@
0x495d0a : mov dword ptr [eax + 0x58], 0
0x495d11 : jmp 0x2f 	(flicplay.c:796)
0x495d16 : mov eax, dword ptr [ebp - 0x10c]
0x495d1c : and eax, 0xffff
0x495d21 : cmp eax, 0xaf12
0x495d26 : jne 0xf
0x495d2c : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:797)
0x495d2f : mov dword ptr [eax + 0x58], 1
0x495d36 : jmp 0xa 	(flicplay.c:798)
0x495d3b : mov eax, 0xffffffff 	(flicplay.c:799)
0x495d40 : -jmp 0x1dd
         : +jmp 0x1d8
0x495d45 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:802)
0x495d48 : push eax
0x495d49 : call MemReadU16 (FUNCTION)
0x495d4e : add esp, 4
0x495d51 : and eax, 0xffff
0x495d56 : mov ecx, dword ptr [ebp + 0x10]
0x495d59 : mov dword ptr [ecx + 0x4c], eax
0x495d5c : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:803)
0x495d5f : mov dword ptr [eax + 0x50], 0
0x495d66 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:804)

---
+++
@@ -0x495e83,28 +0x47b089,27 @@
0x495e83 : mov eax, dword ptr [ebp + 0x24] 	(flicplay.c:830)
0x495e86 : mov ecx, dword ptr [ebp + 0x10]
0x495e89 : mov dword ptr [ecx + 0x40], eax
0x495e8c : cmp dword ptr [ebp + 0x28], 0 	(flicplay.c:833)
0x495e90 : je 0x14
0x495e96 : mov eax, 0x3e8 	(flicplay.c:834)
0x495e9b : cdq 
0x495e9c : idiv dword ptr [ebp + 0x28]
0x495e9f : mov ecx, dword ptr [ebp + 0x10]
0x495ea2 : mov dword ptr [ecx + 0x30], eax
0x495ea5 : -jmp 0x58
         : +jmp 0x53 	(flicplay.c:835)
0x495eaa : test dword ptr [ebp - 8], 0xffff 	(flicplay.c:836)
0x495eb1 : -jne 0x14
         : +jne 0xf
0x495eb7 : push gLast_flic_name[0] (DATA) 	(flicplay.c:837)
0x495ebc : push 0x10
0x495ebe : call FatalError (FUNCTION)
0x495ec3 : add esp, 8
0x495ec6 : -jmp 0x37
0x495ecb : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:839)
0x495ece : cmp dword ptr [eax + 0x58], 0
0x495ed2 : je 0x13
0x495ed8 : mov eax, dword ptr [ebp - 8] 	(flicplay.c:840)
0x495edb : and eax, 0xffff
0x495ee0 : mov ecx, dword ptr [ebp + 0x10]
0x495ee3 : mov dword ptr [ecx + 0x30], eax
0x495ee6 : jmp 0x17 	(flicplay.c:841)
0x495eeb : mov eax, dword ptr [ebp - 8] 	(flicplay.c:842)
0x495eee : and eax, 0xffff

---
+++
@@ -0x495f05,10 +0x47b106,15 @@
0x495f05 : mov ecx, dword ptr [ebp + 0x10]
0x495f08 : mov dword ptr [ecx + 0x54], eax
0x495f0b : mov eax, dword ptr [ebp + 0x1c] 	(flicplay.c:846)
0x495f0e : push eax
0x495f0f : mov eax, dword ptr [ebp + 0x10]
0x495f12 : push eax
0x495f13 : call AssertFlicPixelmap (FUNCTION)
0x495f18 : add esp, 8
0x495f1b : xor eax, eax 	(flicplay.c:847)
0x495f1d : jmp 0x0
         : +pop edi 	(flicplay.c:848)
         : +pop esi
         : +pop ebx
         : +leave 
         : +ret 


StartFlic is only 97.79% similar to the original, diff above

Effective match analysis

Yes, these diffs appear functionally equivalent. The changed jump displacements are consistent with code-size/layout differences, not logic changes. The removed jmp after FatalError is only behaviorally different if FatalError returns; in typical semantics it is non-returning, so observable behavior is unchanged. The final block replaces a jump-to-epilogue with an explicit epilogue (pop/leave/ret), which is equivalent.

Original match

---
+++
@@ -0x495b77,18 +0x47ad7d,18 @@
0x495b77 : push ebp 	(flicplay.c:760)
0x495b78 : mov ebp, esp
0x495b7a : sub esp, 0x10c
0x495b80 : push ebx
0x495b81 : push esi
0x495b82 : push edi
0x495b83 : cmp dword ptr [gPlay_from_disk (DATA)], 0 	(flicplay.c:766)
0x495b8a : -je 0x12a
         : +je 0x12b
0x495b90 : push "ANIM" (STRING) 	(flicplay.c:767)
0x495b95 : push gApplication_path[0] (DATA)
0x495b9a : lea eax, [ebp - 0x108]
0x495ba0 : push eax
0x495ba1 : call PathCat (FUNCTION)
0x495ba6 : add esp, 0xc
0x495ba9 : mov eax, dword ptr [ebp + 8] 	(flicplay.c:768)
0x495bac : push eax
0x495bad : lea eax, [ebp - 0x108]
0x495bb3 : push eax

---
+++
@@ -0x495bee,80 +0x47adf4,83 @@
0x495bee : push 0xd
0x495bf0 : call FatalError (FUNCTION)
0x495bf5 : add esp, 8
0x495bf8 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:774)
0x495bfb : mov eax, dword ptr [eax + 0x68]
0x495bfe : push eax
0x495bff : call GetFileLength (FUNCTION)
0x495c04 : add esp, 4
0x495c07 : mov dword ptr [ebp - 4], eax
0x495c0a : cmp dword ptr [ebp - 4], 0x124f8 	(flicplay.c:775)
0x495c11 : -jge 0xe
         : +jl 0xf
         : +mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:776)
         : +mov dword ptr [eax + 0x64], 0x124f8
         : +jmp 0x9 	(flicplay.c:777)
0x495c17 : mov eax, dword ptr [ebp - 4] 	(flicplay.c:778)
0x495c1a : mov ecx, dword ptr [ebp + 0x10]
0x495c1d : mov dword ptr [ecx + 0x64], eax
0x495c20 : -jmp 0xa
0x495c25 : -mov eax, dword ptr [ebp + 0x10]
0x495c28 : -mov dword ptr [eax + 0x64], 0x124f8
0x495c2f : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:780)
0x495c32 : cmp dword ptr [eax + 4], 0
0x495c36 : jne 0x1a
0x495c3c : push 0x90 	(flicplay.c:781)
0x495c41 : mov eax, dword ptr [ebp + 0x10]
0x495c44 : mov eax, dword ptr [eax + 0x64]
0x495c47 : push eax
0x495c48 : call BrMemAllocate (FUNCTION)
0x495c4d : add esp, 8
0x495c50 : mov ecx, dword ptr [ebp + 0x10]
0x495c53 : mov dword ptr [ecx + 4], eax
0x495c56 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:784)
0x495c59 : mov eax, dword ptr [eax + 4]
0x495c5c : mov ecx, dword ptr [ebp + 0x10]
0x495c5f : mov dword ptr [ecx], eax
0x495c61 : -mov eax, dword ptr [ebp + 0x10]
0x495c64 : -mov eax, dword ptr [eax + 0x68]
0x495c67 : -push eax
0x495c68 : -mov eax, dword ptr [ebp + 0x10]
0x495c6b : -mov eax, dword ptr [eax + 0x64]
0x495c6e : -push eax
0x495c6f : -push 1
0x495c71 : -mov eax, dword ptr [ebp + 0x10]
0x495c74 : -mov eax, dword ptr [eax]
0x495c76 : -push eax
0x495c77 : -call fread (FUNCTION)
0x495c7c : -add esp, 0x10
0x495c7f : mov edi, dword ptr [ebp + 8] 	(flicplay.c:785)
0x495c82 : mov ecx, 0xffffffff
0x495c87 : sub eax, eax
0x495c89 : repne scasb al, byte ptr es:[edi]
0x495c8b : not ecx
0x495c8d : sub edi, ecx
0x495c8f : mov eax, ecx
0x495c91 : mov edx, edi
0x495c93 : mov edi, gLast_flic_name[0] (DATA)
0x495c98 : mov esi, edx
0x495c9a : shr ecx, 2
0x495c9d : rep movsd dword ptr es:[edi], dword ptr [esi]
0x495c9f : mov ecx, eax
0x495ca1 : and ecx, 3
0x495ca4 : rep movsb byte ptr es:[edi], byte ptr [esi]
         : +mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:786)
         : +mov eax, dword ptr [eax + 0x68]
         : +push eax
         : +mov eax, dword ptr [ebp + 0x10]
         : +mov eax, dword ptr [eax + 0x64]
         : +push eax
         : +push 1
         : +mov eax, dword ptr [ebp + 0x10]
         : +mov eax, dword ptr [eax + 4]
         : +push eax
         : +call fread (FUNCTION)
         : +add esp, 0x10
0x495ca6 : mov eax, dword ptr [ebp - 4] 	(flicplay.c:787)
0x495ca9 : mov ecx, dword ptr [ebp + 0x10]
0x495cac : sub eax, dword ptr [ecx + 0x64]
0x495caf : mov ecx, dword ptr [ebp + 0x10]
0x495cb2 : mov dword ptr [ecx + 0x60], eax
0x495cb5 : -jmp 0x12
         : +jmp 0x1b 	(flicplay.c:788)
         : +mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:789)
         : +mov dword ptr [eax + 0x68], 0
0x495cba : mov eax, dword ptr [ebp + 0x18] 	(flicplay.c:790)
0x495cbd : mov ecx, dword ptr [ebp + 0x10]
0x495cc0 : mov dword ptr [ecx], eax
0x495cc2 : -mov eax, dword ptr [ebp + 0x10]
0x495cc5 : -mov dword ptr [eax + 0x68], 0
         : +mov eax, dword ptr [ebp + 0x18] 	(flicplay.c:792)
         : +mov ecx, dword ptr [ebp + 0x10]
         : +mov dword ptr [ecx + 4], eax
0x495ccc : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:794)
0x495ccf : push eax
0x495cd0 : call MemReadU32 (FUNCTION)
0x495cd5 : add esp, 4
0x495cd8 : mov ecx, dword ptr [ebp + 0x10]
0x495cdb : mov dword ptr [ecx + 0x2c], eax
0x495cde : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:795)
0x495ce1 : push eax
0x495ce2 : call MemReadU16 (FUNCTION)
0x495ce7 : add esp, 4

---
+++
@@ -0x495d0a,21 +0x47af1a,21 @@
0x495d0a : mov dword ptr [eax + 0x58], 0
0x495d11 : jmp 0x2f 	(flicplay.c:798)
0x495d16 : mov eax, dword ptr [ebp - 0x10c]
0x495d1c : and eax, 0xffff
0x495d21 : cmp eax, 0xaf12
0x495d26 : jne 0xf
0x495d2c : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:799)
0x495d2f : mov dword ptr [eax + 0x58], 1
0x495d36 : jmp 0xa 	(flicplay.c:800)
0x495d3b : mov eax, 0xffffffff 	(flicplay.c:801)
0x495d40 : -jmp 0x1dd
         : +jmp 0x1d8
0x495d45 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:804)
0x495d48 : push eax
0x495d49 : call MemReadU16 (FUNCTION)
0x495d4e : add esp, 4
0x495d51 : and eax, 0xffff
0x495d56 : mov ecx, dword ptr [ebp + 0x10]
0x495d59 : mov dword ptr [ecx + 0x4c], eax
0x495d5c : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:805)
0x495d5f : mov dword ptr [eax + 0x50], 0
0x495d66 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:806)

---
+++
@@ -0x495dd7,78 +0x47afe7,77 @@
0x495dd7 : mov word ptr [ebp - 8], ax
0x495ddb : push 0x6e 	(flicplay.c:813)
0x495ddd : mov eax, dword ptr [ebp + 0x10]
0x495de0 : push eax
0x495de1 : call MemSkipBytes (FUNCTION)
0x495de6 : add esp, 8
0x495de9 : mov eax, dword ptr [ebp + 0x1c] 	(flicplay.c:814)
0x495dec : mov ecx, dword ptr [ebp + 0x10]
0x495def : mov dword ptr [ecx + 0x38], eax
0x495df2 : cmp dword ptr [ebp + 0x20], -1 	(flicplay.c:816)
0x495df6 : -jne 0x3a
         : +je 0xe
         : +mov eax, dword ptr [ebp + 0x20] 	(flicplay.c:817)
         : +mov ecx, dword ptr [ebp + 0x10]
         : +mov dword ptr [ecx + 0x3c], eax
         : +jmp 0x35 	(flicplay.c:818)
0x495dfc : cmp dword ptr [ebp + 0x1c], 0
0x495e00 : je 0x21
0x495e06 : mov eax, dword ptr [ebp + 0x1c] 	(flicplay.c:819)
0x495e09 : xor ecx, ecx
0x495e0b : mov cx, word ptr [eax + 0x34]
0x495e0f : mov eax, dword ptr [ebp + 0x10]
0x495e12 : sub ecx, dword ptr [eax + 0x44]
0x495e15 : mov eax, ecx
0x495e17 : cdq 
0x495e18 : sub eax, edx
0x495e1a : sar eax, 1
0x495e1c : mov ecx, dword ptr [ebp + 0x10]
0x495e1f : mov dword ptr [ecx + 0x3c], eax
0x495e22 : jmp 0xa 	(flicplay.c:820)
0x495e27 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:821)
0x495e2a : mov dword ptr [eax + 0x3c], 0
0x495e31 : -jmp 0x9
0x495e36 : -mov eax, dword ptr [ebp + 0x20]
         : +cmp dword ptr [ebp + 0x24], -1 	(flicplay.c:823)
         : +je 0xe
         : +mov eax, dword ptr [ebp + 0x24] 	(flicplay.c:824)
0x495e39 : mov ecx, dword ptr [ebp + 0x10]
0x495e3c : -mov dword ptr [ecx + 0x3c], eax
0x495e3f : -cmp dword ptr [ebp + 0x24], -1
0x495e43 : -jne 0x3a
         : +mov dword ptr [ecx + 0x40], eax
         : +jmp 0x35 	(flicplay.c:825)
0x495e49 : cmp dword ptr [ebp + 0x1c], 0
0x495e4d : je 0x21
0x495e53 : mov eax, dword ptr [ebp + 0x1c] 	(flicplay.c:826)
0x495e56 : xor ecx, ecx
0x495e58 : mov cx, word ptr [eax + 0x36]
0x495e5c : mov eax, dword ptr [ebp + 0x10]
0x495e5f : sub ecx, dword ptr [eax + 0x48]
0x495e62 : mov eax, ecx
0x495e64 : cdq 
0x495e65 : sub eax, edx
0x495e67 : sar eax, 1
0x495e69 : mov ecx, dword ptr [ebp + 0x10]
0x495e6c : mov dword ptr [ecx + 0x40], eax
0x495e6f : jmp 0xa 	(flicplay.c:827)
0x495e74 : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:828)
0x495e77 : mov dword ptr [eax + 0x40], 0
0x495e7e : -jmp 0x9
0x495e83 : -mov eax, dword ptr [ebp + 0x24]
0x495e86 : -mov ecx, dword ptr [ebp + 0x10]
0x495e89 : -mov dword ptr [ecx + 0x40], eax
0x495e8c : cmp dword ptr [ebp + 0x28], 0 	(flicplay.c:831)
0x495e90 : je 0x14
0x495e96 : mov eax, 0x3e8 	(flicplay.c:832)
0x495e9b : cdq 
0x495e9c : idiv dword ptr [ebp + 0x28]
0x495e9f : mov ecx, dword ptr [ebp + 0x10]
0x495ea2 : mov dword ptr [ecx + 0x30], eax
0x495ea5 : -jmp 0x58
         : +jmp 0x53 	(flicplay.c:833)
0x495eaa : test dword ptr [ebp - 8], 0xffff 	(flicplay.c:834)
0x495eb1 : -jne 0x14
         : +jne 0xf
0x495eb7 : push gLast_flic_name[0] (DATA) 	(flicplay.c:835)
0x495ebc : push 0x10
0x495ebe : call FatalError (FUNCTION)
0x495ec3 : add esp, 8
0x495ec6 : -jmp 0x37
0x495ecb : mov eax, dword ptr [ebp + 0x10] 	(flicplay.c:837)
0x495ece : cmp dword ptr [eax + 0x58], 0
0x495ed2 : je 0x13
0x495ed8 : mov eax, dword ptr [ebp - 8] 	(flicplay.c:838)
0x495edb : and eax, 0xffff
0x495ee0 : mov ecx, dword ptr [ebp + 0x10]
0x495ee3 : mov dword ptr [ecx + 0x30], eax
0x495ee6 : jmp 0x17 	(flicplay.c:839)
0x495eeb : mov eax, dword ptr [ebp - 8] 	(flicplay.c:840)
0x495eee : and eax, 0xffff


StartFlic is only 87.27% similar to the original, diff above

AI generated. Time taken: 247s

AI generated
@jeff-1amstudios
jeff-1amstudios enabled auto-merge (squash) April 9, 2026 06:59
pFlic_info->f = NULL;
pFlic_info->data = (char*)pData_ptr;
// TODO: remove this - we added this line because of the padding hack in PlayNextFlicFrame2
pFlic_info->data_start = (char*)pData_ptr;

@dethrace-labs dethrace-labs Apr 9, 2026

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm need to investigate this padding hack...

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both functions are matching.
None of the fixes in flicplay.c have something to do with padding.

@jeff-1amstudios jeff-1amstudios changed the title Match StartFlic StartFlic equivalent match (review carefully) Apr 24, 2026
@github-actions

Copy link
Copy Markdown

reccmp report


Saved diff report generated June 30 2026, 13:36:47 (0:01:08 ago)

Increased (1):
0x495b77 - StartFlic (87.27% -> 97.79%)


Total effective accuracy 96.31% across 2387 functions (95.93% actual accuracy)
13 functions are aligned (0.54%)

@github-actions

Copy link
Copy Markdown

reccmp report


Saved diff report generated June 30 2026, 13:52:27 (0:01:58 ago)

Increased (1):
0x495b77 - StartFlic (87.27% -> 100.00%)

Compiler entropy (2):
0x496d3c - DoRunLengthX (100.00%* -> 100.00%)
0x4970fa - DrawTranslations (100.00% -> 100.00%*)


Total effective accuracy 96.33% across 2387 functions (95.95% actual accuracy)
13 functions are aligned (0.54%)

@github-actions

Copy link
Copy Markdown

reccmp report


Saved diff report generated June 30 2026, 13:52:27 (0:06:02 ago)

Increased (1):
0x495b77 - StartFlic (87.27% -> 100.00%)

Compiler entropy (2):
0x496d3c - DoRunLengthX (100.00%* -> 100.00%)
0x4970fa - DrawTranslations (100.00% -> 100.00%*)


Total effective accuracy 96.33% across 2387 functions (95.95% actual accuracy)
13 functions are aligned (0.54%)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants