diff --git a/makerom/deps/libblz/include/blz.h b/makerom/deps/libblz/include/blz.h new file mode 100644 index 0000000..e0cea22 --- /dev/null +++ b/makerom/deps/libblz/include/blz.h @@ -0,0 +1,15 @@ +#pragma once +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLZ_NORMAL 0 // normal mode +#define BLZ_BEST 1 // best mode + +uint8_t *BLZ_Code(uint8_t *raw_buffer, int raw_len, uint32_t *new_len, int best); + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/makerom/deps/libblz/makefile b/makerom/deps/libblz/makefile new file mode 100644 index 0000000..8d4c7e8 --- /dev/null +++ b/makerom/deps/libblz/makefile @@ -0,0 +1,198 @@ +# C++/C Recursive Project Makefile +# (c) Jack +# Version 7 (20220413) + +# Project Name +PROJECT_NAME = libblz + +# Project Relative Paths +PROJECT_PATH = $(CURDIR) +PROJECT_SRC_PATH = src +PROJECT_SRC_SUBDIRS = $(PROJECT_SRC_PATH) +PROJECT_INCLUDE_PATH = include +#PROJECT_TESTSRC_PATH = test +#PROJECT_TESTSRC_SUBDIRS = $(PROJECT_TESTSRC_PATH) +PROJECT_BIN_PATH = bin +#PROJECT_DOCS_PATH = docs +#PROJECT_DOXYFILE_PATH = Doxyfile + +# Determine if the root makefile has been established, and if not establish this makefile as the root makefile +ifeq ($(ROOT_PROJECT_NAME),) + export ROOT_PROJECT_NAME = $(PROJECT_NAME) + export ROOT_PROJECT_PATH = $(PROJECT_PATH) + export ROOT_PROJECT_DEPENDENCY_PATH = $(ROOT_PROJECT_PATH)/deps +endif + +# Project Dependencies +PROJECT_DEPEND = +PROJECT_DEPEND_LOCAL_DIR = + +# Generate compiler flags for including project include path +ifneq ($(PROJECT_INCLUDE_PATH),) + INC += -I"$(PROJECT_INCLUDE_PATH)" +endif + +# Generate compiler flags for local included dependencies +ifneq ($(PROJECT_DEPEND_LOCAL_DIR),) + LIB += $(foreach dep,$(PROJECT_DEPEND_LOCAL_DIR), -L"$(ROOT_PROJECT_DEPENDENCY_PATH)/$(dep)/bin") + INC += $(foreach dep,$(PROJECT_DEPEND_LOCAL_DIR), -I"$(ROOT_PROJECT_DEPENDENCY_PATH)/$(dep)/include") +endif + +# Generate compiler flags for external dependencies +ifneq ($(PROJECT_DEPEND),) + LIB += $(foreach dep,$(PROJECT_DEPEND), -l$(dep)) +endif + +# Detect Platform +ifeq ($(PROJECT_PLATFORM),) + ifeq ($(OS), Windows_NT) + export PROJECT_PLATFORM = WIN32 + else + UNAME = $(shell uname -s) + ifeq ($(UNAME), Darwin) + export PROJECT_PLATFORM = MACOS + else ifneq (, $(findstring CYGWIN_NT, $(UNAME))) + export PROJECT_PLATFORM = CYGWIN_NT + else + export PROJECT_PLATFORM = GNU + endif + endif +endif + +# Detect Architecture +ifeq ($(PROJECT_PLATFORM_ARCH),) + ifeq ($(PROJECT_PLATFORM), WIN32) + export PROJECT_PLATFORM_ARCH = x86_64 + else ifeq ($(PROJECT_PLATFORM), GNU) + export PROJECT_PLATFORM_ARCH = $(shell uname -m) + else ifeq ($(PROJECT_PLATFORM), MACOS) + export PROJECT_PLATFORM_ARCH = $(shell uname -m) + else ifeq ($(PROJECT_PLATFORM), CYGWIN_NT) + export PROJECT_PLATFORM_ARCH = $(shell uname -m) + else + export PROJECT_PLATFORM_ARCH = x86_64 + endif +endif + +# Generate platform specific compiler flags +ifeq ($(PROJECT_PLATFORM), WIN32) + # Windows Flags/Libs + CC = x86_64-w64-mingw32-gcc + CXX = x86_64-w64-mingw32-g++ + WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable + ARCHFLAGS = + INC += + LIB += -static + ARFLAGS = cr -o +else ifeq ($(PROJECT_PLATFORM), GNU) + # GNU/Linux Flags/Libs + #CC = + #CXX = + WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable + ARCHFLAGS = + INC += + LIB += + ARFLAGS = cr -o +else ifeq ($(PROJECT_PLATFORM), MACOS) + # MacOS Flags/Libs + #CC = + #CXX = + WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-private-field + ARCHFLAGS = -arch $(PROJECT_PLATFORM_ARCH) + INC += + LIB += + ARFLAGS = rc +else ifeq ($(PROJECT_PLATFORM), CYGWIN_NT) + # CygWin Flags/Libs + #CC = + #CXX = + WARNFLAGS = -Wall -Wno-unused-value -Wno-unused-but-set-variable + ARCHFLAGS = + INC += + LIB += + ARFLAGS = cr -o +endif + +# Compiler Flags +CXXFLAGS = -std=c++11 $(INC) $(WARNFLAGS) $(ARCHFLAGS) -fPIC +CFLAGS = -std=c11 $(INC) $(WARNFLAGS) $(ARCHFLAGS) -fPIC + +# Object Files +SRC_OBJ = $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .cc,.o,$(wildcard $(dir)/*.cc))) $(foreach dir,$(PROJECT_SRC_SUBDIRS),$(subst .c,.o,$(wildcard $(dir)/*.c))) +TESTSRC_OBJ = $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .cpp,.o,$(wildcard $(dir)/*.cpp))) $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .cc,.o,$(wildcard $(dir)/*.cc))) $(foreach dir,$(PROJECT_TESTSRC_SUBDIRS),$(subst .c,.o,$(wildcard $(dir)/*.c))) + +# all is the default, user should specify what the default should do +# - 'static_lib' for building source as a static library +# - 'program' for building source as executable program +# - 'test_program' for building the test program +# test_program can be used with program or static_lib, but program and static_lib cannot be used together +all: static_lib + +clean: clean_object_files remove_binary_dir + +# Object Compile Rules +%.o: %.c + @echo CC $< + @$(CC) $(CFLAGS) -c $< -o $@ + +%.o: %.cpp + @echo CXX $< + @$(CXX) $(CXXFLAGS) -c $< -o $@ + +%.o: %.cc + @echo CXX $< + @$(CXX) $(CXXFLAGS) -c $< -o $@ + +# Binary Directory +.PHONY: create_binary_dir +create_binary_dir: + @mkdir -p "$(PROJECT_BIN_PATH)" + +.PHONY: remove_binary_dir +remove_binary_dir: +ifneq ($(PROJECT_BIN_PATH),) + @rm -rf "$(PROJECT_BIN_PATH)" +endif + +.PHONY: clean_object_files +clean_object_files: + @rm -f $(SRC_OBJ) $(TESTSRC_OBJ) + +# Build Library +static_lib: $(SRC_OBJ) create_binary_dir + @echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME).a + @ar $(ARFLAGS) "$(PROJECT_BIN_PATH)/$(PROJECT_NAME).a" $(SRC_OBJ) + +# Build Program +program: $(SRC_OBJ) create_binary_dir + @echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME) + @$(CXX) $(ARCHFLAGS) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)" + +# Build Test Program +test_program: $(TESTSRC_OBJ) $(SRC_OBJ) create_binary_dir +ifneq ($(PROJECT_TESTSRC_PATH),) + @echo LINK $(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test + @$(CXX) $(ARCHFLAGS) $(TESTSRC_OBJ) $(SRC_OBJ) $(LIB) -o "$(PROJECT_BIN_PATH)/$(PROJECT_NAME)_test" +endif + +# Documentation +.PHONY: docs +docs: +ifneq ($(PROJECT_DOCS_PATH),) + doxygen "$(PROJECT_DOXYFILE_PATH)" +endif + +.PHONY: clean_docs +clean_docs: +ifneq ($(PROJECT_DOCS_PATH),) + @rm -rf "$(PROJECT_DOCS_PATH)" +endif + +# Dependencies +.PHONY: deps +deps: + @$(foreach lib,$(PROJECT_DEPEND_LOCAL_DIR), cd "$(ROOT_PROJECT_DEPENDENCY_PATH)/$(lib)" && $(MAKE) static_lib && cd "$(PROJECT_PATH)";) + +.PHONY: clean_deps +clean_deps: + @$(foreach lib,$(PROJECT_DEPEND_LOCAL_DIR), cd "$(ROOT_PROJECT_DEPENDENCY_PATH)/$(lib)" && $(MAKE) clean && cd "$(PROJECT_PATH)";) \ No newline at end of file diff --git a/makerom/src/blz.c b/makerom/deps/libblz/src/blz.c similarity index 85% rename from makerom/src/blz.c rename to makerom/deps/libblz/src/blz.c index 7f4622d..a57ecce 100644 --- a/makerom/src/blz.c +++ b/makerom/deps/libblz/src/blz.c @@ -17,8 +17,10 @@ /*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------*/ -#include "lib.h" -#include "blz.h" +#include +#include + +#include /*----------------------------------------------------------------------------*/ #define CMD_DECODE 0x00 // decode @@ -47,16 +49,16 @@ #define EXIT(text) { printf(text); exit(-1); } /*----------------------------------------------------------------------------*/ -u8 *Memory(int length, int size); +uint8_t *Memory(int length, int size); -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best); -void BLZ_Invert(u8 *buffer, int length); +uint8_t *BLZ_Code(uint8_t *raw_buffer, int raw_len, uint32_t *new_len, int best); +void BLZ_Invert(uint8_t *buffer, int length); /*----------------------------------------------------------------------------*/ -u8 *Memory(int length, int size) { - u8 *fb; +uint8_t *Memory(int length, int size) { + uint8_t *fb; - fb = (u8 *) calloc(length * size, size); + fb = (uint8_t *) calloc(length * size, size); if (fb == NULL) EXIT("\nMemory error\n"); return(fb); @@ -64,15 +66,15 @@ u8 *Memory(int length, int size) { /*----------------------------------------------------------------------------*/ void BLZ_Decode(char *filename) { - // u8 *pak_buffer, *raw_buffer, *pak, *raw, *pak_end, *raw_end; - // u32 pak_len, raw_len, len, pos, inc_len, hdr_len, enc_len, dec_len; - // u8 flags, mask; + // uint8_t *pak_buffer, *raw_buffer, *pak, *raw, *pak_end, *raw_end; + // uint32_t pak_len, raw_len, len, pos, inc_len, hdr_len, enc_len, dec_len; + // uint8_t flags, mask; // printf("- decoding '%s'", filename); // // pak_buffer = Load(filename, &pak_len, BLZ_MINIM, BLZ_MAXIM); - // inc_len = *(u32 *)(pak_buffer + pak_len - 4); + // inc_len = *(uint32_t *)(pak_buffer + pak_len - 4); // if (!inc_len) { // enc_len = 0; // dec_len = pak_len - 4; @@ -83,14 +85,14 @@ void BLZ_Decode(char *filename) { // hdr_len = pak_buffer[pak_len - 5]; // if ((hdr_len < 0x08) || (hdr_len > 0x0B)) EXIT("Bad header length\n"); // if (pak_len <= hdr_len) EXIT("Bad length\n"); - // enc_len = *(u32 *)(pak_buffer + pak_len - 8) & 0x00FFFFFF; + // enc_len = *(uint32_t *)(pak_buffer + pak_len - 8) & 0x00FFFFFF; // dec_len = pak_len - enc_len; // pak_len = enc_len - hdr_len; // raw_len = dec_len + enc_len + inc_len; // if (raw_len > RAW_MAXIM) EXIT("Bad decoded length\n"); // } - // raw_buffer = (u8 *) Memory(raw_len, sizeof(char)); + // raw_buffer = (uint8_t *) Memory(raw_len, sizeof(char)); // pak = pak_buffer; // raw = raw_buffer; @@ -141,10 +143,10 @@ void BLZ_Decode(char *filename) { // printf("\n"); } -u8 *Load(char *filename, u32 *length, int min, int max) { +uint8_t *Load(char *filename, uint32_t *length, int min, int max) { FILE *fp; int fs; - u8 *fb; + uint8_t *fb; if ((fp = fopen(filename, "rb")) == NULL) EXIT("\nFile open error\n"); fseek(fp, 0, SEEK_END); @@ -161,9 +163,9 @@ u8 *Load(char *filename, u32 *length, int min, int max) { } /*----------------------------------------------------------------------------*/ -u8* BLZ_Encode(char *filename, u32* pak_len, int mode) { - u8 *raw_buffer, *pak_buffer, *new_buffer; - u32 raw_len, new_len; +uint8_t* BLZ_Encode(char *filename, uint32_t* pak_len, int mode) { + uint8_t *raw_buffer, *pak_buffer, *new_buffer; + uint32_t raw_len, new_len; raw_buffer = Load(filename, &raw_len, RAW_MINIM, RAW_MAXIM); @@ -181,12 +183,12 @@ u8* BLZ_Encode(char *filename, u32* pak_len, int mode) { } /*----------------------------------------------------------------------------*/ -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) { - u8 *pak_buffer, *pak, *raw, *raw_end, *flg = NULL, *tmp; - u32 pak_len, inc_len, hdr_len, enc_len, len, pos, max; - u32 len_best, pos_best = 0, len_next, pos_next, len_post, pos_post; - u32 pak_tmp, raw_tmp; - u8 mask; +uint8_t *BLZ_Code(uint8_t *raw_buffer, int raw_len, uint32_t *new_len, int best) { + uint8_t *pak_buffer, *pak, *raw, *raw_end, *flg = NULL, *tmp; + uint32_t pak_len, inc_len, hdr_len, enc_len, len, pos, max; + uint32_t len_best, pos_best = 0, len_next, pos_next, len_post, pos_post; + uint32_t pak_tmp, raw_tmp; + uint8_t mask; #define SEARCH(l,p) { \ l = BLZ_THRESHOLD; \ @@ -210,7 +212,7 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) { raw_tmp = raw_len; pak_len = raw_len + ((raw_len + 7) / 8) + 11; - pak_buffer = (u8 *) Memory(pak_len, sizeof(char)); + pak_buffer = (uint8_t *) Memory(pak_len, sizeof(char)); BLZ_Invert(raw_buffer, raw_len); @@ -282,9 +284,9 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) { while ((pak - pak_buffer) & 3) *pak++ = 0; - *(u32 *)pak = 0; pak += 4; + *(uint32_t *)pak = 0; pak += 4; } else { - tmp = (u8 *) Memory(raw_tmp + pak_tmp + 11, sizeof(char)); + tmp = (uint8_t *) Memory(raw_tmp + pak_tmp + 11, sizeof(char)); for (len = 0; len < raw_tmp; len++) tmp[len] = raw_buffer[len]; @@ -308,9 +310,9 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) { hdr_len++; } - *(u32 *)pak = enc_len + hdr_len; pak += 3; + *(uint32_t *)pak = enc_len + hdr_len; pak += 3; *pak++ = hdr_len; - *(u32 *)pak = inc_len - hdr_len; pak += 4; + *(uint32_t *)pak = inc_len - hdr_len; pak += 4; } *new_len = pak - pak_buffer; @@ -319,8 +321,8 @@ u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best) { } /*----------------------------------------------------------------------------*/ -void BLZ_Invert(u8 *buffer, int length) { - u8 *bottom, ch; +void BLZ_Invert(uint8_t *buffer, int length) { + uint8_t *bottom, ch; bottom = buffer + length - 1; diff --git a/makerom/makefile b/makerom/makefile index aa9c98b..7591dff 100644 --- a/makerom/makefile +++ b/makerom/makefile @@ -24,8 +24,8 @@ ifeq ($(ROOT_PROJECT_NAME),) endif # Project Dependencies -PROJECT_DEPEND = mbedtls polarssl yaml -PROJECT_DEPEND_LOCAL_DIR = libmbedtls libpolarssl libyaml +PROJECT_DEPEND = mbedtls polarssl blz yaml +PROJECT_DEPEND_LOCAL_DIR = libmbedtls libpolarssl libblz libyaml # Generate compiler flags for including project include path ifneq ($(PROJECT_INCLUDE_PATH),) diff --git a/makerom/src/blz.h b/makerom/src/blz.h deleted file mode 100644 index 4e1dd26..0000000 --- a/makerom/src/blz.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#define BLZ_NORMAL 0 // normal mode -#define BLZ_BEST 1 // best mode - -u8 *BLZ_Code(u8 *raw_buffer, int raw_len, u32 *new_len, int best); \ No newline at end of file diff --git a/makerom/src/code.c b/makerom/src/code.c index e7d60c4..98d8cf7 100644 --- a/makerom/src/code.c +++ b/makerom/src/code.c @@ -1,10 +1,11 @@ #include "lib.h" #include "elf.h" -#include "blz.h" #include "ncch_build.h" #include "exheader_read.h" #include "code.h" +#include + const u32 CTR_PAGE_SIZE = 0x1000; const u32 DEFAULT_STACK_SIZE = 0x4000; // 10KB