Add NON-WORKING gzip DEFLATE support

This commit is contained in:
CrashOveride95
2021-01-03 13:09:20 -05:00
parent 08f47d350b
commit fc0aabe98e
7 changed files with 898 additions and 11 deletions

View File

@@ -8,6 +8,8 @@ default: all
# Preprocessor definitions # Preprocessor definitions
DEFINES := DEFINES :=
SRC_DIRS :=
#==============================================================================# #==============================================================================#
# Build Options # # Build Options #
#==============================================================================# #==============================================================================#
@@ -41,6 +43,15 @@ COMPILER ?= gcc
$(eval $(call validate-option,COMPILER,ido gcc)) $(eval $(call validate-option,COMPILER,ido gcc))
COMPRESS ?= yay0
$(eval $(call validate-option,COMPRESS,yay0 gzip))
ifeq ($(COMPRESS),gzip)
DEFINES += GZIP=1
SRC_DIRS += src/gzip
else ifeq ($(COMPRESS),yay0)
DEFINES += YAY0=1
endif
# VERSION - selects the version of the game to build # VERSION - selects the version of the game to build
# jp - builds the 1996 Japanese version # jp - builds the 1996 Japanese version
# us - builds the 1996 North American version # us - builds the 1996 North American version
@@ -254,7 +265,7 @@ ACTOR_DIR := actors
LEVEL_DIRS := $(patsubst levels/%,%,$(dir $(wildcard levels/*/header.h))) LEVEL_DIRS := $(patsubst levels/%,%,$(dir $(wildcard levels/*/header.h)))
# Directories containing source files # Directories containing source files
SRC_DIRS := src src/engine src/game src/audio src/menu src/buffers actors levels bin data assets asm lib sound SRC_DIRS += src src/engine src/game src/audio src/menu src/buffers actors levels bin data assets asm lib sound
BIN_DIRS := bin bin/$(VERSION) BIN_DIRS := bin bin/$(VERSION)
# File dependencies and variables for specific files # File dependencies and variables for specific files
@@ -393,6 +404,7 @@ export LANG := C
# N64 tools # N64 tools
YAY0TOOL := $(TOOLS_DIR)/slienc YAY0TOOL := $(TOOLS_DIR)/slienc
ROMALIGN := $(TOOLS_DIR)/romalign
N64CKSUM := $(TOOLS_DIR)/n64cksum N64CKSUM := $(TOOLS_DIR)/n64cksum
N64GRAPHICS := $(TOOLS_DIR)/n64graphics N64GRAPHICS := $(TOOLS_DIR)/n64graphics
N64GRAPHICS_CI := $(TOOLS_DIR)/n64graphics_ci N64GRAPHICS_CI := $(TOOLS_DIR)/n64graphics_ci
@@ -564,6 +576,23 @@ $(BUILD_DIR)/levels/%/leveldata.bin: $(BUILD_DIR)/levels/%/leveldata.elf
$(call print,Extracting compressionable data from:,$<,$@) $(call print,Extracting compressionable data from:,$<,$@)
$(V)$(EXTRACT_DATA_FOR_MIO) $< $@ $(V)$(EXTRACT_DATA_FOR_MIO) $< $@
ifeq ($(COMPRESS),gzip)
# Compress binary file to gzip
$(BUILD_DIR)/%.gz: $(BUILD_DIR)/%.bin
$(call print,Compressing:,$<,$@)
$(V)gzip -c -9 -n $< > $@
# Strip gzip header
$(BUILD_DIR)/%.szp: $(BUILD_DIR)/%.gz
$(call print,Converting:,$<,$@)
$(V)dd bs=10 skip=1 if=$< of=$@
$(V)$(ROMALIGN) $@ 16
# convert binary szp to object file
$(BUILD_DIR)/%.szp.o: $(BUILD_DIR)/%.szp
$(call print,Converting GZIP to ELF:,$<,$@)
$(V)printf ".section .data\n\n.incbin \"$<\"\n" | $(AS) $(ASFLAGS) -o $@
else
# Compress binary file # Compress binary file
$(BUILD_DIR)/%.szp: $(BUILD_DIR)/%.bin $(BUILD_DIR)/%.szp: $(BUILD_DIR)/%.bin
$(call print,Compressing:,$<,$@) $(call print,Compressing:,$<,$@)
@@ -573,7 +602,7 @@ $(BUILD_DIR)/%.szp: $(BUILD_DIR)/%.bin
$(BUILD_DIR)/%.szp.o: $(BUILD_DIR)/%.szp $(BUILD_DIR)/%.szp.o: $(BUILD_DIR)/%.szp
$(call print,Converting YAY0 to ELF:,$<,$@) $(call print,Converting YAY0 to ELF:,$<,$@)
$(V)printf ".section .data\n\n.incbin \"$<\"\n" | $(AS) $(ASFLAGS) -o $@ $(V)printf ".section .data\n\n.incbin \"$<\"\n" | $(AS) $(ASFLAGS) -o $@
endif
#==============================================================================# #==============================================================================#
# Sound File Generation # # Sound File Generation #
@@ -756,14 +785,8 @@ $(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT)
$(call print,Preprocessing linker script:,$<,$@) $(call print,Preprocessing linker script:,$<,$@)
$(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $< $(V)$(CPP) $(CPPFLAGS) -DBUILD_DIR=$(BUILD_DIR) -MMD -MP -MT $@ -MF $@.d -o $@ $<
# Link libultra
$(BUILD_DIR)/libultra.a: $(ULTRA_O_FILES)
@$(PRINT) "$(GREEN)Linking libultra: $(BLUE)$@ $(NO_COL)\n"
$(V)$(AR) rcs -o $@ $(ULTRA_O_FILES)
$(V)$(TOOLS_DIR)/patch_libultra_math $@
# Link SM64 ELF file # Link SM64 ELF file
$(ELF): $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt $(BUILD_DIR)/libultra.a $(ELF): $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n" @$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
$(V)$(LD) -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L$(LIBS_DIR) -lultra_rom -Llib -lhvqm2 -lgcc $(V)$(LD) -L $(BUILD_DIR) -T undefined_syms.txt -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -L$(LIBS_DIR) -lultra_rom -Llib -lhvqm2 -lgcc

21
sm64.ld
View File

@@ -76,7 +76,8 @@ SECTIONS
END_SEG(boot) END_SEG(boot)
. = 0x80000400; . = 0x80000400;
BEGIN_NOLOAD(zbuffer) { BEGIN_NOLOAD(zbuffer)
{
BUILD_DIR/src/buffers/zbuffer.o(.bss*); BUILD_DIR/src/buffers/zbuffer.o(.bss*);
} }
END_NOLOAD(zbuffer) END_NOLOAD(zbuffer)
@@ -123,7 +124,12 @@ SECTIONS
BUILD_DIR/src/usb*.o(.text); BUILD_DIR/src/usb*.o(.text);
#endif #endif
BUILD_DIR/src/audio*.o(.text); BUILD_DIR/src/audio*.o(.text);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.text);
#endif
#ifdef YAY0
BUILD_DIR/asm/slidec.o(.text); BUILD_DIR/asm/slidec.o(.text);
#endif
*/libultra_rom.a:*.o(.text); */libultra_rom.a:*.o(.text);
*/libgcc.a:_umoddi3.o(.text); */libgcc.a:_umoddi3.o(.text);
@@ -155,6 +161,9 @@ SECTIONS
#endif #endif
BUILD_DIR/src/audio*.o(.data*); BUILD_DIR/src/audio*.o(.data*);
BUILD_DIR/src/audio*.o(.sdata*); BUILD_DIR/src/audio*.o(.sdata*);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.data*);
#endif
*/libultra_rom.a:*.o(.data*); */libultra_rom.a:*.o(.data*);
*/libultra_rom.a:*.o(.sdata*); */libultra_rom.a:*.o(.sdata*);
@@ -173,6 +182,9 @@ SECTIONS
BUILD_DIR/src/usb*.o(.rodata*); BUILD_DIR/src/usb*.o(.rodata*);
#endif #endif
BUILD_DIR/src/audio*.o(.rodata*); BUILD_DIR/src/audio*.o(.rodata*);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.rodata*);
#endif
*/libultra_rom.a:*.o(.rodata*); */libultra_rom.a:*.o(.rodata*);
*/libgcc.a:_umoddi3.o(.rodata*); */libgcc.a:_umoddi3.o(.rodata*);
@@ -193,11 +205,18 @@ SECTIONS
{ {
BUILD_DIR/src/game*.o(.bss*); BUILD_DIR/src/game*.o(.bss*);
BUILD_DIR/src/game*.o(.sbss*); BUILD_DIR/src/game*.o(.sbss*);
#ifdef HVQM
BUILD_DIR/src/hvqm*.o(.bss*); BUILD_DIR/src/hvqm*.o(.bss*);
#endif
#ifdef UNF
BUILD_DIR/src/usb*.o(.bss*); BUILD_DIR/src/usb*.o(.bss*);
BUILD_DIR/src/usb*.o(.sbss*); BUILD_DIR/src/usb*.o(.sbss*);
#endif
BUILD_DIR/src/audio*.o(.bss*); BUILD_DIR/src/audio*.o(.bss*);
BUILD_DIR/src/audio*.o(.sbss*); BUILD_DIR/src/audio*.o(.sbss*);
#ifdef GZIP
BUILD_DIR/src/gzip*.o(.bss*);
#endif
*/libultra_rom.a:*.o(COMMON); */libultra_rom.a:*.o(COMMON);
*/libultra_rom.a:*.o(.scommon); */libultra_rom.a:*.o(.scommon);

View File

@@ -11,6 +11,9 @@
#include "memory.h" #include "memory.h"
#include "segment_symbols.h" #include "segment_symbols.h"
#include "segments.h" #include "segments.h"
#ifdef GZIP
#include "gzip/gzipdma.h"
#endif
#ifdef UNF #ifdef UNF
#include "usb/debug.h" #include "usb/debug.h"
#endif #endif
@@ -247,7 +250,7 @@ u32 main_pool_pop_state(void) {
* Perform a DMA read from ROM. The transfer is split into 4KB blocks, and this * Perform a DMA read from ROM. The transfer is split into 4KB blocks, and this
* function blocks until completion. * function blocks until completion.
*/ */
static void dma_read(u8 *dest, u8 *srcStart, u8 *srcEnd) { void dma_read(u8 *dest, u8 *srcStart, u8 *srcEnd) {
u32 size = ALIGN16(srcEnd - srcStart); u32 size = ALIGN16(srcEnd - srcStart);
osInvalDCache(dest, size); osInvalDCache(dest, size);
@@ -336,7 +339,11 @@ void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd) {
dma_read(compressed, srcStart, srcEnd); dma_read(compressed, srcStart, srcEnd);
dest = main_pool_alloc(*size, MEMORY_POOL_LEFT); dest = main_pool_alloc(*size, MEMORY_POOL_LEFT);
if (dest != NULL) { if (dest != NULL) {
#ifdef GZIP
slidma(dest, compressed, compSize);
#else
slidstart(compressed, dest); slidstart(compressed, dest);
#endif
set_segment_base_addr(segment, dest); set_segment_base_addr(segment, dest);
main_pool_free(compressed); main_pool_free(compressed);
} else { } else {
@@ -354,7 +361,11 @@ void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd) {
if (compressed != NULL) { if (compressed != NULL) {
dma_read(compressed, srcStart, srcEnd); dma_read(compressed, srcStart, srcEnd);
#ifdef GZIP
slidma(gDecompressionHeap, compressed, compSize);
#else
slidstart(compressed, gDecompressionHeap); slidstart(compressed, gDecompressionHeap);
#endif
set_segment_base_addr(segment, gDecompressionHeap); set_segment_base_addr(segment, gDecompressionHeap);
main_pool_free(compressed); main_pool_free(compressed);
} else { } else {

34
src/gzip/gzip.h Executable file
View File

@@ -0,0 +1,34 @@
#ifndef __GZIP_H__
#define __GZIP_H__
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#define INBUFSIZ 4096 // input buffer size
#define WSIZE 0x8000
typedef struct {
u8 * next_addr;
u32 rest_size;
} FILE_HND;
#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(0))
#define try_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(1))
extern unsigned int insize; // valid bytes in inbuf
extern unsigned int inptr; // index of next byte to be processed in inbuf
extern unsigned int outcnt; // bytes in output buffer
extern u8 inbuf[]; // input buffer
extern u8 *op; // Sliding window and suffix table
extern int inflate(void);
extern int fill_inbuf(int eof_ok);
extern void flush_window(void);
extern void dma_read(u8 *dest, u8 *srcStart, u8 *srcEnd);
#endif

768
src/gzip/gzipdma.c Executable file

File diff suppressed because it is too large Load Diff

14
src/gzip/gzipdma.h Executable file
View File

@@ -0,0 +1,14 @@
#ifndef _GZIP_DMA_H_
#define _GZIP_DMA_H_
#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif
void slidma(unsigned long dmasrc, char *dst, unsigned long dmasiz);
#ifdef _LANGUAGE_C_PLUS_PLUS
}
#endif
#endif /* _GZIP_DMA_H_ */

18
tools/romalign Executable file
View File

@@ -0,0 +1,18 @@
#!/usr/bin/perl
die "Usage: romalign file align\n" unless $#ARGV >= 1;
$in = $ARGV[0];
$align = $ARGV[1];
@s = stat($in);
$insize = $s[7];
open(OUT, ">> $in") or die "Can't open $in for output: $!";
$frag = $insize % $align;
$fill = pack("C", 0);
for($i = 0; $i < ($align-$frag)%$align; $i++) {
syswrite(OUT, $fill, 1);
}
close OUT;