From 01826fd85bd935b792168561872bdaefd6f7f26f Mon Sep 17 00:00:00 2001 From: CrashOveride95 Date: Sun, 24 Jan 2021 14:06:58 -0500 Subject: [PATCH] Make gzip work --- Makefile | 21 +- README.md | 1 + lib/libz.a | Bin 0 -> 39436 bytes sm64.ld | 15 +- src/game/memory.c | 23 +- src/gzip/dmacopy.c | 65 ----- src/gzip/dmacopy.h | 8 - src/gzip/gzip.h | 6 +- src/gzip/inflate.c | 685 --------------------------------------------- src/gzip/unzip.c | 255 ----------------- 10 files changed, 37 insertions(+), 1042 deletions(-) create mode 100644 lib/libz.a delete mode 100755 src/gzip/dmacopy.c delete mode 100755 src/gzip/dmacopy.h mode change 100755 => 100644 src/gzip/gzip.h delete mode 100755 src/gzip/inflate.c delete mode 100755 src/gzip/unzip.c diff --git a/Makefile b/Makefile index dcb71766..0756cd23 100644 --- a/Makefile +++ b/Makefile @@ -66,6 +66,9 @@ else ifeq ($(COMPRESS),yay0) DEFINES += YAY0=1 endif +GZIPVER ?= std +$(eval $(call validate-option,GZIPVER,std libdef)) + # VERSION - selects the version of the game to build # jp - builds the 1996 Japanese version # us - builds the 1996 North American version @@ -435,6 +438,11 @@ AIFF_EXTRACT_CODEBOOK := $(TOOLS_DIR)/aiff_extract_codebook VADPCM_ENC := $(TOOLS_DIR)/vadpcm_enc EXTRACT_DATA_FOR_MIO := $(TOOLS_DIR)/extract_data_for_mio SKYCONV := $(TOOLS_DIR)/skyconv +ifeq ($(GZIPVER),std) +GZIP := gzip +else +GZIP := libdeflate-gzip +endif # Use the system installed armips if available. Otherwise use the one provided with this repository. ifneq (,$(call find-command,armips)) RSPASM := armips @@ -602,10 +610,11 @@ ifeq ($(COMPRESS),gzip) # Compress binary file to gzip $(BUILD_DIR)/%.gz: $(BUILD_DIR)/%.bin $(call print,Compressing:,$<,$@) - $(V)gzip -c -9 -n $< > $@ -# $(V)dd if=/dev/zero bs=1 count=4 >> $@ -# $(ROMALIGN) $@ 16 -# $(V)$(FILESIZER) $< $@ +ifeq ($(GZIPVER),std) + $(V)$(GZIP) -c -9 -n $< > $@ +else + $(V)$(GZIP) -c -12 -n $< > $@ +endif # Strip gzip header $(BUILD_DIR)/%.szp: $(BUILD_DIR)/%.gz @@ -813,12 +822,12 @@ $(BUILD_DIR)/$(LD_SCRIPT): $(LD_SCRIPT) # Link SM64 ELF file $(ELF): $(O_FILES) $(YAY0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) undefined_syms.txt @$(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 -lz # Build ROM $(ROM): $(ELF) $(call print,Building ROM:,$<,$@) - $(V)$(OBJCOPY) --pad-to=0x800000 --gap-fill=0xFF $< $(@:.z64=.bin) -O binary + $(V)$(OBJCOPY) --pad-to=0x100000 --gap-fill=0xFF $< $(@:.z64=.bin) -O binary $(V)$(N64CKSUM) $(@:.z64=.bin) $@ $(BUILD_DIR)/$(TARGET).objdump: $(ELF) diff --git a/README.md b/README.md index 8f53f2bb..d7c0c98a 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ - Shindou Rumble Pak code is on for all regions. - Targeting the iQue Player is supported. - Saving to 32kbyte/256kbit SRAM is supported. +- Using gzip DEFLATE compression is supported. - It has been patched with someone2639's shiftable segments patch - Getting HVQM FMV support to work with the game is in progress. - Getting UNFLoader (flashcart USB library) to work with the game is in progress. diff --git a/lib/libz.a b/lib/libz.a new file mode 100644 index 0000000000000000000000000000000000000000..d97720705fffdd5f21ad042cae1f6bf8c0efdd17 GIT binary patch literal 39436 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 - -/*----------------------------------------------------------------------------- - DMA転送 - u32 src_addr : 読み込み元カートリッジアドレス - void* dest_addr: 出力先メインメモリアドレス - u32 size : 転送サイズ(バイト数) ------------------------------------------------------------------------------*/ - -#define DMAREADBLOCK 8192 - -OSPiHandle *osCartRomHandle() { - static OSPiHandle *cartHandle = NULL; - - if(cartHandle == NULL) { - cartHandle = osCartRomInit(); - } - - return cartHandle; -} - -u32 auRomDataRead(u32 src_addr, void* dest_addr, u32 size) -{ - static OSMesgQueue RomMessageQ; - static OSMesg RomMessageBuf; - static int initialized = 0; - - OSIoMesg dmaIoMesgBuf; - u32 romaddr, memaddr, sizectr, readlen; - - if(!initialized) { - osCreateMesgQueue(&RomMessageQ, &RomMessageBuf, 1); - initialized = 1; - } - - // CPUキャッシュの無効化 - osInvalDCache((void*)dest_addr, (s32)size); - - sizectr = size; - romaddr = src_addr; - memaddr = (u32)dest_addr; - - while(sizectr) { - readlen = MIN(sizectr, DMAREADBLOCK); - - dmaIoMesgBuf.hdr.pri = OS_MESG_PRI_NORMAL; - dmaIoMesgBuf.hdr.retQueue = &RomMessageQ; - dmaIoMesgBuf.dramAddr = (void *)memaddr; - dmaIoMesgBuf.devAddr = romaddr; - dmaIoMesgBuf.size = readlen; - - osEPiStartDma(osCartRomHandle(), &dmaIoMesgBuf, OS_READ); - - romaddr += readlen; - memaddr += readlen; - sizectr -= readlen; - - // DMA転送終了まで待つ - osRecvMesg(&RomMessageQ, NULL, OS_MESG_BLOCK); - } - - return (u32)dest_addr + size; -} - diff --git a/src/gzip/dmacopy.h b/src/gzip/dmacopy.h deleted file mode 100755 index 2bee460a..00000000 --- a/src/gzip/dmacopy.h +++ /dev/null @@ -1,8 +0,0 @@ - -#if !defined(_DMACOPY_H_) -#define _DMACOPY_H_ - -extern OSPiHandle *osCartRomHandle(); -extern u32 auRomDataRead(u32 src_addr, void* dest_addr, u32 size); - -#endif // _DMACOPY_H_ diff --git a/src/gzip/gzip.h b/src/gzip/gzip.h old mode 100755 new mode 100644 index d49b73e4..8ff67e6a --- a/src/gzip/gzip.h +++ b/src/gzip/gzip.h @@ -27,7 +27,7 @@ #define WSIZE 0x8000 typedef struct { - u32 next_addr; + u8 * next_addr; u32 rest_size; } FILE_HND; @@ -47,13 +47,13 @@ extern u8 window[]; // Sliding window and suffix table extern int inflate(void); extern int fill_inbuf(int eof_ok); -extern void flush_window(void); +extern int flush_window(void); //=========================================================================== // // -extern u32 expand_gzip(char *src_addr, char *dst_addr, u32 size); +u32 expand_gzip(u8 *src_addr, u8 *dst_addr, u32 size, u32 outbytes_limit); #endif diff --git a/src/gzip/inflate.c b/src/gzip/inflate.c deleted file mode 100755 index e2668869..00000000 --- a/src/gzip/inflate.c +++ /dev/null @@ -1,685 +0,0 @@ -#include -#include "gzip.h" - - -struct huft { - u8 e; /* number of extra bits or operation */ - u8 b; /* number of bits in this code or subcode */ - union { - u16 n; /* literal, length base, or distance base */ - struct huft *t; /* pointer to next level of table */ - } v; -}; - - -int huft_build(unsigned int *, unsigned int, unsigned int, u16 *, u16 *, struct huft **, int *); -int huft_free(struct huft *); -int inflate_codes(struct huft *, struct huft *, int, int); -int inflate_stored(void); -int inflate_fixed(void); -int inflate_dynamic(void); -int inflate_block(int *); -int inflate(void); - - -#define wp outcnt -#define flush_output(w) (wp=(w),flush_window()) - - -// Order of the bit length code lengths -static unsigned int border[] = { - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; -// Copy lengths for literal codes 257..285 -static u16 cplens[] = { - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; -// Extra bits for literal codes 257..285 -static u16 cplext[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, - 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; // 99==invalid -// Copy offsets for distance codes 0..29 -static u16 cpdist[] = { - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577}; -// Extra bits for distance codes -static u16 cpdext[] = { - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, - 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, - 12, 12, 13, 13}; - -u32 bb; // bit buffer -unsigned int bk; // bits in bit buffer - -u16 mask_bits[] = { - 0x0000, - 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff -}; - -#define NEXTBYTE() (u8)get_byte() -#define NEEDBITS(n) {while(k<(n)){b|=((u32)NEXTBYTE())<>=(n);k-=(n);} - -int lbits = 9; /* bits in base literal/length lookup table */ -int dbits = 6; /* bits in base distance lookup table */ - -/* If BMAX needs to be larger than 16, then h and x[] should be u32. */ -#define BMAX 16 /* maximum bit length of any code (16 for explode) */ -#define N_MAX 288 /* maximum number of codes in any set */ - -unsigned int hufts; /* track memory usage */ - -// Buffer -#define GZIP_MEM_BUFFSIZ 16384 -static char gzip_mem_buff[GZIP_MEM_BUFFSIZ]; -static char *gzip_malloc_addr = gzip_mem_buff; -static long gzip_malloc_tmp = 0; - - -//=========================================================================== -// -// -char *gzip_malloc(long size) -{ - char *ret; - - gzip_malloc_tmp += size; - - if ( gzip_malloc_tmp > GZIP_MEM_BUFFSIZ ) { - // Debug - // printf("memory overflow\n"); - return(NULL); - } - - ret = gzip_malloc_addr; - gzip_malloc_addr += size; - - return(ret); -} - - - -//=========================================================================== -// -// -void gzip_free(char *ptr) -{ - // Debug - //if ( gzip_malloc_tmp != 0 ) printf("%ld byte free\n", gzip_malloc_tmp); - - gzip_malloc_tmp = 0; - gzip_malloc_addr = gzip_mem_buff; -} - - - -//=========================================================================== -// -// -int huft_build(b, n, s, d, e, t, m) -unsigned int *b; /* code lengths in bits (all assumed <= BMAX) */ -unsigned int n; /* number of codes (assumed <= N_MAX) */ -unsigned int s; /* number of simple-valued codes (0..s-1) */ -u16 *d; /* list of base values for non-simple codes */ -u16 *e; /* list of extra bits for non-simple codes */ -struct huft **t; /* result: starting table */ -int *m; /* maximum lookup bits, returns actual */ -{ - unsigned int a; /* counter for codes of length k */ - unsigned int c[BMAX+1]; /* bit length count table */ - unsigned int f; /* i repeats in table every f entries */ - int g; /* maximum code length */ - int h; /* table level */ - register unsigned int i; /* counter, current code */ - register unsigned int j; /* counter */ - register int k; /* number of bits in current code */ - int l; /* bits per table (returned in m) */ - register unsigned int *p; /* pointer into c[], b[], or v[] */ - register struct huft *q; /* points to current table */ - struct huft r; /* table entry for structure assignment */ - struct huft *u[BMAX]; /* table stack */ - unsigned int v[N_MAX]; /* values in order of bit length */ - register int w; /* bits before this table == (l * h) */ - unsigned int x[BMAX+1]; /* bit offsets, then code stack */ - unsigned int *xp; /* pointer into x */ - int y; /* number of dummy codes added */ - unsigned int z; /* number of entries in current table */ - - /* Generate counts for each bit length */ - for ( j = 0; j < (BMAX+1); j++ ) c[j] = 0; - - p = b; i = n; - do { - c[*p]++; /* assume all entries <= BMAX */ - p++; /* Can't combine with above line (Solaris bug) */ - } while (--i); - if (c[0] == n) { /* null input--all zero length codes */ - *t = (struct huft *)NULL; - *m = 0; - return 0; - } - - /* Find minimum and maximum length, bound *m by those */ - l = *m; - for (j = 1; j <= BMAX; j++) - if (c[j]) break; - k = j; /* minimum code length */ - if ((unsigned int)l < j) l = j; - for (i = BMAX; i; i--) if (c[i]) break; - g = i; /* maximum code length */ - if ((unsigned int)l > i) l = i; - *m = l; - - /* Adjust last length count to fill out codes, if needed */ - for (y = 1 << j; j < i; j++, y <<= 1) { - if ((y -= c[j]) < 0) return 2; /* bad input: more codes than bits */ - } - if ((y -= c[i]) < 0) return 2; - c[i] += y; - - /* Generate starting offsets into the value table for each length */ - x[1] = j = 0; - p = c + 1; xp = x + 2; - while (--i) { /* note that i == g from above */ - *xp++ = (j += *p++); - } - - - /* Make a table of values in order of bit lengths */ - p = b; i = 0; - do { - if ((j = *p++) != 0) v[x[j]++] = i; - } while (++i < n); - - - /* Generate the Huffman codes and for each, make the table entries */ - x[0] = i = 0; /* first Huffman code is zero */ - p = v; /* grab values in bit order */ - h = -1; /* no tables yet--level -1 */ - w = -l; /* bits decoded == (l * h) */ - u[0] = (struct huft *)NULL; /* just to keep compilers happy */ - q = (struct huft *)NULL; /* ditto */ - z = 0; /* ditto */ - - /* go through the bit lengths (k already is bits in shortest code) */ - for (; k <= g; k++) { - a = c[k]; - while (a--) { - /* here i is the Huffman code of length k bits for value *p */ - /* make tables up to required level */ - while (k > w + l) { - h++; - w += l; /* previous table always l bits */ - - /* compute minimum size table less than or equal to l bits */ - z = (z = g - w) > (unsigned int)l ? l : z; /* upper limit on table size */ - if ((f = 1 << (j = k - w)) > a + 1) { /* try a k-w bit table */ - /* too few codes for k-w bit table */ - f -= a + 1; /* deduct codes from patterns left */ - xp = c + k; - while (++j < z) /* try smaller tables up to z bits */ - { - if ((f <<= 1) <= *++xp) break; /* enough codes to use up j bits */ - f -= *xp; /* else deduct codes from patterns */ - } - } - z = 1 << j; /* table entries for j-bit table */ - - /* allocate and link in new table */ - if ( ( q = (struct huft *)gzip_malloc( (z + 1)*sizeof(struct huft) ) ) == (struct huft *)NULL ) { - if (h) huft_free(u[0]); - return 3; /* not enough memory */ - } - hufts += z + 1; /* track memory usage */ - *t = q + 1; /* link to list for huft_free() */ - *(t = &(q->v.t)) = (struct huft *)NULL; - u[h] = ++q; /* table starts after link */ - - /* connect to last table, if there is one */ - if (h) { - x[h] = i; /* save pattern for backing up */ - r.b = (u8)l; /* bits to dump before this table */ - r.e = (u8)(16 + j); /* bits in this table */ - r.v.t = q; /* pointer to this table */ - j = i >> (w - l); /* (get around Turbo C bug) */ - u[h-1][j] = r; /* connect to last table */ - } - } - - /* set up table entry in r */ - r.b = (u8)(k - w); - if (p >= v + n) { - r.e = 99; /* out of values--invalid code */ - } else if (*p < s) { - r.e = (u8)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ - r.v.n = (u16)(*p); /* simple code is just the value */ - p++; /* one compiler does not like *p++ */ - } else { - r.e = (u8)e[*p - s]; /* non-simple--look up in lists */ - r.v.n = d[*p++ - s]; - } - - /* fill code-like entries with r */ - f = 1 << (k - w); - for (j = i >> w; j < z; j += f) q[j] = r; - - /* backwards increment the k-bit code i */ - for (j = 1 << (k - 1); i & j; j >>= 1) i ^= j; - i ^= j; - - /* backup over finished tables */ - while ((i & ((1 << w) - 1)) != x[h]) { - h--; /* don't need to update q */ - w -= l; - } - } - } - - /* Return true (1) if we were given an incomplete table */ - return y != 0 && g != 1; -} - - - -int huft_free(t) -struct huft *t; /* table to free */ -{ - register struct huft *p, *q; - - /* Go through linked list, freeing from the malloced (t[-1]) address. */ - p = t; - while (p != (struct huft *)NULL) { - q = (--p)->v.t; - gzip_free((char*)p); - p = q; - } - return 0; -} - - -int inflate_codes(tl, td, bl, bd) -struct huft *tl, *td; /* literal/length and distance decoder tables */ -int bl, bd; /* number of bits decoded by tl[] and td[] */ -/* inflate (decompress) the codes in a deflated (compressed) block. - Return an error code or zero if it all goes ok. */ -{ - register unsigned int e; /* table entry flag/number of extra bits */ - unsigned int n, d; /* length and index for copy */ - unsigned int w; /* current window position */ - struct huft *t; /* pointer to table entry */ - unsigned int ml, md; /* masks for bl and bd bits */ - register u32 b; /* bit buffer */ - register unsigned int k; /* number of bits in bit buffer */ - unsigned int i; - u8 *src, *dst; - - /* make local copies of globals */ - b = bb; /* initialize bit buffer */ - k = bk; - w = wp; /* initialize window position */ - - /* inflate the coded data */ - ml = mask_bits[bl]; /* precompute masks for speed */ - md = mask_bits[bd]; - for (;;) { /* do until end of block */ - NEEDBITS((unsigned int)bl) - if ((e = (t = tl + ((unsigned int)b & ml))->e) > 16) { - do { - if (e == 99) return 1; - DUMPBITS(t->b) - e -= 16; - NEEDBITS(e) - } while ((e = (t = t->v.t + ((unsigned int)b & mask_bits[e]))->e) > 16); - } - DUMPBITS(t->b) - if (e == 16) { /* then it's a literal */ - window[w++] = (u8)t->v.n; - if (w == WSIZE) { - flush_output(w); - w = 0; - } - } else { /* it's an EOB or a length */ - /* exit if end of block */ - if (e == 15) break; - /* get length of block to copy */ - NEEDBITS(e) - n = t->v.n + ((unsigned int)b & mask_bits[e]); - DUMPBITS(e); - /* decode distance of block to copy */ - NEEDBITS((unsigned int)bd) - if ((e = (t = td + ((unsigned int)b & md))->e) > 16) { - do { - if (e == 99) - return 1; - DUMPBITS(t->b) - e -= 16; - NEEDBITS(e) - } while ((e = (t = t->v.t + ((unsigned int)b & mask_bits[e]))->e) > 16); - } - DUMPBITS(t->b) - NEEDBITS(e) - d = w - t->v.n - ((unsigned int)b & mask_bits[e]); - DUMPBITS(e) - - /* do the copy */ - do { - n -= (e = (e = WSIZE - ((d &= WSIZE-1) > w ? d : w)) > n ? n : e); -/* -//#if !defined(NOMEMCPY) && !defined(DEBUG) - if (w - d >= e) { // (this test assumes unsigned comparison) - dst = (u8 *)( (u32)window + (u32)w ); - src = (u8 *)( (u32)window + (u32)d ); - for ( i = 0; i < e; i++ ) { - *dst = *src; - dst++; - src++; - } - w += e; - d += e; - } else // do it slow to avoid memcpy() overlap -//#endif !NOMEMCPY -*/ - do { - window[w++] = window[d++]; - } while (--e); - if (w == WSIZE) { - flush_output(w); - w = 0; - } - } while (n); - } - } - - - /* restore the globals from the locals */ - wp = w; /* restore global window pointer */ - bb = b; /* restore global bit buffer */ - bk = k; - - /* done */ - return 0; -} - - - -int inflate_stored(void) -/* "decompress" an inflated type 0 (stored) block. */ -{ - unsigned int n; /* number of bytes in block */ - unsigned int w; /* current window position */ - register u32 b; /* bit buffer */ - register unsigned int k; /* number of bits in bit buffer */ - - /* make local copies of globals */ - b = bb; /* initialize bit buffer */ - k = bk; - w = wp; /* initialize window position */ - - /* go to byte boundary */ - n = k & 7; - DUMPBITS(n); - - /* get the length and its complement */ - NEEDBITS(16) - n = ((unsigned int)b & 0xffff); - DUMPBITS(16) - NEEDBITS(16) - if (n != (unsigned int)((~b) & 0xffff)) return 1; /* error in compressed data */ - DUMPBITS(16) - - /* read and output the compressed data */ - while (n--) { - NEEDBITS(8) - window[w++] = (u8)b; - if (w == WSIZE) { - flush_output(w); - w = 0; - } - DUMPBITS(8) - } - - /* restore the globals from the locals */ - wp = w; /* restore global window pointer */ - bb = b; /* restore global bit buffer */ - bk = k; - return 0; -} - - - -int inflate_fixed(void) -/* decompress an inflated type 1 (fixed Huffman codes) block. We should - either replace this with a custom decoder, or at least precompute the - Huffman tables. */ -{ - int i; /* temporary variable */ - struct huft *tl; /* literal/length code table */ - struct huft *td; /* distance code table */ - int bl; /* lookup bits for tl */ - int bd; /* lookup bits for td */ - unsigned int l[288]; /* length list for huft_build */ - - /* set up literal table */ - for (i = 0; i < 144; i++) - l[i] = 8; - for (; i < 256; i++) - l[i] = 9; - for (; i < 280; i++) - l[i] = 7; - for (; i < 288; i++) /* make a complete, but wrong code set */ - l[i] = 8; - bl = 7; - if ((i = huft_build(l, 288, 257, cplens, cplext, &tl, &bl)) != 0) return i; - - /* set up distance table */ - for (i = 0; i < 30; i++) l[i] = 5; /* make an incomplete code set */ - bd = 5; - if ((i = huft_build(l, 30, 0, cpdist, cpdext, &td, &bd)) > 1) { - huft_free(tl); - return i; - } - - /* decompress until an end-of-block code */ - if (inflate_codes(tl, td, bl, bd)) return 1; - - /* free the decoding tables, return */ - huft_free(td); - huft_free(tl); - return 0; -} - - - -int inflate_dynamic(void) -/* decompress an inflated type 2 (dynamic Huffman codes) block. */ -{ - int i; /* temporary variables */ - unsigned int j; - unsigned int l; /* last length */ - unsigned int m; /* mask for bit lengths table */ - unsigned int n; /* number of lengths to get */ - struct huft *tl; /* literal/length code table */ - struct huft *td; /* distance code table */ - int bl; /* lookup bits for tl */ - int bd; /* lookup bits for td */ - unsigned int nb; /* number of bit length codes */ - unsigned int nl; /* number of literal/length codes */ - unsigned int nd; /* number of distance codes */ - unsigned int ll[288+32]; /* literal/length and distance code lengths */ - register u32 b; /* bit buffer */ - register unsigned int k; /* number of bits in bit buffer */ - - /* make local bit buffer */ - b = bb; - k = bk; - - /* read in table lengths */ - NEEDBITS(5) - nl = 257 + ((unsigned int)b & 0x1f); /* number of literal/length codes */ - DUMPBITS(5) - NEEDBITS(5) - nd = 1 + ((unsigned int)b & 0x1f); /* number of distance codes */ - DUMPBITS(5) - NEEDBITS(4) - nb = 4 + ((unsigned int)b & 0xf); /* number of bit length codes */ - DUMPBITS(4) - if (nl > 288 || nd > 32) return 1; /* bad lengths */ - - /* read in bit-length-code lengths */ - for (j = 0; j < nb; j++) { - NEEDBITS(3) - ll[border[j]] = (unsigned int)b & 7; - DUMPBITS(3) - } - for (; j < 19; j++) ll[border[j]] = 0; - - /* build decoding table for trees--single level, 7 bit lookup */ - bl = 7; - if ((i = huft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0) { - if (i == 1) huft_free(tl); - return i; /* incomplete code set */ - } - - /* read in literal and distance code lengths */ - n = nl + nd; - m = mask_bits[bl]; - i = l = 0; - while ((unsigned int)i < n) { - NEEDBITS((unsigned int)bl) - j = (td = tl + ((unsigned int)b & m))->b; - DUMPBITS(j) - j = td->v.n; - if (j < 16) { /* length of code in bits (0..15) */ - ll[i++] = l = j; /* save last length in l */ - } else if (j == 16) { /* repeat last length 3 to 6 times */ - NEEDBITS(2) - j = 3 + ((unsigned int)b & 3); - DUMPBITS(2) - if ((unsigned int)i + j > n) return 1; - while (j--) ll[i++] = l; - } else if (j == 17) { /* 3 to 10 zero length codes */ - NEEDBITS(3) - j = 3 + ((unsigned int)b & 7); - DUMPBITS(3) - if ((unsigned int)i + j > n) return 1; - while (j--) ll[i++] = 0; - l = 0; - } else { /* j == 18: 11 to 138 zero length codes */ - NEEDBITS(7) - j = 11 + ((unsigned int)b & 0x7f); - DUMPBITS(7) - if ((unsigned int)i + j > n) return 1; - while (j--) ll[i++] = 0; - l = 0; - } - } - - - /* free decoding table for trees */ - huft_free(tl); - - /* restore the global bit buffer */ - bb = b; - bk = k; - - /* build the decoding tables for literal/length and distance codes */ - bl = lbits; - if ((i = huft_build(ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) { - if (i == 1) { - huft_free(tl); - } - return i; /* incomplete code set */ - } - bd = dbits; - if ((i = huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) { - if (i == 1) i = 0; - } - - /* decompress until an end-of-block code */ - if (inflate_codes(tl, td, bl, bd)) return 1; - - /* free the decoding tables, return */ - huft_free(td); - huft_free(tl); - return 0; -} - - - -/* decompress an inflated block */ -int inflate_block(e) -int *e; /* last block flag */ -{ - unsigned int t; /* block type */ - register u32 b; /* bit buffer */ - register unsigned int k; /* number of bits in bit buffer */ - - /* make local bit buffer */ - b = bb; - k = bk; - - /* read in last block bit */ - NEEDBITS(1) - *e = (int)b & 1; - DUMPBITS(1) - - /* read in block type */ - NEEDBITS(2) - t = (unsigned int)b & 3; - DUMPBITS(2) - - /* restore the global bit buffer */ - bb = b; - bk = k; - - /* inflate that block type */ - if (t == 2) return inflate_dynamic(); - if (t == 0) return inflate_stored(); - if (t == 1) return inflate_fixed(); - - /* bad block type */ - return 2; -} - - - -//=========================================================================== -// decompress an inflated entry -//=========================================================================== -int inflate(void) -{ - int e; // last block flag - int r; // result code - unsigned int h; // maximum struct huft's malloc'ed - - // initialize window, bit buffer - wp = 0; - bk = 0; - bb = 0; - - // initialize malloc buffer - gzip_malloc_tmp = 0; - gzip_malloc_addr = gzip_mem_buff; - - // decompress until the last block - h = 0; - do { - hufts = 0; - if ( ( r = inflate_block(&e) ) != 0 ) return r; - if ( hufts > h ) h = hufts; - } while (!e); - - // Undo too much lookahead. The next read will be byte aligned so we - // can discard unused bits in the last meaningful byte. - while ( bk >= 8 ) { - bk -= 8; - inptr--; - } - - // flush out window - flush_output(wp); - - // return success - return 0; -} diff --git a/src/gzip/unzip.c b/src/gzip/unzip.c deleted file mode 100755 index 33722d7d..00000000 --- a/src/gzip/unzip.c +++ /dev/null @@ -1,255 +0,0 @@ -#include -#include "gzip.h" -#include "dmacopy.h" - -// 展開バッファ -Gfx gzip_dummy_dl[] = { - gsSPEndDisplayList(), -}; -unsigned char inbuf[INBUFSIZ]; -unsigned char outbuf[OUTBUFSIZ]; -unsigned char window[WSIZE]; - -// ワーク -FILE_HND ifd; /* input file descriptor */ -FILE_HND ofd; /* output file descriptor */ -long bytes_in; /* number of input bytes */ -long bytes_out; /* number of output bytes */ -unsigned int insize; /* valid bytes in inbuf */ -unsigned int inptr; /* index of next byte to be processed in inbuf */ -unsigned int outcnt; /* bytes in output buffer */ - - -void clear_bufs(void); -u32 updcrc(u8 *s, unsigned int n); - - -//======================================================================== -// Table of CRC-32's of all single-byte values -//======================================================================== -static u32 crc_32_tab[] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - - -//=========================================================================== -// データの読み込み -// -u32 data_read(FILE_HND *infile, u8 *dst_addr, u32 size) -{ - u32 i; - - if ( infile->rest_size < size ) size = infile->rest_size; - - i = ( size + 7 ) & 0xfffffff8; - - if ( i != 0 ) { - auRomDataRead(infile->next_addr, (void *)dst_addr, i); - } - - infile->rest_size -= i; - infile->next_addr += i; - if ( infile->rest_size & 0x80000000 ) infile->rest_size = 0; - - return(size); -} - - - -//=========================================================================== -// メモリ書き出し -// -u32 data_write(FILE_HND *outfile, u8 *src_addr, unsigned int size) -{ - u32 i; - u8 *dst_addr = (u8 *)outfile->next_addr; - - for ( i = 0; i < size; i++ ) { - *dst_addr = src_addr[i]; - dst_addr++; - } - outfile->rest_size += size; - outfile->next_addr = (u32)dst_addr; - - return(size); -} - - - -//=========================================================================== -// 展開 -// -int unzip(void) -{ - int res; - int n; - u32 orig_crc; // original crc - u32 orig_len; // original uncompressed length - u8 buf[32]; // extended local header - - updcrc(NULL, 0); // initialize crc - - // Decompress - res = inflate(); - if ( res == 3 ) { - return(-1); - } else if ( res != 0 ) { - return(-1); - } - - // Get the crc and original length - for ( n = 0; n < 8; n++ ) buf[n] = (u8)get_byte(); - orig_crc = LG(buf); - orig_len = LG(buf+4); - -#if 0 // def DEBUG - if ( orig_len == bytes_out ) { - osSyncPrintf("=== ExpOK ===\n"); - } else { - osSyncPrintf("**** ExpError **** orglen : %d , outlen : %d\n", orig_len, bytes_out); - } -#endif - - return(0); -} - - - -//=========================================================================== -// Run a set of bytes through the crc shift register. If s is a NULL -// pointer, then initialize the crc shift register contents instead. -// Return the current crc in either case. -// -u32 updcrc(s, n) - u8 *s; /* pointer to bytes to pump through */ - unsigned int n; /* number of bytes in s[] */ -{ - register u32 c; /* temporary variable */ - - static u32 crc = 0xffffffff; /* shift register contents */ - - if ( s == NULL ) { - c = 0xffffffff; - } else { - c = crc; - if (n) do { - c = crc_32_tab[((int)c ^ (*s++)) & 0xff] ^ (c >> 8); - } while (--n); - } - crc = c; - return c ^ 0xffffffff; /* (instead of ~c for 64-bit machines) */ -} - - - -//=========================================================================== -// Clear input and output buffers -void clear_bufs(void) -{ - outcnt = 0; - insize = inptr = 0; - bytes_in = bytes_out = 0; -} - - - -//=========================================================================== -// Fill the input buffer. This is called only when the buffer is empty. -int fill_inbuf(int eof_ok) -{ - int len; - - insize = 0; - do { - len = data_read(&ifd, (char*)inbuf+insize, INBUFSIZ-insize); - if ( len == 0 || len == -1 ) break; - insize += len; - } while (insize < INBUFSIZ); - - if ( insize == 0 ) { - if (eof_ok) return -1; - } - - bytes_in += (u32)insize; - inptr = 1; - - return inbuf[0]; -} - - - -//=========================================================================== -// Does the same as write(), but also handles partial pipe writes and checks -// for error return. -void write_buf(FILE_HND *fd, char *buf, unsigned int cnt) -{ - u32 n; - - while ( ( n = data_write(fd, buf, cnt) ) != cnt ) { - cnt -= n; - buf += n; - } -} - - - -//=========================================================================== -// Write the output window window[0..outcnt-1] and update crc and bytes_out. -// (Used for the decompressed data only.) -void flush_window(void) -{ - if (outcnt == 0) return; - updcrc(window, outcnt); - - write_buf(&ofd, (char *)window, outcnt); - bytes_out += (u32)outcnt; - outcnt = 0; -} - - -//=========================================================================== -// データの読み込みと展開 -// input: -// char *src_addr ROM Address -// char *dst_addr RAM Adress -// u32 size ROM Size -// return: -// 展開後のサイズ -// -u32 expand_gzip(char *src_addr, char *dst_addr, u32 size) -{ - ifd.next_addr = (u32)src_addr; - ifd.rest_size = size; - ofd.next_addr = (u32)dst_addr; - ofd.rest_size = 0; - - clear_bufs(); - unzip(); - - return( ofd.rest_size ); -} \ No newline at end of file