From 02202304033a82f51d4af0b1645c0a6796ad6ad1 Mon Sep 17 00:00:00 2001 From: Wolfvak Date: Tue, 5 Dec 2017 18:25:18 +0100 Subject: [PATCH] Replace QLZ with PCX for splash --- Makefile.common | 2 +- arm9/source/common/ui.c | 6 +- arm9/source/godmode.c | 12 +- arm9/source/quicklz/qlzcomp.c | 17 - arm9/source/quicklz/qlzcomp.h | 6 - arm9/source/quicklz/quicklz.c | 848 --------------------------------- arm9/source/quicklz/quicklz.h | 151 ------ arm9/source/system/pcx.c | 62 +++ arm9/source/system/pcx.h | 35 ++ arm9/source/system/vram0.h | 2 +- resources/GodMode9_splash.pcx | Bin 0 -> 8708 bytes resources/GodMode9_splash.qlz | Bin 23580 -> 0 bytes resources/SafeMode9_splash.pcx | Bin 0 -> 12510 bytes resources/SafeMode9_splash.qlz | Bin 35600 -> 0 bytes 14 files changed, 112 insertions(+), 1029 deletions(-) delete mode 100644 arm9/source/quicklz/qlzcomp.c delete mode 100644 arm9/source/quicklz/qlzcomp.h delete mode 100644 arm9/source/quicklz/quicklz.c delete mode 100644 arm9/source/quicklz/quicklz.h create mode 100644 arm9/source/system/pcx.c create mode 100644 arm9/source/system/pcx.h create mode 100644 resources/GodMode9_splash.pcx delete mode 100644 resources/GodMode9_splash.qlz create mode 100644 resources/SafeMode9_splash.pcx delete mode 100644 resources/SafeMode9_splash.qlz diff --git a/Makefile.common b/Makefile.common index 1aa9612..894140b 100644 --- a/Makefile.common +++ b/Makefile.common @@ -7,7 +7,7 @@ rwildcard = $(foreach d, $(wildcard $1*), \ FLAVOR ?= GodMode9 README := README.md -SPLASH = resources/$(FLAVOR)_splash.qlz +SPLASH = resources/$(FLAVOR)_splash.pcx ifeq ($(FONT),ORIG) CFLAGS += -DFONT_ORIGINAL diff --git a/arm9/source/common/ui.c b/arm9/source/common/ui.c index aa806b6..59c879d 100644 --- a/arm9/source/common/ui.c +++ b/arm9/source/common/ui.c @@ -52,6 +52,10 @@ void DrawRectangle(u8* screen, int x, int y, int width, int height, int color) void DrawBitmap(u8* screen, int x, int y, int w, int h, u8* bitmap) { + // on negative values: center the bitmap + if (x < 0) x = (SCREEN_WIDTH(screen) - w) >> 1; + if (y < 0) y = (SCREEN_HEIGHT - h) >> 1; + u8* bitmapPos = bitmap; for (int yy = 0; yy < h; yy++) { int xDisplacement = (x * BYTES_PER_PIXEL * SCREEN_HEIGHT); @@ -319,7 +323,7 @@ bool ShowPrompt(bool ask, const char *format, ...) #ifndef AUTO_UNLOCK #define PRNG (*(volatile u32*)0x10011000) bool ShowUnlockSequence(u32 seqlvl, const char *format, ...) { - const char dpad_symbols[] = { '\x1A', '\x1B', '\x18', '\x19' }; // R L D U + const char dpad_symbols[] = { '\x1A', '\x1B', '\x18', '\x19' }; // R L U D const int seqcolors[7] = { COLOR_STD_FONT, COLOR_BRIGHTGREEN, COLOR_BRIGHTYELLOW, COLOR_ORANGE, COLOR_BRIGHTBLUE, COLOR_RED, COLOR_DARKRED }; const u32 seqlen_max = 7; diff --git a/arm9/source/godmode.c b/arm9/source/godmode.c index ad48be5..fa1ade9 100644 --- a/arm9/source/godmode.c +++ b/arm9/source/godmode.c @@ -10,7 +10,7 @@ #include "unittype.h" #include "entrypoints.h" #include "bootfirm.h" -#include "qlzcomp.h" +#include "pcx.h" #include "timer.h" #include "rtc.h" #include "power.h" @@ -48,7 +48,8 @@ static PaneData* panedata = (PaneData*) (DIR_BUFFER + 0xF0000); u32 SplashInit(const char* modestr) { - void* splash = FindVTarFileInfo(VRAM0_SPLASH_QLZ, NULL); + u64 splash_size; + u8* splash = FindVTarFileInfo(VRAM0_SPLASH_PCX, &splash_size); const char* namestr = FLAVOR " " VERSION; const char* loadstr = "booting..."; const u32 pos_xb = 10; @@ -57,8 +58,11 @@ u32 SplashInit(const char* modestr) { const u32 pos_yu = SCREEN_HEIGHT - 10 - GetDrawStringHeight(loadstr); ClearScreenF(true, true, COLOR_STD_BG); - if (splash) QlzDecompress(TOP_SCREEN, splash, 0); - else DrawStringF(TOP_SCREEN, 10, 10, COLOR_STD_FONT, COLOR_TRANSPARENT, "(" VRAM0_SPLASH_QLZ " not found)"); + + if (splash && PCX_Decompress(TEMP_BUFFER, TEMP_BUFFER_SIZE, splash, splash_size)) { + PCXHdr* hdr = (PCXHdr*) (void*) splash; + DrawBitmap(TOP_SCREEN, -1, -1, PCX_Width(hdr), PCX_Height(hdr), TEMP_BUFFER); + } else DrawStringF(TOP_SCREEN, 10, 10, COLOR_STD_FONT, COLOR_TRANSPARENT, "(" VRAM0_SPLASH_PCX " not found)"); if (modestr) DrawStringF(TOP_SCREEN, SCREEN_WIDTH_TOP - 10 - GetDrawStringWidth(modestr), SCREEN_HEIGHT - 10 - GetDrawStringHeight(modestr), COLOR_STD_FONT, COLOR_TRANSPARENT, modestr); diff --git a/arm9/source/quicklz/qlzcomp.c b/arm9/source/quicklz/qlzcomp.c deleted file mode 100644 index 6475c8b..0000000 --- a/arm9/source/quicklz/qlzcomp.c +++ /dev/null @@ -1,17 +0,0 @@ -#include "qlzcomp.h" -#include "quicklz.h" - -u32 QlzCompress(void* out, const void* in, u32 size_in) { - if (TEMP_BUFFER_SIZE < sizeof(qlz_state_compress)) return 1; - qlz_state_compress *state_compress = (qlz_state_compress*) (void*) TEMP_BUFFER; - memset(state_compress, 0, sizeof(qlz_state_compress)); - return (qlz_compress(in, out, size_in, state_compress) > 0) ? 0 : 1; -} - -u32 QlzDecompress(void* out, const void* in, u32 size_out) { - if (TEMP_BUFFER_SIZE < sizeof(qlz_state_decompress)) return 1; - if (size_out && (qlz_size_decompressed(in) != size_out)) return 1; - qlz_state_decompress *state_decompress = (qlz_state_decompress*) (void*) TEMP_BUFFER; - memset(state_decompress, 0, sizeof(qlz_state_decompress)); - return (qlz_decompress(in, out, state_decompress) > 0) ? 0 : 1; -} diff --git a/arm9/source/quicklz/qlzcomp.h b/arm9/source/quicklz/qlzcomp.h deleted file mode 100644 index d5c2d4c..0000000 --- a/arm9/source/quicklz/qlzcomp.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "common.h" - -u32 QlzCompress(void* out, const void* in, u32 size_decomp); -u32 QlzDecompress(void* out, const void* in, u32 size); diff --git a/arm9/source/quicklz/quicklz.c b/arm9/source/quicklz/quicklz.c deleted file mode 100644 index 3742129..0000000 --- a/arm9/source/quicklz/quicklz.c +++ /dev/null @@ -1,848 +0,0 @@ -// Fast data compression library -// Copyright (C) 2006-2011 Lasse Mikkel Reinhold -// lar@quicklz.com -// -// QuickLZ can be used for free under the GPL 1, 2 or 3 license (where anything -// released into public must be open source) or under a commercial license if such -// has been acquired (see http://www.quicklz.com/order.html). The commercial license -// does not cover derived or ported versions created by third parties under GPL. - -// 1.5.0 final - -#include "quicklz.h" - -#if QLZ_VERSION_MAJOR != 1 || QLZ_VERSION_MINOR != 5 || QLZ_VERSION_REVISION != 0 - #error quicklz.c and quicklz.h have different versions -#endif - -#if (defined(__X86__) || defined(__i386__) || defined(i386) || defined(_M_IX86) || defined(__386__) || defined(__x86_64__) || defined(_M_X64)) - #define X86X64 -#endif - -#define MINOFFSET 2 -#define UNCONDITIONAL_MATCHLEN 6 -#define UNCOMPRESSED_END 4 -#define CWORD_LEN 4 - -#if QLZ_COMPRESSION_LEVEL == 1 && defined QLZ_PTR_64 && QLZ_STREAMING_BUFFER == 0 - #define OFFSET_BASE source - #define CAST (ui32)(size_t) -#else - #define OFFSET_BASE 0 - #define CAST -#endif - -int qlz_get_setting(int setting) -{ - switch (setting) - { - case 0: return QLZ_COMPRESSION_LEVEL; - case 1: return sizeof(qlz_state_compress); - case 2: return sizeof(qlz_state_decompress); - case 3: return QLZ_STREAMING_BUFFER; -#ifdef QLZ_MEMORY_SAFE - case 6: return 1; -#else - case 6: return 0; -#endif - case 7: return QLZ_VERSION_MAJOR; - case 8: return QLZ_VERSION_MINOR; - case 9: return QLZ_VERSION_REVISION; - } - return -1; -} - -#if QLZ_COMPRESSION_LEVEL == 1 -static int same(const unsigned char *src, size_t n) -{ - while(n > 0 && *(src + n) == *src) - n--; - return n == 0 ? 1 : 0; -} -#endif - -static void reset_table_compress(qlz_state_compress *state) -{ - int i; - for(i = 0; i < QLZ_HASH_VALUES; i++) - { -#if QLZ_COMPRESSION_LEVEL == 1 - state->hash[i].offset = 0; -#else - state->hash_counter[i] = 0; -#endif - } -} - -static void reset_table_decompress(qlz_state_decompress *state) -{ - int i; - (void)state; - (void)i; -#if QLZ_COMPRESSION_LEVEL == 2 - for(i = 0; i < QLZ_HASH_VALUES; i++) - { - state->hash_counter[i] = 0; - } -#endif -} - -static __inline ui32 hash_func(ui32 i) -{ -#if QLZ_COMPRESSION_LEVEL == 2 - return ((i >> 9) ^ (i >> 13) ^ i) & (QLZ_HASH_VALUES - 1); -#else - return ((i >> 12) ^ i) & (QLZ_HASH_VALUES - 1); -#endif -} - -static __inline ui32 fast_read(void const *src, ui32 bytes) -{ -#ifndef X86X64 - unsigned char *p = (unsigned char*)src; - switch (bytes) - { - case 4: - return(*p | *(p + 1) << 8 | *(p + 2) << 16 | *(p + 3) << 24); - case 3: - return(*p | *(p + 1) << 8 | *(p + 2) << 16); - case 2: - return(*p | *(p + 1) << 8); - case 1: - return(*p); - } - return 0; -#else - if (bytes >= 1 && bytes <= 4) - return *((ui32*)src); - else - return 0; -#endif -} - -static __inline ui32 hashat(const unsigned char *src) -{ - ui32 fetch, hash; - fetch = fast_read(src, 3); - hash = hash_func(fetch); - return hash; -} - -static __inline void fast_write(ui32 f, void *dst, size_t bytes) -{ -#ifndef X86X64 - unsigned char *p = (unsigned char*)dst; - - switch (bytes) - { - case 4: - *p = (unsigned char)f; - *(p + 1) = (unsigned char)(f >> 8); - *(p + 2) = (unsigned char)(f >> 16); - *(p + 3) = (unsigned char)(f >> 24); - return; - case 3: - *p = (unsigned char)f; - *(p + 1) = (unsigned char)(f >> 8); - *(p + 2) = (unsigned char)(f >> 16); - return; - case 2: - *p = (unsigned char)f; - *(p + 1) = (unsigned char)(f >> 8); - return; - case 1: - *p = (unsigned char)f; - return; - } -#else - switch (bytes) - { - case 4: - *((ui32*)dst) = f; - return; - case 3: - *((ui32*)dst) = f; - return; - case 2: - *((ui16 *)dst) = (ui16)f; - return; - case 1: - *((unsigned char*)dst) = (unsigned char)f; - return; - } -#endif -} - - -size_t qlz_size_decompressed(const char *source) -{ - ui32 n, r; - n = (((*source) & 2) == 2) ? 4 : 1; - r = fast_read(source + 1 + n, n); - r = r & (0xffffffff >> ((4 - n)*8)); - return r; -} - -size_t qlz_size_compressed(const char *source) -{ - ui32 n, r; - n = (((*source) & 2) == 2) ? 4 : 1; - r = fast_read(source + 1, n); - r = r & (0xffffffff >> ((4 - n)*8)); - return r; -} - -size_t qlz_size_header(const char *source) -{ - size_t n = 2*((((*source) & 2) == 2) ? 4 : 1) + 1; - return n; -} - - -static __inline void memcpy_up(unsigned char *dst, const unsigned char *src, ui32 n) -{ - // Caution if modifying memcpy_up! Overlap of dst and src must be special handled. -#ifndef X86X64 - unsigned char *end = dst + n; - while(dst < end) - { - *dst = *src; - dst++; - src++; - } -#else - ui32 f = 0; - do - { - *(ui32 *)(dst + f) = *(ui32 *)(src + f); - f += MINOFFSET + 1; - } - while (f < n); -#endif -} - -static __inline void update_hash(qlz_state_decompress *state, const unsigned char *s) -{ -#if QLZ_COMPRESSION_LEVEL == 1 - ui32 hash; - hash = hashat(s); - state->hash[hash].offset = s; - state->hash_counter[hash] = 1; -#elif QLZ_COMPRESSION_LEVEL == 2 - ui32 hash; - unsigned char c; - hash = hashat(s); - c = state->hash_counter[hash]; - state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = s; - c++; - state->hash_counter[hash] = c; -#endif - (void)state; - (void)s; -} - -#if QLZ_COMPRESSION_LEVEL <= 2 -static void update_hash_upto(qlz_state_decompress *state, unsigned char **lh, const unsigned char *max) -{ - while(*lh < max) - { - (*lh)++; - update_hash(state, *lh); - } -} -#endif - -static size_t qlz_compress_core(const unsigned char *source, unsigned char *destination, size_t size, qlz_state_compress *state) -{ - const unsigned char *last_byte = source + size - 1; - const unsigned char *src = source; - unsigned char *cword_ptr = destination; - unsigned char *dst = destination + CWORD_LEN; - ui32 cword_val = 1U << 31; - const unsigned char *last_matchstart = last_byte - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END; - ui32 fetch = 0; - unsigned int lits = 0; - - (void) lits; - - if(src <= last_matchstart) - fetch = fast_read(src, 3); - - while(src <= last_matchstart) - { - if ((cword_val & 1) == 1) - { - // store uncompressed if compression ratio is too low - if (src > source + (size >> 1) && dst - destination > src - source - ((src - source) >> 5)) - return 0; - - fast_write((cword_val >> 1) | (1U << 31), cword_ptr, CWORD_LEN); - - cword_ptr = dst; - dst += CWORD_LEN; - cword_val = 1U << 31; - fetch = fast_read(src, 3); - } -#if QLZ_COMPRESSION_LEVEL == 1 - { - const unsigned char *o; - ui32 hash, cached; - - hash = hash_func(fetch); - cached = fetch ^ state->hash[hash].cache; - state->hash[hash].cache = fetch; - - o = state->hash[hash].offset + OFFSET_BASE; - state->hash[hash].offset = CAST(src - OFFSET_BASE); - -#ifdef X86X64 - if ((cached & 0xffffff) == 0 && o != OFFSET_BASE && (src - o > MINOFFSET || (src == o + 1 && lits >= 3 && src > source + 3 && same(src - 3, 6)))) - { - if(cached != 0) - { -#else - if (cached == 0 && o != OFFSET_BASE && (src - o > MINOFFSET || (src == o + 1 && lits >= 3 && src > source + 3 && same(src - 3, 6)))) - { - if (*(o + 3) != *(src + 3)) - { -#endif - hash <<= 4; - cword_val = (cword_val >> 1) | (1U << 31); - fast_write((3 - 2) | hash, dst, 2); - src += 3; - dst += 2; - } - else - { - const unsigned char *old_src = src; - size_t matchlen; - hash <<= 4; - - cword_val = (cword_val >> 1) | (1U << 31); - src += 4; - - if(*(o + (src - old_src)) == *src) - { - src++; - if(*(o + (src - old_src)) == *src) - { - size_t q = last_byte - UNCOMPRESSED_END - (src - 5) + 1; - size_t remaining = q > 255 ? 255 : q; - src++; - while(*(o + (src - old_src)) == *src && (size_t)(src - old_src) < remaining) - src++; - } - } - - matchlen = src - old_src; - if (matchlen < 18) - { - fast_write((ui32)(matchlen - 2) | hash, dst, 2); - dst += 2; - } - else - { - fast_write((ui32)(matchlen << 16) | hash, dst, 3); - dst += 3; - } - } - fetch = fast_read(src, 3); - lits = 0; - } - else - { - lits++; - *dst = *src; - src++; - dst++; - cword_val = (cword_val >> 1); -#ifdef X86X64 - fetch = fast_read(src, 3); -#else - fetch = (fetch >> 8 & 0xffff) | (*(src + 2) << 16); -#endif - } - } -#elif QLZ_COMPRESSION_LEVEL >= 2 - { - const unsigned char *o, *offset2; - ui32 hash, matchlen, k, m, best_k = 0; - unsigned char c; - size_t remaining = (last_byte - UNCOMPRESSED_END - src + 1) > 255 ? 255 : (last_byte - UNCOMPRESSED_END - src + 1); - (void)best_k; - - - //hash = hashat(src); - fetch = fast_read(src, 3); - hash = hash_func(fetch); - - c = state->hash_counter[hash]; - - offset2 = state->hash[hash].offset[0]; - if(offset2 < src - MINOFFSET && c > 0 && ((fast_read(offset2, 3) ^ fetch) & 0xffffff) == 0) - { - matchlen = 3; - if(*(offset2 + matchlen) == *(src + matchlen)) - { - matchlen = 4; - while(*(offset2 + matchlen) == *(src + matchlen) && matchlen < remaining) - matchlen++; - } - } - else - matchlen = 0; - for(k = 1; k < QLZ_POINTERS && c > k; k++) - { - o = state->hash[hash].offset[k]; -#if QLZ_COMPRESSION_LEVEL == 3 - if(((fast_read(o, 3) ^ fetch) & 0xffffff) == 0 && o < src - MINOFFSET) -#elif QLZ_COMPRESSION_LEVEL == 2 - if(*(src + matchlen) == *(o + matchlen) && ((fast_read(o, 3) ^ fetch) & 0xffffff) == 0 && o < src - MINOFFSET) -#endif - { - m = 3; - while(*(o + m) == *(src + m) && m < remaining) - m++; -#if QLZ_COMPRESSION_LEVEL == 3 - if ((m > matchlen) || (m == matchlen && o > offset2)) -#elif QLZ_COMPRESSION_LEVEL == 2 - if (m > matchlen) -#endif - { - offset2 = o; - matchlen = m; - best_k = k; - } - } - } - o = offset2; - state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = src; - c++; - state->hash_counter[hash] = c; - -#if QLZ_COMPRESSION_LEVEL == 3 - if(matchlen > 2 && src - o < 131071) - { - ui32 u; - size_t offset = src - o; - - for(u = 1; u < matchlen; u++) - { - hash = hashat(src + u); - c = state->hash_counter[hash]++; - state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = src + u; - } - - cword_val = (cword_val >> 1) | (1U << 31); - src += matchlen; - - if(matchlen == 3 && offset <= 63) - { - *dst = (unsigned char)(offset << 2); - dst++; - } - else if (matchlen == 3 && offset <= 16383) - { - ui32 f = (ui32)((offset << 2) | 1); - fast_write(f, dst, 2); - dst += 2; - } - else if (matchlen <= 18 && offset <= 1023) - { - ui32 f = ((matchlen - 3) << 2) | ((ui32)offset << 6) | 2; - fast_write(f, dst, 2); - dst += 2; - } - - else if(matchlen <= 33) - { - ui32 f = ((matchlen - 2) << 2) | ((ui32)offset << 7) | 3; - fast_write(f, dst, 3); - dst += 3; - } - else - { - ui32 f = ((matchlen - 3) << 7) | ((ui32)offset << 15) | 3; - fast_write(f, dst, 4); - dst += 4; - } - } - else - { - *dst = *src; - src++; - dst++; - cword_val = (cword_val >> 1); - } -#elif QLZ_COMPRESSION_LEVEL == 2 - - if(matchlen > 2) - { - cword_val = (cword_val >> 1) | (1U << 31); - src += matchlen; - - if (matchlen < 10) - { - ui32 f = best_k | ((matchlen - 2) << 2) | (hash << 5); - fast_write(f, dst, 2); - dst += 2; - } - else - { - ui32 f = best_k | (matchlen << 16) | (hash << 5); - fast_write(f, dst, 3); - dst += 3; - } - } - else - { - *dst = *src; - src++; - dst++; - cword_val = (cword_val >> 1); - } -#endif - } -#endif - } - while (src <= last_byte) - { - if ((cword_val & 1) == 1) - { - fast_write((cword_val >> 1) | (1U << 31), cword_ptr, CWORD_LEN); - cword_ptr = dst; - dst += CWORD_LEN; - cword_val = 1U << 31; - } -#if QLZ_COMPRESSION_LEVEL < 3 - if (src <= last_byte - 3) - { -#if QLZ_COMPRESSION_LEVEL == 1 - ui32 hash, fetch; - fetch = fast_read(src, 3); - hash = hash_func(fetch); - state->hash[hash].offset = CAST(src - OFFSET_BASE); - state->hash[hash].cache = fetch; -#elif QLZ_COMPRESSION_LEVEL == 2 - ui32 hash; - unsigned char c; - hash = hashat(src); - c = state->hash_counter[hash]; - state->hash[hash].offset[c & (QLZ_POINTERS - 1)] = src; - c++; - state->hash_counter[hash] = c; -#endif - } -#endif - *dst = *src; - src++; - dst++; - cword_val = (cword_val >> 1); - } - - while((cword_val & 1) != 1) - cword_val = (cword_val >> 1); - - fast_write((cword_val >> 1) | (1U << 31), cword_ptr, CWORD_LEN); - - // min. size must be 9 bytes so that the qlz_size functions can take 9 bytes as argument - return dst - destination < 9 ? 9 : dst - destination; -} - -static size_t qlz_decompress_core(const unsigned char *source, unsigned char *destination, size_t size, qlz_state_decompress *state, const unsigned char *history) -{ - const unsigned char *src = source + qlz_size_header((const char *)source); - unsigned char *dst = destination; - const unsigned char *last_destination_byte = destination + size - 1; - ui32 cword_val = 1; - const unsigned char *last_matchstart = last_destination_byte - UNCONDITIONAL_MATCHLEN - UNCOMPRESSED_END; - unsigned char *last_hashed = destination - 1; - const unsigned char *last_source_byte = source + qlz_size_compressed((const char *)source) - 1; - static const ui32 bitlut[16] = {4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0}; - - (void) last_source_byte; - (void) last_hashed; - (void) state; - (void) history; - - for(;;) - { - ui32 fetch; - - if (cword_val == 1) - { -#ifdef QLZ_MEMORY_SAFE - if(src + CWORD_LEN - 1 > last_source_byte) - return 0; -#endif - cword_val = fast_read(src, CWORD_LEN); - src += CWORD_LEN; - } - -#ifdef QLZ_MEMORY_SAFE - if(src + 4 - 1 > last_source_byte) - return 0; -#endif - - fetch = fast_read(src, 4); - - if ((cword_val & 1) == 1) - { - ui32 matchlen; - const unsigned char *offset2; - -#if QLZ_COMPRESSION_LEVEL == 1 - ui32 hash; - cword_val = cword_val >> 1; - hash = (fetch >> 4) & 0xfff; - offset2 = (const unsigned char *)(size_t)state->hash[hash].offset; - - if((fetch & 0xf) != 0) - { - matchlen = (fetch & 0xf) + 2; - src += 2; - } - else - { - matchlen = *(src + 2); - src += 3; - } - -#elif QLZ_COMPRESSION_LEVEL == 2 - ui32 hash; - unsigned char c; - cword_val = cword_val >> 1; - hash = (fetch >> 5) & 0x7ff; - c = (unsigned char)(fetch & 0x3); - offset2 = state->hash[hash].offset[c]; - - if((fetch & (28)) != 0) - { - matchlen = ((fetch >> 2) & 0x7) + 2; - src += 2; - } - else - { - matchlen = *(src + 2); - src += 3; - } - -#elif QLZ_COMPRESSION_LEVEL == 3 - ui32 offset; - cword_val = cword_val >> 1; - if ((fetch & 3) == 0) - { - offset = (fetch & 0xff) >> 2; - matchlen = 3; - src++; - } - else if ((fetch & 2) == 0) - { - offset = (fetch & 0xffff) >> 2; - matchlen = 3; - src += 2; - } - else if ((fetch & 1) == 0) - { - offset = (fetch & 0xffff) >> 6; - matchlen = ((fetch >> 2) & 15) + 3; - src += 2; - } - else if ((fetch & 127) != 3) - { - offset = (fetch >> 7) & 0x1ffff; - matchlen = ((fetch >> 2) & 0x1f) + 2; - src += 3; - } - else - { - offset = (fetch >> 15); - matchlen = ((fetch >> 7) & 255) + 3; - src += 4; - } - - offset2 = dst - offset; -#endif - -#ifdef QLZ_MEMORY_SAFE - if(offset2 < history || offset2 > dst - MINOFFSET - 1) - return 0; - - if(matchlen > (ui32)(last_destination_byte - dst - UNCOMPRESSED_END + 1)) - return 0; -#endif - - memcpy_up(dst, offset2, matchlen); - dst += matchlen; - -#if QLZ_COMPRESSION_LEVEL <= 2 - update_hash_upto(state, &last_hashed, dst - matchlen); - last_hashed = dst - 1; -#endif - } - else - { - if (dst < last_matchstart) - { - unsigned int n = bitlut[cword_val & 0xf]; -#ifdef X86X64 - *(ui32 *)dst = *(ui32 *)src; -#else - memcpy_up(dst, src, 4); -#endif - cword_val = cword_val >> n; - dst += n; - src += n; -#if QLZ_COMPRESSION_LEVEL <= 2 - update_hash_upto(state, &last_hashed, dst - 3); -#endif - } - else - { - while(dst <= last_destination_byte) - { - if (cword_val == 1) - { - src += CWORD_LEN; - cword_val = 1U << 31; - } -#ifdef QLZ_MEMORY_SAFE - if(src >= last_source_byte + 1) - return 0; -#endif - *dst = *src; - dst++; - src++; - cword_val = cword_val >> 1; - } - -#if QLZ_COMPRESSION_LEVEL <= 2 - update_hash_upto(state, &last_hashed, last_destination_byte - 3); // todo, use constant -#endif - return size; - } - - } - } -} - -size_t qlz_compress(const void *source, char *destination, size_t size, qlz_state_compress *state) -{ - size_t r; - ui32 compressed; - size_t base; - - if(size == 0 || size > 0xffffffff - 400) - return 0; - - if(size < 216) - base = 3; - else - base = 9; - -#if QLZ_STREAMING_BUFFER > 0 - if (state->stream_counter + size - 1 >= QLZ_STREAMING_BUFFER) -#endif - { - reset_table_compress(state); - r = base + qlz_compress_core((const unsigned char *)source, (unsigned char*)destination + base, size, state); -#if QLZ_STREAMING_BUFFER > 0 - reset_table_compress(state); -#endif - if(r == base) - { - memcpy(destination + base, source, size); - r = size + base; - compressed = 0; - } - else - { - compressed = 1; - } - state->stream_counter = 0; - } -#if QLZ_STREAMING_BUFFER > 0 - else - { - unsigned char *src = state->stream_buffer + state->stream_counter; - - memcpy(src, source, size); - r = base + qlz_compress_core(src, (unsigned char*)destination + base, size, state); - - if(r == base) - { - memcpy(destination + base, src, size); - r = size + base; - compressed = 0; - reset_table_compress(state); - } - else - { - compressed = 1; - } - state->stream_counter += size; - } -#endif - if(base == 3) - { - *destination = (unsigned char)(0 | compressed); - *(destination + 1) = (unsigned char)r; - *(destination + 2) = (unsigned char)size; - } - else - { - *destination = (unsigned char)(2 | compressed); - fast_write((ui32)r, destination + 1, 4); - fast_write((ui32)size, destination + 5, 4); - } - - *destination |= (QLZ_COMPRESSION_LEVEL << 2); - *destination |= (1 << 6); - *destination |= ((QLZ_STREAMING_BUFFER == 0 ? 0 : (QLZ_STREAMING_BUFFER == 100000 ? 1 : (QLZ_STREAMING_BUFFER == 1000000 ? 2 : 3))) << 4); - -// 76543210 -// 01SSLLHC - - return r; -} - -size_t qlz_decompress(const char *source, void *destination, qlz_state_decompress *state) -{ - size_t dsiz = qlz_size_decompressed(source); - -#if QLZ_STREAMING_BUFFER > 0 - if (state->stream_counter + qlz_size_decompressed(source) - 1 >= QLZ_STREAMING_BUFFER) -#endif - { - if((*source & 1) == 1) - { - reset_table_decompress(state); - dsiz = qlz_decompress_core((const unsigned char *)source, (unsigned char *)destination, dsiz, state, (const unsigned char *)destination); - } - else - { - memcpy(destination, source + qlz_size_header(source), dsiz); - } - state->stream_counter = 0; - reset_table_decompress(state); - } -#if QLZ_STREAMING_BUFFER > 0 - else - { - unsigned char *dst = state->stream_buffer + state->stream_counter; - if((*source & 1) == 1) - { - dsiz = qlz_decompress_core((const unsigned char *)source, dst, dsiz, state, (const unsigned char *)state->stream_buffer); - } - else - { - memcpy(dst, source + qlz_size_header(source), dsiz); - reset_table_decompress(state); - } - memcpy(destination, dst, dsiz); - state->stream_counter += dsiz; - } -#endif - return dsiz; -} - diff --git a/arm9/source/quicklz/quicklz.h b/arm9/source/quicklz/quicklz.h deleted file mode 100644 index 131a25b..0000000 --- a/arm9/source/quicklz/quicklz.h +++ /dev/null @@ -1,151 +0,0 @@ -#ifndef QLZ_HEADER -#define QLZ_HEADER - -// Fast data compression library -// Copyright (C) 2006-2011 Lasse Mikkel Reinhold -// lar@quicklz.com -// -// QuickLZ can be used for free under the GPL 1, 2 or 3 license (where anything -// released into public must be open source) or under a commercial license if such -// has been acquired (see http://www.quicklz.com/order.html). The commercial license -// does not cover derived or ported versions created by third parties under GPL. - -// You can edit following user settings. Data must be decompressed with the same -// setting of QLZ_COMPRESSION_LEVEL and QLZ_STREAMING_BUFFER as it was compressed -// (see manual). If QLZ_STREAMING_BUFFER > 0, scratch buffers must be initially -// zeroed out (see manual). First #ifndef makes it possible to define settings from -// the outside like the compiler command line. - -// 1.5.0 final - -#ifndef QLZ_COMPRESSION_LEVEL - - // 1 gives fastest compression speed. 3 gives fastest decompression speed and best - // compression ratio. - //#define QLZ_COMPRESSION_LEVEL 1 - //#define QLZ_COMPRESSION_LEVEL 2 - #define QLZ_COMPRESSION_LEVEL 3 - - // If > 0, zero out both states prior to first call to qlz_compress() or qlz_decompress() - // and decompress packets in the same order as they were compressed - #define QLZ_STREAMING_BUFFER 0 - //#define QLZ_STREAMING_BUFFER 1000 - //#define QLZ_STREAMING_BUFFER 100000 - //#define QLZ_STREAMING_BUFFER 1000000 - - // Guarantees that decompression of corrupted data cannot crash. Decreases decompression - // speed 10-20%. Compression speed not affected. - //#define QLZ_MEMORY_SAFE -#endif - -#define QLZ_VERSION_MAJOR 1 -#define QLZ_VERSION_MINOR 5 -#define QLZ_VERSION_REVISION 0 - -// Using size_t, memset() and memcpy() -#include - -// Verify compression level -#if QLZ_COMPRESSION_LEVEL != 1 && QLZ_COMPRESSION_LEVEL != 2 && QLZ_COMPRESSION_LEVEL != 3 -#error QLZ_COMPRESSION_LEVEL must be 1, 2 or 3 -#endif - -typedef unsigned int ui32; -typedef unsigned short int ui16; - -// Decrease QLZ_POINTERS for level 3 to increase compression speed. Do not touch any other values! -#if QLZ_COMPRESSION_LEVEL == 1 -#define QLZ_POINTERS 1 -#define QLZ_HASH_VALUES 4096 -#elif QLZ_COMPRESSION_LEVEL == 2 -#define QLZ_POINTERS 4 -#define QLZ_HASH_VALUES 2048 -#elif QLZ_COMPRESSION_LEVEL == 3 -#define QLZ_POINTERS 16 -#define QLZ_HASH_VALUES 4096 -#endif - -// Detect if pointer size is 64-bit. It's not fatal if some 64-bit target is not detected because this is only for adding an optional 64-bit optimization. -#if defined _LP64 || defined __LP64__ || defined __64BIT__ || _ADDR64 || defined _WIN64 || defined __arch64__ || __WORDSIZE == 64 || (defined __sparc && defined __sparcv9) || defined __x86_64 || defined __amd64 || defined __x86_64__ || defined _M_X64 || defined _M_IA64 || defined __ia64 || defined __IA64__ - #define QLZ_PTR_64 -#endif - -// hash entry -typedef struct -{ -#if QLZ_COMPRESSION_LEVEL == 1 - ui32 cache; -#if defined QLZ_PTR_64 && QLZ_STREAMING_BUFFER == 0 - unsigned int offset; -#else - const unsigned char *offset; -#endif -#else - const unsigned char *offset[QLZ_POINTERS]; -#endif - -} qlz_hash_compress; - -typedef struct -{ -#if QLZ_COMPRESSION_LEVEL == 1 - const unsigned char *offset; -#else - const unsigned char *offset[QLZ_POINTERS]; -#endif -} qlz_hash_decompress; - - -// states -typedef struct -{ - #if QLZ_STREAMING_BUFFER > 0 - unsigned char stream_buffer[QLZ_STREAMING_BUFFER]; - #endif - size_t stream_counter; - qlz_hash_compress hash[QLZ_HASH_VALUES]; - unsigned char hash_counter[QLZ_HASH_VALUES]; -} qlz_state_compress; - - -#if QLZ_COMPRESSION_LEVEL == 1 || QLZ_COMPRESSION_LEVEL == 2 - typedef struct - { -#if QLZ_STREAMING_BUFFER > 0 - unsigned char stream_buffer[QLZ_STREAMING_BUFFER]; -#endif - qlz_hash_decompress hash[QLZ_HASH_VALUES]; - unsigned char hash_counter[QLZ_HASH_VALUES]; - size_t stream_counter; - } qlz_state_decompress; -#elif QLZ_COMPRESSION_LEVEL == 3 - typedef struct - { -#if QLZ_STREAMING_BUFFER > 0 - unsigned char stream_buffer[QLZ_STREAMING_BUFFER]; -#endif -#if QLZ_COMPRESSION_LEVEL <= 2 - qlz_hash_decompress hash[QLZ_HASH_VALUES]; -#endif - size_t stream_counter; - } qlz_state_decompress; -#endif - - -#if defined (__cplusplus) -extern "C" { -#endif - -// Public functions of QuickLZ -size_t qlz_size_decompressed(const char *source); -size_t qlz_size_compressed(const char *source); -size_t qlz_compress(const void *source, char *destination, size_t size, qlz_state_compress *state); -size_t qlz_decompress(const char *source, void *destination, qlz_state_decompress *state); -int qlz_get_setting(int setting); - -#if defined (__cplusplus) -} -#endif - -#endif - diff --git a/arm9/source/system/pcx.c b/arm9/source/system/pcx.c new file mode 100644 index 0000000..73cc6d0 --- /dev/null +++ b/arm9/source/system/pcx.c @@ -0,0 +1,62 @@ +#include +#include + +#include "pcx.h" + +// Define __PCX_INVERT_RGB to have the buffer output in BGR24 +#define __PCX_INVERT_RGB + + +static inline int PCX_Validate(const PCXHdr *hdr) { + return (hdr != NULL && + hdr->manufacturer == 10 && + PCX_Encoding(hdr) == 1 && + PCX_PlaneCount(hdr) == 1 && + PCX_BitsPerPixel(hdr) == 8) ? 1 : 0; +} + +int PCX_Decompress(u8 *out_buf, size_t out_maxlen, const u8 *pcx_data, size_t pcx_len) { + const PCXHdr *pcx = (const PCXHdr*)pcx_data; + const u8 *pcx_palette, *out_start, *out_end, *pcx_bitmap, *pcx_end; + int mrk, palind; + + if (PCX_Validate(pcx) == 0 || (size_t) (PCX_BitmapSize(pcx) * 3) > out_maxlen) + return -1; + + pcx_end = pcx_data + pcx_len - 769; + out_end = out_buf + out_maxlen; + out_start = out_buf; + pcx_bitmap = PCX_Bitmap(pcx); + pcx_palette = PCX_Palette(pcx, pcx_len); + + while (pcx_bitmap < pcx_end && out_buf < out_end) { + mrk = *(pcx_bitmap++); + + if (mrk >= 0xC0) { + mrk -= 0xC0; + palind = *(pcx_bitmap++) * 3; + + if ((out_buf + mrk) > out_end) { + // TODO: report the buffer overflow somehow + return -1; + } + } else { + palind = mrk * 3; + mrk = 1; + } + + while (mrk--) { + #ifdef __PCX_INVERT_RGB + *(out_buf++) = pcx_palette[palind + 2]; + *(out_buf++) = pcx_palette[palind + 1]; + *(out_buf++) = pcx_palette[palind + 0]; + #else + *(out_buf++) = pcx_palette[palind + 0]; + *(out_buf++) = pcx_palette[palind + 1]; + *(out_buf++) = pcx_palette[palind + 2]; + #endif + } + } + + return (out_buf - out_start); +} diff --git a/arm9/source/system/pcx.h b/arm9/source/system/pcx.h new file mode 100644 index 0000000..ffb7266 --- /dev/null +++ b/arm9/source/system/pcx.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include "common.h" + +typedef struct { + u8 manufacturer; + u8 version; + u8 enc; + u8 bpp; + u16 minx; + u16 miny; + u16 maxx; + u16 maxy; + u16 hres; + u16 vres; + u8 egapalette[48]; + u8 reserved; + u8 clrplanes; + u16 bytesperline; + u16 palettetype; + u8 resv_[58]; +} __attribute__((packed)) PCXHdr; + +#define PCX_Width(hdr) (hdr->maxx - hdr->minx + 1) +#define PCX_Height(hdr) (hdr->maxy - hdr->miny + 1) +#define PCX_BitsPerPixel(hdr) (hdr->bpp) +#define PCX_BitmapSize(hdr) (PCX_Width(hdr) * PCX_Height(hdr)) +#define PCX_MaxColors(hdr) (1<clrplanes) +#define PCX_Encoding(hdr) (hdr->enc) +#define PCX_Palette(hdr, pcx_len) (((u8*)hdr) + pcx_len - 768) +#define PCX_Bitmap(hdr) (((u8*)hdr) + sizeof(PCXHdr)) + +int PCX_Decompress(u8 *out_buf, size_t out_maxlen, const u8 *pcx_data, size_t pcx_len); diff --git a/arm9/source/system/vram0.h b/arm9/source/system/vram0.h index 415cd3c..67e5885 100644 --- a/arm9/source/system/vram0.h +++ b/arm9/source/system/vram0.h @@ -7,7 +7,7 @@ // known file names inside VRAM0 TAR #define VRAM0_AUTORUN_GM9 "autorun.gm9" #define VRAM0_README_MD "README.md" -#define VRAM0_SPLASH_QLZ FLAVOR "_splash.qlz" +#define VRAM0_SPLASH_PCX FLAVOR "_splash.pcx" #define VRAM0_OFFSET 0x18000000 diff --git a/resources/GodMode9_splash.pcx b/resources/GodMode9_splash.pcx new file mode 100644 index 0000000000000000000000000000000000000000..95b3485f544aaf391189270401239dbb9f697e1e GIT binary patch literal 8708 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 BKK1|r diff --git a/resources/SafeMode9_splash.pcx b/resources/SafeMode9_splash.pcx new file mode 100644 index 0000000000000000000000000000000000000000..8121e8b94b6c58caa7d1cb235474f53415da77ad GIT binary patch literal 12510 zcmb_?cXV6Vndf_`GKgM?O7z})B>@s73Q2$z*u(-B6%(RJiKHYJby>w!r#dZBwj@WE zWVshfwk(%-L6x|~jx&>Fl1XMZyNOdK$s{|ONp|;~-TOc#**|tD=bR-3orm}C``-P1 z?f$;+J{lQahQL26nnKd>^EdyY%TV-hzUi+w{BLCO^C|KvQf<3)0KBa7-N8Ol+26uG zu~(~t2hJ>BfB2tV{T$w>wE-FMRo7QJY(C%s^}Zmh_Rn|yzpj0b;L^0@Cbvop%;_pU z&(Xs31?xc$)NAVx99g_~sS%$*3HEBO&7FhyPNXMns;UXH&1Y+JSNrVMeEOn7X#p--4|u=~s?!tv zbhT}wD&10FEo&h2KoePCUC(M*l=k>>50C}q0Lw=91$j+rzMIU`C%x4^8Q(nNtM}4X zyee~3l}#1&$x1l?@HNNYgHn&k0IxpSluOFUdX>$~vTJ3v<_1umjJwI{2GFF^*K5He zsb6pGJp>@&s7>$F@?w=u4d!S@PcB5sJZ_+c2dY^{y$Uo0>v`_ls$lhz^AD*HkKs>C+m5YEslxWf`lC71^}6rakxP+ zDyeK@C4+W-tf8vfSCD)Yq2dPk>TkFOf51^Pw-7DV%6M*>*(h$1F~ki?2?wMn%tB7Q z7BCuW&0IRa$l?PQe}Nt$-ABr!AG7G0G6Z7Mc^6ps>0ZWtM9N=a(cv$8v>c%#LU`mA z!x8uU3?NfP%(XIeL|7{mGpf?&7_b$6K>+{pfIgNME+FNqxo_IF!0zxM zRDkg3U~u^CMHLx-Dvb+Bv+r&ZUd@s1HbCapHUq?cSEaT2?39j&h-A(OZ1zgBj6_Au zb3m(avfGMyKy-=$QdVuNB%uxMG>Lq=JdtN*u6@gzBUXH>|0+xgMGEs zgwv7&H=`xv@a|LrJIH`2M~Hm|uIvNX!L{NZu;J;8#fRYawcz5~lbJk|1}GK^%_8%H z*{WJ|rW~oz&t-w87y=qPAcP14iw7XwIWk8gV5aUV*(lq>ry^4AT!Wa-6!=X9RE@S% z)S3>&oilmk0#6U2{60d`>QO>BQ>+tsklHziNyHADP@*vctOl1Lf=F#_#XWV{K^A&JaeLu|IwL$=8;cIw#&hk85o>PV5I0K2;`=;ReLl2Yb8L zjr6a*xVHGh``E)*!9Tu={o|{zAA0p9F7{EmM6b32QNd-USlTTM?asW_SZ@{dh?vSO zB?ZtFH-!QvTdLA>0>iVH=QZ+Fh$14UC_SNY&T(e=&OB3qD$5t3k?mo@BJwh?PlQ^y z3_zF}?w$lLK|v=`_*EgG1`-#6CXD(SDK#pJ5T$0a!RQi6tU{Am2*hC_LpRg&)Hj}7 z`Ps53makY64A^%^mTpLTOD6x^&PwK*(zS1NUE1~1uA$9)*DUmoj9nak{SbH+dw6K) z?sdr^6WZHSbXq!V&))z)!oGi|qtF>mv;%WH^q69{6C^qloy3gYC1+R#XuCYcMgbco zutRL2irGV(otZzNVR4;GZj_tUg~V>&nVI=n4S`F6fk=h1ob?Ns>|vdODP@tZTyMLW zs0_{YOe$R>uQ8%y*a!x-#HD72Ok6+1YRE{`M*l<;ClFB^BEaYhND2YJPz-vci|CiF zSOUx-_EAGi8bItv&gaSc%823k^>Z7+u^n9l+uOF)jZf|F?HW7>`VYMd4jtRNEgocA zAovDKA}61J3;g27dAUc@1oFik_6g_&j$AC?nN8%l{Gf}bv&vCQh|2~96dIqvWat|- zlsofhG;FRY4j_06hhTD(hv&f=0#`&ck^nS(kSPplLbM*}^DHuvOK1>Ah@g9BwmW4M zu?&ErWvfL-bwI#2rNUyO0<{_?o~oD;5RE`mG)e*yKEn^hrZNb9*%M&dy(jShp#v-h zs_~>)4^+1EN01|Y6}gfOBB%SoI_&-)Bz1ahcWc-lV+Y^PMP>W~ zD{S&}^FpyVS0Ck z9`>6j;Q`ddQn;q~UB7LsC{MQ_chW)+2woeVnjY%fK7HY()s1yEptWZFjY~rtK|gef zL$AMgcqHl5z$GuoH&;;00Y{fXMe6c`FHy`_CZrWq@7Aq}Y{_SNZwgP?!^Q^m6tASZVlS4h|*@7Nxh+rfkq@cqj z=!qyrCUS#-NlDTlMJ)RslJ}1uZ@;_ErD7-u|)uWzauN`_|R9w$*G~J+iTXbbmQ0 zyRv2#Tq`V{Of{j5dLO5iNW?6}ehGdUQAkNhv^tR$IOQ-d$RUBw zG@;6^38BPPKnkcGEs)#z72dErMl3=-$kN#!XT4ex_o53hv&NfQs(^?R2NI|Sznx`O zW}p;~O|IYz0IDvhA}v))qYHK6T2L4Q5k<3(`ESy>ek{WbLM>_dmUV!~19VzY!0H9C3wn zrVN%JR3y+O0-s_(%vhlcxb>Z8IZc48fGrnK&YXd~M`{wo3?BBVa%|KpVMj@jt9CFz zhcH|bYYG(j-jqCD)uT=jTwat9GEpT!b!anRMX(an-jWJb83{0Ql>v@cV4x>6aYF^J zf~Z==c3I(Kfvdn^f;6KjZ4NhszlHxlX0V{eSRjQIHDDyqiMfkqXJZN!HU?fDVvlb>z?vU`w zsB>}#k|?Xf1XscPq;h>0xFpdK%V_F=l;9qT>TXde>0UXdrAK|{e5gChC79Eebh{Z9 zOIcdoB+;5q;?~#dI6xt>Mi@SUkwu_cr7(_K@3({{=@%hW9^ACy{A9)A zImvbJ-MC@+-5WO_Il!&XSUwj^;JKhaXCY8D?N(@ijinp=#f|pr`Z(zULe*CaoOCW~ zuD@Fe%bO-Li1H!dQmC;X%=dsv$O)V>ufQU2XOrk;;ry&sStW!iASfg92^0l`qot`) z3NhRRQ$R}&aMWy(!Cw^%fJ{MRB-aOx4-wKL@WtTAfiJrKtW;(GsW`<332jc-k0{{{Q6 z;2*F*y0I^@d;Kr=T^bt%_pskrJv#sIj$KKWTs`yQ%?~RO*l?gCh870UaSS?`k)mV< z-{E9i4AJ^-qEln}@CNp~n;Hfz>8ZRdq|lUxoJa@D9$45@5qF*oC{4zQ+@m8ZX%w2g zNJ|5z6UducTA_;(W?Gx^aA0u@UUNXlu~A$S;pENB&>ujHkce^uFd32q&BZYA_<=_X zAA&0ar%6xlx=H$rJA5rjTVXozy|D(@#EWCMeEVR4T+ZQ$v46n+75jHHjIDcv{e2h4 z2C;i9Fpw@O<6p5q=B~u6bv??S`F45*9_4s)B-23Fl695=gl@xriv1A#H1E_{qxG?r zmFcxy#unbxiE)iU-yooJo`@p=erd@!+(a7Bs7Q7&l+gy7TtK1K%936|T*GYU+r1nj z!;kuL-=G&V@v1;XXUm2F>nu2lM@W^rTWyS}!!2(3$X`YweKH1&BHRZ{N`VY|<#Oz| z=bm{)6}~RIy&KovvRxm-^>XDL43&|A3t)T!U>~=>a$$P=dt0Wqw$|;sggwB(Dh!?l zeaV=gty4RPa|s1Z`tToOym}xjw=ffA;0Ex94!zU?>YTN}MKlCb>$GLZd7%^bUGjClQ8mU1(X5TR9>Ij+W4)2Bw)( zws50rqf3|ax1@#O(*ocGggUrbLya%y3s_97d>;IEkuyC8&MPD9ZfUQN;rK^-Z&zRM zy7bb{=^cBw4s9O*eN)q0Rt>BfUp=s6_s|Zobc z+j%in-jT=Ps)_xS%_~H!nU=g&M62y2Dujy)AY}7aL#>~|k1Q&{)+q_lJUUi14e<*A zQz?skonAsl*35$SEsenyL#F8o##56N2S=n(frS}^4mIKnWu-wWF<6zRs>(t%AOQ?X zSl3eqQ}WFx!OACKeBc^*R7NZXr*E(eLSBc1KezF=cGpnNmc#FXXTgb8t-Jd64uNM| z+qSiVZLN#v-jfnjGz}mSH7K(a??(ZMzEUF~I8zo{iUKr=N_rq7=SO`OjU`Wv(kLy_ zjtXcMa)J_*=$s}6q&kan5L6gy!v-(xwNQXuKtP=>X;kK=$@tLrtoVe5)ESXt8nw1un6yiWfC-xC{>06fl&L9wOM6;CUQ5c%t~Io?H^l z^w7)I`%2IUdv6E(c5FFycop_JIC=uC+V;xOj#G!X)HT+$)|`STvG0J-PaU2bGSZl+ z3)0%jl+z)D4M2#VARtgs3q_NqWaZgBU+v=Xt7%zgd!8#vW$0nt@PL<7GAKeuMx@qB z?^BUjR!A}FWXfnh)lQLXQdxp3m(tYIoy;T50jGa!F;%xscee7uU zl^t!3t4^Ib_0B5Lx^Havz~N`NG@cs)jWw&mv&B_4+qb?fH7eVg-66>3x+#tf2{Fc) zg6`o-xqyxRU^tQWCa~|IR&l02AxLQ2^TP77@-iGh&yusE0wGIUURD8@6Sr9@5K?4u ze_CU(P*OCD!4}idC>qoW-QFqYh}a<*_kNoo!O&UWd|z=3`w_Nqq`~SERv^N9hbt;V zg{E*zo)c9RbQ}+S3h5Jsx?#oh%U9xV53w&_@faY%zS26d7rXy*^&4yI##bE%r&ib0 zHI5DL+`VPhmeqSVwl=mkZaD=GZ&|&2=vMU`9kot5fz8ygAuc`=;0c^eXUI7$NDO!8 zLX=#B!^l)S%w9`(Hb4S6dmx*ME`l6pI#?KF_{9w01978rA%RWkFvMJ33X{S#sbT~` zbJ8@;{2**6$_XemyGNVW^$gEr*t>>mxU!yMx{P9J{H{;a4F$rMVN1?hFmMAL4~bgA zWfl2!&I9Br?8_C;FN5nMj(_=z$HUoy+x*3~*mua+#`<1qt=m!qR!{Y=eQ|Wt`fGbO zjh>#KYO5Q^9@JqEcJ;08Kgv7)IwF)?09>%}cCj=<4goo(IPC1CfKIukGspI4>KzF) zA!N~!K8DL)zMDvM3QdsKdgp*Ds0~h3H03l-yxS?QFblX8uUT16ju8Yjs7NV4$Vdq$ zJwlud_y`KQ2y&cvh1EAcI8U>tXu-L>l8~~pdzy)+svKlTl7a%S5ATvId6hhe{~-<^ z`_1z!7cKv_(BSY-kG@Sl4&8hl)QmT78`}K(>Gh-Q7dDL!?5$}XuLG^y2i6|ENn$bHvo|_u%y4MUjA3&O76kxUpEG8q**-l}~oeWQN zL$EVTaVGNoj0(+n7R?IW)_@23%j}sH-U`sB&@9^<7rHA$H0aq(A(dnnnE4?;HCCCd z^=jm`5U|eL{pNvg7~zZ{0iEC|W==A+=M55u+SN_4P7=9Hg_KM5S5#H1VVlH7gr-*5 zjXH)}5)n&FWb`Z~za_v+!2rijxbe-rqm^$A^@6UUmq6c3Lwk>H2FH2_hxUTL-8&n> zw$)ub)KgNefGOly+JO2+BxErXKc*X@Z0@W78>N*EDB@yK&UY zDi{V9Q`&$~<64xMZJ`muZZgdx1hiQ(36W&Y4oMjTVk{Xm#H4kwf+pqcTeE^N(&4LS zQn+D0!OHN3{A!?>WGF*iBGb^pjWm~0(=i>

n(rO&S5Fbol$So$$?_POWr;9kCB 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 HF75vTTC5L! literal 0 HcmV?d00001 diff --git a/resources/SafeMode9_splash.qlz b/resources/SafeMode9_splash.qlz deleted file mode 100644 index d2503e0dab385c6cfeaa5113679d831511bcb96c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35600 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