From 2ad1d63ca645829a411a097c03f4ebc388e952ad Mon Sep 17 00:00:00 2001 From: optixx Date: Mon, 19 Oct 2009 11:52:20 +0200 Subject: [PATCH] add kzip raw compress stuff --- scripts/DeflOpt.exe | Bin 0 -> 52736 bytes scripts/conv_zip.py | 109 +++++++++++++++++++++++++++++++++ scripts/deflate.sh | 5 ++ scripts/kzip.exe | Bin 0 -> 14848 bytes scripts/zip2raw.rb | 146 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 260 insertions(+) create mode 100644 scripts/DeflOpt.exe create mode 100644 scripts/conv_zip.py create mode 100644 scripts/deflate.sh create mode 100644 scripts/kzip.exe create mode 100644 scripts/zip2raw.rb diff --git a/scripts/DeflOpt.exe b/scripts/DeflOpt.exe new file mode 100644 index 0000000000000000000000000000000000000000..7f0cd4ca67780f9930df82db458f5b5777c59c33 GIT binary patch literal 52736 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�K=f)aE#4grSy;3_B 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 literal 0 HcmV?d00001 diff --git a/scripts/conv_zip.py b/scripts/conv_zip.py new file mode 100644 index 0000000..62bef05 --- /dev/null +++ b/scripts/conv_zip.py @@ -0,0 +1,109 @@ +import binascii +import os +import sys +import time +import shutil + +LEN = 2**16 +huffman = False +TARGET=os.getcwd() +SOURCE=sys.argv[1] +DEFLATE=os.path.basename(sys.argv[1]) + ".deflate" + + +if os.path.isfile("rom.zip"): + os.unlink("rom.zip") + +os.system("wine kzip.exe rom /s1 %s" % SOURCE) +os.system("wine DeflOpt.exe /a rom.zip") +os.system("ruby zip2raw.rb rom.zip") + +if os.path.isfile("rom.zip"): + os.unlink("rom.zip") + +data = open(DEFLATE).read() +os.unlink(DEFLATE) +zip_size = len(data) +cfile = open("/tmp/loader.c","w") +hfile = open("/tmp/loader.h","w") + +parts = [] +cnt = len(data) / ((2**15) -1 ) +r = len(data) - (cnt * ((2**15) -1)) +for i in range(0, cnt): + parts.append(((2**15) -1 )) +parts.append(r) + +hfile.write('''/* +File: %s +Time: %s +*/ +#ifndef __FIFO_H__ +#define __FIFO_H__ + +#define ROM_ZIP_SIZE %i +#define ROM_BUFFER_CNT %i + +''' % (os.path.basename(SOURCE),time.strftime("%a, %d %b %Y %H:%M:%S", + time.localtime()),zip_size,len(parts))) + + +for idx,val in enumerate(parts): + hfile.write('#define ROM_BUFFER_SIZE%02i %i\n' % (idx+1,val)) + + +hfile.write('\n#endif\n') +hfile.close() +cfile.write('''/* +File: %s +Time: %s +*/ +#include +#include +''') + + +addr = 0 +for idx,val in enumerate(parts): + cfile.write(''' +const char _rom%02i[ROM_BUFFER_SIZE%02i] PROGMEM = { +''' % (idx+1,idx+1)) + l = addr + h = addr + parts[idx] + addr+= parts[idx] + for idx,c in enumerate(data[l:h]): + c = ord(c) + if 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 DB;!1j literal 0 HcmV?d00001 diff --git a/scripts/zip2raw.rb b/scripts/zip2raw.rb new file mode 100644 index 0000000..5aba4c6 --- /dev/null +++ b/scripts/zip2raw.rb @@ -0,0 +1,146 @@ + +use_file_names = true +include_file_names = false + +loop do + + + if ARGF.read(2) != "PK" + if ARGF.eof? + exit + end + warn "Input is not a zip file" + exit 1 + end + + if !(ARGF.read(2) == "\003\004") # file header + exit + end + + version = ARGF.read(2).unpack("v").first + + # i should use this to sort out some incompatible file formats.... + + + + bitflag = ( ARGF.read(2).unpack("v").first) + + use_data_descriptor = bitflag[3] == 1 + + # should check for things that are unsupported for sure.... + c_method = ARGF.read(2).unpack("v").first + if c_method != 8 + warn "Unknown compression method" + end + + if c_method > 255 + warn "Unsupported compression method" + exit 1 + end + last_mod_time = ARGF.read(2) # unsupported until i know how to convert dos to unix time + last_mod_date = ARGF.read(2) # unsupported until i know how to convert dos to unix time + + crc_32 = ARGF.read(4).unpack("V").first + + size = ARGF.read(4).unpack("V").first + if use_data_descriptor + size = :auto + end + + uncompressed_size = ARGF.read(4).unpack("V").first + + file_name_length = ARGF.read(2).unpack("v").first + extra_field_length = ARGF.read(2).unpack("v").first + + file_name = ARGF.read(file_name_length) + ARGF.read(extra_field_length) # extra field.. no use (yet?) + + file_name2 = file_name + if use_file_names + outfile = nil + while !outfile + + if !(file_name2 =~ /\//) + used_filename = file_name2 + outfile = File.open("#{file_name2}.deflate","w") + end + file_name2 = "zip2gz_file%05i" % rand(100000) + + end + else + outfile = STDOUT + end + + + #generate gz header + #outfile.print "\x1f\x8b" + #outfile.putc c_method + + flags = 0 + + if include_file_names && !file_name.empty? + flags |= 0b1000 + end + + #outfile.print flags.chr + #outfile.print [0].pack("V") # no time conversion (yet) + #outfile.print 2.chr # maybe copy first 3 bits of the zip extra flags? default to maximum compression + #outfile.print 255.chr # this is stored in the central directory... (same for comments) we don't parse this... + + #if include_file_names && !file_name.empty? + # outfile.print file_name.tr("\x00"," ")+"\x00" + #end + + if size != :auto + blocks = size / 0x100 + rest = size & 0xFF + + blocks.times do + outfile.print ARGF.read(0x100) + end + + outfile.print ARGF.read(rest) + else + + size = -14 + + buffer = "" + loop do + buffer << ARGF.getc + size += 1 + if buffer.size > 14 + outfile.putc buffer[0] + buffer[0,1] = "" + end + + if buffer.size == 14 + crc, c_size, u_size, magic_number = buffer.unpack("VVVa2") + if c_size == size && c_size <= u_size && magic_number == "PK" + + break + + ARGF.ungetc "K" + ARGF.ungetc "P" + uncompressed_size = u_size + crc_32 = crc + end + end + + + end + end + + #outfile.print [crc_32, uncompressed_size ].pack("VV") + if file_name.empty? + warn "Successfully wrote file crc32:%08X length:%i to %s" % [crc_32, size, (outfile == STDOUT ? "stdout" : "#{used_filename}.deflate")] + else + warn "Successfully wrote file \"%s\" crc32:%08X length:%i to %s" % [file_name, crc_32, size, (outfile == STDOUT ? "stdout" : "#{used_filename}.deflate")] + end + + if use_file_names + outfile.close + end + +end + +