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

@@ -11,6 +11,9 @@
#include "memory.h"
#include "segment_symbols.h"
#include "segments.h"
#ifdef GZIP
#include "gzip/gzipdma.h"
#endif
#ifdef UNF
#include "usb/debug.h"
#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
* 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);
osInvalDCache(dest, size);
@@ -336,7 +339,11 @@ void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd) {
dma_read(compressed, srcStart, srcEnd);
dest = main_pool_alloc(*size, MEMORY_POOL_LEFT);
if (dest != NULL) {
#ifdef GZIP
slidma(dest, compressed, compSize);
#else
slidstart(compressed, dest);
#endif
set_segment_base_addr(segment, dest);
main_pool_free(compressed);
} else {
@@ -354,7 +361,11 @@ void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd) {
if (compressed != NULL) {
dma_read(compressed, srcStart, srcEnd);
#ifdef GZIP
slidma(gDecompressionHeap, compressed, compSize);
#else
slidstart(compressed, gDecompressionHeap);
#endif
set_segment_base_addr(segment, gDecompressionHeap);
main_pool_free(compressed);
} 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_ */