From 7306d7a9925866891dff5866867333bb913214e8 Mon Sep 17 00:00:00 2001 From: jonschz Date: Sun, 25 May 2025 07:36:12 +0200 Subject: [PATCH] Improve jumps --- LEGO1/omni/src/video/flic.cpp | 74 +++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/LEGO1/omni/src/video/flic.cpp b/LEGO1/omni/src/video/flic.cpp index 0f33f31b..476a08af 100644 --- a/LEGO1/omni/src/video/flic.cpp +++ b/LEGO1/omni/src/video/flic.cpp @@ -379,54 +379,75 @@ void DecodeSS2(LPBITMAPINFOHEADER p_bitmapHeader, BYTE* p_pixelData, BYTE* p_dat skip_lines: // The layout in BETA10 strongly suggests that lots of `goto`s are used. + // LINE: LEGO1 0x100bdb05 // LINE: BETA10 0x1013e684 row += token; start_packet: do { + // LINE: LEGO1 0x100bdaef // LINE: BETA10 0x1013e692 token = *(short*) data; data += 2; - + // LINE: LEGO1 0x100bdafb if (token >= 0) { goto column_loop; } - + // LINE: LEGO1 0x100bdb00 if ((unsigned short) token & 0x4000) { goto skip_lines; } + // LINE: LEGO1 0x100bdb0a WritePixel(p_bitmapHeader, p_pixelData, xmax, row, token); token = *(short*) data; data += 2; + // LINE: LEGO1 0x100bdb2f // LINE: BETA10 0x1013e6ef if (!token) { row--; if (--lines > 0) { goto start_packet; } - break; + return; } + else { - // TODO: Something is still slightly incorrect here - orig has two `jmp`s, recomp only has one + column_loop: + // LINE: LEGO1 0x100bdb49 + // LINE: BETA10 0x1013e71e + short column = xofs; - column_loop: - // LINE: BETA10 0x1013e71e - short column = xofs; + column_loop_inner: + // LINE: LEGO1 0x100bdb50 + // LINE: BETA10 0x1013e726 + column += *data++; + // LINE: BETA10 0x1013e73a + short type = *(char*) data++; + type += type; - column_loop_inner: - // LINE: BETA10 0x1013e726 - column += *data++; - // LINE: BETA10 0x1013e73a - short type = *(char*) data++; - type += type; + if (type >= 0) { + WritePixels(p_bitmapHeader, p_pixelData, column, row, (BYTE*) data, type); + column += type; + data += type; + // LINE: BETA10 0x1013e797 + if (--token != 0) { + goto column_loop_inner; + } + row--; + if (--lines > 0) { + goto start_packet; + } + break; + } - if (type >= 0) { - WritePixels(p_bitmapHeader, p_pixelData, column, row, (BYTE*) data, type); + type = -type; + WORD* p_pixel = (WORD*) data; + data += 2; + WritePixelPairs(p_bitmapHeader, p_pixelData, column, row, *p_pixel, type >> 1); column += type; - data += type; - // LINE: BETA10 0x1013e797 + // LINE: BETA10 0x1013e813 if (--token != 0) { goto column_loop_inner; } @@ -434,24 +455,9 @@ void DecodeSS2(LPBITMAPINFOHEADER p_bitmapHeader, BYTE* p_pixelData, BYTE* p_dat if (--lines > 0) { goto start_packet; } - break; + return; + // the `while (0)` looks off, but produces the correct `jmp` instructions near the end } - - type = -type; - WORD* p_pixel = (WORD*) data; - data += 2; - WritePixelPairs(p_bitmapHeader, p_pixelData, column, row, *p_pixel, type >> 1); - column += type; - // LINE: BETA10 0x1013e813 - if (--token != 0) { - goto column_loop_inner; - } - row--; - if (--lines > 0) { - goto start_packet; - } - return; - // the `while (0)` looks off, but produces the correct `jmp` instructions near the end } while (0); }