diff --git a/tools/bsnes/Makefile b/tools/bsnes/Makefile index f894ac7..47cda8e 100755 --- a/tools/bsnes/Makefile +++ b/tools/bsnes/Makefile @@ -1,141 +1,92 @@ -include lib/nall/Makefile.string -prefix = /usr/local +include lib/nall/Makefile ui = ui_qt + +platform=x +compiler=gcc +enable_gzip=false + ################ ### compiler ### ################ -platform=mac -compiler=gcc -enable_gzip=false +c := $(compiler) +cpp := $(subst cc,++,$(compiler)) +flags := -ggdb -O3 -fomit-frame-pointer -Ilib \ +-I/Developer/SDKs/Qt/include \ +-I/Developer/SDKs/Qt/include/QtCore \ +-I/Developer/SDKs/Qt/include/QtGui \ +-I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers \ +-I/System/Library/Frameworks/AGL.framework/Headers \ +-I/Developer/SDKs/Qt/include/QtOpenGL -I/usr/X11R6/include +link := -ifneq ($(findstring gcc,$(compiler)),) # GCC family - flags = -O2 -fomit-frame-pointer -Ilib - libcoflags := $(flags) -static - c = $(compiler) - cpp = $(subst cc,++,$(compiler)) - obj = o - rule = -c $< -o $@ - link = - mkbin = -o$1 - mkdef = -D$1 - mkincpath = -I$1 - mklib = -l$1 - mklibpath = -L$1 - # profile-guided optimization: - #flags += -fprofile-generate - #link += -lgcov - #flags += -fprofile-use - flags += -g -ggdb -export-symbols -else ifeq ($(compiler),cl) # Visual C++ - flags = /nologo /wd4355 /wd4805 /wd4996 /Ox /GL /EHsc /Ilib - libcoflags = $(flags) - c = cl - cpp = cl - obj = obj - rule = /c $< /Fo$@ - link = /link - mkbin = /Fe$1 - mkdef = /D$1 - mkincpath = /I$1 - mklib = $1.lib - mklibpath = /L$1 +# profile-guided instrumentation: +# flags += -fprofile-generate +# link += -lgcov + +# profile-guided optimization: +#flags += -fprofile-use + +################ +### platform ### +################ + +ifeq ($(platform),x) + ruby := video.glx video.xv video.sdl + ruby += audio.alsa audio.openal audio.oss audio.pulseaudio audio.ao + ruby += input.sdl input.x +else ifeq ($(platform),win) + ruby := video.direct3d video.wgl video.directdraw video.gdi + ruby += audio.directsound + ruby += input.rawinput input.directinput + + link += -mwindows +# link += -mconsole + link += -luuid -lkernel32 -luser32 -lgdi32 -lshell32 + # statically link Qt for Windows build + link += -enable-stdcall-fixup -Wl,-s -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc else - unknown_compiler: help; -endif - -########## -### os ### -########## - - -ifeq ($(platform),mac) #Mac - ruby = video.glx video.xv video.sdl audio.alsa audio.openal audio.oss audio.pulseaudio audio.ao input.sdl input.x - mkbin = -o $1 - delete = rm -f $1 - link += -L/opt/local/lib \ - -lSDL -framework,Cocoa \ - -lX11 \ - -lm \ - -framework Foundation\ - -framework Cocoa \ - -framework AGL \ - -framework OpenAL\ - -framework ApplicationServices \ - -framework Foundation\ - -framework OpenGL\ - -framework GLUT \ - -lz \ - -lgl \ - -lao - - - flags +=-I/opt/local/include \ - -I/System/Library/Frameworks/OpenAL.framework/Versions/A/Headers/\ - -DVIDEO_SDL \ - -DINPUT_SDL \ - -DVIDEO_GLX \ - -DAUDIO_AO \ - -DAUDIO_OPENAL -endif - -ifeq ($(platform),x) # X11 - ruby = video.glx video.xv video.sdl audio.alsa audio.openal audio.oss audio.pulseaudio audio.ao input.sdl input.x - delete = rm -f $1 - -else ifeq ($(platform),win) # Windows - mingw_link_flags = -mwindows - # mingw_links_flags = -mconsole - # enable static linking to Qt for Windows build - mingw_link_flags += -enable-stdcall-fixup -Wl,-s -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc - ruby = video.direct3d video.wgl video.directdraw video.gdi audio.directsound input.rawinput input.directinput - delete = $(if $(findstring i586-mingw-gcc,$(compiler)),rm -f $1,del $(subst /,\,$1)) - link += $(if $(findstring mingw,$(compiler)),$(mingw_link_flags)) - link += $(call mklib,uuid) - link += $(call mklib,kernel32) - link += $(call mklib,user32) - link += $(call mklib,gdi32) - link += $(call mklib,shell32) + unknown_platform: help; endif ############ ### ruby ### ############ -rubyflags = $(if $(findstring .sdl,$(ruby)),`sdl-config --cflags`) -#link += $(if $(findstring .sdl,$(ruby)),`sdl-config --libs`) +rubyflags = $(call ifhas,.sdl,$(ruby),`sdl-config --cflags`) -#link += $(if $(findstring video.direct3d,$(ruby)),$(call mklib,d3d9)) -#link += $(if $(findstring video.directdraw,$(ruby)),$(call mklib,ddraw)) -#link += $(if $(findstring video.glx,$(ruby)),$(call mklib,GL)) -#link += $(if $(findstring video.wgl,$(ruby)),$(call mklib,opengl32)) -#link += $(if $(findstring video.xv,$(ruby)),$(call mklib,Xv)) -#link += $(if $(findstring audio.alsa,$(ruby)),$(call mklib,asound)) -#link += $(if $(findstring audio.ao,$(ruby)),$(call mklib,ao)) -#link += $(if $(findstring audio.directsound,$(ruby)),$(call mklib,dsound)) -#link += $(if $(findstring audio.openal,$(ruby)),$(if $(call streq,$(platform),x),$(call mklib,openal),$(call mklib,openal32))) -#link += $(if $(findstring audio.pulseaudio,$(ruby)),$(call mklib,pulse-simple)) -#link += $(if $(findstring input.directinput,$(ruby)),$(call mklib,dinput8) $(call mklib,dxguid)) -#link += $(if $(findstring input.rawinput,$(ruby)),$(call mklib,xinput) $(call mklib,dinput8) $(call mklib,dxguid)) +link += $(call ifhas,.sdl,$(ruby),`sdl-config --libs`) +link += $(call ifhas,video.direct3d,$(ruby),-ld3d9) +link += $(call ifhas,video.directdraw,$(ruby),-lddraw) +link += $(call ifhas,video.glx,$(ruby),-lGL) +link += $(call ifhas,video.wgl,$(ruby),-lopengl32) +link += $(call ifhas,video.xv,$(ruby),-lXv) +link += $(call ifhas,audio.alsa,$(ruby),-lasound) +link += $(call ifhas,audio.ao,$(ruby),-lao) +link += $(call ifhas,audio.directsound,$(ruby),-ldsound) +link += $(call ifhas,audio.openal,$(ruby),$(if $(call streq,$(platform),x),-lopenal,-lopenal32)) +link += $(call ifhas,audio.pulseaudio,$(ruby),-lpulse-simple) +link += $(call ifhas,input.directinput,$(ruby),-ldinput8 -ldxguid) +link += $(call ifhas,input.rawinput,$(ruby),-lxinput -ldinput8 -ldxguid) #################### ### core objects ### #################### -objects = libco ruby libfilter string \ - reader cart cheat \ - memory smemory cpu scpu smp ssmp sdsp ppu bppu snes \ - bsx srtc sdd1 spc7110 cx4 dsp1 dsp2 dsp3 dsp4 obc1 st010 +objects = libco ruby libreader libfilter string \ + system cartridge cheat \ + memory smemory cpu cpucore scpu smp smpcore ssmp sdsp ppu bppu \ + sgb sa1 bsx srtc sdd1 spc7110 cx4 dsp1 dsp2 dsp3 dsp4 obc1 st010 ifeq ($(enable_gzip),true) - #objects += adler32 compress crc32 deflate gzio inffast inflate inftrees ioapi trees unzip zip zutil - #flags += $(call mkdef,GZIP_SUPPORT) + objects += adler32 compress crc32 deflate gzio inffast inflate inftrees ioapi trees unzip zip zutil + flags += -DGZIP_SUPPORT endif ifeq ($(enable_jma),true) - #objects += jma jcrc32 lzmadec 7zlzma iiostrm inbyte lzma winout - #flags += $(call mkdef,JMA_SUPPORT) + objects += jma jcrc32 lzmadec 7zlzma iiostrm inbyte lzma winout + flags += -DJMA_SUPPORT endif ###################### @@ -145,135 +96,139 @@ endif compile = \ $(strip \ $(if $(filter %.c,$<), \ - $(c) $(flags) $1 $(rule), \ + $(c) $(flags) $1 -c $< -o $@, \ $(if $(filter %.cpp,$<), \ - $(cpp) $(flags) $1 $(rule) \ + $(cpp) $(flags) $1 -c $< -o $@ \ ) \ ) \ ) -%.$(obj): $<; $(call compile) +%.o: $<; $(call compile) all: build; include $(ui)/Makefile - -objects := $(patsubst %,obj/%.$(obj),$(objects)) -#rubydef := $(foreach c,$(subst .,_,$(call strupper,$(ruby))),$(call mkdef,$c)) - +objects := $(patsubst %,obj/%.o,$(objects)) +rubydef := $(foreach c,$(subst .,_,$(call strupper,$(ruby))),-D$c) +#-DVIDEO_GLX -DVIDEO_XV -DVIDEO_SDL -DAUDIO_ALSA -DAUDIO_OPENAL -DAUDIO_OSS -DAUDIO_PULSEAUDIO -DAUDIO_AO -DINPUT_SDL -DINPUT_X +rubydef =-DVIDEO_SDL -DINPUT_SDL ################# ### libraries ### ################# -obj/ruby.$(obj): lib/ruby/ruby.cpp lib/ruby/* lib/ruby/video/* lib/ruby/audio/* lib/ruby/input/* +obj/ruby.o: lib/ruby/ruby.cpp $(call rwildcard,lib/ruby/*) $(call compile,$(rubydef) $(rubyflags)) -obj/libco.$(obj): lib/libco/libco.c lib/libco/* - $(c) $(libcoflags) $(rule) -obj/libfilter.$(obj): lib/libfilter/libfilter.cpp lib/libfilter/* -obj/string.$(obj): lib/nall/string.cpp lib/nall/* +obj/libco.o: lib/libco/libco.c lib/libco/* + $(c) -O3 -fomit-frame-pointer -static -Ilib -c $< -o $@ +obj/libreader.o: lib/libreader/libreader.cpp lib/libreader/* +obj/libfilter.o: lib/libfilter/libfilter.cpp lib/libfilter/* +obj/string.o: lib/nall/string.cpp lib/nall/* ################# ### utilities ### ################# -obj/reader.$(obj): reader/reader.cpp reader/* -obj/cart.$(obj) : cart/cart.cpp cart/* -obj/cheat.$(obj) : cheat/cheat.cpp cheat/* +obj/cartridge.o: cartridge/cartridge.cpp cartridge/* +obj/cheat.o : cheat/cheat.cpp cheat/* ############## ### memory ### ############## -obj/memory.$(obj) : memory/memory.cpp memory/* -obj/smemory.$(obj): memory/smemory/smemory.cpp memory/smemory/* memory/smemory/mapper/* +obj/memory.o : memory/memory.cpp memory/* +obj/smemory.o: memory/smemory/smemory.cpp $(call rwildcard,memory/smemory/) ########### ### cpu ### ########### -obj/cpu.$(obj) : cpu/cpu.cpp cpu/* -obj/scpu.$(obj): cpu/scpu/scpu.cpp cpu/scpu/* cpu/scpu/core/* cpu/scpu/dma/* cpu/scpu/memory/* cpu/scpu/mmio/* cpu/scpu/timing/* +obj/cpu.o : cpu/cpu.cpp cpu/* +obj/cpucore.o: cpu/core/core.cpp $(call rwildcard,cpu/core/) +obj/scpu.o : cpu/scpu/scpu.cpp $(call rwildcard,cpu/scpu/) ########### ### smp ### ########### -obj/smp.$(obj) : smp/smp.cpp smp/* -obj/ssmp.$(obj): smp/ssmp/ssmp.cpp smp/ssmp/* smp/ssmp/core/* smp/ssmp/memory/* smp/ssmp/timing/* +obj/smp.o : smp/smp.cpp smp/* +obj/smpcore.o: smp/core/core.cpp $(call rwildcard,smp/core/) +obj/ssmp.o : smp/ssmp/ssmp.cpp $(call rwildcard,smp/ssmp/) ########### ### dsp ### ########### -obj/adsp.$(obj): dsp/adsp/adsp.cpp dsp/adsp/* -obj/sdsp.$(obj): dsp/sdsp/sdsp.cpp dsp/sdsp/* +obj/adsp.o: dsp/adsp/adsp.cpp dsp/adsp/* +obj/sdsp.o: dsp/sdsp/sdsp.cpp dsp/sdsp/* ########### ### ppu ### ########### -obj/ppu.$(obj) : ppu/ppu.cpp ppu/* -obj/bppu.$(obj): ppu/bppu/bppu.cpp ppu/bppu/* +obj/ppu.o : ppu/ppu.cpp ppu/* +obj/bppu.o: ppu/bppu/bppu.cpp ppu/bppu/* -############ -### snes ### -############ +############## +### system ### +############## -obj/snes.$(obj): snes/snes.cpp snes/* snes/scheduler/* snes/video/* snes/audio/* snes/input/* +obj/system.o: system/system.cpp $(call rwildcard,system/) ##################### ### special chips ### ##################### -obj/bsx.$(obj) : chip/bsx/bsx.cpp chip/bsx/* -obj/srtc.$(obj) : chip/srtc/srtc.cpp chip/srtc/* -obj/sdd1.$(obj) : chip/sdd1/sdd1.cpp chip/sdd1/* -obj/spc7110.$(obj): chip/spc7110/spc7110.cpp chip/spc7110/* -obj/cx4.$(obj) : chip/cx4/cx4.cpp chip/cx4/* -obj/dsp1.$(obj) : chip/dsp1/dsp1.cpp chip/dsp1/* -obj/dsp2.$(obj) : chip/dsp2/dsp2.cpp chip/dsp2/* -obj/dsp3.$(obj) : chip/dsp3/dsp3.cpp chip/dsp3/* -obj/dsp4.$(obj) : chip/dsp4/dsp4.cpp chip/dsp4/* -obj/obc1.$(obj) : chip/obc1/obc1.cpp chip/obc1/* -obj/st010.$(obj) : chip/st010/st010.cpp chip/st010/* +obj/sgb.o : chip/sgb/sgb.cpp $(call rwildcard,chip/sgb/) +obj/sa1.o : chip/sa1/sa1.cpp $(call rwildcard,chip/sa1/) +obj/bsx.o : chip/bsx/bsx.cpp chip/bsx/* +obj/srtc.o : chip/srtc/srtc.cpp chip/srtc/* +obj/sdd1.o : chip/sdd1/sdd1.cpp chip/sdd1/* +obj/spc7110.o: chip/spc7110/spc7110.cpp chip/spc7110/* +obj/cx4.o : chip/cx4/cx4.cpp chip/cx4/* +obj/dsp1.o : chip/dsp1/dsp1.cpp chip/dsp1/* +obj/dsp2.o : chip/dsp2/dsp2.cpp chip/dsp2/* +obj/dsp3.o : chip/dsp3/dsp3.cpp chip/dsp3/* +obj/dsp4.o : chip/dsp4/dsp4.cpp chip/dsp4/* +obj/obc1.o : chip/obc1/obc1.cpp chip/obc1/* +obj/st010.o : chip/st010/st010.cpp chip/st010/* ############ ### zlib ### ############ -obj/adler32.$(obj) : reader/zlib/adler32.c reader/zlib/* -obj/compress.$(obj): reader/zlib/compress.c reader/zlib/* -obj/crc32.$(obj) : reader/zlib/crc32.c reader/zlib/* -obj/deflate.$(obj) : reader/zlib/deflate.c reader/zlib/* -obj/gzio.$(obj) : reader/zlib/gzio.c reader/zlib/* -obj/inffast.$(obj) : reader/zlib/inffast.c reader/zlib/* -obj/inflate.$(obj) : reader/zlib/inflate.c reader/zlib/* -obj/inftrees.$(obj): reader/zlib/inftrees.c reader/zlib/* -obj/ioapi.$(obj) : reader/zlib/ioapi.c reader/zlib/* -obj/trees.$(obj) : reader/zlib/trees.c reader/zlib/* -obj/unzip.$(obj) : reader/zlib/unzip.c reader/zlib/* -obj/zip.$(obj) : reader/zlib/zip.c reader/zlib/* -obj/zutil.$(obj) : reader/zlib/zutil.c reader/zlib/* +obj/adler32.o : lib/zlib/adler32.c lib/zlib/* +obj/compress.o: lib/zlib/compress.c lib/zlib/* +obj/crc32.o : lib/zlib/crc32.c lib/zlib/* +obj/deflate.o : lib/zlib/deflate.c lib/zlib/* +obj/gzio.o : lib/zlib/gzio.c lib/zlib/* +obj/inffast.o : lib/zlib/inffast.c lib/zlib/* +obj/inflate.o : lib/zlib/inflate.c lib/zlib/* +obj/inftrees.o: lib/zlib/inftrees.c lib/zlib/* +obj/ioapi.o : lib/zlib/ioapi.c lib/zlib/* +obj/trees.o : lib/zlib/trees.c lib/zlib/* +obj/unzip.o : lib/zlib/unzip.c lib/zlib/* +obj/zip.o : lib/zlib/zip.c lib/zlib/* +obj/zutil.o : lib/zlib/zutil.c lib/zlib/* -########### -### jma ### -########### +############## +### libjma ### +############## -obj/jma.$(obj) : reader/jma/jma.cpp reader/jma/* -obj/jcrc32.$(obj) : reader/jma/jcrc32.cpp reader/jma/* -obj/lzmadec.$(obj): reader/jma/lzmadec.cpp reader/jma/* -obj/7zlzma.$(obj) : reader/jma/7zlzma.cpp reader/jma/* -obj/iiostrm.$(obj): reader/jma/iiostrm.cpp reader/jma/* -obj/inbyte.$(obj) : reader/jma/inbyte.cpp reader/jma/* -obj/lzma.$(obj) : reader/jma/lzma.cpp reader/jma/* -obj/winout.$(obj) : reader/jma/winout.cpp reader/jma/* +obj/jma.o : lib/libjma/jma.cpp lib/libjma/* +obj/jcrc32.o : lib/libjma/jcrc32.cpp lib/libjma/* +obj/lzmadec.o: lib/libjma/lzmadec.cpp lib/libjma/* +obj/7zlzma.o : lib/libjma/7zlzma.cpp lib/libjma/* +obj/iiostrm.o: lib/libjma/iiostrm.cpp lib/libjma/* +obj/inbyte.o : lib/libjma/inbyte.cpp lib/libjma/* +obj/lzma.o : lib/libjma/lzma.cpp lib/libjma/* +obj/winout.o : lib/libjma/winout.cpp lib/libjma/* ############### ### targets ### ############### build: ui_build $(objects) - g++ $(call mkbin,bsnes) $(objects) $(link) + $(strip g++ -o bsnes $(objects) $(link)) install: install -D -m 755 ../bsnes $(DESTDIR)$(prefix)/bin/bsnes @@ -281,7 +236,7 @@ install: install -D -m 644 data/bsnes.desktop $(DESTDIR)$(prefix)/share/applications/bsnes.desktop clean: ui_clean - -@$(call delete,obj/*.$(obj)) + -@$(call delete,obj/*.o) -@$(call delete,*.res) -@$(call delete,*.pgd) -@$(call delete,*.pgc) @@ -300,7 +255,6 @@ help: @echo " gcc - GCC compiler" @echo " mingw32-gcc - MinGW compiler" @echo " i586-mingw32-gcc - MinGW cross compiler" - @echo " cl - Visual C++" @echo "" @echo "Available options:" @echo " enable_gzip=[true|false] - Enable ZIP / GZ support (default=false)" @@ -308,3 +262,4 @@ help: @echo "" @echo "Example: $(MAKE) platform=x compiler=gcc enable_gzip=true" @echo "" + diff --git a/tools/bsnes/README b/tools/bsnes/README deleted file mode 100644 index e69de29..0000000 diff --git a/tools/bsnes/base.hpp b/tools/bsnes/base.hpp index ab2d5c3..01990d1 100755 --- a/tools/bsnes/base.hpp +++ b/tools/bsnes/base.hpp @@ -1,4 +1,4 @@ -#define BSNES_VERSION "0.042" +#define BSNES_VERSION "0.046" #define BSNES_TITLE "bsnes v" BSNES_VERSION #define BUSCORE sBus @@ -9,12 +9,7 @@ //S-DSP can be encapsulated into a state machine using #define magic //this avoids ~2.048m co_switch() calls per second (~5% speedup) -#define USE_STATE_MACHINE - -//FAST_FRAMESKIP disables calculation of RTO during frameskip -//frameskip offers near-zero speedup if RTO is calculated -//accuracy is not affected by this define when frameskipping is off -#define FAST_FRAMESKIP +#define DSP_STATE_MACHINE //game genie + pro action replay code support (~2% speed hit) #define CHEAT_SYSTEM @@ -25,8 +20,9 @@ #include #include #include +#include #include -#include +#include #include #include #include @@ -40,10 +36,9 @@ using namespace nall; typedef int8_t int8; typedef int16_t int16; typedef int32_t int32; -typedef int64_t int64; typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32; -typedef uint64_t uint64; #include "interface.hpp" + diff --git a/tools/bsnes/cart/cart.cpp b/tools/bsnes/cart/cart.cpp deleted file mode 100755 index 60ea832..0000000 --- a/tools/bsnes/cart/cart.cpp +++ /dev/null @@ -1,234 +0,0 @@ -#include <../base.hpp> -#include <../chip/chip.hpp> -#include <../reader/reader.hpp> -#define CART_CPP - -#include -#include - -#include "cart.hpp" -#include "cart_file.cpp" -#include "cart_header.cpp" -#include "cart_loader.cpp" - -namespace memory { - MappedRAM cartrom, cartram, cartrtc; - MappedRAM bscram; - MappedRAM stArom, stAram; - MappedRAM stBrom, stBram; -}; - -Cartridge cartridge; - -void Cartridge::load_begin(Mode cartridge_mode) { - cart.rom = cart.ram = cart.rtc = 0; - bs.ram = 0; - stA.rom = stA.ram = 0; - stB.rom = stB.ram = 0; - - cart.rom_size = cart.ram_size = cart.rtc_size = 0; - bs.ram_size = 0; - stA.rom_size = stA.ram_size = 0; - stB.rom_size = stB.ram_size = 0; - - set(loaded, false); - set(bsx_flash_loaded, false); - set(patched, false); - set(mode, cartridge_mode); -} - -void Cartridge::load_end() { - memory::cartrom.map(cart.rom, cart.rom_size); - memory::cartram.map(cart.ram, cart.ram_size); - memory::cartrtc.map(cart.rtc, cart.rtc_size); - memory::bscram.map(bs.ram, bs.ram_size); - memory::stArom.map(stA.rom, stA.rom_size); - memory::stAram.map(stA.ram, stA.ram_size); - memory::stBrom.map(stB.rom, stB.rom_size); - memory::stBram.map(stB.ram, stB.ram_size); - - memory::cartrom.write_protect(true); - memory::cartram.write_protect(false); - memory::bscram.write_protect(true); - memory::stArom.write_protect(true); - memory::stAram.write_protect(false); - memory::stBrom.write_protect(true); - memory::stBram.write_protect(false); - - string cheat_file = get_filename(cart.filename, "cht", snes.config.path.cheat); - if(file::exists(cheat_file)) { - cheat.clear(); - cheat.load(cheat_file); - } - - bus.load_cart(); - set(loaded, true); -} - -void Cartridge::unload() { - if(loaded() == false) return; - bus.unload_cart(); - - switch(mode()) { - case ModeNormal: unload_normal(); break; - case ModeBsxSlotted: unload_bsx_slotted(); break; - case ModeBsx: unload_bsx(); break; - case ModeSufamiTurbo: unload_sufami_turbo(); break; - } - - if(cart.rom) { delete[] cart.rom; cart.rom = 0; } - if(cart.ram) { delete[] cart.ram; cart.ram = 0; } - if(cart.rtc) { delete[] cart.rtc; cart.rtc = 0; } - if(bs.ram) { delete[] bs.ram; bs.ram = 0; } - if(stA.rom) { delete[] stA.rom; stA.rom = 0; } - if(stA.ram) { delete[] stA.ram; stA.ram = 0; } - if(stB.rom) { delete[] stB.rom; stB.rom = 0; } - if(stB.ram) { delete[] stB.ram; stB.ram = 0; } - - string cheat_file = get_filename(cart.filename, "cht", snes.config.path.cheat); - if(cheat.count() > 0 || file::exists(cheat_file)) { - cheat.save(cheat_file); - cheat.clear(); - } - - set(loaded, false); -} - -Cartridge::Cartridge() { - set(loaded, false); -} - -Cartridge::~Cartridge() { - if(loaded() == true) unload(); -} - -void Cartridge::set_cartinfo(const Cartridge::cartinfo_t &source) { - set(region, source.region); - set(mapper, source.mapper); - set(dsp1_mapper, source.dsp1_mapper); - - set(has_bsx_slot, source.bsx_slot); - set(has_superfx, source.superfx); - set(has_sa1, source.sa1); - set(has_srtc, source.srtc); - set(has_sdd1, source.sdd1); - set(has_spc7110, source.spc7110); - set(has_spc7110rtc, source.spc7110rtc); - set(has_cx4, source.cx4); - set(has_dsp1, source.dsp1); - set(has_dsp2, source.dsp2); - set(has_dsp3, source.dsp3); - set(has_dsp4, source.dsp4); - set(has_obc1, source.obc1); - set(has_st010, source.st010); - set(has_st011, source.st011); - set(has_st018, source.st018); -} - -//========== -//cartinfo_t -//========== - -void Cartridge::cartinfo_t::reset() { - type = TypeUnknown; - mapper = LoROM; - dsp1_mapper = DSP1Unmapped; - region = NTSC; - - rom_size = 0; - ram_size = 0; - - bsx_slot = false; - superfx = false; - sa1 = false; - srtc = false; - sdd1 = false; - spc7110 = false; - spc7110rtc = false; - cx4 = false; - dsp1 = false; - dsp2 = false; - dsp3 = false; - dsp4 = false; - obc1 = false; - st010 = false; - st011 = false; - st018 = false; -} - -Cartridge::cartinfo_t::cartinfo_t() { - reset(); -} - -//======= -//utility -//======= - -//ensure file path is absolute (eg resolve relative paths) -string Cartridge::filepath(const char *filename, const char *pathname) { - //if no pathname, return filename as-is - string file(filename); - file.replace("\\", "/"); - - string path = (!pathname || !*pathname) ? (const char*)snes.config.path.current : pathname; - //ensure path ends with trailing '/' - path.replace("\\", "/"); - if(!strend(path, "/")) path.append("/"); - - //replace relative path with absolute path - if(strbegin(path, "./")) { - ltrim(path, "./"); - path = string() << snes.config.path.base << path; - } - - //remove folder part of filename - lstring part; - part.split("/", file); - return path << part[part.size() - 1]; -} - -//remove directory information and file extension ("/foo/bar.ext" -> "bar") -string Cartridge::basename(const char *filename) { - string name(filename); - - //remove extension - for(signed i = strlen(name) - 1; i >= 0; i--) { - if(name[i] == '.') { - name[i] = 0; - break; - } - } - - //remove directory information - for(signed i = strlen(name) - 1; i >= 0; i--) { - if(name[i] == '/' || name[i] == '\\') { - i++; - char *output = name(); - while(true) { - *output++ = name[i]; - if(!name[i]) break; - i++; - } - break; - } - } - - return name; -} - -//remove filename and return path only ("/foo/bar.ext" -> "/foo/bar/") -string Cartridge::basepath(const char *filename) { - string path(filename); - path.replace("\\", "/"); - - //remove filename - for(signed i = strlen(path) - 1; i >= 0; i--) { - if(path[i] == '/') { - path[i] = 0; - break; - } - } - - if(!strend(path, "/")) path.append("/"); - return path; -} diff --git a/tools/bsnes/cart/cart.hpp b/tools/bsnes/cart/cart.hpp deleted file mode 100755 index f2f399a..0000000 --- a/tools/bsnes/cart/cart.hpp +++ /dev/null @@ -1,178 +0,0 @@ -class Cartridge : public property { -public: - enum Mode { - ModeNormal, - ModeBsxSlotted, - ModeBsx, - ModeSufamiTurbo, - }; - - enum Type { - TypeNormal, - TypeBsxSlotted, - TypeBsxBios, - TypeBsx, - TypeSufamiTurboBios, - TypeSufamiTurbo, - TypeUnknown, - }; - - enum Region { - NTSC, - PAL, - }; - - enum MemoryMapper { - LoROM, - HiROM, - ExLoROM, - ExHiROM, - SPC7110ROM, - BSCLoROM, - BSCHiROM, - BSXROM, - STROM, - }; - - enum DSP1MemoryMapper { - DSP1Unmapped, - DSP1LoROM1MB, - DSP1LoROM2MB, - DSP1HiROM, - }; - - //properties can be read via operator(), eg "if(cartridge.loaded() == true)"; - //warning: if loaded() == false, no other property is considered valid! - - property_t loaded; //is a base cartridge inserted? - property_t bsx_flash_loaded; //is a BS-X flash cart connected? - property_t patched; //has a UPS patch been applied? - property_t name; //display name (filename sans path and extension) - - property_t mode; - property_t region; - property_t mapper; - property_t dsp1_mapper; - - property_t has_bsx_slot; - property_t has_superfx; - property_t has_sa1; - property_t has_srtc; - property_t has_sdd1; - property_t has_spc7110, has_spc7110rtc; - property_t has_cx4; - property_t has_dsp1, has_dsp2, has_dsp3, has_dsp4; - property_t has_obc1; - property_t has_st010, has_st011, has_st018; - - //main interface - bool load_normal (const char *base); - bool load_bsx_slotted (const char *base, const char *slot = ""); - bool load_bsx (const char *base, const char *slot = ""); - bool load_sufami_turbo(const char *base, const char *slotA = "", const char *slotB = ""); - void unload(); - - //utility functions - static string filepath(const char *filename, const char *pathname); //"./bar.ext" -> "/foo/bar.ext" - static string basename(const char *filename); //"/foo/bar.ext" -> "bar" - static string basepath(const char *filename); //"/foo/bar.ext" -> "/foo/bar/" - //this function will load 'filename', decompress it if needed, and determine what type of - //image file 'filename' refers to (eg normal cart, BS-X flash cart, Sufami Turbo cart, etc.) - //warning: this operation is very expensive, use sparingly! - Type detect_image_type(const char *filename) const; - - Cartridge(); - ~Cartridge(); - -private: - void load_begin(Mode); - void load_end(); - void unload_normal(); - void unload_bsx_slotted(); - void unload_bsx(); - void unload_sufami_turbo(); - - struct cartinfo_t { - Type type; - Region region; - MemoryMapper mapper; - DSP1MemoryMapper dsp1_mapper; - unsigned rom_size, ram_size; - - bool bsx_slot; - bool superfx; - bool sa1; - bool srtc; - bool sdd1; - bool spc7110, spc7110rtc; - bool cx4; - bool dsp1, dsp2, dsp3, dsp4; - bool obc1; - bool st010, st011, st018; - - void reset(); - cartinfo_t(); - }; - - enum HeaderField { - CartName = 0x00, - Mapper = 0x15, - RomType = 0x16, - RomSize = 0x17, - RamSize = 0x18, - CartRegion = 0x19, - Company = 0x1a, - Version = 0x1b, - Complement = 0x1c, //inverse checksum - Checksum = 0x1e, - ResetVector = 0x3c, - }; - - void read_header(cartinfo_t &info, const uint8_t *data, unsigned size) const; - unsigned find_header(const uint8_t *data, unsigned size) const; - unsigned score_header(const uint8_t *data, unsigned size, unsigned addr) const; - void set_cartinfo(const cartinfo_t&); - - bool load_image(const char *filename, uint8_t *&data, unsigned &size, bool &patched) const; - bool load_ram (const char *filename, uint8_t *&data, unsigned size, uint8_t init_value) const; - - enum CompressionMode { - CompressionNone, //always load without compression - CompressionInspect, //use file header inspection - CompressionAuto, //use file extension or file header inspection (configured by user) - }; - - bool load_file(const char *fn, uint8 *&data, unsigned &size, CompressionMode compression = CompressionNone) const; - bool save_file(const char *fn, uint8 *data, unsigned size) const; - bool apply_patch(const uint8_t *pdata, unsigned psize, uint8_t *&data, unsigned &size) const; - - string modify_extension(const char *filename, const char *extension) const; - string get_filename(const char *source, const char *extension, const char *path) const; - - struct { - string filename; - uint8_t *rom, *ram, *rtc; - unsigned rom_size, ram_size, rtc_size; - } cart; - - struct { - string filename; - uint8_t *ram; - unsigned ram_size; - } bs; - - struct { - string filename; - uint8_t *rom, *ram; - unsigned rom_size, ram_size; - } stA, stB; -}; - -namespace memory { - extern MappedRAM cartrom, cartram, cartrtc; - extern MappedRAM bscram; - extern MappedRAM stArom, stAram; - extern MappedRAM stBrom, stBram; -}; - -extern Cartridge cartridge; diff --git a/tools/bsnes/cart/cart_file.cpp b/tools/bsnes/cart/cart_file.cpp deleted file mode 100755 index 1410229..0000000 --- a/tools/bsnes/cart/cart_file.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#ifdef CART_CPP - -#include "../reader/filereader.hpp" - -#if defined(GZIP_SUPPORT) - #include "../reader/gzreader.hpp" - #include "../reader/zipreader.hpp" -#endif - -#if defined(JMA_SUPPORT) - #include "../reader/jmareader.hpp" -#endif - -string Cartridge::modify_extension(const char *filename_, const char *extension) const { - string filename = filename_; - int i; - for(i = strlen(filename); i >= 0; i--) { - if(filename[i] == '.') break; - if(filename[i] == '/') break; - if(filename[i] == '\\') break; - } - if(i > 0 && filename[i] == '.') filename[i] = 0; - return filename << "." << extension; -} - -string Cartridge::get_filename(const char *source, const char *extension, const char *path) const { - return filepath(modify_extension(source, extension), path); -} - -bool Cartridge::load_file(const char *fn, uint8 *&data, unsigned &size, CompressionMode compression) const { - if(file::exists(fn) == false) return false; - - Reader::Type filetype = Reader::Normal; - if(compression == CompressionInspect) filetype = Reader::detect(fn, true); - if(compression == CompressionAuto) filetype = Reader::detect(fn, snes.config.file.autodetect_type); - - switch(filetype) { default: - case Reader::Normal: { - FileReader ff(fn); - if(!ff.ready()) return false; - size = ff.size(); - data = ff.read(); - } break; - - #ifdef GZIP_SUPPORT - case Reader::GZIP: { - GZReader gf(fn); - if(!gf.ready()) return false; - size = gf.size(); - data = gf.read(); - } break; - - case Reader::ZIP: { - ZipReader zf(fn); - if(!zf.ready()) return false; - size = zf.size(); - data = zf.read(); - } break; - #endif - - #ifdef JMA_SUPPORT - case Reader::JMA: { - try { - JMAReader jf(fn); - size = jf.size(); - data = jf.read(); - } catch(JMA::jma_errors jma_error) { - return false; - } - } break; - #endif - } - - return true; -} - -bool Cartridge::apply_patch(const uint8_t *pdata, const unsigned psize, uint8_t *&data, unsigned &size) const { - uint8_t *outdata = 0; - unsigned outsize; - ups patcher; - ups::result result = patcher.apply(pdata, psize, data, size, outdata, outsize); - - bool apply = false; - if(result == ups::ok) apply = true; - if(snes.config.file.bypass_patch_crc32 == true) { - if(result == ups::input_crc32_invalid) apply = true; - if(result == ups::output_crc32_invalid) apply = true; - } - - //if patch application was successful, replace old data, size with new data, size - if(apply == true) { - delete[] data; - data = new uint8_t[size = outsize]; - memcpy(data, outdata, outsize); - } - - if(outdata) delete[] outdata; - return apply; -} - -bool Cartridge::save_file(const char *fn, uint8 *data, unsigned size) const { - file fp; - if(!fp.open(fn, file::mode_write)) return false; - fp.write(data, size); - fp.close(); - return true; -} - -#endif diff --git a/tools/bsnes/cart/cart_header.cpp b/tools/bsnes/cart/cart_header.cpp deleted file mode 100755 index b99a1d4..0000000 --- a/tools/bsnes/cart/cart_header.cpp +++ /dev/null @@ -1,272 +0,0 @@ -#ifdef CART_CPP - -void Cartridge::read_header(cartinfo_t &info, const uint8_t *data, unsigned size) const { - info.reset(); - unsigned index = find_header(data, size); - - //======================= - //detect BS-X flash carts - //======================= - - if(data[index + 0x13] == 0x00 || data[index + 0x13] == 0xff) { - if(data[index + 0x14] == 0x00) { - const uint8_t n15 = data[index + 0x15]; - if(n15 == 0x00 || n15 == 0x80 || n15 == 0x84 || n15 == 0x9c || n15 == 0xbc || n15 == 0xfc) { - if(data[index + 0x1a] == 0x33 || data[index + 0x1a] == 0xff) { - info.type = TypeBsx; - info.mapper = BSXROM; - info.region = NTSC; //BS-X only released in Japan - return; - } - } - } - } - - //========================= - //detect Sufami Turbo carts - //========================= - - if(!memcmp(data, "BANDAI SFC-ADX", 14)) { - if(!memcmp(data + 16, "SFC-ADX BACKUP", 14)) { - info.type = TypeSufamiTurboBios; - } else { - info.type = TypeSufamiTurbo; - } - info.mapper = STROM; - info.region = NTSC; //Sufami Turbo only released in Japan - return; //RAM size handled internally by load_cart_st(); - } - - //===================== - //detect standard carts - //===================== - - const uint8 mapper = data[index + Mapper]; - const uint8 rom_type = data[index + RomType]; - const uint8 rom_size = data[index + RomSize]; - const uint8 company = data[index + Company]; - const uint8 region = data[index + CartRegion] & 0x7f; - - //detect presence of BS-X flash cartridge connector (reads extended header information) - if(data[index - 14] == 'Z') { - if(data[index - 11] == 'J') { - uint8 n13 = data[index - 13]; - if((n13 >= 'A' && n13 <= 'Z') || (n13 >= '0' && n13 <= '9')) { - if(company == 0x33 || (data[index - 10] == 0x00 && data[index - 4] == 0x00)) { - info.bsx_slot = true; - } - } - } - } - - if(info.bsx_slot == true) { - if(!memcmp(data + index, "Satellaview BS-X ", 21)) { - //BS-X base cart - info.type = TypeBsxBios; - info.mapper = BSXROM; - info.region = NTSC; //BS-X only released in Japan - return; //RAM size handled internally by load_cart_bsx() -> BSXCart class - } else { - info.type = TypeBsxSlotted; - info.mapper = (index == 0x7fc0 ? BSCLoROM : BSCHiROM); - } - } else { - //standard cart - info.type = TypeNormal; - - if(index == 0x7fc0 && size >= 0x401000) { - info.mapper = ExLoROM; - } else if(index == 0x7fc0 && mapper == 0x32) { - info.mapper = ExLoROM; - } else if(index == 0x7fc0) { - info.mapper = LoROM; - } else if(index == 0xffc0) { - info.mapper = HiROM; - } else { //index == 0x40ffc0 - info.mapper = ExHiROM; - } - } - - if(mapper == 0x20 && (rom_type == 0x13 || rom_type == 0x14 || rom_type == 0x15 || rom_type == 0x1a)) { - info.superfx = true; - } - - if(mapper == 0x23 && (rom_type == 0x34 || rom_type == 0x35)) { - info.sa1 = true; - } - - if(mapper == 0x35 && rom_type == 0x55) { - info.srtc = true; - } - - if(mapper == 0x32 && (rom_type == 0x43 || rom_type == 0x45)) { - info.sdd1 = true; - } - - if(mapper == 0x3a && (rom_type == 0xf5 || rom_type == 0xf9)) { - info.spc7110 = true; - info.spc7110rtc = (rom_type == 0xf9); - info.mapper = SPC7110ROM; - } - - if(mapper == 0x20 && rom_type == 0xf3) { - info.cx4 = true; - } - - if((mapper == 0x20 || mapper == 0x21) && rom_type == 0x03) { - info.dsp1 = true; - } - - if(mapper == 0x30 && rom_type == 0x05 && company != 0xb2) { - info.dsp1 = true; - } - - if(mapper == 0x31 && (rom_type == 0x03 || rom_type == 0x05)) { - info.dsp1 = true; - } - - if(info.dsp1 == true) { - if((mapper & 0x2f) == 0x20 && size <= 0x100000) { - info.dsp1_mapper = DSP1LoROM1MB; - } else if((mapper & 0x2f) == 0x20) { - info.dsp1_mapper = DSP1LoROM2MB; - } else if((mapper & 0x2f) == 0x21) { - info.dsp1_mapper = DSP1HiROM; - } - } - - if(mapper == 0x20 && rom_type == 0x05) { - info.dsp2 = true; - } - - if(mapper == 0x30 && rom_type == 0x05 && company == 0xb2) { - info.dsp3 = true; - } - - if(mapper == 0x30 && rom_type == 0x03) { - info.dsp4 = true; - } - - if(mapper == 0x30 && rom_type == 0x25) { - info.obc1 = true; - } - - if(mapper == 0x30 && rom_type == 0xf6 && rom_size >= 10) { - info.st010 = true; - } - - if(mapper == 0x30 && rom_type == 0xf6 && rom_size < 10) { - info.st011 = true; - } - - if(mapper == 0x30 && rom_type == 0xf5) { - info.st018 = true; - } - - if(data[index + RamSize] & 7) { - info.ram_size = 1024 << (data[index + RamSize] & 7); - } else { - info.ram_size = 0; - } - - //0, 1, 13 = NTSC; 2 - 12 = PAL - info.region = (region <= 1 || region >= 13) ? NTSC : PAL; -} - -unsigned Cartridge::find_header(const uint8_t *data, unsigned size) const { - unsigned score_lo = score_header(data, size, 0x007fc0); - unsigned score_hi = score_header(data, size, 0x00ffc0); - unsigned score_ex = score_header(data, size, 0x40ffc0); - if(score_ex) score_ex += 4; //favor ExHiROM on images > 32mbits - - if(score_lo >= score_hi && score_lo >= score_ex) { - return 0x007fc0; - } else if(score_hi >= score_ex) { - return 0x00ffc0; - } else { - return 0x40ffc0; - } -} - -unsigned Cartridge::score_header(const uint8_t *data, unsigned size, unsigned addr) const { - if(size < addr + 64) return 0; //image too small to contain header at this location? - int score = 0; - - uint16 resetvector = data[addr + ResetVector] | (data[addr + ResetVector + 1] << 8); - uint16 checksum = data[addr + Checksum ] | (data[addr + Checksum + 1] << 8); - uint16 complement = data[addr + Complement ] | (data[addr + Complement + 1] << 8); - - uint8 resetop = data[(addr & ~0x7fff) | (resetvector & 0x7fff)]; //first opcode executed upon reset - uint8 mapper = data[addr + Mapper] & ~0x10; //mask off irrelevent FastROM-capable bit - - //$00:[000-7fff] contains uninitialized RAM and MMIO. - //reset vector must point to ROM at $00:[8000-ffff] to be considered valid. - if(resetvector < 0x8000) return 0; - - //some images duplicate the header in multiple locations, and others have completely - //invalid header information that cannot be relied upon. - //below code will analyze the first opcode executed at the specified reset vector to - //determine the probability that this is the correct header. - - //most likely opcodes - if(resetop == 0x78 //sei - || resetop == 0x18 //clc (clc; xce) - || resetop == 0x38 //sec (sec; xce) - || resetop == 0x9c //stz $nnnn (stz $4200) - || resetop == 0x4c //jmp $nnnn - || resetop == 0x5c //jml $nnnnnn - ) score += 8; - - //plausible opcodes - if(resetop == 0xc2 //rep #$nn - || resetop == 0xe2 //sep #$nn - || resetop == 0xad //lda $nnnn - || resetop == 0xae //ldx $nnnn - || resetop == 0xac //ldy $nnnn - || resetop == 0xaf //lda $nnnnnn - || resetop == 0xa9 //lda #$nn - || resetop == 0xa2 //ldx #$nn - || resetop == 0xa0 //ldy #$nn - || resetop == 0x20 //jsr $nnnn - || resetop == 0x22 //jsl $nnnnnn - ) score += 4; - - //implausible opcodes - if(resetop == 0x40 //rti - || resetop == 0x60 //rts - || resetop == 0x6b //rtl - || resetop == 0xcd //cmp $nnnn - || resetop == 0xec //cpx $nnnn - || resetop == 0xcc //cpy $nnnn - ) score -= 4; - - //least likely opcodes - if(resetop == 0x00 //brk #$nn - || resetop == 0x02 //cop #$nn - || resetop == 0xdb //stp - || resetop == 0x42 //wdm - || resetop == 0xff //sbc $nnnnnn,x - ) score -= 8; - - //at times, both the header and reset vector's first opcode will match ... - //fallback and rely on info validity in these cases to determine more likely header. - - //a valid checksum is the biggest indicator of a valid header. - if((checksum + complement) == 0xffff && (checksum != 0) && (complement != 0)) score += 4; - - if(addr == 0x007fc0 && mapper == 0x20) score += 2; //0x20 is usually LoROM - if(addr == 0x00ffc0 && mapper == 0x21) score += 2; //0x21 is usually HiROM - if(addr == 0x007fc0 && mapper == 0x22) score += 2; //0x22 is usually ExLoROM - if(addr == 0x40ffc0 && mapper == 0x25) score += 2; //0x25 is usually ExHiROM - - if(data[addr + Company] == 0x33) score += 2; //0x33 indicates extended header - if(data[addr + RomType] < 0x08) score++; - if(data[addr + RomSize] < 0x10) score++; - if(data[addr + RamSize] < 0x08) score++; - if(data[addr + CartRegion] < 14) score++; - - if(score < 0) score = 0; - return score; -} - -#endif diff --git a/tools/bsnes/cart/cart_loader.cpp b/tools/bsnes/cart/cart_loader.cpp deleted file mode 100755 index 283496e..0000000 --- a/tools/bsnes/cart/cart_loader.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#ifdef CART_CPP - -//================ -//Normal cartridge -//================ - -bool Cartridge::load_normal(const char *base) { - uint8_t *data; - unsigned size; - bool patch_applied; - cart.filename = base; - - load_begin(ModeNormal); - if(load_image(base, data, size, patch_applied) == false) return false; - - snes.config.path.current = basepath(cart.filename); - if(patch_applied) set(patched, true); - - cartinfo_t cartinfo; - read_header(cartinfo, cart.rom = data, cart.rom_size = size); - set_cartinfo(cartinfo); - - if(cartinfo.ram_size > 0) { - load_ram(get_filename(base, "srm", snes.config.path.save), cart.ram, cart.ram_size = cartinfo.ram_size, 0xff); - } - - if(cartinfo.srtc || cartinfo.spc7110rtc) { - load_ram(get_filename(base, "rtc", snes.config.path.save), cart.rtc, cart.rtc_size = 20, 0x00); - } - - load_end(); - set(name, basename(base)); - return true; -} - -void Cartridge::unload_normal() { - if(cart.ram) save_file(get_filename(cart.filename, "srm", snes.config.path.save), cart.ram, cart.ram_size); - if(cart.rtc) save_file(get_filename(cart.filename, "rtc", snes.config.path.save), cart.rtc, cart.rtc_size); -} - -//====================== -//BS-X slotted cartridge -//====================== - -bool Cartridge::load_bsx_slotted(const char *base, const char *slot) { - uint8_t *data; - unsigned size; - bool patch_applied; - cart.filename = base; - bs.filename = slot; - - load_begin(ModeBsxSlotted); - if(load_image(base, data, size, patch_applied) == false) return false; - - snes.config.path.current = basepath(cart.filename); - if(patch_applied) set(patched, true); - - cartinfo_t cartinfo; - read_header(cartinfo, cart.rom = data, cart.rom_size = size); - set_cartinfo(cartinfo); - - if(load_image(slot, data, size, patch_applied) == true) { - set(bsx_flash_loaded, true); - if(patch_applied) set(patched, true); - bs.ram = data; - bs.ram_size = size; - } - - if(cartinfo.ram_size > 0) { - load_ram(get_filename(base, "srm", snes.config.path.save), cart.ram, cart.ram_size = cartinfo.ram_size, 0xff); - } - - load_end(); - string filename = basename(base); - if(*slot) filename << " + " << basename(slot); - set(name, filename); - return true; -} - -void Cartridge::unload_bsx_slotted() { - if(cart.ram) save_file(get_filename(cart.filename, "srm", snes.config.path.save), cart.ram, cart.ram_size); -} - -//==================== -//BS-X flash cartridge -//==================== - -bool Cartridge::load_bsx(const char *base, const char *slot) { - uint8_t *data; - unsigned size; - bool patch_applied; - cart.filename = base; - bs.filename = slot; - - load_begin(ModeBsx); - if(load_image(base, data, size, patch_applied) == false) return false; - - snes.config.path.current = basepath(cart.filename); - if(patch_applied) set(patched, true); - - cartinfo_t cartinfo; - read_header(cartinfo, cart.rom = data, cart.rom_size = size); - set_cartinfo(cartinfo); - - cart.ram = 0; - cart.ram_size = 0; - - memset(bsxcart.sram.handle (), 0x00, bsxcart.sram.size ()); - memset(bsxcart.psram.handle(), 0x00, bsxcart.psram.size()); - - if(load_file(get_filename(base, "srm", snes.config.path.save), data, size, CompressionNone) == true) { - memcpy(bsxcart.sram.handle (), data, min(bsxcart.sram.size (), size)); - delete[] data; - } - - if(load_file(get_filename(base, "psr", snes.config.path.save), data, size, CompressionNone) == true) { - memcpy(bsxcart.psram.handle(), data, min(bsxcart.psram.size(), size)); - delete[] data; - } - - if(load_image(slot, data, size, patch_applied) == true) { - set(bsx_flash_loaded, true); - if(patch_applied) set(patched, true); - bs.ram = data; - bs.ram_size = size; - } - - load_end(); - set(name, !*slot ? basename(base) : basename(slot)); - return true; -} - -void Cartridge::unload_bsx() { - save_file(get_filename(cart.filename, "srm", snes.config.path.save), bsxcart.sram.handle (), bsxcart.sram.size ()); - save_file(get_filename(cart.filename, "psr", snes.config.path.save), bsxcart.psram.handle(), bsxcart.psram.size()); -} - -//============================ -//Sufami Turbo flash cartridge -//============================ - -bool Cartridge::load_sufami_turbo(const char *base, const char *slotA, const char *slotB) { - uint8_t *data; - unsigned size; - bool patch_applied; - cart.filename = base; - stA.filename = slotA; - stB.filename = slotB; - - load_begin(ModeSufamiTurbo); - if(load_image(base, data, size, patch_applied) == false) return false; - - snes.config.path.current = basepath(cart.filename); - if(patch_applied) set(patched, true); - - cartinfo_t cartinfo; - read_header(cartinfo, cart.rom = data, cart.rom_size = size); - set_cartinfo(cartinfo); - - if(load_image(slotA, data, size, patch_applied) == true) { - if(patch_applied) set(patched, true); - stA.rom = new(zeromemory) uint8_t[stA.rom_size = 0x100000]; - memcpy(stA.rom, data, min(size, stA.rom_size)); - delete[] data; - - load_ram(get_filename(slotA, "srm", snes.config.path.save), stA.ram, stA.ram_size = 0x020000, 0xff); - } - - if(load_image(slotB, data, size, patch_applied) == true) { - if(patch_applied) set(patched, true); - stB.rom = new(zeromemory) uint8_t[stB.rom_size = 0x100000]; - memcpy(stB.rom, data, min(size, stB.rom_size)); - delete[] data; - - load_ram(get_filename(slotB, "srm", snes.config.path.save), stB.ram, stB.ram_size = 0x020000, 0xff); - } - - load_end(); - string filename; - if(!*slotA && !*slotB) filename << basename(base); - else if( *slotA && !*slotB) filename << basename(slotA); - else if(!*slotA && *slotB) filename << basename(slotB); - else filename << basename(slotA) << " + " << basename(slotB); - set(name, filename); - return true; -} - -void Cartridge::unload_sufami_turbo() { - if(stA.ram) save_file(get_filename(stA.filename, "srm", snes.config.path.save), stA.ram, stA.ram_size); - if(stB.ram) save_file(get_filename(stB.filename, "srm", snes.config.path.save), stB.ram, stB.ram_size); -} - -//================= -//utility functions -//================= - -Cartridge::Type Cartridge::detect_image_type(const char *filename) const { - uint8_t *data; - unsigned size; - bool patch_applied; - if(!load_image(filename, data, size, patch_applied)) return TypeUnknown; - - cartinfo_t info; - read_header(info, data, size); - delete[] data; - return info.type; -} - -bool Cartridge::load_image(const char *filename, uint8_t *&data, unsigned &size, bool &patched) const { - if(!filename || !*filename) return false; - if(!load_file(filename, data, size, CompressionAuto)) return false; - - if((size & 0x7fff) == 512) { - //remove 512-byte header - memmove(data, data + 512, size -= 512); - } - - uint8_t *pdata; - unsigned psize; - if(load_file(get_filename(filename, "ups", snes.config.path.patch), pdata, psize, CompressionInspect) == true) { - apply_patch(pdata, psize, data, size); - delete[] pdata; - patched = true; - } else { - patched = false; - } - - return true; -} - -bool Cartridge::load_ram(const char *filename, uint8_t *&data, unsigned size, uint8_t init) const { - data = new uint8_t[size]; - memset(data, init, size); - - uint8_t *savedata; - unsigned savesize; - if(load_file(filename, savedata, savesize, CompressionNone) == false) return false; - - memcpy(data, savedata, min(size, savesize)); - delete[] savedata; - return true; -} - -#endif diff --git a/tools/bsnes/cc.bat b/tools/bsnes/cc.bat index ecdff18..d8ae3c6 100755 --- a/tools/bsnes/cc.bat +++ b/tools/bsnes/cc.bat @@ -1,3 +1,3 @@ -::@mingw32-make platform=win compiler=mingw32-gcc -@mingw32-make platform=win compiler=mingw32-gcc enable_gzip=true enable_jma=true +@mingw32-make +::@mingw32-make enable_gzip=true enable_jma=true @pause diff --git a/tools/bsnes/cc.sh b/tools/bsnes/cc.sh deleted file mode 100755 index 51da6a6..0000000 --- a/tools/bsnes/cc.sh +++ /dev/null @@ -1,2 +0,0 @@ -make platform=x compiler=gcc -#make platform=x compiler=gcc enable_gzip=true enable_jma=true diff --git a/tools/bsnes/cheat/cheat.cpp b/tools/bsnes/cheat/cheat.cpp index b6f95e3..7bc1131 100755 --- a/tools/bsnes/cheat/cheat.cpp +++ b/tools/bsnes/cheat/cheat.cpp @@ -1,4 +1,7 @@ -#include <../base.hpp> +#include <../base.hpp> + +#define CHEAT_CPP +namespace SNES { Cheat cheat; @@ -178,9 +181,7 @@ void Cheat::disable(unsigned i) { //... //=============================== -bool Cheat::load(const char *fn) { - string data; - if(!data.readfile(fn)) return false; +void Cheat::load(string data) { data.replace("\r\n", "\n"); data.qreplace(" ", ""); @@ -193,21 +194,16 @@ bool Cheat::load(const char *fn) { trim(part[0], "\""); add(part[1] == "enabled", /* code = */ part[2], /* desc = */ part[0]); } - - return true; } -bool Cheat::save(const char *fn) const { - file fp; - if(!fp.open(fn, file::mode_write)) return false; - for(unsigned i = 0; i < code.size(); i++) { - fp.print(string() - << "\"" << code[i].desc << "\", " - << (code[i].enabled ? "enabled, " : "disabled, ") - << code[i].code << "\r\n"); - } - fp.close(); - return true; +string Cheat::save() const { + string data; + for(unsigned i = 0; i < code.size(); i++) { + data << "\"" << code[i].desc << "\", " + << (code[i].enabled ? "enabled, " : "disabled, ") + << code[i].code << "\r\n"; + } + return data; } void Cheat::clear() { @@ -390,3 +386,6 @@ string& Cheat::decode_description(string &desc) const { desc.replace("\\n", "\n"); return desc; } + +}; + diff --git a/tools/bsnes/cheat/cheat.hpp b/tools/bsnes/cheat/cheat.hpp index 58fa8b6..56fef31 100755 --- a/tools/bsnes/cheat/cheat.hpp +++ b/tools/bsnes/cheat/cheat.hpp @@ -38,8 +38,8 @@ public: void enable(unsigned i); void disable(unsigned i); - bool load(const char *fn); - bool save(const char *fn) const; + void load(string data); + string save() const; void clear(); Cheat(); diff --git a/tools/bsnes/chip/bsx/bsx.cpp b/tools/bsnes/chip/bsx/bsx.cpp index 9d4de10..f871597 100755 --- a/tools/bsnes/chip/bsx/bsx.cpp +++ b/tools/bsnes/chip/bsx/bsx.cpp @@ -1,8 +1,10 @@ #include <../base.hpp> -#include <../cart/cart.hpp> -#define BSX_CPP + +#define BSX_CPP +namespace SNES { -#include "bsx.hpp" #include "bsx_base.cpp" #include "bsx_cart.cpp" #include "bsx_flash.cpp" +}; + diff --git a/tools/bsnes/chip/bsx/bsx.hpp b/tools/bsnes/chip/bsx/bsx.hpp index 484cf42..efcaaf7 100755 --- a/tools/bsnes/chip/bsx/bsx.hpp +++ b/tools/bsnes/chip/bsx/bsx.hpp @@ -32,16 +32,10 @@ public: uint8 mmio_read(unsigned addr); void mmio_write(unsigned addr, uint8 data); - MappedRAM sram; - MappedRAM psram; - BSXCart(); ~BSXCart(); private: - uint8 *sram_data; //256kbit SRAM - uint8 *psram_data; // 4mbit PSRAM - struct { uint8 r[16]; } regs; diff --git a/tools/bsnes/chip/bsx/bsx_base.cpp b/tools/bsnes/chip/bsx/bsx_base.cpp index 496150a..2272c17 100755 --- a/tools/bsnes/chip/bsx/bsx_base.cpp +++ b/tools/bsnes/chip/bsx/bsx_base.cpp @@ -1,5 +1,7 @@ #ifdef BSX_CPP +BSXBase bsxbase; + void BSXBase::init() { } @@ -135,3 +137,4 @@ void BSXBase::mmio_write(unsigned addr, uint8 data) { } #endif + diff --git a/tools/bsnes/chip/bsx/bsx_cart.cpp b/tools/bsnes/chip/bsx/bsx_cart.cpp index 68a0758..92d6ead 100755 --- a/tools/bsnes/chip/bsx/bsx_cart.cpp +++ b/tools/bsnes/chip/bsx/bsx_cart.cpp @@ -1,5 +1,7 @@ #ifdef BSX_CPP +BSXCart bsxcart; + void BSXCart::init() { } @@ -20,7 +22,7 @@ void BSXCart::reset() { } void BSXCart::update_memory_map() { - Memory &cart = (regs.r[0x01] & 0x80) == 0x00 ? (Memory&)bsxflash : (Memory&)psram; + Memory &cart = (regs.r[0x01] & 0x80) == 0x00 ? (Memory&)bsxflash : (Memory&)memory::bsxpram; if((regs.r[0x02] & 0x80) == 0x00) { //LoROM mapping @@ -35,16 +37,16 @@ void BSXCart::update_memory_map() { } if(regs.r[0x03] & 0x80) { - bus.map(Bus::MapLinear, 0x60, 0x6f, 0x0000, 0xffff, psram); - //bus.map(Bus::MapLinear, 0x70, 0x77, 0x0000, 0xffff, psram); + bus.map(Bus::MapLinear, 0x60, 0x6f, 0x0000, 0xffff, memory::bsxpram); + //bus.map(Bus::MapLinear, 0x70, 0x77, 0x0000, 0xffff, memory::bsxpram); } if((regs.r[0x05] & 0x80) == 0x00) { - bus.map(Bus::MapLinear, 0x40, 0x4f, 0x0000, 0xffff, psram); + bus.map(Bus::MapLinear, 0x40, 0x4f, 0x0000, 0xffff, memory::bsxpram); } if((regs.r[0x06] & 0x80) == 0x00) { - bus.map(Bus::MapLinear, 0x50, 0x5f, 0x0000, 0xffff, psram); + bus.map(Bus::MapLinear, 0x50, 0x5f, 0x0000, 0xffff, memory::bsxpram); } if(regs.r[0x07] & 0x80) { @@ -55,8 +57,8 @@ void BSXCart::update_memory_map() { bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom); } - bus.map(Bus::MapShadow, 0x20, 0x3f, 0x6000, 0x7fff, psram); - bus.map(Bus::MapLinear, 0x70, 0x77, 0x0000, 0xffff, psram); + bus.map(Bus::MapShadow, 0x20, 0x3f, 0x6000, 0x7fff, memory::bsxpram); + bus.map(Bus::MapLinear, 0x70, 0x77, 0x0000, 0xffff, memory::bsxpram); } uint8 BSXCart::mmio_read(unsigned addr) { @@ -66,7 +68,7 @@ uint8 BSXCart::mmio_read(unsigned addr) { } if((addr & 0xf8f000) == 0x105000) { //$[10-17]:[5000-5fff] SRAM - return sram.read(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff)); + return memory::bsxram.read(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff)); } return 0x00; @@ -81,21 +83,15 @@ void BSXCart::mmio_write(unsigned addr, uint8 data) { } if((addr & 0xf8f000) == 0x105000) { //$[10-17]:[5000-5fff] SRAM - return sram.write(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff), data); + return memory::bsxram.write(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff), data); } } BSXCart::BSXCart() { - sram_data = new uint8_t[ 32 * 1024]; - psram_data = new uint8_t[512 * 1024]; - - sram.map (sram_data, 32 * 1024); - psram.map(psram_data, 512 * 1024); } BSXCart::~BSXCart() { - delete[] sram_data; - delete[] psram_data; } #endif + diff --git a/tools/bsnes/chip/bsx/bsx_flash.cpp b/tools/bsnes/chip/bsx/bsx_flash.cpp index deceb95..dfd7ead 100755 --- a/tools/bsnes/chip/bsx/bsx_flash.cpp +++ b/tools/bsnes/chip/bsx/bsx_flash.cpp @@ -1,5 +1,7 @@ #ifdef BSX_CPP +BSXFlash bsxflash; + void BSXFlash::init() {} void BSXFlash::enable() {} @@ -15,10 +17,11 @@ void BSXFlash::reset() { regs.flash_enable = false; regs.read_enable = false; regs.write_enable = false; + memory::bsxflash.write_protect(!regs.write_enable); } unsigned BSXFlash::size() const { - return memory::bscram.size(); + return memory::bsxflash.size(); } uint8 BSXFlash::read(unsigned addr) { @@ -45,7 +48,7 @@ uint8 BSXFlash::read(unsigned addr) { } } - return memory::bscram.read(addr); + return memory::bsxflash.read(addr); } void BSXFlash::write(unsigned addr, uint8 data) { @@ -64,11 +67,11 @@ void BSXFlash::write(unsigned addr, uint8 data) { regs.write_new = data; if(regs.write_enable && regs.write_old == regs.write_new) { - return memory::bscram.write(addr, data); + return memory::bsxflash.write(addr, data); } } else { if(regs.write_enable) { - return memory::bscram.write(addr, data); + return memory::bsxflash.write(addr, data); } } @@ -107,7 +110,10 @@ void BSXFlash::write(unsigned addr, uint8 data) { regs.read_enable = false; regs.write_enable = false; } + + memory::bsxflash.write_protect(!regs.write_enable); } } #endif + diff --git a/tools/bsnes/chip/chip.hpp b/tools/bsnes/chip/chip.hpp index 1769862..eac962d 100755 --- a/tools/bsnes/chip/chip.hpp +++ b/tools/bsnes/chip/chip.hpp @@ -1,3 +1,5 @@ +#include "sgb/sgb.hpp" +#include "sa1/sa1.hpp" #include "bsx/bsx.hpp" #include "srtc/srtc.hpp" #include "sdd1/sdd1.hpp" diff --git a/tools/bsnes/chip/cx4/cx4.cpp b/tools/bsnes/chip/cx4/cx4.cpp index 963d42c..bfca06d 100755 --- a/tools/bsnes/chip/cx4/cx4.cpp +++ b/tools/bsnes/chip/cx4/cx4.cpp @@ -6,9 +6,12 @@ */ #include <../base.hpp> -#define CX4_CPP + +#define CX4_CPP +namespace SNES { + +Cx4 cx4; -#include "cx4.hpp" #include "cx4data.cpp" #include "cx4fn.cpp" #include "cx4oam.cpp" @@ -30,8 +33,8 @@ uint16 addr = 0x0080 + (r * 3); } void Cx4::mul(uint32 x, uint32 y, uint32 &rl, uint32 &rh) { -int64 rx = x & 0xffffff; -int64 ry = y & 0xffffff; +int64_t rx = x & 0xffffff; +int64_t ry = y & 0xffffff; if(rx & 0x800000)rx |= ~0x7fffff; if(ry & 0x800000)ry |= ~0x7fffff; @@ -195,3 +198,5 @@ void Cx4::reset() { memset(ram, 0, 0x0c00); memset(reg, 0, 0x0100); } +}; + diff --git a/tools/bsnes/chip/dsp1/dsp1.cpp b/tools/bsnes/chip/dsp1/dsp1.cpp index 323c88b..56fdb90 100755 --- a/tools/bsnes/chip/dsp1/dsp1.cpp +++ b/tools/bsnes/chip/dsp1/dsp1.cpp @@ -1,8 +1,10 @@ #include <../base.hpp> -#include <../cart/cart.hpp> -#define DSP1_CPP + +#define DSP1_CPP +namespace SNES { + +DSP1 dsp1; -#include "dsp1.hpp" #include "dsp1emu.cpp" void DSP1::init() {} @@ -57,3 +59,5 @@ void DSP1::write(unsigned addr, uint8 data) { dsp1.setDr(data); } } +}; + diff --git a/tools/bsnes/chip/dsp2/dsp2.cpp b/tools/bsnes/chip/dsp2/dsp2.cpp index de40c0e..5d49663 100755 --- a/tools/bsnes/chip/dsp2/dsp2.cpp +++ b/tools/bsnes/chip/dsp2/dsp2.cpp @@ -1,7 +1,10 @@ #include <../base.hpp> -#define DSP2_CPP + +#define DSP2_CPP +namespace SNES { + +DSP2 dsp2; -#include "dsp2.hpp" #include "dsp2_op.cpp" void DSP2::init() {} @@ -134,3 +137,5 @@ void DSP2::write(unsigned addr, uint8 data) { DSP2::DSP2() {} DSP2::~DSP2() {} +}; + diff --git a/tools/bsnes/chip/dsp3/dsp3.cpp b/tools/bsnes/chip/dsp3/dsp3.cpp index e6c7c7c..896227a 100755 --- a/tools/bsnes/chip/dsp3/dsp3.cpp +++ b/tools/bsnes/chip/dsp3/dsp3.cpp @@ -1,7 +1,10 @@ #include <../base.hpp> -#define DSP3_CPP + +#define DSP3_CPP +namespace SNES { + +DSP3 dsp3; -#include "dsp3.hpp" namespace DSP3i { #define bool8 uint8 #include "dsp3emu.c" @@ -33,3 +36,5 @@ void DSP3::write(unsigned addr, uint8 data) { DSP3i::dsp3_byte = data; DSP3i::DSP3SetByte(); } +}; + diff --git a/tools/bsnes/chip/dsp4/dsp4.cpp b/tools/bsnes/chip/dsp4/dsp4.cpp index aed7caf..74459a8 100755 --- a/tools/bsnes/chip/dsp4/dsp4.cpp +++ b/tools/bsnes/chip/dsp4/dsp4.cpp @@ -1,7 +1,10 @@ #include <../base.hpp> -#define DSP4_CPP + +#define DSP4_CPP +namespace SNES { + +DSP4 dsp4; -#include "dsp4.hpp" namespace DSP4i { inline uint16 READ_WORD(uint8 *addr) { return (addr[0]) + (addr[1] << 8); @@ -53,3 +56,5 @@ void DSP4::write(unsigned addr, uint8 data) { DSP4i::DSP4SetByte(); } } +}; + diff --git a/tools/bsnes/chip/obc1/obc1.cpp b/tools/bsnes/chip/obc1/obc1.cpp index 9606995..4fd555b 100755 --- a/tools/bsnes/chip/obc1/obc1.cpp +++ b/tools/bsnes/chip/obc1/obc1.cpp @@ -1,6 +1,9 @@ #include <../base.hpp> -#include <../cart/cart.hpp> -#include "obc1.hpp" + +#define OBC1_CPP +namespace SNES { + +OBC1 obc1; void OBC1::init() {} void OBC1::enable() {} @@ -21,7 +24,7 @@ uint8 OBC1::read(unsigned addr) { addr &= 0x1fff; if((addr & 0x1ff8) != 0x1ff0) return ram_read(addr); - switch(addr) { default: //never used, avoids compiler warning + switch(addr) { default: //never used, avoids compiler warning case 0x1ff0: return ram_read(status.baseptr + (status.address << 2) + 0); case 0x1ff1: return ram_read(status.baseptr + (status.address << 2) + 1); case 0x1ff2: return ram_read(status.baseptr + (status.address << 2) + 2); @@ -69,4 +72,7 @@ void OBC1::ram_write(unsigned addr, uint8 data) { } OBC1::OBC1() {} -OBC1::~OBC1() {} +OBC1::~OBC1() {} + +}; + diff --git a/tools/bsnes/chip/sdd1/sdd1.cpp b/tools/bsnes/chip/sdd1/sdd1.cpp index 8530b4b..0338b2a 100755 --- a/tools/bsnes/chip/sdd1/sdd1.cpp +++ b/tools/bsnes/chip/sdd1/sdd1.cpp @@ -1,8 +1,10 @@ #include <../base.hpp> -#include <../cart/cart.hpp> -#define SDD1_CPP + +#define SDD1_CPP +namespace SNES { + +SDD1 sdd1; -#include "sdd1.hpp" #include "sdd1emu.cpp" void SDD1::init() {} @@ -11,7 +13,7 @@ void SDD1::enable() { //hook S-CPU DMA MMIO registers to gather information for struct dma[]; //buffer address and transfer size information for use in SDD1::read() for(unsigned i = 0x4300; i <= 0x437f; i++) { - cpu_mmio[i & 0x7f] = memory::mmio.get(i); + cpu_mmio[i & 0x7f] = memory::mmio.mmio[i - 0x2000]; memory::mmio.map(i, *this); } @@ -156,3 +158,5 @@ SDD1::SDD1() { SDD1::~SDD1() { delete[] buffer.data; } +}; + diff --git a/tools/bsnes/chip/spc7110/spc7110.cpp b/tools/bsnes/chip/spc7110/spc7110.cpp index b5c59ae..4620cf9 100755 --- a/tools/bsnes/chip/spc7110/spc7110.cpp +++ b/tools/bsnes/chip/spc7110/spc7110.cpp @@ -1,8 +1,10 @@ #include <../base.hpp> -#include <../cart/cart.hpp> -#define SPC7110_CPP -#include "spc7110.hpp" +#define SPC7110_CPP +namespace SNES { + +SPC7110 spc7110; + #include "decomp.cpp" const unsigned SPC7110::months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; @@ -670,3 +672,6 @@ void SPC7110::write(unsigned addr, uint8 data) { SPC7110::SPC7110() { } + +}; + diff --git a/tools/bsnes/chip/srtc/srtc.cpp b/tools/bsnes/chip/srtc/srtc.cpp index f76ecf4..84b1bc5 100755 --- a/tools/bsnes/chip/srtc/srtc.cpp +++ b/tools/bsnes/chip/srtc/srtc.cpp @@ -1,6 +1,9 @@ #include <../base.hpp> -#include <../cart/cart.hpp> -#include "srtc.hpp" + +#define SRTC_CPP +namespace SNES { + +SRTC srtc; const unsigned SRTC::months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; @@ -224,3 +227,6 @@ void SRTC::mmio_write(unsigned addr, uint8 data) { SRTC::SRTC() { } + +}; + diff --git a/tools/bsnes/chip/st010/st010.cpp b/tools/bsnes/chip/st010/st010.cpp index c0c8f90..b7917b3 100755 --- a/tools/bsnes/chip/st010/st010.cpp +++ b/tools/bsnes/chip/st010/st010.cpp @@ -1,7 +1,10 @@ #include <../base.hpp> + #define ST010_CPP +namespace SNES { + +ST010 st010; -#include "st010.hpp" #include "st010_data.hpp" #include "st010_op.cpp" @@ -85,3 +88,5 @@ void ST010::write(unsigned addr, uint8 data) { ram[0x0021] &= ~0x80; } } +}; + diff --git a/tools/bsnes/clean.bat b/tools/bsnes/clean.bat index 1d563cc..d8bb7e0 100755 --- a/tools/bsnes/clean.bat +++ b/tools/bsnes/clean.bat @@ -1 +1 @@ -@mingw32-make platform=win compiler=mingw32-gcc clean +@mingw32-make clean diff --git a/tools/bsnes/clean.sh b/tools/bsnes/clean.sh deleted file mode 100755 index fddeab6..0000000 --- a/tools/bsnes/clean.sh +++ /dev/null @@ -1 +0,0 @@ -make platform=x compiler=gcc clean diff --git a/tools/bsnes/cpu/cpu.cpp b/tools/bsnes/cpu/cpu.cpp index 0d10758..0984f88 100755 --- a/tools/bsnes/cpu/cpu.cpp +++ b/tools/bsnes/cpu/cpu.cpp @@ -1,10 +1,10 @@ #include <../base.hpp> + #define CPU_CPP - -#include "dcpu.cpp" +namespace SNES { void CPU::power() { - cpu_version = snes.config.cpu.version; + cpu_version = config.cpu.version; } void CPU::reset() { @@ -15,3 +15,5 @@ CPU::CPU() { CPU::~CPU() { } +}; + diff --git a/tools/bsnes/cpu/cpu.hpp b/tools/bsnes/cpu/cpu.hpp index e13a430..a2d85e4 100755 --- a/tools/bsnes/cpu/cpu.hpp +++ b/tools/bsnes/cpu/cpu.hpp @@ -13,62 +13,10 @@ public: virtual uint8 port_read(uint8 port) = 0; virtual void port_write(uint8 port, uint8 value) = 0; - #include "cpuregs.hpp" - regs_t regs; - virtual void scanline() = 0; virtual void power(); virtual void reset(); - /***** - * in opcode-based CPU emulators, the main emulation routine - * will only be able to call the disassemble_opcode() function - * on clean opcode edges. but with cycle-based CPU emulators, - * the CPU may be in the middle of executing an opcode when the - * emulator (e.g. debugger) wants to disassemble an opcode. this - * would mean that important registers may not reflect what they - * did at the start of the opcode (especially regs.pc), so in - * cycle-based emulators, this function should be overridden to - * reflect whether or not an opcode has only been partially - * executed. if not, the debugger should abort attempts to skip, - * disable, or disassemble the current opcode. - *****/ - virtual bool in_opcode() { return false; } - - /***** - * opcode disassembler - *****/ - enum { - OPTYPE_DP = 0, //dp - OPTYPE_DPX, //dp,x - OPTYPE_DPY, //dp,y - OPTYPE_IDP, //(dp) - OPTYPE_IDPX, //(dp,x) - OPTYPE_IDPY, //(dp),y - OPTYPE_ILDP, //[dp] - OPTYPE_ILDPY, //[dp],y - OPTYPE_ADDR, //addr - OPTYPE_ADDRX, //addr,x - OPTYPE_ADDRY, //addr,y - OPTYPE_IADDRX, //(addr,x) - OPTYPE_ILADDR, //[addr] - OPTYPE_LONG, //long - OPTYPE_LONGX, //long, x - OPTYPE_SR, //sr,s - OPTYPE_ISRY, //(sr,s),y - OPTYPE_ADDR_PC, //pbr:addr - OPTYPE_IADDR_PC, //pbr:(addr) - OPTYPE_RELB, //relb - OPTYPE_RELW, //relw - }; - - void disassemble_opcode(char *output); - uint8 dreadb(uint32 addr); - uint16 dreadw(uint32 addr); - uint32 dreadl(uint32 addr); - uint32 decode(uint8 offset_type, uint32 addr); - uint8 opcode_length(); - CPU(); virtual ~CPU(); }; diff --git a/tools/bsnes/cpu/cpuregs.hpp b/tools/bsnes/cpu/cpuregs.hpp deleted file mode 100755 index 88360aa..0000000 --- a/tools/bsnes/cpu/cpuregs.hpp +++ /dev/null @@ -1,74 +0,0 @@ -struct flag_t { - bool n, v, m, x, d, i, z, c; - - inline operator unsigned() const { - return (n << 7) + (v << 6) + (m << 5) + (x << 4) - + (d << 3) + (i << 2) + (z << 1) + (c << 0); - } - - inline unsigned operator=(uint8_t data) { - n = data & 0x80; v = data & 0x40; m = data & 0x20; x = data & 0x10; - d = data & 0x08; i = data & 0x04; z = data & 0x02; c = data & 0x01; - return data; - } - - inline unsigned operator|=(unsigned data) { return operator=(operator unsigned() | data); } - inline unsigned operator^=(unsigned data) { return operator=(operator unsigned() ^ data); } - inline unsigned operator&=(unsigned data) { return operator=(operator unsigned() & data); } - - flag_t() : n(0), v(0), m(0), x(0), d(0), i(0), z(0), c(0) {} -}; - -struct reg16_t { - union { - uint16 w; - struct { uint8 order_lsb2(l, h); }; - }; - - inline operator unsigned() const { return w; } - inline unsigned operator = (unsigned i) { return w = i; } - inline unsigned operator |= (unsigned i) { return w |= i; } - inline unsigned operator ^= (unsigned i) { return w ^= i; } - inline unsigned operator &= (unsigned i) { return w &= i; } - inline unsigned operator <<= (unsigned i) { return w <<= i; } - inline unsigned operator >>= (unsigned i) { return w >>= i; } - inline unsigned operator += (unsigned i) { return w += i; } - inline unsigned operator -= (unsigned i) { return w -= i; } - inline unsigned operator *= (unsigned i) { return w *= i; } - inline unsigned operator /= (unsigned i) { return w /= i; } - inline unsigned operator %= (unsigned i) { return w %= i; } - - reg16_t() : w(0) {} -}; - -struct reg24_t { - union { - uint32 d; - struct { uint16 order_lsb2(w, wh); }; - struct { uint8 order_lsb4(l, h, b, bh); }; - }; - - inline operator unsigned() const { return d; } - inline unsigned operator = (unsigned i) { return d = uclip<24>(i); } - inline unsigned operator |= (unsigned i) { return d = uclip<24>(d | i); } - inline unsigned operator ^= (unsigned i) { return d = uclip<24>(d ^ i); } - inline unsigned operator &= (unsigned i) { return d = uclip<24>(d & i); } - inline unsigned operator <<= (unsigned i) { return d = uclip<24>(d << i); } - inline unsigned operator >>= (unsigned i) { return d = uclip<24>(d >> i); } - inline unsigned operator += (unsigned i) { return d = uclip<24>(d + i); } - inline unsigned operator -= (unsigned i) { return d = uclip<24>(d - i); } - inline unsigned operator *= (unsigned i) { return d = uclip<24>(d * i); } - inline unsigned operator /= (unsigned i) { return d = uclip<24>(d / i); } - inline unsigned operator %= (unsigned i) { return d = uclip<24>(d % i); } - - reg24_t() : d(0) {} -}; - -struct regs_t { - reg24_t pc; - reg16_t a, x, y, s, d; - flag_t p; - uint8_t db, mdr; - bool e; - regs_t() : db(0), mdr(0), e(false) {} -}; diff --git a/tools/bsnes/cpu/dcpu.cpp b/tools/bsnes/cpu/dcpu.cpp deleted file mode 100755 index bf8942a..0000000 --- a/tools/bsnes/cpu/dcpu.cpp +++ /dev/null @@ -1,483 +0,0 @@ -#ifdef CPU_CPP - -uint8 CPU::dreadb(uint32 addr) { - if((addr & 0x40ffff) >= 0x2000 && (addr & 0x40ffff) <= 0x5fff) { - //$[00-3f|80-bf]:[2000-5fff] - //do not read MMIO registers within debugger - return 0x00; - } - return bus.read(addr); -} - -uint16 CPU::dreadw(uint32 addr) { - uint16 r; - r = dreadb((addr + 0) & 0xffffff) << 0; - r |= dreadb((addr + 1) & 0xffffff) << 8; - return r; -} - -uint32 CPU::dreadl(uint32 addr) { - uint32 r; - r = dreadb((addr + 0) & 0xffffff) << 0; - r |= dreadb((addr + 1) & 0xffffff) << 8; - r |= dreadb((addr + 2) & 0xffffff) << 16; - return r; -} - -uint32 CPU::decode(uint8 offset_type, uint32 addr) { - uint32 r = 0; - - switch(offset_type) { - case OPTYPE_DP: - r = (regs.d + (addr & 0xffff)) & 0xffff; - break; - case OPTYPE_DPX: - r = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; - break; - case OPTYPE_DPY: - r = (regs.d + regs.y + (addr & 0xffff)) & 0xffff; - break; - case OPTYPE_IDP: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - r = (regs.db << 16) + dreadw(addr); - break; - case OPTYPE_IDPX: - addr = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; - r = (regs.db << 16) + dreadw(addr); - break; - case OPTYPE_IDPY: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - r = (regs.db << 16) + dreadw(addr) + regs.y; - break; - case OPTYPE_ILDP: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - r = dreadl(addr); - break; - case OPTYPE_ILDPY: - addr = (regs.d + (addr & 0xffff)) & 0xffff; - r = dreadl(addr) + regs.y; - break; - case OPTYPE_ADDR: - r = (regs.db << 16) + (addr & 0xffff); - break; - case OPTYPE_ADDR_PC: - r = (regs.pc.b << 16) + (addr & 0xffff); - break; - case OPTYPE_ADDRX: - r = (regs.db << 16) + (addr & 0xffff) + regs.x; - break; - case OPTYPE_ADDRY: - r = (regs.db << 16) + (addr & 0xffff) + regs.y; - break; - case OPTYPE_IADDR_PC: - r = (regs.pc.b << 16) + (addr & 0xffff); - break; - case OPTYPE_IADDRX: - r = (regs.pc.b << 16) + ((addr + regs.x) & 0xffff); - break; - case OPTYPE_ILADDR: - r = addr; - break; - case OPTYPE_LONG: - r = addr; - break; - case OPTYPE_LONGX: - r = (addr + regs.x); - break; - case OPTYPE_SR: - r = (regs.s + (addr & 0xff)) & 0xffff; - break; - case OPTYPE_ISRY: - addr = (regs.s + (addr & 0xff)) & 0xffff; - r = (regs.db << 16) + dreadw(addr) + regs.y; - break; - case OPTYPE_RELB: - r = (regs.pc.b << 16) + ((regs.pc.w + 2) & 0xffff); - r += int8(addr); - break; - case OPTYPE_RELW: - r = (regs.pc.b << 16) + ((regs.pc.w + 3) & 0xffff); - r += int16(addr); - break; - } - - return(r & 0xffffff); -} - -void CPU::disassemble_opcode(char *output) { - static reg24_t pc; - char t[256]; - char *s = output; - - if(in_opcode() == true) { - strcpy(s, "?????? "); - return; - } - - pc.d = regs.pc.d; - sprintf(s, "%.6x ", (uint32)pc.d); - - uint8 op = dreadb(pc.d); pc.w++; - uint8 op0 = dreadb(pc.d); pc.w++; - uint8 op1 = dreadb(pc.d); pc.w++; - uint8 op2 = dreadb(pc.d); - - #define op8 ((op0)) - #define op16 ((op0) | (op1 << 8)) - #define op24 ((op0) | (op1 << 8) | (op2 << 16)) - #define a8 (regs.e || regs.p.m) - #define x8 (regs.e || regs.p.x) - - switch(op) { - case 0x00: sprintf(t, "brk #$%.2x ", op8); break; - case 0x01: sprintf(t, "ora ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0x02: sprintf(t, "cop #$%.2x ", op8); break; - case 0x03: sprintf(t, "ora $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0x04: sprintf(t, "tsb $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x05: sprintf(t, "ora $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x06: sprintf(t, "asl $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x07: sprintf(t, "ora [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0x08: sprintf(t, "php "); break; - case 0x09: if(a8)sprintf(t, "ora #$%.2x ", op8); - else sprintf(t, "ora #$%.4x ", op16); break; - case 0x0a: sprintf(t, "asl a "); break; - case 0x0b: sprintf(t, "phd "); break; - case 0x0c: sprintf(t, "tsb $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x0d: sprintf(t, "ora $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x0e: sprintf(t, "asl $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x0f: sprintf(t, "ora $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0x10: sprintf(t, "bpl $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0x11: sprintf(t, "ora ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0x12: sprintf(t, "ora ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0x13: sprintf(t, "ora ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0x14: sprintf(t, "trb $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x15: sprintf(t, "ora $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x16: sprintf(t, "asl $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x17: sprintf(t, "ora [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0x18: sprintf(t, "clc "); break; - case 0x19: sprintf(t, "ora $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0x1a: sprintf(t, "inc "); break; - case 0x1b: sprintf(t, "tcs "); break; - case 0x1c: sprintf(t, "trb $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x1d: sprintf(t, "ora $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x1e: sprintf(t, "asl $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x1f: sprintf(t, "ora $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - case 0x20: sprintf(t, "jsr $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR_PC, op16)); break; - case 0x21: sprintf(t, "and ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0x22: sprintf(t, "jsl $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0x23: sprintf(t, "and $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0x24: sprintf(t, "bit $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x25: sprintf(t, "and $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x26: sprintf(t, "rol $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x27: sprintf(t, "and [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0x28: sprintf(t, "plp "); break; - case 0x29: if(a8)sprintf(t, "and #$%.2x ", op8); - else sprintf(t, "and #$%.4x ", op16); break; - case 0x2a: sprintf(t, "rol a "); break; - case 0x2b: sprintf(t, "pld "); break; - case 0x2c: sprintf(t, "bit $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x2d: sprintf(t, "and $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x2e: sprintf(t, "rol $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x2f: sprintf(t, "and $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0x30: sprintf(t, "bmi $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0x31: sprintf(t, "and ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0x32: sprintf(t, "and ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0x33: sprintf(t, "and ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0x34: sprintf(t, "bit $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x35: sprintf(t, "and $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x36: sprintf(t, "rol $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x37: sprintf(t, "and [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0x38: sprintf(t, "sec "); break; - case 0x39: sprintf(t, "and $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0x3a: sprintf(t, "dec "); break; - case 0x3b: sprintf(t, "tsc "); break; - case 0x3c: sprintf(t, "bit $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x3d: sprintf(t, "and $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x3e: sprintf(t, "rol $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x3f: sprintf(t, "and $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - case 0x40: sprintf(t, "rti "); break; - case 0x41: sprintf(t, "eor ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0x42: sprintf(t, "wdm "); break; - case 0x43: sprintf(t, "eor $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0x44: sprintf(t, "mvp $%.2x,$%.2x ", op1, op8); break; - case 0x45: sprintf(t, "eor $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x46: sprintf(t, "lsr $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x47: sprintf(t, "eor [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0x48: sprintf(t, "pha "); break; - case 0x49: if(a8)sprintf(t, "eor #$%.2x ", op8); - else sprintf(t, "eor #$%.4x ", op16); break; - case 0x4a: sprintf(t, "lsr a "); break; - case 0x4b: sprintf(t, "phk "); break; - case 0x4c: sprintf(t, "jmp $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR_PC, op16)); break; - case 0x4d: sprintf(t, "eor $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x4e: sprintf(t, "lsr $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x4f: sprintf(t, "eor $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0x50: sprintf(t, "bvc $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0x51: sprintf(t, "eor ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0x52: sprintf(t, "eor ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0x53: sprintf(t, "eor ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0x54: sprintf(t, "mvn $%.2x,$%.2x ", op1, op8); break; - case 0x55: sprintf(t, "eor $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x56: sprintf(t, "lsr $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x57: sprintf(t, "eor [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0x58: sprintf(t, "cli "); break; - case 0x59: sprintf(t, "eor $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0x5a: sprintf(t, "phy "); break; - case 0x5b: sprintf(t, "tcd "); break; - case 0x5c: sprintf(t, "jml $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0x5d: sprintf(t, "eor $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x5e: sprintf(t, "lsr $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x5f: sprintf(t, "eor $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - case 0x60: sprintf(t, "rts "); break; - case 0x61: sprintf(t, "adc ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0x62: sprintf(t, "per $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x63: sprintf(t, "adc $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0x64: sprintf(t, "stz $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x65: sprintf(t, "adc $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x66: sprintf(t, "ror $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x67: sprintf(t, "adc [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0x68: sprintf(t, "pla "); break; - case 0x69: if(a8)sprintf(t, "adc #$%.2x ", op8); - else sprintf(t, "adc #$%.4x ", op16); break; - case 0x6a: sprintf(t, "ror a "); break; - case 0x6b: sprintf(t, "rtl "); break; - case 0x6c: sprintf(t, "jmp ($%.4x) [$%.6x]", op16, decode(OPTYPE_IADDR_PC, op16)); break; - case 0x6d: sprintf(t, "adc $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x6e: sprintf(t, "ror $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x6f: sprintf(t, "adc $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0x70: sprintf(t, "bvs $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0x71: sprintf(t, "adc ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0x72: sprintf(t, "adc ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0x73: sprintf(t, "adc ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0x74: sprintf(t, "stz $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x75: sprintf(t, "adc $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x76: sprintf(t, "ror $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x77: sprintf(t, "adc [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0x78: sprintf(t, "sei "); break; - case 0x79: sprintf(t, "adc $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0x7a: sprintf(t, "ply "); break; - case 0x7b: sprintf(t, "tdc "); break; - case 0x7c: sprintf(t, "jmp ($%.4x,x) [$%.6x]", op16, decode(OPTYPE_IADDRX, op16)); break; - case 0x7d: sprintf(t, "adc $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x7e: sprintf(t, "ror $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x7f: sprintf(t, "adc $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - case 0x80: sprintf(t, "bra $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0x81: sprintf(t, "sta ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0x82: sprintf(t, "brl $%.4x [$%.6x]", uint16(decode(OPTYPE_RELW, op16)), decode(OPTYPE_RELW, op16)); break; - case 0x83: sprintf(t, "sta $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0x84: sprintf(t, "sty $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x85: sprintf(t, "sta $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x86: sprintf(t, "stx $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0x87: sprintf(t, "sta [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0x88: sprintf(t, "dey "); break; - case 0x89: if(a8)sprintf(t, "bit #$%.2x ", op8); - else sprintf(t, "bit #$%.4x ", op16); break; - case 0x8a: sprintf(t, "txa "); break; - case 0x8b: sprintf(t, "phb "); break; - case 0x8c: sprintf(t, "sty $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x8d: sprintf(t, "sta $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x8e: sprintf(t, "stx $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x8f: sprintf(t, "sta $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0x90: sprintf(t, "bcc $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0x91: sprintf(t, "sta ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0x92: sprintf(t, "sta ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0x93: sprintf(t, "sta ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0x94: sprintf(t, "sty $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x95: sprintf(t, "sta $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0x96: sprintf(t, "stx $%.2x,y [$%.6x]", op8, decode(OPTYPE_DPY, op8)); break; - case 0x97: sprintf(t, "sta [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0x98: sprintf(t, "tya "); break; - case 0x99: sprintf(t, "sta $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0x9a: sprintf(t, "txs "); break; - case 0x9b: sprintf(t, "txy "); break; - case 0x9c: sprintf(t, "stz $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0x9d: sprintf(t, "sta $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x9e: sprintf(t, "stz $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0x9f: sprintf(t, "sta $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - case 0xa0: if(x8)sprintf(t, "ldy #$%.2x ", op8); - else sprintf(t, "ldy #$%.4x ", op16); break; - case 0xa1: sprintf(t, "lda ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0xa2: if(x8)sprintf(t, "ldx #$%.2x ", op8); - else sprintf(t, "ldx #$%.4x ", op16); break; - case 0xa3: sprintf(t, "lda $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0xa4: sprintf(t, "ldy $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xa5: sprintf(t, "lda $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xa6: sprintf(t, "ldx $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xa7: sprintf(t, "lda [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0xa8: sprintf(t, "tay "); break; - case 0xa9: if(a8)sprintf(t, "lda #$%.2x ", op8); - else sprintf(t, "lda #$%.4x ", op16); break; - case 0xaa: sprintf(t, "tax "); break; - case 0xab: sprintf(t, "plb "); break; - case 0xac: sprintf(t, "ldy $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xad: sprintf(t, "lda $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xae: sprintf(t, "ldx $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xaf: sprintf(t, "lda $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0xb0: sprintf(t, "bcs $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0xb1: sprintf(t, "lda ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0xb2: sprintf(t, "lda ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0xb3: sprintf(t, "lda ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0xb4: sprintf(t, "ldy $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0xb5: sprintf(t, "lda $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0xb6: sprintf(t, "ldx $%.2x,y [$%.6x]", op8, decode(OPTYPE_DPY, op8)); break; - case 0xb7: sprintf(t, "lda [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0xb8: sprintf(t, "clv "); break; - case 0xb9: sprintf(t, "lda $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0xba: sprintf(t, "tsx "); break; - case 0xbb: sprintf(t, "tyx "); break; - case 0xbc: sprintf(t, "ldy $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0xbd: sprintf(t, "lda $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0xbe: sprintf(t, "ldx $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0xbf: sprintf(t, "lda $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - case 0xc0: if(x8)sprintf(t, "cpy #$%.2x ", op8); - else sprintf(t, "cpy #$%.4x ", op16); break; - case 0xc1: sprintf(t, "cmp ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0xc2: sprintf(t, "rep #$%.2x ", op8); break; - case 0xc3: sprintf(t, "cmp $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0xc4: sprintf(t, "cpy $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xc5: sprintf(t, "cmp $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xc6: sprintf(t, "dec $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xc7: sprintf(t, "cmp [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0xc8: sprintf(t, "iny "); break; - case 0xc9: if(a8)sprintf(t, "cmp #$%.2x ", op8); - else sprintf(t, "cmp #$%.4x ", op16); break; - case 0xca: sprintf(t, "dex "); break; - case 0xcb: sprintf(t, "wai "); break; - case 0xcc: sprintf(t, "cpy $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xcd: sprintf(t, "cmp $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xce: sprintf(t, "dec $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xcf: sprintf(t, "cmp $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0xd0: sprintf(t, "bne $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0xd1: sprintf(t, "cmp ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0xd2: sprintf(t, "cmp ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0xd3: sprintf(t, "cmp ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0xd4: sprintf(t, "pei ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0xd5: sprintf(t, "cmp $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0xd6: sprintf(t, "dec $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0xd7: sprintf(t, "cmp [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0xd8: sprintf(t, "cld "); break; - case 0xd9: sprintf(t, "cmp $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0xda: sprintf(t, "phx "); break; - case 0xdb: sprintf(t, "stp "); break; - case 0xdc: sprintf(t, "jmp [$%.4x] [$%.6x]", op16, decode(OPTYPE_ILADDR, op16)); break; - case 0xdd: sprintf(t, "cmp $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0xde: sprintf(t, "dec $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0xdf: sprintf(t, "cmp $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - case 0xe0: if(x8)sprintf(t, "cpx #$%.2x ", op8); - else sprintf(t, "cpx #$%.4x ", op16); break; - case 0xe1: sprintf(t, "sbc ($%.2x,x) [$%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; - case 0xe2: sprintf(t, "sep #$%.2x ", op8); break; - case 0xe3: sprintf(t, "sbc $%.2x,s [$%.6x]", op8, decode(OPTYPE_SR, op8)); break; - case 0xe4: sprintf(t, "cpx $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xe5: sprintf(t, "sbc $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xe6: sprintf(t, "inc $%.2x [$%.6x]", op8, decode(OPTYPE_DP, op8)); break; - case 0xe7: sprintf(t, "sbc [$%.2x] [$%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; - case 0xe8: sprintf(t, "inx "); break; - case 0xe9: if(a8)sprintf(t, "sbc #$%.2x ", op8); - else sprintf(t, "sbc #$%.4x ", op16); break; - case 0xea: sprintf(t, "nop "); break; - case 0xeb: sprintf(t, "xba "); break; - case 0xec: sprintf(t, "cpx $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xed: sprintf(t, "sbc $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xee: sprintf(t, "inc $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xef: sprintf(t, "sbc $%.6x [$%.6x]", op24, decode(OPTYPE_LONG, op24)); break; - case 0xf0: sprintf(t, "beq $%.4x [$%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; - case 0xf1: sprintf(t, "sbc ($%.2x),y [$%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; - case 0xf2: sprintf(t, "sbc ($%.2x) [$%.6x]", op8, decode(OPTYPE_IDP, op8)); break; - case 0xf3: sprintf(t, "sbc ($%.2x,s),y [$%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; - case 0xf4: sprintf(t, "pea $%.4x [$%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; - case 0xf5: sprintf(t, "sbc $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0xf6: sprintf(t, "inc $%.2x,x [$%.6x]", op8, decode(OPTYPE_DPX, op8)); break; - case 0xf7: sprintf(t, "sbc [$%.2x],y [$%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; - case 0xf8: sprintf(t, "sed "); break; - case 0xf9: sprintf(t, "sbc $%.4x,y [$%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; - case 0xfa: sprintf(t, "plx "); break; - case 0xfb: sprintf(t, "xce "); break; - case 0xfc: sprintf(t, "jsr ($%.4x,x) [$%.6x]", op16, decode(OPTYPE_IADDRX, op16)); break; - case 0xfd: sprintf(t, "sbc $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0xfe: sprintf(t, "inc $%.4x,x [$%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; - case 0xff: sprintf(t, "sbc $%.6x,x [$%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; - } - - #undef op8 - #undef op16 - #undef op24 - #undef a8 - #undef x8 - - strcat(s, t); - strcat(s, " "); - - sprintf(t, "A:%.4x X:%.4x Y:%.4x S:%.4x D:%.4x DB:%.2x ", - regs.a.w, regs.x.w, regs.y.w, regs.s.w, regs.d.w, regs.db); - strcat(s, t); - - if(regs.e) { - sprintf(t, "%c%c%c%c%c%c%c%c", - regs.p.n ? 'N' : 'n', regs.p.v ? 'V' : 'v', - regs.p.m ? '1' : '0', regs.p.x ? 'B' : 'b', - regs.p.d ? 'D' : 'd', regs.p.i ? 'I' : 'i', - regs.p.z ? 'Z' : 'z', regs.p.c ? 'C' : 'c'); - } else { - sprintf(t, "%c%c%c%c%c%c%c%c", - regs.p.n ? 'N' : 'n', regs.p.v ? 'V' : 'v', - regs.p.m ? 'M' : 'm', regs.p.x ? 'X' : 'x', - regs.p.d ? 'D' : 'd', regs.p.i ? 'I' : 'i', - regs.p.z ? 'Z' : 'z', regs.p.c ? 'C' : 'c'); - } - - strcat(s, t); - strcat(s, " "); - - sprintf(t, "V:%3d H:%4d", ppu.vcounter(), ppu.hcounter()); - strcat(s, t); -} - -//opcode_length() retrieves the length of the next opcode -//to be executed. It is used by the debugger to step over, -//disable and proceed cpu opcodes. -// -//5 and 6 are special cases, 5 is used for #consts based on -//the A register size, 6 for the X/Y register size. the -//rest are literal sizes. There's no need to test for -//emulation mode, as regs.p.m/regs.p.x should *always* be -//set in emulation mode. - -uint8 CPU::opcode_length() { - uint8 op, len; - static uint8 op_len_tbl[256] = { - //0,1,2,3, 4,5,6,7, 8,9,a,b, c,d,e,f - - 2,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x0n - 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x1n - 3,2,4,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x2n - 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x3n - - 1,2,2,2, 3,2,2,2, 1,5,1,1, 3,3,3,4, //0x4n - 2,2,2,2, 3,2,2,2, 1,3,1,1, 4,3,3,4, //0x5n - 1,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x6n - 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x7n - - 2,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x8n - 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x9n - 6,2,6,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xan - 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xbn - - 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xcn - 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xdn - 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xen - 2,2,2,2, 3,2,2,2, 1,3,1,1, 3,3,3,4 //0xfn - }; - - if(in_opcode() == true) { - return 0; - } - - op = dreadb(regs.pc.d); - len = op_len_tbl[op]; - if(len == 5) return (regs.e || regs.p.m) ? 2 : 3; - if(len == 6) return (regs.e || regs.p.x) ? 2 : 3; - return len; -} - -#endif //ifdef CPU_CPP diff --git a/tools/bsnes/cpu/scpu/core/cc.sh b/tools/bsnes/cpu/scpu/core/cc.sh deleted file mode 100755 index 97971d7..0000000 --- a/tools/bsnes/cpu/scpu/core/cc.sh +++ /dev/null @@ -1,4 +0,0 @@ -g++ -c scpugen.cpp -I../../../lib -g++ -c ../../../lib/nall/string.cpp -I../../../lib -g++ -o scpugen scpugen.o string.o -rm *.o diff --git a/tools/bsnes/cpu/scpu/core/clean.sh b/tools/bsnes/cpu/scpu/core/clean.sh deleted file mode 100755 index 33da881..0000000 --- a/tools/bsnes/cpu/scpu/core/clean.sh +++ /dev/null @@ -1 +0,0 @@ -rm scpugen diff --git a/tools/bsnes/cpu/scpu/core/core.cpp b/tools/bsnes/cpu/scpu/core/core.cpp deleted file mode 100755 index b746d6b..0000000 --- a/tools/bsnes/cpu/scpu/core/core.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#ifdef SCPU_CPP - -#include "opfn.cpp" - -void sCPU::enter() { - initialize: - //initial latch values for $213c/$213d - //[x]0035 : [y]0000 (53.0 -> 212) [lda $2137] - //[x]0038 : [y]0000 (56.5 -> 226) [nop : lda $2137] - add_clocks(186); - - loop: - if(status.interrupt_pending) { - status.interrupt_pending = false; - if(status.nmi_pending) { - status.nmi_pending = false; - status.interrupt_vector = (regs.e == false ? 0xffea : 0xfffa); - } else if(status.irq_pending) { - status.irq_pending = false; - status.interrupt_vector = (regs.e == false ? 0xffee : 0xfffe); - } - op_irq(); - } - - tracer.trace_cpuop(); //traces CPU opcode (only if tracer is enabled) - - status.in_opcode = true; - switch(op_readpc()) { - #include "op_read.cpp" - #include "op_write.cpp" - #include "op_rmw.cpp" - #include "op_pc.cpp" - #include "op_misc.cpp" - } - status.in_opcode = false; - - goto loop; -} - -void sCPU::op_irq() { - op_read(regs.pc.d); - op_io(); - if(!regs.e) op_writestack(regs.pc.b); - op_writestack(regs.pc.h); - op_writestack(regs.pc.l); - op_writestack(regs.e ? (regs.p & ~0x10) : regs.p); - rd.l = op_read(status.interrupt_vector + 0); - regs.pc.b = 0x00; - regs.p.i = 1; - regs.p.d = 0; - rd.h = op_read(status.interrupt_vector + 1); - regs.pc.w = rd.w; -} - -//immediate, 2-cycle opcodes with I/O cycle will become bus read -//when an IRQ is to be triggered immediately after opcode completion -//this affects the following opcodes: -// clc, cld, cli, clv, sec, sed, sei, -// tax, tay, txa, txy, tya, tyx, -// tcd, tcs, tdc, tsc, tsx, txs, -// inc, inx, iny, dec, dex, dey, -// asl, lsr, rol, ror, nop, xce. -alwaysinline void sCPU::op_io_irq() { - if(status.interrupt_pending) { - //IRQ pending, modify I/O cycle to bus read cycle, do not increment PC - op_read(regs.pc.d); - } else { - op_io(); - } -} - -alwaysinline void sCPU::op_io_cond2() { - if(regs.d.l != 0x00) { - op_io(); - } -} - -alwaysinline void sCPU::op_io_cond4(uint16 x, uint16 y) { - if(!regs.p.x || (x & 0xff00) != (y & 0xff00)) { - op_io(); - } -} - -alwaysinline void sCPU::op_io_cond6(uint16 addr) { - if(regs.e && (regs.pc.w & 0xff00) != (addr & 0xff00)) { - op_io(); - } -} - -#endif diff --git a/tools/bsnes/cpu/scpu/core/core.hpp b/tools/bsnes/cpu/scpu/core/core.hpp deleted file mode 100755 index 945c917..0000000 --- a/tools/bsnes/cpu/scpu/core/core.hpp +++ /dev/null @@ -1,54 +0,0 @@ - reg24_t aa, rd; - uint8_t dp, sp; - - void op_irq(); - - inline bool in_opcode() { return status.in_opcode; } - - //op_read - void op_adc_b(); - void op_adc_w(); - void op_and_b(); - void op_and_w(); - void op_bit_b(); - void op_bit_w(); - void op_cmp_b(); - void op_cmp_w(); - void op_cpx_b(); - void op_cpx_w(); - void op_cpy_b(); - void op_cpy_w(); - void op_eor_b(); - void op_eor_w(); - void op_lda_b(); - void op_lda_w(); - void op_ldx_b(); - void op_ldx_w(); - void op_ldy_b(); - void op_ldy_w(); - void op_ora_b(); - void op_ora_w(); - void op_sbc_b(); - void op_sbc_w(); - //op_rmw - void op_inc_b(); - void op_inc_w(); - void op_dec_b(); - void op_dec_w(); - void op_asl_b(); - void op_asl_w(); - void op_lsr_b(); - void op_lsr_w(); - void op_rol_b(); - void op_rol_w(); - void op_ror_b(); - void op_ror_w(); - void op_trb_b(); - void op_trb_w(); - void op_tsb_b(); - void op_tsb_w(); - - void op_io_irq(); - void op_io_cond2(); - void op_io_cond4(uint16 x, uint16 y); - void op_io_cond6(uint16 addr); diff --git a/tools/bsnes/cpu/scpu/core/op_misc.b b/tools/bsnes/cpu/scpu/core/op_misc.b deleted file mode 100755 index 491b14a..0000000 --- a/tools/bsnes/cpu/scpu/core/op_misc.b +++ /dev/null @@ -1,298 +0,0 @@ -nop(0xea) { -1:last_cycle(); - op_io_irq(); -} - -wdm(0x42) { -1:last_cycle(); - op_readpc(); -} - -xba(0xeb) { -1:op_io(); -2:last_cycle(); - op_io(); - regs.a.l ^= regs.a.h; - regs.a.h ^= regs.a.l; - regs.a.l ^= regs.a.h; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); -} - -mvn(0x54, ++), -mvp(0x44, --) { -1:dp = op_readpc(); -2:sp = op_readpc(); -3:regs.db = dp; - rd.l = op_readlong((sp << 16) | regs.x.w); -4:op_writelong((dp << 16) | regs.y.w, rd.l); -5:op_io(); - if(regs.p.x) { - regs.x.l $1; - regs.y.l $1; - } else { - regs.x.w $1; - regs.y.w $1; - } -6:last_cycle(); - op_io(); - if(regs.a.w--) regs.pc.w -= 3; -} - -brk(0x00, 0xfffe, 0xffff, 0xffe6, 0xffe7), -cop(0x02, 0xfff4, 0xfff5, 0xffe4, 0xffe5) { -1:op_readpc(); -2:if(!regs.e) op_writestack(regs.pc.b); -3:op_writestack(regs.pc.h); -4:op_writestack(regs.pc.l); -5:op_writestack(regs.p); -6:rd.l = op_readlong(regs.e ? $1 : $3); - regs.pc.b = 0x00; - regs.p.i = 1; - regs.p.d = 0; -7:last_cycle(); - rd.h = op_readlong(regs.e ? $2 : $4); - regs.pc.w = rd.w; -} - -stp(0xdb) { -1:op_io(); -2:last_cycle(); - while(true) op_io(); -} - -wai(0xcb) { -//last_cycle() will clear status.wai_lock once an NMI / IRQ edge is reached -1:status.wai_lock = true; - while(status.wai_lock) { - last_cycle(); - op_io(); - } -2:op_io(); -} - -xce(0xfb) { -1:last_cycle(); - op_io_irq(); - bool carry = regs.p.c; - regs.p.c = regs.e; - regs.e = carry; - if(regs.e) { - regs.p |= 0x30; - regs.s.h = 0x01; - } - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -} - -clc(0x18, regs.p.c = 0), -cld(0xd8, regs.p.d = 0), -cli(0x58, regs.p.i = 0), -clv(0xb8, regs.p.v = 0), -sec(0x38, regs.p.c = 1), -sed(0xf8, regs.p.d = 1), -sei(0x78, regs.p.i = 1) { -1:last_cycle(); - op_io_irq(); - $1; -} - -rep(0xc2, &=~), -sep(0xe2, |=) { -1:rd.l = op_readpc(); -2:last_cycle(); - op_io(); - regs.p $1 rd.l; - if(regs.e) regs.p |= 0x30; - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -} - -tax(0xaa, regs.p.x, x, a), -tay(0xa8, regs.p.x, y, a), -txa(0x8a, regs.p.m, a, x), -txy(0x9b, regs.p.x, y, x), -tya(0x98, regs.p.m, a, y), -tyx(0xbb, regs.p.x, x, y) { -1:last_cycle(); - op_io_irq(); - if($1) { - regs.$2.l = regs.$3.l; - regs.p.n = !!(regs.$2.l & 0x80); - regs.p.z = (regs.$2.l == 0); - } else { - regs.$2.w = regs.$3.w; - regs.p.n = !!(regs.$2.w & 0x8000); - regs.p.z = (regs.$2.w == 0); - } -} - -tcd(0x5b) { -1:last_cycle(); - op_io_irq(); - regs.d.w = regs.a.w; - regs.p.n = !!(regs.d.w & 0x8000); - regs.p.z = (regs.d.w == 0); -} - -tcs(0x1b) { -1:last_cycle(); - op_io_irq(); - regs.s.w = regs.a.w; - if(regs.e) regs.s.h = 0x01; -} - -tdc(0x7b) { -1:last_cycle(); - op_io_irq(); - regs.a.w = regs.d.w; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); -} - -tsc(0x3b) { -1:last_cycle(); - op_io_irq(); - regs.a.w = regs.s.w; - if(regs.e) { - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} - -tsx(0xba) { -1:last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.x.l = regs.s.l; - regs.p.n = !!(regs.x.l & 0x80); - regs.p.z = (regs.x.l == 0); - } else { - regs.x.w = regs.s.w; - regs.p.n = !!(regs.x.w & 0x8000); - regs.p.z = (regs.x.w == 0); - } -} - -txs(0x9a) { -1:last_cycle(); - op_io_irq(); - if(regs.e) { - regs.s.l = regs.x.l; - } else { - regs.s.w = regs.x.w; - } -} - -pha(0x48, regs.p.m, a), -phx(0xda, regs.p.x, x), -phy(0x5a, regs.p.x, y) { -1:op_io(); -2:if(!$1)op_writestack(regs.$2.h); -3:last_cycle(); - op_writestack(regs.$2.l); -} - -phd(0x0b) { -1:op_io(); -2:op_writestackn(regs.d.h); -3:last_cycle(); - op_writestackn(regs.d.l); - if(regs.e) regs.s.h = 0x01; -} - -phb(0x8b, regs.db), -phk(0x4b, regs.pc.b), -php(0x08, regs.p) { -1:op_io(); -2:last_cycle(); - op_writestack($1); -} - -pla(0x68, regs.p.m, a), -plx(0xfa, regs.p.x, x), -ply(0x7a, regs.p.x, y) { -1:op_io(); -2:op_io(); -3:if($1)last_cycle(); - regs.$2.l = op_readstack(); - if($1) { - regs.p.n = !!(regs.$2.l & 0x80); - regs.p.z = (regs.$2.l == 0); - end; - } -4:last_cycle(); - regs.$2.h = op_readstack(); - regs.p.n = !!(regs.$2.w & 0x8000); - regs.p.z = (regs.$2.w == 0); -} - -pld(0x2b) { -1:op_io(); -2:op_io(); -3:regs.d.l = op_readstackn(); -4:last_cycle(); - regs.d.h = op_readstackn(); - regs.p.n = !!(regs.d.w & 0x8000); - regs.p.z = (regs.d.w == 0); - if(regs.e) regs.s.h = 0x01; -} - -plb(0xab) { -1:op_io(); -2:op_io(); -3:last_cycle(); - regs.db = op_readstack(); - regs.p.n = !!(regs.db & 0x80); - regs.p.z = (regs.db == 0); -} - -plp(0x28) { -1:op_io(); -2:op_io(); -3:last_cycle(); - regs.p = op_readstack(); - if(regs.e) regs.p |= 0x30; - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -} - -pea(0xf4) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_writestackn(aa.h); -4:last_cycle(); - op_writestackn(aa.l); - if(regs.e) regs.s.h = 0x01; -} - -pei(0xd4) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:op_writestackn(aa.h); -6:last_cycle(); - op_writestackn(aa.l); - if(regs.e) regs.s.h = 0x01; -} - -per(0x62) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io(); - rd.w = regs.pc.d + (int16)aa.w; -4:op_writestackn(rd.h); -5:last_cycle(); - op_writestackn(rd.l); - if(regs.e) regs.s.h = 0x01; -} diff --git a/tools/bsnes/cpu/scpu/core/op_misc.cpp b/tools/bsnes/cpu/scpu/core/op_misc.cpp deleted file mode 100755 index ef1fc98..0000000 --- a/tools/bsnes/cpu/scpu/core/op_misc.cpp +++ /dev/null @@ -1,539 +0,0 @@ -#ifdef SCPU_CPP - -//nop -case 0xea: { - last_cycle(); - op_io_irq(); -} break; - -//wdm -case 0x42: { - last_cycle(); - op_readpc(); -} break; - -//xba -case 0xeb: { - op_io(); - last_cycle(); - op_io(); - regs.a.l ^= regs.a.h; - regs.a.h ^= regs.a.l; - regs.a.l ^= regs.a.h; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); -} break; - -//mvn -case 0x54: { - dp = op_readpc(); - sp = op_readpc(); - regs.db = dp; - rd.l = op_readlong((sp << 16) | regs.x.w); - op_writelong((dp << 16) | regs.y.w, rd.l); - op_io(); - if(regs.p.x) { - regs.x.l ++; - regs.y.l ++; - } else { - regs.x.w ++; - regs.y.w ++; - } - last_cycle(); - op_io(); - if(regs.a.w--) regs.pc.w -= 3; -} break; - -//mvp -case 0x44: { - dp = op_readpc(); - sp = op_readpc(); - regs.db = dp; - rd.l = op_readlong((sp << 16) | regs.x.w); - op_writelong((dp << 16) | regs.y.w, rd.l); - op_io(); - if(regs.p.x) { - regs.x.l --; - regs.y.l --; - } else { - regs.x.w --; - regs.y.w --; - } - last_cycle(); - op_io(); - if(regs.a.w--) regs.pc.w -= 3; -} break; - -//brk -case 0x00: { - op_readpc(); - if(!regs.e) op_writestack(regs.pc.b); - op_writestack(regs.pc.h); - op_writestack(regs.pc.l); - op_writestack(regs.p); - rd.l = op_readlong(regs.e ? 0xfffe : 0xffe6); - regs.pc.b = 0x00; - regs.p.i = 1; - regs.p.d = 0; - last_cycle(); - rd.h = op_readlong(regs.e ? 0xffff : 0xffe7); - regs.pc.w = rd.w; -} break; - -//cop -case 0x02: { - op_readpc(); - if(!regs.e) op_writestack(regs.pc.b); - op_writestack(regs.pc.h); - op_writestack(regs.pc.l); - op_writestack(regs.p); - rd.l = op_readlong(regs.e ? 0xfff4 : 0xffe4); - regs.pc.b = 0x00; - regs.p.i = 1; - regs.p.d = 0; - last_cycle(); - rd.h = op_readlong(regs.e ? 0xfff5 : 0xffe5); - regs.pc.w = rd.w; -} break; - -//stp -case 0xdb: { - op_io(); - last_cycle(); - while(true) op_io(); -} break; - -//wai -case 0xcb: { - //last_cycle() will clear status.wai_lock once an NMI / IRQ edge is reached - status.wai_lock = true; - while(status.wai_lock) { - last_cycle(); - op_io(); - } - op_io(); -} break; - -//xce -case 0xfb: { - last_cycle(); - op_io_irq(); - bool carry = regs.p.c; - regs.p.c = regs.e; - regs.e = carry; - if(regs.e) { - regs.p |= 0x30; - regs.s.h = 0x01; - } - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -} break; - -//clc -case 0x18: { - last_cycle(); - op_io_irq(); - regs.p.c = 0; -} break; - -//cld -case 0xd8: { - last_cycle(); - op_io_irq(); - regs.p.d = 0; -} break; - -//cli -case 0x58: { - last_cycle(); - op_io_irq(); - regs.p.i = 0; -} break; - -//clv -case 0xb8: { - last_cycle(); - op_io_irq(); - regs.p.v = 0; -} break; - -//sec -case 0x38: { - last_cycle(); - op_io_irq(); - regs.p.c = 1; -} break; - -//sed -case 0xf8: { - last_cycle(); - op_io_irq(); - regs.p.d = 1; -} break; - -//sei -case 0x78: { - last_cycle(); - op_io_irq(); - regs.p.i = 1; -} break; - -//rep -case 0xc2: { - rd.l = op_readpc(); - last_cycle(); - op_io(); - regs.p &=~ rd.l; - if(regs.e) regs.p |= 0x30; - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -} break; - -//sep -case 0xe2: { - rd.l = op_readpc(); - last_cycle(); - op_io(); - regs.p |= rd.l; - if(regs.e) regs.p |= 0x30; - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -} break; - -//tax -case 0xaa: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.x.l = regs.a.l; - regs.p.n = !!(regs.x.l & 0x80); - regs.p.z = (regs.x.l == 0); - } else { - regs.x.w = regs.a.w; - regs.p.n = !!(regs.x.w & 0x8000); - regs.p.z = (regs.x.w == 0); - } -} break; - -//tay -case 0xa8: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.y.l = regs.a.l; - regs.p.n = !!(regs.y.l & 0x80); - regs.p.z = (regs.y.l == 0); - } else { - regs.y.w = regs.a.w; - regs.p.n = !!(regs.y.w & 0x8000); - regs.p.z = (regs.y.w == 0); - } -} break; - -//txa -case 0x8a: { - last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.a.l = regs.x.l; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.a.w = regs.x.w; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//txy -case 0x9b: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.y.l = regs.x.l; - regs.p.n = !!(regs.y.l & 0x80); - regs.p.z = (regs.y.l == 0); - } else { - regs.y.w = regs.x.w; - regs.p.n = !!(regs.y.w & 0x8000); - regs.p.z = (regs.y.w == 0); - } -} break; - -//tya -case 0x98: { - last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.a.l = regs.y.l; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.a.w = regs.y.w; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//tyx -case 0xbb: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.x.l = regs.y.l; - regs.p.n = !!(regs.x.l & 0x80); - regs.p.z = (regs.x.l == 0); - } else { - regs.x.w = regs.y.w; - regs.p.n = !!(regs.x.w & 0x8000); - regs.p.z = (regs.x.w == 0); - } -} break; - -//tcd -case 0x5b: { - last_cycle(); - op_io_irq(); - regs.d.w = regs.a.w; - regs.p.n = !!(regs.d.w & 0x8000); - regs.p.z = (regs.d.w == 0); -} break; - -//tcs -case 0x1b: { - last_cycle(); - op_io_irq(); - regs.s.w = regs.a.w; - if(regs.e) regs.s.h = 0x01; -} break; - -//tdc -case 0x7b: { - last_cycle(); - op_io_irq(); - regs.a.w = regs.d.w; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); -} break; - -//tsc -case 0x3b: { - last_cycle(); - op_io_irq(); - regs.a.w = regs.s.w; - if(regs.e) { - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//tsx -case 0xba: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.x.l = regs.s.l; - regs.p.n = !!(regs.x.l & 0x80); - regs.p.z = (regs.x.l == 0); - } else { - regs.x.w = regs.s.w; - regs.p.n = !!(regs.x.w & 0x8000); - regs.p.z = (regs.x.w == 0); - } -} break; - -//txs -case 0x9a: { - last_cycle(); - op_io_irq(); - if(regs.e) { - regs.s.l = regs.x.l; - } else { - regs.s.w = regs.x.w; - } -} break; - -//pha -case 0x48: { - op_io(); - if(!regs.p.m)op_writestack(regs.a.h); - last_cycle(); - op_writestack(regs.a.l); -} break; - -//phx -case 0xda: { - op_io(); - if(!regs.p.x)op_writestack(regs.x.h); - last_cycle(); - op_writestack(regs.x.l); -} break; - -//phy -case 0x5a: { - op_io(); - if(!regs.p.x)op_writestack(regs.y.h); - last_cycle(); - op_writestack(regs.y.l); -} break; - -//phd -case 0x0b: { - op_io(); - op_writestackn(regs.d.h); - last_cycle(); - op_writestackn(regs.d.l); - if(regs.e) regs.s.h = 0x01; -} break; - -//phb -case 0x8b: { - op_io(); - last_cycle(); - op_writestack(regs.db); -} break; - -//phk -case 0x4b: { - op_io(); - last_cycle(); - op_writestack(regs.pc.b); -} break; - -//php -case 0x08: { - op_io(); - last_cycle(); - op_writestack(regs.p); -} break; - -//pla -case 0x68: { - op_io(); - op_io(); - if(regs.p.m)last_cycle(); - regs.a.l = op_readstack(); - if(regs.p.m) { - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - break; - } - last_cycle(); - regs.a.h = op_readstack(); - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); -} break; - -//plx -case 0xfa: { - op_io(); - op_io(); - if(regs.p.x)last_cycle(); - regs.x.l = op_readstack(); - if(regs.p.x) { - regs.p.n = !!(regs.x.l & 0x80); - regs.p.z = (regs.x.l == 0); - break; - } - last_cycle(); - regs.x.h = op_readstack(); - regs.p.n = !!(regs.x.w & 0x8000); - regs.p.z = (regs.x.w == 0); -} break; - -//ply -case 0x7a: { - op_io(); - op_io(); - if(regs.p.x)last_cycle(); - regs.y.l = op_readstack(); - if(regs.p.x) { - regs.p.n = !!(regs.y.l & 0x80); - regs.p.z = (regs.y.l == 0); - break; - } - last_cycle(); - regs.y.h = op_readstack(); - regs.p.n = !!(regs.y.w & 0x8000); - regs.p.z = (regs.y.w == 0); -} break; - -//pld -case 0x2b: { - op_io(); - op_io(); - regs.d.l = op_readstackn(); - last_cycle(); - regs.d.h = op_readstackn(); - regs.p.n = !!(regs.d.w & 0x8000); - regs.p.z = (regs.d.w == 0); - if(regs.e) regs.s.h = 0x01; -} break; - -//plb -case 0xab: { - op_io(); - op_io(); - last_cycle(); - regs.db = op_readstack(); - regs.p.n = !!(regs.db & 0x80); - regs.p.z = (regs.db == 0); -} break; - -//plp -case 0x28: { - op_io(); - op_io(); - last_cycle(); - regs.p = op_readstack(); - if(regs.e) regs.p |= 0x30; - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -} break; - -//pea -case 0xf4: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_writestackn(aa.h); - last_cycle(); - op_writestackn(aa.l); - if(regs.e) regs.s.h = 0x01; -} break; - -//pei -case 0xd4: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_writestackn(aa.h); - last_cycle(); - op_writestackn(aa.l); - if(regs.e) regs.s.h = 0x01; -} break; - -//per -case 0x62: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.w = regs.pc.d + (int16)aa.w; - op_writestackn(rd.h); - last_cycle(); - op_writestackn(rd.l); - if(regs.e) regs.s.h = 0x01; -} break; - -#endif diff --git a/tools/bsnes/cpu/scpu/core/op_pc.b b/tools/bsnes/cpu/scpu/core/op_pc.b deleted file mode 100755 index aac012c..0000000 --- a/tools/bsnes/cpu/scpu/core/op_pc.b +++ /dev/null @@ -1,163 +0,0 @@ -bcc(0x90, !regs.p.c), -bcs(0xb0, regs.p.c), -bne(0xd0, !regs.p.z), -beq(0xf0, regs.p.z), -bpl(0x10, !regs.p.n), -bmi(0x30, regs.p.n), -bvc(0x50, !regs.p.v), -bvs(0x70, regs.p.v) { -1:if(!$1) last_cycle(); - rd.l = op_readpc(); - if($1) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - end; - } -2:op_io_cond6(aa.w); -3:last_cycle(); - op_io(); -} - -bra(0x80) { -1:rd.l = op_readpc(); - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; -2:op_io_cond6(aa.w); -3:last_cycle(); - op_io(); -} - -brl(0x82) { -1:rd.l = op_readpc(); -2:rd.h = op_readpc(); -3:last_cycle(); - op_io(); - regs.pc.w = regs.pc.d + (int16)rd.w; -} - -jmp_addr(0x4c) { -1:rd.l = op_readpc(); -2:last_cycle(); - rd.h = op_readpc(); - regs.pc.w = rd.w; -} - -jmp_long(0x5c) { -1:rd.l = op_readpc(); -2:rd.h = op_readpc(); -3:last_cycle(); - rd.b = op_readpc(); - regs.pc.d = rd.d & 0xffffff; -} - -jmp_iaddr(0x6c) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:rd.l = op_readaddr(aa.w); -4:last_cycle(); - rd.h = op_readaddr(aa.w + 1); - regs.pc.w = rd.w; -} - -jmp_iaddrx(0x7c) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io(); -4:rd.l = op_readpbr(aa.w + regs.x.w); -5:last_cycle(); - rd.h = op_readpbr(aa.w + regs.x.w + 1); - regs.pc.w = rd.w; -} - -jmp_iladdr(0xdc) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:rd.l = op_readaddr(aa.w); -4:rd.h = op_readaddr(aa.w + 1); -5:last_cycle(); - rd.b = op_readaddr(aa.w + 2); - regs.pc.d = rd.d & 0xffffff; -} - -jsr_addr(0x20) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io(); -4:regs.pc.w--; - op_writestack(regs.pc.h); -5:last_cycle(); - op_writestack(regs.pc.l); - regs.pc.w = aa.w; -} - -jsr_long(0x22) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_writestackn(regs.pc.b); -4:op_io(); -5:aa.b = op_readpc(); -6:regs.pc.w--; - op_writestackn(regs.pc.h); -7:last_cycle(); - op_writestackn(regs.pc.l); - regs.pc.d = aa.d & 0xffffff; - if(regs.e) regs.s.h = 0x01; -} - -jsr_iaddrx(0xfc) { -1:aa.l = op_readpc(); -2:op_writestackn(regs.pc.h); -3:op_writestackn(regs.pc.l); -4:aa.h = op_readpc(); -5:op_io(); -6:rd.l = op_readpbr(aa.w + regs.x.w); -7:last_cycle(); - rd.h = op_readpbr(aa.w + regs.x.w + 1); - regs.pc.w = rd.w; - if(regs.e) regs.s.h = 0x01; -} - -rti(0x40) { -1:op_io(); -2:op_io(); -3:regs.p = op_readstack(); - if(regs.e) regs.p |= 0x30; - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } -4:rd.l = op_readstack(); -5:if(regs.e) last_cycle(); - rd.h = op_readstack(); - if(regs.e) { - regs.pc.w = rd.w; - end; - } -6:last_cycle(); - rd.b = op_readstack(); - regs.pc.d = rd.d & 0xffffff; -} - -rts(0x60) { -1:op_io(); -2:op_io(); -3:rd.l = op_readstack(); -4:rd.h = op_readstack(); -5:last_cycle(); - op_io(); - regs.pc.w = rd.w; - regs.pc.w++; -} - -rtl(0x6b) { -1:op_io(); -2:op_io(); -3:rd.l = op_readstackn(); -4:rd.h = op_readstackn(); -5:last_cycle(); - rd.b = op_readstackn(); - regs.pc.d = rd.d & 0xffffff; - regs.pc.w++; - if(regs.e) regs.s.h = 0x01; -} diff --git a/tools/bsnes/cpu/scpu/core/op_pc.cpp b/tools/bsnes/cpu/scpu/core/op_pc.cpp deleted file mode 100755 index 9588206..0000000 --- a/tools/bsnes/cpu/scpu/core/op_pc.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#ifdef SCPU_CPP - -//bcc -case 0x90: { - if(!!regs.p.c) last_cycle(); - rd.l = op_readpc(); - if(!regs.p.c) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//bcs -case 0xb0: { - if(!regs.p.c) last_cycle(); - rd.l = op_readpc(); - if(regs.p.c) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//bne -case 0xd0: { - if(!!regs.p.z) last_cycle(); - rd.l = op_readpc(); - if(!regs.p.z) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//beq -case 0xf0: { - if(!regs.p.z) last_cycle(); - rd.l = op_readpc(); - if(regs.p.z) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//bpl -case 0x10: { - if(!!regs.p.n) last_cycle(); - rd.l = op_readpc(); - if(!regs.p.n) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//bmi -case 0x30: { - if(!regs.p.n) last_cycle(); - rd.l = op_readpc(); - if(regs.p.n) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//bvc -case 0x50: { - if(!!regs.p.v) last_cycle(); - rd.l = op_readpc(); - if(!regs.p.v) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//bvs -case 0x70: { - if(!regs.p.v) last_cycle(); - rd.l = op_readpc(); - if(regs.p.v) { - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - } else { - break; - } - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//bra -case 0x80: { - rd.l = op_readpc(); - aa.w = regs.pc.d + (int8)rd.l; - regs.pc.w = aa.w; - op_io_cond6(aa.w); - last_cycle(); - op_io(); -} break; - -//brl -case 0x82: { - rd.l = op_readpc(); - rd.h = op_readpc(); - last_cycle(); - op_io(); - regs.pc.w = regs.pc.d + (int16)rd.w; -} break; - -//jmp_addr -case 0x4c: { - rd.l = op_readpc(); - last_cycle(); - rd.h = op_readpc(); - regs.pc.w = rd.w; -} break; - -//jmp_long -case 0x5c: { - rd.l = op_readpc(); - rd.h = op_readpc(); - last_cycle(); - rd.b = op_readpc(); - regs.pc.d = rd.d & 0xffffff; -} break; - -//jmp_iaddr -case 0x6c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readaddr(aa.w); - last_cycle(); - rd.h = op_readaddr(aa.w + 1); - regs.pc.w = rd.w; -} break; - -//jmp_iaddrx -case 0x7c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.l = op_readpbr(aa.w + regs.x.w); - last_cycle(); - rd.h = op_readpbr(aa.w + regs.x.w + 1); - regs.pc.w = rd.w; -} break; - -//jmp_iladdr -case 0xdc: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readaddr(aa.w); - rd.h = op_readaddr(aa.w + 1); - last_cycle(); - rd.b = op_readaddr(aa.w + 2); - regs.pc.d = rd.d & 0xffffff; -} break; - -//jsr_addr -case 0x20: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - regs.pc.w--; - op_writestack(regs.pc.h); - last_cycle(); - op_writestack(regs.pc.l); - regs.pc.w = aa.w; -} break; - -//jsr_long -case 0x22: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_writestackn(regs.pc.b); - op_io(); - aa.b = op_readpc(); - regs.pc.w--; - op_writestackn(regs.pc.h); - last_cycle(); - op_writestackn(regs.pc.l); - regs.pc.d = aa.d & 0xffffff; - if(regs.e) regs.s.h = 0x01; -} break; - -//jsr_iaddrx -case 0xfc: { - aa.l = op_readpc(); - op_writestackn(regs.pc.h); - op_writestackn(regs.pc.l); - aa.h = op_readpc(); - op_io(); - rd.l = op_readpbr(aa.w + regs.x.w); - last_cycle(); - rd.h = op_readpbr(aa.w + regs.x.w + 1); - regs.pc.w = rd.w; - if(regs.e) regs.s.h = 0x01; -} break; - -//rti -case 0x40: { - op_io(); - op_io(); - regs.p = op_readstack(); - if(regs.e) regs.p |= 0x30; - if(regs.p.x) { - regs.x.h = 0x00; - regs.y.h = 0x00; - } - rd.l = op_readstack(); - if(regs.e) last_cycle(); - rd.h = op_readstack(); - if(regs.e) { - regs.pc.w = rd.w; - break; - } - last_cycle(); - rd.b = op_readstack(); - regs.pc.d = rd.d & 0xffffff; -} break; - -//rts -case 0x60: { - op_io(); - op_io(); - rd.l = op_readstack(); - rd.h = op_readstack(); - last_cycle(); - op_io(); - regs.pc.w = rd.w; - regs.pc.w++; -} break; - -//rtl -case 0x6b: { - op_io(); - op_io(); - rd.l = op_readstackn(); - rd.h = op_readstackn(); - last_cycle(); - rd.b = op_readstackn(); - regs.pc.d = rd.d & 0xffffff; - regs.pc.w++; - if(regs.e) regs.s.h = 0x01; -} break; - -#endif diff --git a/tools/bsnes/cpu/scpu/core/op_read.b b/tools/bsnes/cpu/scpu/core/op_read.b deleted file mode 100755 index 82785f9..0000000 --- a/tools/bsnes/cpu/scpu/core/op_read.b +++ /dev/null @@ -1,317 +0,0 @@ -adc_const(0x69, adc, regs.p.m), -and_const(0x29, and, regs.p.m), -cmp_const(0xc9, cmp, regs.p.m), -cpx_const(0xe0, cpx, regs.p.x), -cpy_const(0xc0, cpy, regs.p.x), -eor_const(0x49, eor, regs.p.m), -lda_const(0xa9, lda, regs.p.m), -ldx_const(0xa2, ldx, regs.p.x), -ldy_const(0xa0, ldy, regs.p.x), -ora_const(0x09, ora, regs.p.m), -sbc_const(0xe9, sbc, regs.p.m) { -1:if($2) last_cycle(); - rd.l = op_readpc(); - if($2) { op_$1_b(); end; } -2:last_cycle(); - rd.h = op_readpc(); - op_$1_w(); -} - -adc_addr(0x6d, adc, regs.p.m), -and_addr(0x2d, and, regs.p.m), -bit_addr(0x2c, bit, regs.p.m), -cmp_addr(0xcd, cmp, regs.p.m), -cpx_addr(0xec, cpx, regs.p.x), -cpy_addr(0xcc, cpy, regs.p.x), -eor_addr(0x4d, eor, regs.p.m), -lda_addr(0xad, lda, regs.p.m), -ldx_addr(0xae, ldx, regs.p.x), -ldy_addr(0xac, ldy, regs.p.x), -ora_addr(0x0d, ora, regs.p.m), -sbc_addr(0xed, sbc, regs.p.m) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:if($2) last_cycle(); - rd.l = op_readdbr(aa.w); - if($2) { op_$1_b(); end; } -4:last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_$1_w(); -} - -adc_addrx(0x7d, adc, regs.p.m), -and_addrx(0x3d, and, regs.p.m), -bit_addrx(0x3c, bit, regs.p.m), -cmp_addrx(0xdd, cmp, regs.p.m), -eor_addrx(0x5d, eor, regs.p.m), -lda_addrx(0xbd, lda, regs.p.m), -ldy_addrx(0xbc, ldy, regs.p.x), -ora_addrx(0x1d, ora, regs.p.m), -sbc_addrx(0xfd, sbc, regs.p.m) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io_cond4(aa.w, aa.w + regs.x.w); -4:if($2) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if($2) { op_$1_b(); end; } -5:last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_$1_w(); -} - -adc_addry(0x79, adc, regs.p.m), -and_addry(0x39, and, regs.p.m), -cmp_addry(0xd9, cmp, regs.p.m), -eor_addry(0x59, eor, regs.p.m), -lda_addry(0xb9, lda, regs.p.m), -ldx_addry(0xbe, ldx, regs.p.x), -ora_addry(0x19, ora, regs.p.m), -sbc_addry(0xf9, sbc, regs.p.m) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io_cond4(aa.w, aa.w + regs.y.w); -4:if($2) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if($2) { op_$1_b(); end; } -5:last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_$1_w(); -} - -adc_long(0x6f, adc, regs.p.m), -and_long(0x2f, and, regs.p.m), -cmp_long(0xcf, cmp, regs.p.m), -eor_long(0x4f, eor, regs.p.m), -lda_long(0xaf, lda, regs.p.m), -ora_long(0x0f, ora, regs.p.m), -sbc_long(0xef, sbc, regs.p.m) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:aa.b = op_readpc(); -4:if($2) last_cycle(); - rd.l = op_readlong(aa.d); - if($2) { op_$1_b(); end; } -5:last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_$1_w(); -} - -adc_longx(0x7f, adc, regs.p.m), -and_longx(0x3f, and, regs.p.m), -cmp_longx(0xdf, cmp, regs.p.m), -eor_longx(0x5f, eor, regs.p.m), -lda_longx(0xbf, lda, regs.p.m), -ora_longx(0x1f, ora, regs.p.m), -sbc_longx(0xff, sbc, regs.p.m) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:aa.b = op_readpc(); -4:if($2) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if($2) { op_$1_b(); end; } -5:last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_$1_w(); -} - -adc_dp(0x65, adc, regs.p.m), -and_dp(0x25, and, regs.p.m), -bit_dp(0x24, bit, regs.p.m), -cmp_dp(0xc5, cmp, regs.p.m), -cpx_dp(0xe4, cpx, regs.p.x), -cpy_dp(0xc4, cpy, regs.p.x), -eor_dp(0x45, eor, regs.p.m), -lda_dp(0xa5, lda, regs.p.m), -ldx_dp(0xa6, ldx, regs.p.x), -ldy_dp(0xa4, ldy, regs.p.x), -ora_dp(0x05, ora, regs.p.m), -sbc_dp(0xe5, sbc, regs.p.m) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:if($2) last_cycle(); - rd.l = op_readdp(dp); - if($2) { op_$1_b(); end; } -4:last_cycle(); - rd.h = op_readdp(dp + 1); - op_$1_w(); -} - -adc_dpx(0x75, adc, regs.p.m), -and_dpx(0x35, and, regs.p.m), -bit_dpx(0x34, bit, regs.p.m), -cmp_dpx(0xd5, cmp, regs.p.m), -eor_dpx(0x55, eor, regs.p.m), -lda_dpx(0xb5, lda, regs.p.m), -ldy_dpx(0xb4, ldy, regs.p.x), -ora_dpx(0x15, ora, regs.p.m), -sbc_dpx(0xf5, sbc, regs.p.m) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:op_io(); -4:if($2) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if($2) { op_$1_b(); end; } -5:last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_$1_w(); -} - -ldx_dpy(0xb6, ldx, regs.p.x) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:op_io(); -4:if($2) last_cycle(); - rd.l = op_readdp(dp + regs.y.w); - if($2) { op_$1_b(); end; } -5:last_cycle(); - rd.h = op_readdp(dp + regs.y.w + 1); - op_$1_w(); -} - -adc_idp(0x72, adc, regs.p.m), -and_idp(0x32, and, regs.p.m), -cmp_idp(0xd2, cmp, regs.p.m), -eor_idp(0x52, eor, regs.p.m), -lda_idp(0xb2, lda, regs.p.m), -ora_idp(0x12, ora, regs.p.m), -sbc_idp(0xf2, sbc, regs.p.m) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:if($2) last_cycle(); - rd.l = op_readdbr(aa.w); - if($2) { op_$1_b(); end; } -6:last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_$1_w(); -} - -adc_idpx(0x61, adc, regs.p.m), -and_idpx(0x21, and, regs.p.m), -cmp_idpx(0xc1, cmp, regs.p.m), -eor_idpx(0x41, eor, regs.p.m), -lda_idpx(0xa1, lda, regs.p.m), -ora_idpx(0x01, ora, regs.p.m), -sbc_idpx(0xe1, sbc, regs.p.m) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:op_io(); -4:aa.l = op_readdp(dp + regs.x.w); -5:aa.h = op_readdp(dp + regs.x.w + 1); -6:if($2) last_cycle(); - rd.l = op_readdbr(aa.w); - if($2) { op_$1_b(); end; } -7:last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_$1_w(); -} - -adc_idpy(0x71, adc, regs.p.m), -and_idpy(0x31, and, regs.p.m), -cmp_idpy(0xd1, cmp, regs.p.m), -eor_idpy(0x51, eor, regs.p.m), -lda_idpy(0xb1, lda, regs.p.m), -ora_idpy(0x11, ora, regs.p.m), -sbc_idpy(0xf1, sbc, regs.p.m) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:op_io_cond4(aa.w, aa.w + regs.y.w); -6:if($2) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if($2) { op_$1_b(); end; } -7:last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_$1_w(); -} - -adc_ildp(0x67, adc, regs.p.m), -and_ildp(0x27, and, regs.p.m), -cmp_ildp(0xc7, cmp, regs.p.m), -eor_ildp(0x47, eor, regs.p.m), -lda_ildp(0xa7, lda, regs.p.m), -ora_ildp(0x07, ora, regs.p.m), -sbc_ildp(0xe7, sbc, regs.p.m) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:aa.b = op_readdp(dp + 2); -6:if($2) last_cycle(); - rd.l = op_readlong(aa.d); - if($2) { op_$1_b(); end; } -7:last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_$1_w(); -} - -adc_ildpy(0x77, adc, regs.p.m), -and_ildpy(0x37, and, regs.p.m), -cmp_ildpy(0xd7, cmp, regs.p.m), -eor_ildpy(0x57, eor, regs.p.m), -lda_ildpy(0xb7, lda, regs.p.m), -ora_ildpy(0x17, ora, regs.p.m), -sbc_ildpy(0xf7, sbc, regs.p.m) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:aa.b = op_readdp(dp + 2); -6:if($2) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if($2) { op_$1_b(); end; } -7:last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_$1_w(); -} - -adc_sr(0x63, adc, regs.p.m), -and_sr(0x23, and, regs.p.m), -cmp_sr(0xc3, cmp, regs.p.m), -eor_sr(0x43, eor, regs.p.m), -lda_sr(0xa3, lda, regs.p.m), -ora_sr(0x03, ora, regs.p.m), -sbc_sr(0xe3, sbc, regs.p.m) { -1:sp = op_readpc(); -2:op_io(); -3:if($2) last_cycle(); - rd.l = op_readsp(sp); - if($2) { op_$1_b(); end; } -4:last_cycle(); - rd.h = op_readsp(sp + 1); - op_$1_w(); -} - -adc_isry(0x73, adc), -and_isry(0x33, and), -cmp_isry(0xd3, cmp), -eor_isry(0x53, eor), -lda_isry(0xb3, lda), -ora_isry(0x13, ora), -sbc_isry(0xf3, sbc) { -1:sp = op_readpc(); -2:op_io(); -3:aa.l = op_readsp(sp); -4:aa.h = op_readsp(sp + 1); -5:op_io(); -6:if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_$1_b(); end; } -7:last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_$1_w(); -} - -bit_const(0x89) { -1:if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { - regs.p.z = ((rd.l & regs.a.l) == 0); - end; - } -2:last_cycle(); - rd.h = op_readpc(); - regs.p.z = ((rd.w & regs.a.w) == 0); -} diff --git a/tools/bsnes/cpu/scpu/core/op_read.cpp b/tools/bsnes/cpu/scpu/core/op_read.cpp deleted file mode 100755 index a486b5f..0000000 --- a/tools/bsnes/cpu/scpu/core/op_read.cpp +++ /dev/null @@ -1,1654 +0,0 @@ -#ifdef SCPU_CPP - -//adc_const -case 0x69: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_adc_w(); -} break; - -//and_const -case 0x29: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_and_w(); -} break; - -//cmp_const -case 0xc9: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_cmp_w(); -} break; - -//cpx_const -case 0xe0: { - if(regs.p.x) last_cycle(); - rd.l = op_readpc(); - if(regs.p.x) { op_cpx_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_cpx_w(); -} break; - -//cpy_const -case 0xc0: { - if(regs.p.x) last_cycle(); - rd.l = op_readpc(); - if(regs.p.x) { op_cpy_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_cpy_w(); -} break; - -//eor_const -case 0x49: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_eor_w(); -} break; - -//lda_const -case 0xa9: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_lda_w(); -} break; - -//ldx_const -case 0xa2: { - if(regs.p.x) last_cycle(); - rd.l = op_readpc(); - if(regs.p.x) { op_ldx_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_ldx_w(); -} break; - -//ldy_const -case 0xa0: { - if(regs.p.x) last_cycle(); - rd.l = op_readpc(); - if(regs.p.x) { op_ldy_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_ldy_w(); -} break; - -//ora_const -case 0x09: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_ora_w(); -} break; - -//sbc_const -case 0xe9: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readpc(); - op_sbc_w(); -} break; - -//adc_addr -case 0x6d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_adc_w(); -} break; - -//and_addr -case 0x2d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_and_w(); -} break; - -//bit_addr -case 0x2c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_bit_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_bit_w(); -} break; - -//cmp_addr -case 0xcd: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_cmp_w(); -} break; - -//cpx_addr -case 0xec: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.x) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_cpx_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_cpx_w(); -} break; - -//cpy_addr -case 0xcc: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.x) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_cpy_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_cpy_w(); -} break; - -//eor_addr -case 0x4d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_eor_w(); -} break; - -//lda_addr -case 0xad: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_lda_w(); -} break; - -//ldx_addr -case 0xae: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.x) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_ldx_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_ldx_w(); -} break; - -//ldy_addr -case 0xac: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.x) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.x) { op_ldy_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_ldy_w(); -} break; - -//ora_addr -case 0x0d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_ora_w(); -} break; - -//sbc_addr -case 0xed: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_sbc_w(); -} break; - -//adc_addrx -case 0x7d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_adc_w(); -} break; - -//and_addrx -case 0x3d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_and_w(); -} break; - -//bit_addrx -case 0x3c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_bit_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_bit_w(); -} break; - -//cmp_addrx -case 0xdd: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_cmp_w(); -} break; - -//eor_addrx -case 0x5d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_eor_w(); -} break; - -//lda_addrx -case 0xbd: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_lda_w(); -} break; - -//ldy_addrx -case 0xbc: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.x) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.x) { op_ldy_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_ldy_w(); -} break; - -//ora_addrx -case 0x1d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_ora_w(); -} break; - -//sbc_addrx -case 0xfd: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.x.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_sbc_w(); -} break; - -//adc_addry -case 0x79: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_adc_w(); -} break; - -//and_addry -case 0x39: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_and_w(); -} break; - -//cmp_addry -case 0xd9: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_cmp_w(); -} break; - -//eor_addry -case 0x59: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_eor_w(); -} break; - -//lda_addry -case 0xb9: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_lda_w(); -} break; - -//ldx_addry -case 0xbe: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.x) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.x) { op_ldx_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_ldx_w(); -} break; - -//ora_addry -case 0x19: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_ora_w(); -} break; - -//sbc_addry -case 0xf9: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_sbc_w(); -} break; - -//adc_long -case 0x6f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_adc_w(); -} break; - -//and_long -case 0x2f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_and_w(); -} break; - -//cmp_long -case 0xcf: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_cmp_w(); -} break; - -//eor_long -case 0x4f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_eor_w(); -} break; - -//lda_long -case 0xaf: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_lda_w(); -} break; - -//ora_long -case 0x0f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_ora_w(); -} break; - -//sbc_long -case 0xef: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_sbc_w(); -} break; - -//adc_longx -case 0x7f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_adc_w(); -} break; - -//and_longx -case 0x3f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_and_w(); -} break; - -//cmp_longx -case 0xdf: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_cmp_w(); -} break; - -//eor_longx -case 0x5f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_eor_w(); -} break; - -//lda_longx -case 0xbf: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_lda_w(); -} break; - -//ora_longx -case 0x1f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_ora_w(); -} break; - -//sbc_longx -case 0xff: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.x.w + 1); - op_sbc_w(); -} break; - -//adc_dp -case 0x65: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_adc_w(); -} break; - -//and_dp -case 0x25: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_and_w(); -} break; - -//bit_dp -case 0x24: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_bit_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_bit_w(); -} break; - -//cmp_dp -case 0xc5: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_cmp_w(); -} break; - -//cpx_dp -case 0xe4: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.x) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.x) { op_cpx_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_cpx_w(); -} break; - -//cpy_dp -case 0xc4: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.x) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.x) { op_cpy_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_cpy_w(); -} break; - -//eor_dp -case 0x45: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_eor_w(); -} break; - -//lda_dp -case 0xa5: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_lda_w(); -} break; - -//ldx_dp -case 0xa6: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.x) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.x) { op_ldx_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_ldx_w(); -} break; - -//ldy_dp -case 0xa4: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.x) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.x) { op_ldy_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_ldy_w(); -} break; - -//ora_dp -case 0x05: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_ora_w(); -} break; - -//sbc_dp -case 0xe5: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + 1); - op_sbc_w(); -} break; - -//adc_dpx -case 0x75: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_adc_w(); -} break; - -//and_dpx -case 0x35: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_and_w(); -} break; - -//bit_dpx -case 0x34: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_bit_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_bit_w(); -} break; - -//cmp_dpx -case 0xd5: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_cmp_w(); -} break; - -//eor_dpx -case 0x55: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_eor_w(); -} break; - -//lda_dpx -case 0xb5: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_lda_w(); -} break; - -//ldy_dpx -case 0xb4: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.x) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.x) { op_ldy_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_ldy_w(); -} break; - -//ora_dpx -case 0x15: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_ora_w(); -} break; - -//sbc_dpx -case 0xf5: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdp(dp + regs.x.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.x.w + 1); - op_sbc_w(); -} break; - -//ldx_dpy -case 0xb6: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.x) last_cycle(); - rd.l = op_readdp(dp + regs.y.w); - if(regs.p.x) { op_ldx_b(); break; } - last_cycle(); - rd.h = op_readdp(dp + regs.y.w + 1); - op_ldx_w(); -} break; - -//adc_idp -case 0x72: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_adc_w(); -} break; - -//and_idp -case 0x32: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_and_w(); -} break; - -//cmp_idp -case 0xd2: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_cmp_w(); -} break; - -//eor_idp -case 0x52: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_eor_w(); -} break; - -//lda_idp -case 0xb2: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_lda_w(); -} break; - -//ora_idp -case 0x12: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_ora_w(); -} break; - -//sbc_idp -case 0xf2: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_sbc_w(); -} break; - -//adc_idpx -case 0x61: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_adc_w(); -} break; - -//and_idpx -case 0x21: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_and_w(); -} break; - -//cmp_idpx -case 0xc1: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_cmp_w(); -} break; - -//eor_idpx -case 0x41: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_eor_w(); -} break; - -//lda_idpx -case 0xa1: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_lda_w(); -} break; - -//ora_idpx -case 0x01: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_ora_w(); -} break; - -//sbc_idpx -case 0xe1: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + 1); - op_sbc_w(); -} break; - -//adc_idpy -case 0x71: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_adc_w(); -} break; - -//and_idpy -case 0x31: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_and_w(); -} break; - -//cmp_idpy -case 0xd1: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_cmp_w(); -} break; - -//eor_idpy -case 0x51: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_eor_w(); -} break; - -//lda_idpy -case 0xb1: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_lda_w(); -} break; - -//ora_idpy -case 0x11: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_ora_w(); -} break; - -//sbc_idpy -case 0xf1: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io_cond4(aa.w, aa.w + regs.y.w); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_sbc_w(); -} break; - -//adc_ildp -case 0x67: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_adc_w(); -} break; - -//and_ildp -case 0x27: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_and_w(); -} break; - -//cmp_ildp -case 0xc7: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_cmp_w(); -} break; - -//eor_ildp -case 0x47: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_eor_w(); -} break; - -//lda_ildp -case 0xa7: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_lda_w(); -} break; - -//ora_ildp -case 0x07: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_ora_w(); -} break; - -//sbc_ildp -case 0xe7: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + 1); - op_sbc_w(); -} break; - -//adc_ildpy -case 0x77: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_adc_w(); -} break; - -//and_ildpy -case 0x37: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_and_w(); -} break; - -//cmp_ildpy -case 0xd7: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_cmp_w(); -} break; - -//eor_ildpy -case 0x57: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_eor_w(); -} break; - -//lda_ildpy -case 0xb7: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_lda_w(); -} break; - -//ora_ildpy -case 0x17: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_ora_w(); -} break; - -//sbc_ildpy -case 0xf7: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - rd.l = op_readlong(aa.d + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readlong(aa.d + regs.y.w + 1); - op_sbc_w(); -} break; - -//adc_sr -case 0x63: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readsp(sp); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readsp(sp + 1); - op_adc_w(); -} break; - -//and_sr -case 0x23: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readsp(sp); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readsp(sp + 1); - op_and_w(); -} break; - -//cmp_sr -case 0xc3: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readsp(sp); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readsp(sp + 1); - op_cmp_w(); -} break; - -//eor_sr -case 0x43: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readsp(sp); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readsp(sp + 1); - op_eor_w(); -} break; - -//lda_sr -case 0xa3: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readsp(sp); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readsp(sp + 1); - op_lda_w(); -} break; - -//ora_sr -case 0x03: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readsp(sp); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readsp(sp + 1); - op_ora_w(); -} break; - -//sbc_sr -case 0xe3: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readsp(sp); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readsp(sp + 1); - op_sbc_w(); -} break; - -//adc_isry -case 0x73: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_adc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_adc_w(); -} break; - -//and_isry -case 0x33: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_and_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_and_w(); -} break; - -//cmp_isry -case 0xd3: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_cmp_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_cmp_w(); -} break; - -//eor_isry -case 0x53: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_eor_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_eor_w(); -} break; - -//lda_isry -case 0xb3: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_lda_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_lda_w(); -} break; - -//ora_isry -case 0x13: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_ora_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_ora_w(); -} break; - -//sbc_isry -case 0xf3: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - rd.l = op_readdbr(aa.w + regs.y.w); - if(regs.p.m) { op_sbc_b(); break; } - last_cycle(); - rd.h = op_readdbr(aa.w + regs.y.w + 1); - op_sbc_w(); -} break; - -//bit_const -case 0x89: { - if(regs.p.m) last_cycle(); - rd.l = op_readpc(); - if(regs.p.m) { - regs.p.z = ((rd.l & regs.a.l) == 0); - break; - } - last_cycle(); - rd.h = op_readpc(); - regs.p.z = ((rd.w & regs.a.w) == 0); -} break; - -#endif diff --git a/tools/bsnes/cpu/scpu/core/op_rmw.b b/tools/bsnes/cpu/scpu/core/op_rmw.b deleted file mode 100755 index 14b1613..0000000 --- a/tools/bsnes/cpu/scpu/core/op_rmw.b +++ /dev/null @@ -1,181 +0,0 @@ -inc(0x1a, regs.p.m, a), -inx(0xe8, regs.p.x, x), -iny(0xc8, regs.p.x, y) { -1:last_cycle(); - op_io_irq(); - if($1) { - regs.$2.l++; - regs.p.n = !!(regs.$2.l & 0x80); - regs.p.z = (regs.$2.l == 0); - } else { - regs.$2.w++; - regs.p.n = !!(regs.$2.w & 0x8000); - regs.p.z = (regs.$2.w == 0); - } -} - -dec(0x3a, regs.p.m, a), -dex(0xca, regs.p.x, x), -dey(0x88, regs.p.x, y) { -1:last_cycle(); - op_io_irq(); - if($1) { - regs.$2.l--; - regs.p.n = !!(regs.$2.l & 0x80); - regs.p.z = (regs.$2.l == 0); - } else { - regs.$2.w--; - regs.p.n = !!(regs.$2.w & 0x8000); - regs.p.z = (regs.$2.w == 0); - } -} - -asl(0x0a) { -1:last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); - regs.a.l <<= 1; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.c = !!(regs.a.w & 0x8000); - regs.a.w <<= 1; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} - -lsr(0x4a) { -1:last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.p.c = regs.a.l & 1; - regs.a.l >>= 1; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.c = regs.a.w & 1; - regs.a.w >>= 1; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} - -rol(0x2a) { -1:last_cycle(); - op_io_irq(); - uint16 c = regs.p.c; - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); - regs.a.l <<= 1; - regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.c = !!(regs.a.w & 0x8000); - regs.a.w <<= 1; - regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} - -ror(0x6a) { -1:last_cycle(); - op_io_irq(); - uint16 c; - if(regs.p.m) { - c = regs.p.c ? 0x80 : 0; - regs.p.c = regs.a.l & 1; - regs.a.l >>= 1; - regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - c = regs.p.c ? 0x8000 : 0; - regs.p.c = regs.a.w & 1; - regs.a.w >>= 1; - regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} - -inc_addr(0xee, inc), -dec_addr(0xce, dec), -asl_addr(0x0e, asl), -lsr_addr(0x4e, lsr), -rol_addr(0x2e, rol), -ror_addr(0x6e, ror), -trb_addr(0x1c, trb), -tsb_addr(0x0c, tsb) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:rd.l = op_readdbr(aa.w); -4:if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); -5:op_io(); - if(regs.p.m) { op_$1_b(); } - else { op_$1_w(); -6:op_writedbr(aa.w + 1, rd.h); } -7:last_cycle(); - op_writedbr(aa.w, rd.l); -} - -inc_addrx(0xfe, inc), -dec_addrx(0xde, dec), -asl_addrx(0x1e, asl), -lsr_addrx(0x5e, lsr), -rol_addrx(0x3e, rol), -ror_addrx(0x7e, ror) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io(); -4:rd.l = op_readdbr(aa.w + regs.x.w); -5:if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1); -6:op_io(); - if(regs.p.m) { op_$1_b(); } - else { op_$1_w(); -7:op_writedbr(aa.w + regs.x.w + 1, rd.h); } -8:last_cycle(); - op_writedbr(aa.w + regs.x.w, rd.l); -} - -inc_dp(0xe6, inc), -dec_dp(0xc6, dec), -asl_dp(0x06, asl), -lsr_dp(0x46, lsr), -rol_dp(0x26, rol), -ror_dp(0x66, ror), -trb_dp(0x14, trb), -tsb_dp(0x04, tsb) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:rd.l = op_readdp(dp); -4:if(!regs.p.m) rd.h = op_readdp(dp + 1); -5:op_io(); - if(regs.p.m) { op_$1_b(); } - else { op_$1_w(); -6:op_writedp(dp + 1, rd.h); } -7:last_cycle(); - op_writedp(dp, rd.l); -} - -inc_dpx(0xf6, inc), -dec_dpx(0xd6, dec), -asl_dpx(0x16, asl), -lsr_dpx(0x56, lsr), -rol_dpx(0x36, rol), -ror_dpx(0x76, ror) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:op_io(); -4:rd.l = op_readdp(dp + regs.x.w); -5:if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1); -6:op_io(); - if(regs.p.m) { op_$1_b(); } - else { op_$1_w(); -7:op_writedp(dp + regs.x.w + 1, rd.h); } -8:last_cycle(); - op_writedp(dp + regs.x.w, rd.l); -} diff --git a/tools/bsnes/cpu/scpu/core/op_rmw.cpp b/tools/bsnes/cpu/scpu/core/op_rmw.cpp deleted file mode 100755 index 6d37dd0..0000000 --- a/tools/bsnes/cpu/scpu/core/op_rmw.cpp +++ /dev/null @@ -1,573 +0,0 @@ -#ifdef SCPU_CPP - -//inc -case 0x1a: { - last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.a.l++; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.a.w++; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//inx -case 0xe8: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.x.l++; - regs.p.n = !!(regs.x.l & 0x80); - regs.p.z = (regs.x.l == 0); - } else { - regs.x.w++; - regs.p.n = !!(regs.x.w & 0x8000); - regs.p.z = (regs.x.w == 0); - } -} break; - -//iny -case 0xc8: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.y.l++; - regs.p.n = !!(regs.y.l & 0x80); - regs.p.z = (regs.y.l == 0); - } else { - regs.y.w++; - regs.p.n = !!(regs.y.w & 0x8000); - regs.p.z = (regs.y.w == 0); - } -} break; - -//dec -case 0x3a: { - last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.a.l--; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.a.w--; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//dex -case 0xca: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.x.l--; - regs.p.n = !!(regs.x.l & 0x80); - regs.p.z = (regs.x.l == 0); - } else { - regs.x.w--; - regs.p.n = !!(regs.x.w & 0x8000); - regs.p.z = (regs.x.w == 0); - } -} break; - -//dey -case 0x88: { - last_cycle(); - op_io_irq(); - if(regs.p.x) { - regs.y.l--; - regs.p.n = !!(regs.y.l & 0x80); - regs.p.z = (regs.y.l == 0); - } else { - regs.y.w--; - regs.p.n = !!(regs.y.w & 0x8000); - regs.p.z = (regs.y.w == 0); - } -} break; - -//asl -case 0x0a: { - last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); - regs.a.l <<= 1; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.c = !!(regs.a.w & 0x8000); - regs.a.w <<= 1; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//lsr -case 0x4a: { - last_cycle(); - op_io_irq(); - if(regs.p.m) { - regs.p.c = regs.a.l & 1; - regs.a.l >>= 1; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.c = regs.a.w & 1; - regs.a.w >>= 1; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//rol -case 0x2a: { - last_cycle(); - op_io_irq(); - uint16 c = regs.p.c; - if(regs.p.m) { - regs.p.c = !!(regs.a.l & 0x80); - regs.a.l <<= 1; - regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - regs.p.c = !!(regs.a.w & 0x8000); - regs.a.w <<= 1; - regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//ror -case 0x6a: { - last_cycle(); - op_io_irq(); - uint16 c; - if(regs.p.m) { - c = regs.p.c ? 0x80 : 0; - regs.p.c = regs.a.l & 1; - regs.a.l >>= 1; - regs.a.l |= c; - regs.p.n = !!(regs.a.l & 0x80); - regs.p.z = (regs.a.l == 0); - } else { - c = regs.p.c ? 0x8000 : 0; - regs.p.c = regs.a.w & 1; - regs.a.w >>= 1; - regs.a.w |= c; - regs.p.n = !!(regs.a.w & 0x8000); - regs.p.z = (regs.a.w == 0); - } -} break; - -//inc_addr -case 0xee: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_inc_b(); } - else { op_inc_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//dec_addr -case 0xce: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_dec_b(); } - else { op_dec_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//asl_addr -case 0x0e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_asl_b(); } - else { op_asl_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//lsr_addr -case 0x4e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_lsr_b(); } - else { op_lsr_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//rol_addr -case 0x2e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_rol_b(); } - else { op_rol_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//ror_addr -case 0x6e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_ror_b(); } - else { op_ror_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//trb_addr -case 0x1c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_trb_b(); } - else { op_trb_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//tsb_addr -case 0x0c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - rd.l = op_readdbr(aa.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + 1); - op_io(); - if(regs.p.m) { op_tsb_b(); } - else { op_tsb_w(); - op_writedbr(aa.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w, rd.l); -} break; - -//inc_addrx -case 0xfe: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_inc_b(); } - else { op_inc_w(); - op_writedbr(aa.w + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w + regs.x.w, rd.l); -} break; - -//dec_addrx -case 0xde: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_dec_b(); } - else { op_dec_w(); - op_writedbr(aa.w + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w + regs.x.w, rd.l); -} break; - -//asl_addrx -case 0x1e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_asl_b(); } - else { op_asl_w(); - op_writedbr(aa.w + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w + regs.x.w, rd.l); -} break; - -//lsr_addrx -case 0x5e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_lsr_b(); } - else { op_lsr_w(); - op_writedbr(aa.w + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w + regs.x.w, rd.l); -} break; - -//rol_addrx -case 0x3e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_rol_b(); } - else { op_rol_w(); - op_writedbr(aa.w + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w + regs.x.w, rd.l); -} break; - -//ror_addrx -case 0x7e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - rd.l = op_readdbr(aa.w + regs.x.w); - if(!regs.p.m) rd.h = op_readdbr(aa.w + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_ror_b(); } - else { op_ror_w(); - op_writedbr(aa.w + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedbr(aa.w + regs.x.w, rd.l); -} break; - -//inc_dp -case 0xe6: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_inc_b(); } - else { op_inc_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//dec_dp -case 0xc6: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_dec_b(); } - else { op_dec_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//asl_dp -case 0x06: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_asl_b(); } - else { op_asl_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//lsr_dp -case 0x46: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_lsr_b(); } - else { op_lsr_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//rol_dp -case 0x26: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_rol_b(); } - else { op_rol_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//ror_dp -case 0x66: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_ror_b(); } - else { op_ror_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//trb_dp -case 0x14: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_trb_b(); } - else { op_trb_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//tsb_dp -case 0x04: { - dp = op_readpc(); - op_io_cond2(); - rd.l = op_readdp(dp); - if(!regs.p.m) rd.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) { op_tsb_b(); } - else { op_tsb_w(); - op_writedp(dp + 1, rd.h); } - last_cycle(); - op_writedp(dp, rd.l); -} break; - -//inc_dpx -case 0xf6: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_inc_b(); } - else { op_inc_w(); - op_writedp(dp + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedp(dp + regs.x.w, rd.l); -} break; - -//dec_dpx -case 0xd6: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_dec_b(); } - else { op_dec_w(); - op_writedp(dp + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedp(dp + regs.x.w, rd.l); -} break; - -//asl_dpx -case 0x16: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_asl_b(); } - else { op_asl_w(); - op_writedp(dp + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedp(dp + regs.x.w, rd.l); -} break; - -//lsr_dpx -case 0x56: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_lsr_b(); } - else { op_lsr_w(); - op_writedp(dp + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedp(dp + regs.x.w, rd.l); -} break; - -//rol_dpx -case 0x36: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_rol_b(); } - else { op_rol_w(); - op_writedp(dp + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedp(dp + regs.x.w, rd.l); -} break; - -//ror_dpx -case 0x76: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - rd.l = op_readdp(dp + regs.x.w); - if(!regs.p.m) rd.h = op_readdp(dp + regs.x.w + 1); - op_io(); - if(regs.p.m) { op_ror_b(); } - else { op_ror_w(); - op_writedp(dp + regs.x.w + 1, rd.h); } - last_cycle(); - op_writedp(dp + regs.x.w, rd.l); -} break; - -#endif diff --git a/tools/bsnes/cpu/scpu/core/op_write.b b/tools/bsnes/cpu/scpu/core/op_write.b deleted file mode 100755 index bd50189..0000000 --- a/tools/bsnes/cpu/scpu/core/op_write.b +++ /dev/null @@ -1,181 +0,0 @@ -sta_addr(0x8d, regs.p.m, regs.a.w), -stx_addr(0x8e, regs.p.x, regs.x.w), -sty_addr(0x8c, regs.p.x, regs.y.w), -stz_addr(0x9c, regs.p.m, 0x0000) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:if($1) last_cycle(); - op_writedbr(aa.w, $2); - if($1) end; -4:last_cycle(); - op_writedbr(aa.w + 1, $2 >> 8); -} - -sta_addrx(0x9d, regs.p.m, regs.a.w), -stz_addrx(0x9e, regs.p.m, 0x0000) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io(); -4:if($1) last_cycle(); - op_writedbr(aa.w + regs.x.w, $2); - if($1) end; -5:last_cycle(); - op_writedbr(aa.w + regs.x.w + 1, $2 >> 8); -} - -sta_addry(0x99) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:op_io(); -4:if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m) end; -5:last_cycle(); - op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} - -sta_long(0x8f) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:aa.b = op_readpc(); -4:if(regs.p.m) last_cycle(); - op_writelong(aa.d, regs.a.l); - if(regs.p.m) end; -5:last_cycle(); - op_writelong(aa.d + 1, regs.a.h); -} - -sta_longx(0x9f) { -1:aa.l = op_readpc(); -2:aa.h = op_readpc(); -3:aa.b = op_readpc(); -4:if(regs.p.m) last_cycle(); - op_writelong(aa.d + regs.x.w, regs.a.l); - if(regs.p.m) end; -5:last_cycle(); - op_writelong(aa.d + regs.x.w + 1, regs.a.h); -} - -sta_dp(0x85, regs.p.m, regs.a.w), -stx_dp(0x86, regs.p.x, regs.x.w), -sty_dp(0x84, regs.p.x, regs.y.w), -stz_dp(0x64, regs.p.m, 0x0000) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:if($1) last_cycle(); - op_writedp(dp, $2); - if($1) end; -4:last_cycle(); - op_writedp(dp + 1, $2 >> 8); -} - -sta_dpx(0x95, regs.p.m, regs.a.w), -sty_dpx(0x94, regs.p.x, regs.y.w), -stz_dpx(0x74, regs.p.m, 0x0000) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:op_io(); -4:if($1) last_cycle(); - op_writedp(dp + regs.x.w, $2); - if($1) end; -5:last_cycle(); - op_writedp(dp + regs.x.w + 1, $2 >> 8); -} - -stx_dpy(0x96) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:op_io(); -4:if(regs.p.x) last_cycle(); - op_writedp(dp + regs.y.w, regs.x.l); - if(regs.p.x) end; -5:last_cycle(); - op_writedp(dp + regs.y.w + 1, regs.x.h); -} - -sta_idp(0x92) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:if(regs.p.m) last_cycle(); - op_writedbr(aa.w, regs.a.l); - if(regs.p.m) end; -6:last_cycle(); - op_writedbr(aa.w + 1, regs.a.h); -} - -sta_ildp(0x87) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:aa.b = op_readdp(dp + 2); -6:if(regs.p.m) last_cycle(); - op_writelong(aa.d, regs.a.l); - if(regs.p.m) end; -7:last_cycle(); - op_writelong(aa.d + 1, regs.a.h); -} - -sta_idpx(0x81) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:op_io(); -4:aa.l = op_readdp(dp + regs.x.w); -5:aa.h = op_readdp(dp + regs.x.w + 1); -6:if(regs.p.m) last_cycle(); - op_writedbr(aa.w, regs.a.l); - if(regs.p.m) end; -7:last_cycle(); - op_writedbr(aa.w + 1, regs.a.h); -} - -sta_idpy(0x91) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:op_io(); -6:if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m) end; -7:last_cycle(); - op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} - -sta_ildpy(0x97) { -1:dp = op_readpc(); -2:op_io_cond2(); -3:aa.l = op_readdp(dp); -4:aa.h = op_readdp(dp + 1); -5:aa.b = op_readdp(dp + 2); -6:if(regs.p.m) last_cycle(); - op_writelong(aa.d + regs.y.w, regs.a.l); - if(regs.p.m) end; -7:last_cycle(); - op_writelong(aa.d + regs.y.w + 1, regs.a.h); -} - -sta_sr(0x83) { -1:sp = op_readpc(); -2:op_io(); -3:if(regs.p.m) last_cycle(); - op_writesp(sp, regs.a.l); - if(regs.p.m) end; -4:last_cycle(); - op_writesp(sp + 1, regs.a.h); -} - -sta_isry(0x93) { -1:sp = op_readpc(); -2:op_io(); -3:aa.l = op_readsp(sp); -4:aa.h = op_readsp(sp + 1); -5:op_io(); -6:if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m) end; -7:last_cycle(); - op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} diff --git a/tools/bsnes/cpu/scpu/core/op_write.cpp b/tools/bsnes/cpu/scpu/core/op_write.cpp deleted file mode 100755 index d2362e6..0000000 --- a/tools/bsnes/cpu/scpu/core/op_write.cpp +++ /dev/null @@ -1,293 +0,0 @@ -#ifdef SCPU_CPP - -//sta_addr -case 0x8d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w, regs.a.w); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + 1, regs.a.w >> 8); -} break; - -//stx_addr -case 0x8e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.x) last_cycle(); - op_writedbr(aa.w, regs.x.w); - if(regs.p.x) break; - last_cycle(); - op_writedbr(aa.w + 1, regs.x.w >> 8); -} break; - -//sty_addr -case 0x8c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.x) last_cycle(); - op_writedbr(aa.w, regs.y.w); - if(regs.p.x) break; - last_cycle(); - op_writedbr(aa.w + 1, regs.y.w >> 8); -} break; - -//stz_addr -case 0x9c: { - aa.l = op_readpc(); - aa.h = op_readpc(); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w, 0x0000); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + 1, 0x0000 >> 8); -} break; - -//sta_addrx -case 0x9d: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.x.w, regs.a.w); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + regs.x.w + 1, regs.a.w >> 8); -} break; - -//stz_addrx -case 0x9e: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.x.w, 0x0000); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + regs.x.w + 1, 0x0000 >> 8); -} break; - -//sta_addry -case 0x99: { - aa.l = op_readpc(); - aa.h = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} break; - -//sta_long -case 0x8f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - op_writelong(aa.d, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writelong(aa.d + 1, regs.a.h); -} break; - -//sta_longx -case 0x9f: { - aa.l = op_readpc(); - aa.h = op_readpc(); - aa.b = op_readpc(); - if(regs.p.m) last_cycle(); - op_writelong(aa.d + regs.x.w, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writelong(aa.d + regs.x.w + 1, regs.a.h); -} break; - -//sta_dp -case 0x85: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - op_writedp(dp, regs.a.w); - if(regs.p.m) break; - last_cycle(); - op_writedp(dp + 1, regs.a.w >> 8); -} break; - -//stx_dp -case 0x86: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.x) last_cycle(); - op_writedp(dp, regs.x.w); - if(regs.p.x) break; - last_cycle(); - op_writedp(dp + 1, regs.x.w >> 8); -} break; - -//sty_dp -case 0x84: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.x) last_cycle(); - op_writedp(dp, regs.y.w); - if(regs.p.x) break; - last_cycle(); - op_writedp(dp + 1, regs.y.w >> 8); -} break; - -//stz_dp -case 0x64: { - dp = op_readpc(); - op_io_cond2(); - if(regs.p.m) last_cycle(); - op_writedp(dp, 0x0000); - if(regs.p.m) break; - last_cycle(); - op_writedp(dp + 1, 0x0000 >> 8); -} break; - -//sta_dpx -case 0x95: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - op_writedp(dp + regs.x.w, regs.a.w); - if(regs.p.m) break; - last_cycle(); - op_writedp(dp + regs.x.w + 1, regs.a.w >> 8); -} break; - -//sty_dpx -case 0x94: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.x) last_cycle(); - op_writedp(dp + regs.x.w, regs.y.w); - if(regs.p.x) break; - last_cycle(); - op_writedp(dp + regs.x.w + 1, regs.y.w >> 8); -} break; - -//stz_dpx -case 0x74: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.m) last_cycle(); - op_writedp(dp + regs.x.w, 0x0000); - if(regs.p.m) break; - last_cycle(); - op_writedp(dp + regs.x.w + 1, 0x0000 >> 8); -} break; - -//stx_dpy -case 0x96: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - if(regs.p.x) last_cycle(); - op_writedp(dp + regs.y.w, regs.x.l); - if(regs.p.x) break; - last_cycle(); - op_writedp(dp + regs.y.w + 1, regs.x.h); -} break; - -//sta_idp -case 0x92: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + 1, regs.a.h); -} break; - -//sta_ildp -case 0x87: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - op_writelong(aa.d, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writelong(aa.d + 1, regs.a.h); -} break; - -//sta_idpx -case 0x81: { - dp = op_readpc(); - op_io_cond2(); - op_io(); - aa.l = op_readdp(dp + regs.x.w); - aa.h = op_readdp(dp + regs.x.w + 1); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + 1, regs.a.h); -} break; - -//sta_idpy -case 0x91: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - op_io(); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} break; - -//sta_ildpy -case 0x97: { - dp = op_readpc(); - op_io_cond2(); - aa.l = op_readdp(dp); - aa.h = op_readdp(dp + 1); - aa.b = op_readdp(dp + 2); - if(regs.p.m) last_cycle(); - op_writelong(aa.d + regs.y.w, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writelong(aa.d + regs.y.w + 1, regs.a.h); -} break; - -//sta_sr -case 0x83: { - sp = op_readpc(); - op_io(); - if(regs.p.m) last_cycle(); - op_writesp(sp, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writesp(sp + 1, regs.a.h); -} break; - -//sta_isry -case 0x93: { - sp = op_readpc(); - op_io(); - aa.l = op_readsp(sp); - aa.h = op_readsp(sp + 1); - op_io(); - if(regs.p.m) last_cycle(); - op_writedbr(aa.w + regs.y.w, regs.a.l); - if(regs.p.m) break; - last_cycle(); - op_writedbr(aa.w + regs.y.w + 1, regs.a.h); -} break; - -#endif diff --git a/tools/bsnes/cpu/scpu/core/opfn.cpp b/tools/bsnes/cpu/scpu/core/opfn.cpp deleted file mode 100755 index 72bb757..0000000 --- a/tools/bsnes/cpu/scpu/core/opfn.cpp +++ /dev/null @@ -1,371 +0,0 @@ -#ifdef SCPU_CPP - -//op_read -inline void sCPU::op_adc_b() { - int r; - if(regs.p.d) { - uint8 n0 = (regs.a.l ) & 15; - uint8 n1 = (regs.a.l >> 4) & 15; - n0 += (rd.l & 15) + regs.p.c; - if(n0 > 9) { - n0 = (n0 - 10) & 15; - n1++; - } - n1 += ((rd.l >> 4) & 15); - if(n1 > 9) { - n1 = (n1 - 10) & 15; - regs.p.c = 1; - } else { - regs.p.c = 0; - } - r = (n1 << 4) | n0; - } else { - r = regs.a.l + rd.l + regs.p.c; - regs.p.c = r > 0xff; - } - regs.p.n = r & 0x80; - regs.p.v = ~(regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80; - regs.p.z = (uint8)r == 0; - regs.a.l = r; -} - -inline void sCPU::op_adc_w() { - int r; - if(regs.p.d) { - uint8 n0 = (regs.a.w ) & 15; - uint8 n1 = (regs.a.w >> 4) & 15; - uint8 n2 = (regs.a.w >> 8) & 15; - uint8 n3 = (regs.a.w >> 12) & 15; - n0 += (rd.w & 15) + regs.p.c; - if(n0 > 9) { - n0 = (n0 - 10) & 15; - n1++; - } - n1 += ((rd.w >> 4) & 15); - if(n1 > 9) { - n1 = (n1 - 10) & 15; - n2++; - } - n2 += ((rd.w >> 8) & 15); - if(n2 > 9) { - n2 = (n2 - 10) & 15; - n3++; - } - n3 += ((rd.w >> 12) & 15); - if(n3 > 9) { - n3 = (n3 - 10) & 15; - regs.p.c = 1; - } else { - regs.p.c = 0; - } - r = (n3 << 12) | (n2 << 8) | (n1 << 4) | n0; - } else { - r = regs.a.w + rd.w + regs.p.c; - regs.p.c = r > 0xffff; - } - regs.p.n = r & 0x8000; - regs.p.v = ~(regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000; - regs.p.z = (uint16)r == 0; - regs.a.w = r; -} - -inline void sCPU::op_and_b() { - regs.a.l &= rd.l; - regs.p.n = regs.a.l & 0x80; - regs.p.z = regs.a.l == 0; -} - -inline void sCPU::op_and_w() { - regs.a.w &= rd.w; - regs.p.n = regs.a.w & 0x8000; - regs.p.z = regs.a.w == 0; -} - -inline void sCPU::op_bit_b() { - regs.p.n = rd.l & 0x80; - regs.p.v = rd.l & 0x40; - regs.p.z = (rd.l & regs.a.l) == 0; -} - -inline void sCPU::op_bit_w() { - regs.p.n = rd.w & 0x8000; - regs.p.v = rd.w & 0x4000; - regs.p.z = (rd.w & regs.a.w) == 0; -} - -inline void sCPU::op_cmp_b() { - int r = regs.a.l - rd.l; - regs.p.n = r & 0x80; - regs.p.z = (uint8)r == 0; - regs.p.c = r >= 0; -} - -inline void sCPU::op_cmp_w() { - int r = regs.a.w - rd.w; - regs.p.n = r & 0x8000; - regs.p.z = (uint16)r == 0; - regs.p.c = r >= 0; -} - -inline void sCPU::op_cpx_b() { - int r = regs.x.l - rd.l; - regs.p.n = r & 0x80; - regs.p.z = (uint8)r == 0; - regs.p.c = r >= 0; -} - -inline void sCPU::op_cpx_w() { - int r = regs.x.w - rd.w; - regs.p.n = r & 0x8000; - regs.p.z = (uint16)r == 0; - regs.p.c = r >= 0; -} - -inline void sCPU::op_cpy_b() { - int r = regs.y.l - rd.l; - regs.p.n = r & 0x80; - regs.p.z = (uint8)r == 0; - regs.p.c = r >= 0; -} - -inline void sCPU::op_cpy_w() { - int r = regs.y.w - rd.w; - regs.p.n = r & 0x8000; - regs.p.z = (uint16)r == 0; - regs.p.c = r >= 0; -} - -inline void sCPU::op_eor_b() { - regs.a.l ^= rd.l; - regs.p.n = regs.a.l & 0x80; - regs.p.z = regs.a.l == 0; -} - -inline void sCPU::op_eor_w() { - regs.a.w ^= rd.w; - regs.p.n = regs.a.w & 0x8000; - regs.p.z = regs.a.w == 0; -} - -inline void sCPU::op_lda_b() { - regs.a.l = rd.l; - regs.p.n = regs.a.l & 0x80; - regs.p.z = regs.a.l == 0; -} - -inline void sCPU::op_lda_w() { - regs.a.w = rd.w; - regs.p.n = regs.a.w & 0x8000; - regs.p.z = regs.a.w == 0; -} - -inline void sCPU::op_ldx_b() { - regs.x.l = rd.l; - regs.p.n = regs.x.l & 0x80; - regs.p.z = regs.x.l == 0; -} - -inline void sCPU::op_ldx_w() { - regs.x.w = rd.w; - regs.p.n = regs.x.w & 0x8000; - regs.p.z = regs.x.w == 0; -} - -inline void sCPU::op_ldy_b() { - regs.y.l = rd.l; - regs.p.n = regs.y.l & 0x80; - regs.p.z = regs.y.l == 0; -} - -inline void sCPU::op_ldy_w() { - regs.y.w = rd.w; - regs.p.n = regs.y.w & 0x8000; - regs.p.z = regs.y.w == 0; -} - -inline void sCPU::op_ora_b() { - regs.a.l |= rd.l; - regs.p.n = regs.a.l & 0x80; - regs.p.z = regs.a.l == 0; -} - -inline void sCPU::op_ora_w() { - regs.a.w |= rd.w; - regs.p.n = regs.a.w & 0x8000; - regs.p.z = regs.a.w == 0; -} - -inline void sCPU::op_sbc_b() { - int r; - if(regs.p.d) { - uint8 n0 = (regs.a.l ) & 15; - uint8 n1 = (regs.a.l >> 4) & 15; - n0 -= ((rd.l ) & 15) + !regs.p.c; - n1 -= ((rd.l >> 4) & 15); - if(n0 > 9) { - n0 += 10; - n1--; - } - if(n1 > 9) { - n1 += 10; - regs.p.c = 0; - } else { - regs.p.c = 1; - } - r = (n1 << 4) | (n0); - } else { - r = regs.a.l - rd.l - !regs.p.c; - regs.p.c = r >= 0; - } - regs.p.n = r & 0x80; - regs.p.v = (regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80; - regs.p.z = (uint8)r == 0; - regs.a.l = r; -} - -inline void sCPU::op_sbc_w() { - int r; - if(regs.p.d) { - uint8 n0 = (regs.a.w ) & 15; - uint8 n1 = (regs.a.w >> 4) & 15; - uint8 n2 = (regs.a.w >> 8) & 15; - uint8 n3 = (regs.a.w >> 12) & 15; - n0 -= ((rd.w ) & 15) + !regs.p.c; - n1 -= ((rd.w >> 4) & 15); - n2 -= ((rd.w >> 8) & 15); - n3 -= ((rd.w >> 12) & 15); - if(n0 > 9) { - n0 += 10; - n1--; - } - if(n1 > 9) { - n1 += 10; - n2--; - } - if(n2 > 9) { - n2 += 10; - n3--; - } - if(n3 > 9) { - n3 += 10; - regs.p.c = 0; - } else { - regs.p.c = 1; - } - r = (n3 << 12) | (n2 << 8) | (n1 << 4) | (n0); - } else { - r = regs.a.w - rd.w - !regs.p.c; - regs.p.c = r >= 0; - } - regs.p.n = r & 0x8000; - regs.p.v = (regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000; - regs.p.z = (uint16)r == 0; - regs.a.w = r; -} - -//op_rmw -inline void sCPU::op_inc_b() { - rd.l++; - regs.p.n = rd.l & 0x80; - regs.p.z = rd.l == 0; -} - -inline void sCPU::op_inc_w() { - rd.w++; - regs.p.n = rd.w & 0x8000; - regs.p.z = rd.w == 0; -} - -inline void sCPU::op_dec_b() { - rd.l--; - regs.p.n = rd.l & 0x80; - regs.p.z = rd.l == 0; -} - -inline void sCPU::op_dec_w() { - rd.w--; - regs.p.n = rd.w & 0x8000; - regs.p.z = rd.w == 0; -} - -inline void sCPU::op_asl_b() { - regs.p.c = rd.l & 0x80; - rd.l <<= 1; - regs.p.n = rd.l & 0x80; - regs.p.z = rd.l == 0; -} - -inline void sCPU::op_asl_w() { - regs.p.c = rd.w & 0x8000; - rd.w <<= 1; - regs.p.n = rd.w & 0x8000; - regs.p.z = rd.w == 0; -} - -inline void sCPU::op_lsr_b() { - regs.p.c = rd.l & 1; - rd.l >>= 1; - regs.p.n = rd.l & 0x80; - regs.p.z = rd.l == 0; -} - -inline void sCPU::op_lsr_w() { - regs.p.c = rd.w & 1; - rd.w >>= 1; - regs.p.n = rd.w & 0x8000; - regs.p.z = rd.w == 0; -} - -inline void sCPU::op_rol_b() { - unsigned carry = (unsigned)regs.p.c; - regs.p.c = rd.l & 0x80; - rd.l = (rd.l << 1) | carry; - regs.p.n = rd.l & 0x80; - regs.p.z = rd.l == 0; -} - -inline void sCPU::op_rol_w() { - unsigned carry = (unsigned)regs.p.c; - regs.p.c = rd.w & 0x8000; - rd.w = (rd.w << 1) | carry; - regs.p.n = rd.w & 0x8000; - regs.p.z = rd.w == 0; -} - -inline void sCPU::op_ror_b() { - unsigned carry = (unsigned)regs.p.c << 7; - regs.p.c = rd.l & 1; - rd.l = carry | (rd.l >> 1); - regs.p.n = rd.l & 0x80; - regs.p.z = rd.l == 0; -} - -inline void sCPU::op_ror_w() { - unsigned carry = (unsigned)regs.p.c << 15; - regs.p.c = rd.w & 1; - rd.w = carry | (rd.w >> 1); - regs.p.n = rd.w & 0x8000; - regs.p.z = rd.w == 0; -} - -inline void sCPU::op_trb_b() { - regs.p.z = (rd.l & regs.a.l) == 0; - rd.l &= ~regs.a.l; -} - -inline void sCPU::op_trb_w() { - regs.p.z = (rd.w & regs.a.w) == 0; - rd.w &= ~regs.a.w; -} - -inline void sCPU::op_tsb_b() { - regs.p.z = (rd.l & regs.a.l) == 0; - rd.l |= regs.a.l; -} - -inline void sCPU::op_tsb_w() { - regs.p.z = (rd.w & regs.a.w) == 0; - rd.w |= regs.a.w; -} - -#endif //ifdef SCPU_CPP diff --git a/tools/bsnes/cpu/scpu/core/scpugen.cpp b/tools/bsnes/cpu/scpu/core/scpugen.cpp deleted file mode 100755 index a2ac5ac..0000000 --- a/tools/bsnes/cpu/scpu/core/scpugen.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#define CLASS_NAME "sCPU" -#include - -int main() { - generate("op_read.cpp", "op_read.b"); - generate("op_write.cpp", "op_write.b"); - generate("op_rmw.cpp", "op_rmw.b"); - generate("op_pc.cpp", "op_pc.b"); - generate("op_misc.cpp", "op_misc.b"); - - return 0; -} diff --git a/tools/bsnes/cpu/scpu/dma/dma.cpp b/tools/bsnes/cpu/scpu/dma/dma.cpp index de73d56..d59415a 100755 --- a/tools/bsnes/cpu/scpu/dma/dma.cpp +++ b/tools/bsnes/cpu/scpu/dma/dma.cpp @@ -3,6 +3,8 @@ void sCPU::dma_add_clocks(unsigned clocks) { status.dma_clocks += clocks; add_clocks(clocks); + scheduler.sync_cpucop(); + scheduler.sync_cpuppu(); } bool sCPU::dma_addr_valid(uint32 abus) { diff --git a/tools/bsnes/cpu/scpu/memory/memory.cpp b/tools/bsnes/cpu/scpu/memory/memory.cpp index 16faf77..e50e86d 100755 --- a/tools/bsnes/cpu/scpu/memory/memory.cpp +++ b/tools/bsnes/cpu/scpu/memory/memory.cpp @@ -1,125 +1,41 @@ #ifdef SCPU_CPP -/***** - * These 3 functions control bus timing for the CPU. - * cpu_io is an I/O cycle, and always 6 clock cycles long. - * mem_read / mem_write indicate memory access bus cycles. - * they are either 6, 8, or 12 bus cycles long, depending - * both on location and the $420d.d0 FastROM enable bit. - *****/ - -void sCPU::op_io() { - status.clock_count = 6; - precycle_edge(); - add_clocks(6); - cycle_edge(); -} - -uint8 sCPU::op_read(uint32 addr) { - status.clock_count = bus.speed(addr); - precycle_edge(); - add_clocks(status.clock_count - 4); - regs.mdr = bus.read(addr); - add_clocks(4); - cycle_edge(); - return regs.mdr; -} - -void sCPU::op_write(uint32 addr, uint8 data) { - status.clock_count = bus.speed(addr); - precycle_edge(); - add_clocks(status.clock_count); - regs.mdr = data; - bus.write(addr, regs.mdr); - cycle_edge(); -} - -// - -alwaysinline uint8 sCPU::op_readpc() { - return op_read((regs.pc.b << 16) + regs.pc.w++); -} - -alwaysinline uint8 sCPU::op_readstack() { - if(regs.e) { - regs.s.l++; - } else { - regs.s.w++; - } - return op_read(regs.s.w); -} - -alwaysinline uint8 sCPU::op_readstackn() { - return op_read(++regs.s.w); -} - -alwaysinline uint8 sCPU::op_readaddr(uint32 addr) { - return op_read(addr & 0xffff); -} - -alwaysinline uint8 sCPU::op_readlong(uint32 addr) { - return op_read(addr & 0xffffff); -} - -alwaysinline uint8 sCPU::op_readdbr(uint32 addr) { - return op_read(((regs.db << 16) + addr) & 0xffffff); -} - -alwaysinline uint8 sCPU::op_readpbr(uint32 addr) { - return op_read((regs.pc.b << 16) + (addr & 0xffff)); -} - -alwaysinline uint8 sCPU::op_readdp(uint32 addr) { - if(regs.e && regs.d.l == 0x00) { - return op_read((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff)); - } else { - return op_read((regs.d + (addr & 0xffff)) & 0xffff); - } -} - -alwaysinline uint8 sCPU::op_readsp(uint32 addr) { - return op_read((regs.s + (addr & 0xffff)) & 0xffff); -} - -alwaysinline void sCPU::op_writestack(uint8 data) { - op_write(regs.s.w, data); - if(regs.e) { - regs.s.l--; - } else { - regs.s.w--; - } -} - -alwaysinline void sCPU::op_writestackn(uint8 data) { - op_write(regs.s.w--, data); -} - -alwaysinline void sCPU::op_writeaddr(uint32 addr, uint8 data) { - op_write(addr & 0xffff, data); -} - -alwaysinline void sCPU::op_writelong(uint32 addr, uint8 data) { - op_write(addr & 0xffffff, data); -} - -alwaysinline void sCPU::op_writedbr(uint32 addr, uint8 data) { - op_write(((regs.db << 16) + addr) & 0xffffff, data); -} - -alwaysinline void sCPU::op_writepbr(uint32 addr, uint8 data) { - op_write((regs.pc.b << 16) + (addr & 0xffff), data); -} - -alwaysinline void sCPU::op_writedp(uint32 addr, uint8 data) { - if(regs.e && regs.d.l == 0x00) { - op_write((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff), data); - } else { - op_write((regs.d + (addr & 0xffff)) & 0xffff, data); - } -} - -alwaysinline void sCPU::op_writesp(uint32 addr, uint8 data) { - op_write((regs.s + (addr & 0xffff)) & 0xffff, data); -} +void sCPU::op_io() { + status.clock_count = 6; + precycle_edge(); + add_clocks(6); + cycle_edge(); +} + +uint8 sCPU::op_read(uint32 addr) { + status.clock_count = speed(addr); + precycle_edge(); + add_clocks(status.clock_count - 4); + scheduler.sync_cpucop(); + regs.mdr = bus.read(addr); + add_clocks(4); + cycle_edge(); + return regs.mdr; +} + +void sCPU::op_write(uint32 addr, uint8 data) { + status.clock_count = speed(addr); + precycle_edge(); + add_clocks(status.clock_count); + scheduler.sync_cpucop(); + bus.write(addr, regs.mdr = data); + cycle_edge(); +} + +unsigned sCPU::speed(unsigned addr) const { + if(addr & 0x408000) { + if(addr & 0x800000) return status.rom_speed; + return 8; + } + if((addr + 0x6000) & 0x4000) return 8; + if((addr - 0x4000) & 0x7e00) return 6; + return 12; +} + +#endif -#endif //ifdef SCPU_CPP diff --git a/tools/bsnes/cpu/scpu/memory/memory.hpp b/tools/bsnes/cpu/scpu/memory/memory.hpp index 50c3b21..1fe036a 100755 --- a/tools/bsnes/cpu/scpu/memory/memory.hpp +++ b/tools/bsnes/cpu/scpu/memory/memory.hpp @@ -1,35 +1,16 @@ - /***** - * CPU<>APU communication ports - *****/ - uint8 apu_port[4]; - uint8 port_read(uint8 port) { return apu_port[port & 3]; } - void port_write(uint8 port, uint8 data) { apu_port[port & 3] = data; } +//============================ +//CPU<>APU communication ports +//============================ - /***** - * core CPU bus functions - *****/ - void op_io(); - uint8 op_read(uint32 addr); - void op_write(uint32 addr, uint8 data); +uint8 apu_port[4]; +uint8 port_read(uint8 port) { return apu_port[port & 3]; } +void port_write(uint8 port, uint8 data) { apu_port[port & 3] = data; } - /***** - * helper memory addressing functions used by CPU core - *****/ - uint8 op_readpc (); - uint8 op_readstack (); - uint8 op_readstackn(); - uint8 op_readaddr (uint32 addr); - uint8 op_readlong (uint32 addr); - uint8 op_readdbr (uint32 addr); - uint8 op_readpbr (uint32 addr); - uint8 op_readdp (uint32 addr); - uint8 op_readsp (uint32 addr); +//====================== +//core CPU bus functions +//====================== - void op_writestack (uint8 data); - void op_writestackn(uint8 data); - void op_writeaddr (uint32 addr, uint8 data); - void op_writelong (uint32 addr, uint8 data); - void op_writedbr (uint32 addr, uint8 data); - void op_writepbr (uint32 addr, uint8 data); - void op_writedp (uint32 addr, uint8 data); - void op_writesp (uint32 addr, uint8 data); +void op_io(); +uint8 op_read(uint32 addr); +void op_write(uint32 addr, uint8 data); +alwaysinline unsigned speed(unsigned addr) const; diff --git a/tools/bsnes/cpu/scpu/mmio/mmio.cpp b/tools/bsnes/cpu/scpu/mmio/mmio.cpp index 7441cb2..5ec95af 100755 --- a/tools/bsnes/cpu/scpu/mmio/mmio.cpp +++ b/tools/bsnes/cpu/scpu/mmio/mmio.cpp @@ -42,7 +42,7 @@ void sCPU::mmio_w4016(uint8 data) { status.joypad_strobe_latch = !!(data & 1); if(status.joypad_strobe_latch == 1) { - snes.input.poll(); + input.poll(); } } @@ -54,7 +54,7 @@ void sCPU::mmio_w4016(uint8 data) { //realtime or buffered status of joypadN.b uint8 sCPU::mmio_r4016() { uint8 r = regs.mdr & 0xfc; - r |= snes.input.port_read(0) & 3; + r |= input.port_read(0) & 3; return r; } @@ -64,7 +64,7 @@ uint8 sCPU::mmio_r4016() { //1-0 = Joypad serial data uint8 sCPU::mmio_r4017() { uint8 r = (regs.mdr & 0xe0) | 0x1c; - r |= snes.input.port_read(1) & 3; + r |= input.port_read(1) & 3; return r; } @@ -93,7 +93,7 @@ void sCPU::mmio_w4203(uint8 data) { status.r4216 = status.mul_a * status.mul_b; status.alu_lock = true; - event.enqueue(snes.config.cpu.alu_mul_delay, EventAluLockRelease); + event.enqueue(config.cpu.alu_mul_delay, EventAluLockRelease); } //WRDIVL @@ -113,7 +113,7 @@ void sCPU::mmio_w4206(uint8 data) { status.r4216 = (status.div_b) ? status.div_a % status.div_b : status.div_a; status.alu_lock = true; - event.enqueue(snes.config.cpu.alu_div_delay, EventAluLockRelease); + event.enqueue(config.cpu.alu_div_delay, EventAluLockRelease); } //HTIMEL @@ -157,7 +157,7 @@ void sCPU::mmio_w420c(uint8 data) { //MEMSEL void sCPU::mmio_w420d(uint8 data) { - bus.set_speed(data & 1); + status.rom_speed = (data & 1 ? 6 : 8); } //RDNMI @@ -402,6 +402,9 @@ void sCPU::mmio_reset() { status.hirq_pos = 0x01ff; status.virq_pos = 0x01ff; + //$420d + status.rom_speed = 8; + //$4214-$4217 status.r4214 = 0x0000; status.r4216 = 0x0000; diff --git a/tools/bsnes/cpu/scpu/scpu.cpp b/tools/bsnes/cpu/scpu/scpu.cpp index 2927cd5..dc7b822 100755 --- a/tools/bsnes/cpu/scpu/scpu.cpp +++ b/tools/bsnes/cpu/scpu/scpu.cpp @@ -1,15 +1,54 @@ -#include <../base.hpp> -#define SCPU_CPP +#include <../base.hpp> +#include + +#define SCPU_CPP +namespace SNES { -#include priority_queue event(512, bind(&sCPU::queue_event, &cpu)); -#include "core/core.cpp" #include "dma/dma.cpp" #include "memory/memory.cpp" #include "mmio/mmio.cpp" #include "timing/timing.cpp" +void sCPU::enter() { + regs.pc.l = bus.read(0xfffc); + regs.pc.h = bus.read(0xfffd); + add_clocks(186); + + while(true) { + if(status.interrupt_pending) { + status.interrupt_pending = false; + if(status.nmi_pending) { + status.nmi_pending = false; + status.interrupt_vector = (regs.e == false ? 0xffea : 0xfffa); + } else if(status.irq_pending) { + status.irq_pending = false; + status.interrupt_vector = (regs.e == false ? 0xffee : 0xfffe); + } + op_irq(); + } + + tracer.trace_cpuop(); //traces CPU opcode (only if tracer is enabled) + (this->*opcode_table[op_readpc()])(); + } +} + +void sCPU::op_irq() { + op_read(regs.pc.d); + op_io(); + if(!regs.e) op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.e ? (regs.p & ~0x10) : regs.p); + rd.l = op_read(status.interrupt_vector + 0); + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; + rd.h = op_read(status.interrupt_vector + 1); + regs.pc.w = rd.w; +} + void sCPU::power() { CPU::power(); @@ -26,11 +65,8 @@ void sCPU::power() { void sCPU::reset() { CPU::reset(); - regs.pc.d = 0x000000; - regs.pc.l = bus.read(0xfffc); - regs.pc.h = bus.read(0xfffd); - //note: some registers are not fully reset by SNES + regs.pc = 0x000000; regs.x.h = 0x00; regs.y.h = 0x00; regs.s.h = 0x01; @@ -39,8 +75,9 @@ void sCPU::reset() { regs.p = 0x34; regs.e = 1; regs.mdr = 0x00; + regs.wai = false; + update_table(); - status.wai_lock = false; status.interrupt_pending = false; status.interrupt_vector = 0xfffc; //reset vector address @@ -59,3 +96,5 @@ sCPU::sCPU() { sCPU::~sCPU() { } +}; + diff --git a/tools/bsnes/cpu/scpu/scpu.hpp b/tools/bsnes/cpu/scpu/scpu.hpp index 3be415f..b2bae64 100755 --- a/tools/bsnes/cpu/scpu/scpu.hpp +++ b/tools/bsnes/cpu/scpu/scpu.hpp @@ -1,8 +1,9 @@ -class sCPU : public CPU { +class sCPU : public CPU, public CPUcore { public: void enter(); + void op_irq(); + bool interrupt_pending() { return status.interrupt_pending; } - #include "core/core.hpp" #include "dma/dma.hpp" #include "memory/memory.hpp" #include "mmio/mmio.hpp" @@ -11,11 +12,6 @@ public: enum DmaState { DmaInactive, DmaRun, DmaCpuSync }; struct { - //core - uint8 opcode; - bool in_opcode; - - bool wai_lock; bool interrupt_pending; uint16 interrupt_vector; @@ -75,6 +71,9 @@ public: //$4207-$420a uint16 hirq_pos, virq_pos; + //$420d + unsigned rom_speed; + //$4214-$4217 uint16 r4214; uint16 r4216; diff --git a/tools/bsnes/cpu/scpu/timing/irq.cpp b/tools/bsnes/cpu/scpu/timing/irq.cpp index 5b4a559..ed4b036 100755 --- a/tools/bsnes/cpu/scpu/timing/irq.cpp +++ b/tools/bsnes/cpu/scpu/timing/irq.cpp @@ -93,14 +93,14 @@ bool sCPU::timeup() { bool sCPU::nmi_test() { if(!status.nmi_transition) return false; status.nmi_transition = false; - status.wai_lock = false; + regs.wai = false; return true; } -bool sCPU::irq_test() { - if(!status.irq_transition) return false; - status.irq_transition = false; - status.wai_lock = false; +bool sCPU::irq_test() { + if(!status.irq_transition && !regs.irq) return false; + status.irq_transition = false; + regs.wai = false; return !regs.p.i; } diff --git a/tools/bsnes/cpu/scpu/timing/joypad.cpp b/tools/bsnes/cpu/scpu/timing/joypad.cpp index c754c4d..2afb017 100755 --- a/tools/bsnes/cpu/scpu/timing/joypad.cpp +++ b/tools/bsnes/cpu/scpu/timing/joypad.cpp @@ -3,8 +3,8 @@ void sCPU::run_auto_joypad_poll() { uint16 joy1 = 0, joy2 = 0, joy3 = 0, joy4 = 0; for(unsigned i = 0; i < 16; i++) { - uint8 port0 = snes.input.port_read(0); - uint8 port1 = snes.input.port_read(1); + uint8 port0 = input.port_read(0); + uint8 port1 = input.port_read(1); joy1 |= (port0 & 1) ? (0x8000 >> i) : 0; joy2 |= (port1 & 1) ? (0x8000 >> i) : 0; diff --git a/tools/bsnes/cpu/scpu/timing/timing.cpp b/tools/bsnes/cpu/scpu/timing/timing.cpp index c43ed5f..63bf3ae 100755 --- a/tools/bsnes/cpu/scpu/timing/timing.cpp +++ b/tools/bsnes/cpu/scpu/timing/timing.cpp @@ -13,19 +13,25 @@ void sCPU::add_clocks(unsigned clocks) { unsigned ticks = clocks >> 1; while(ticks--) { ppu.tick(); - if((ppu.hcounter() & 2) == 0) { - snes.input.tick(); - } else { + if(ppu.hcounter() & 2) { + input.tick(); poll_interrupts(); } } scheduler.addclocks_cpu(clocks); } +//called by ppu.tick() when Hcounter=0 void sCPU::scanline() { status.dma_counter = (status.dma_counter + status.line_clocks) & 7; status.line_clocks = ppu.lineclocks(); + //forcefully sync S-CPU to other processors, in case chips are not communicating + scheduler.sync_cpuppu(); + scheduler.sync_cpucop(); + scheduler.sync_cpusmp(); + system.scanline(); + if(ppu.vcounter() == 0) { //hdma init triggers once every frame event.enqueue(cpu_version == 1 ? 12 + 8 - dma_counter() : 12 + dma_counter(), EventHdmaInit); @@ -41,7 +47,7 @@ void sCPU::scanline() { } if(status.auto_joypad_poll == true && ppu.vcounter() == (ppu.overscan() == false ? 227 : 242)) { - snes.input.poll(); + input.poll(); run_auto_joypad_poll(); } } diff --git a/tools/bsnes/dsp/adsp/adsp.cpp b/tools/bsnes/dsp/adsp/adsp.cpp index d758ca1..e73350e 100755 --- a/tools/bsnes/dsp/adsp/adsp.cpp +++ b/tools/bsnes/dsp/adsp/adsp.cpp @@ -1,5 +1,7 @@ #include <../base.hpp> + #define ADSP_CPP +namespaec SNES { #include "adsp_tables.cpp" @@ -580,9 +582,13 @@ int32 fir_samplel, fir_sampler; msampler = sclamp<16>(msampler); } - snes.audio.update(msamplel, msampler); + audio.sample(msamplel, msampler); scheduler.addclocks_dsp(32 * 3 * 8); + scheduler.sync_dspsmp(); } aDSP::aDSP() {} aDSP::~aDSP() {} + +}; + diff --git a/tools/bsnes/dsp/sdsp/echo.cpp b/tools/bsnes/dsp/sdsp/echo.cpp index 36e7d92..fa38f87 100755 --- a/tools/bsnes/dsp/sdsp/echo.cpp +++ b/tools/bsnes/dsp/sdsp/echo.cpp @@ -106,7 +106,7 @@ void sDSP::echo_27() { } //output sample to DAC - snes.audio.update(outl, outr); + audio.sample(outl, outr); } void sDSP::echo_28() { diff --git a/tools/bsnes/dsp/sdsp/sdsp.cpp b/tools/bsnes/dsp/sdsp/sdsp.cpp index d972f2d..5277dc7 100755 --- a/tools/bsnes/dsp/sdsp/sdsp.cpp +++ b/tools/bsnes/dsp/sdsp/sdsp.cpp @@ -1,21 +1,21 @@ /* S-DSP emulator - license: LGPLv2 - Note: this is basically a C++ cothreaded implementation of Shay Green's (blargg's) S-DSP emulator. The actual algorithms, timing information, tables, variable names, etc were all from him. */ #include <../base.hpp> + #define SDSP_CPP +namespace SNES { #define REG(n) state.regs[r_##n] #define VREG(n) state.regs[v.vidx + v_##n] -#if !defined(USE_STATE_MACHINE) +#if !defined(DSP_STATE_MACHINE) #define phase_start() while(true) { #define phase(n) - #define tick() scheduler.addclocks_dsp(3 * 8) + #define tick() scheduler.addclocks_dsp(3 * 8); scheduler.sync_dspsmp() #define phase_end() } #else #define phase_start() switch(phase_index) { @@ -324,3 +324,6 @@ sDSP::sDSP() { sDSP::~sDSP() { } + +}; + diff --git a/tools/bsnes/interface.hpp b/tools/bsnes/interface.hpp index 09b75ff..19d6641 100755 --- a/tools/bsnes/interface.hpp +++ b/tools/bsnes/interface.hpp @@ -1,24 +1,31 @@ -#include "cheat/cheat.hpp" +namespace SNES { + #include "cheat/cheat.hpp" -#include "memory/memory.hpp" -#include "memory/smemory/smemory.hpp" + #include "memory/memory.hpp" + #include "memory/smemory/smemory.hpp" -#include "cpu/cpu.hpp" -#include "cpu/scpu/scpu.hpp" + #include "cpu/cpu.hpp" + #include "cpu/core/core.hpp" + #include "cpu/scpu/scpu.hpp" -#include "ppu/ppu.hpp" -#include "ppu/bppu/bppu.hpp" + #include "smp/smp.hpp" + #include "smp/core/core.hpp" + #include "smp/ssmp/ssmp.hpp" -#include "smp/smp.hpp" -#include "smp/ssmp/ssmp.hpp" + #include "ppu/ppu.hpp" + #include "ppu/bppu/bppu.hpp" -#include "dsp/dsp.hpp" -#include "dsp/sdsp/sdsp.hpp" + #include "dsp/dsp.hpp" + #include "dsp/sdsp/sdsp.hpp" -extern BUSCORE bus; -extern CPUCORE cpu; -extern SMPCORE smp; -extern DSPCORE dsp; -extern PPUCORE ppu; + extern BUSCORE bus; + extern CPUCORE cpu; + extern SMPCORE smp; + extern DSPCORE dsp; + extern PPUCORE ppu; + + #include "system/system.hpp" + #include "chip/chip.hpp" + #include "cartridge/cartridge.hpp" +}; -#include "snes/snes.hpp" diff --git a/tools/bsnes/lib/nall/Makefile.string b/tools/bsnes/lib/nall/Makefile.string deleted file mode 100755 index 0de1db2..0000000 --- a/tools/bsnes/lib/nall/Makefile.string +++ /dev/null @@ -1,63 +0,0 @@ -# Makefile.string -# author: byuu -# license: public domain - -[A-Z] = A B C D E F G H I J K L M N O P Q R S T U V W X Y Z -[a-z] = a b c d e f g h i j k l m n o p q r s t u v w x y z -[0-9] = 0 1 2 3 4 5 6 7 8 9 -[markup] = ` ~ ! @ \# $$ % ^ & * ( ) - _ = + [ { ] } \ | ; : ' " , < . > / ? -[all] = $([A-Z]) $([a-z]) $([0-9]) $([markup]) -[space] := -[space] += - -##### -# function strtr(source, from, to) -##### -strtr = \ - $(eval __temp := $1) \ - $(strip \ - $(foreach c, \ - $(join $(addsuffix :,$2),$3), \ - $(eval __temp := \ - $(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$(__temp)) \ - ) \ - ) \ - $(__temp) \ - ) - -##### -# function strupper(source) -##### -strupper = $(call strtr,$1,$([a-z]),$([A-Z])) - -##### -# function strlower(source) -##### -strlower = $(call strtr,$1,$([A-Z]),$([a-z])) - -##### -# function strlen(source) -##### -strlen = \ - $(eval __temp := $(subst $([space]),_,$1)) \ - $(words \ - $(strip \ - $(foreach c, \ - $([all]), \ - $(eval __temp := \ - $(subst $c,$c ,$(__temp)) \ - ) \ - ) \ - $(__temp) \ - ) \ - ) - -##### -# function streq(source) -##### -streq = $(if $(filter-out xx,x$(subst $1,,$2)$(subst $2,,$1)x),,1) - -##### -# function strne(source) -##### -strne = $(if $(filter-out xx,x$(subst $1,,$2)$(subst $2,,$1)x),1,) diff --git a/tools/bsnes/lib/nall/file.hpp b/tools/bsnes/lib/nall/file.hpp index dc4da3a..5ebaeb4 100755 --- a/tools/bsnes/lib/nall/file.hpp +++ b/tools/bsnes/lib/nall/file.hpp @@ -130,6 +130,21 @@ namespace nall { return false; } + static unsigned size(const char *fn) { + #if !defined(_WIN32) + FILE *fp = fopen(fn, "rb"); + #else + FILE *fp = _wfopen(utf16_t(fn), L"rb"); + #endif + unsigned filesize = 0; + if(fp) { + fseek(fp, 0, SEEK_END); + filesize = ftell(fp); + fclose(fp); + } + return filesize; + } + bool open() { return fp; } diff --git a/tools/bsnes/lib/nall/function.hpp b/tools/bsnes/lib/nall/function.hpp index 9e90cb1..dfd66ee 100755 --- a/tools/bsnes/lib/nall/function.hpp +++ b/tools/bsnes/lib/nall/function.hpp @@ -133,7 +133,12 @@ namespace nall { R operator()(PL) const { return data.fn_call(data cat(CL)); } operator bool() const { return data.fn_call; } - function() { data.fn_call = 0; } + function() { data.fn_call = 0; } + + function(void *fn) { + data.fn_call = &fn_call_global; + data.fn_global = (R (*)(PL))fn; + } function(R (*fn)(PL)) { data.fn_call = &fn_call_global; @@ -155,8 +160,9 @@ namespace nall { assert(sizeof data.fn_member >= sizeof fn); data.object = obj; } - - function &operator=(const function &source) { memcpy(&data, &source.data, sizeof(data_t)); return *this; } + + function& operator=(void *fn) { return operator=(function(fn)); } + function& operator=(const function &source) { memcpy(&data, &source.data, sizeof(data_t)); return *this; } function(const function &source) { memcpy(&data, &source.data, sizeof(data_t)); } }; diff --git a/tools/bsnes/lib/nall/platform.hpp b/tools/bsnes/lib/nall/platform.hpp index bdae675..3fe3c7a 100755 --- a/tools/bsnes/lib/nall/platform.hpp +++ b/tools/bsnes/lib/nall/platform.hpp @@ -20,6 +20,7 @@ #include #include #include + #undef interface #else #include #include @@ -73,3 +74,4 @@ #endif #endif + diff --git a/tools/bsnes/lib/nall/utf8.hpp b/tools/bsnes/lib/nall/utf8.hpp index cae4e1b..5b7316d 100755 --- a/tools/bsnes/lib/nall/utf8.hpp +++ b/tools/bsnes/lib/nall/utf8.hpp @@ -11,6 +11,7 @@ #undef NOMINMAX #define NOMINMAX #include +#undef interface namespace nall { //UTF-8 to UTF-16 diff --git a/tools/bsnes/lib/ruby/audio/openal.cpp b/tools/bsnes/lib/ruby/audio/openal.cpp index 90c0698..69d811e 100755 --- a/tools/bsnes/lib/ruby/audio/openal.cpp +++ b/tools/bsnes/lib/ruby/audio/openal.cpp @@ -1,11 +1,6 @@ +#include +#include -#ifdef __APPLE__ - #include - #include -#else - #include - #include -#endif namespace ruby { #include "openal.hpp" diff --git a/tools/bsnes/lib/ruby/video/glx.cpp b/tools/bsnes/lib/ruby/video/glx.cpp index 909390c..aba8484 100755 --- a/tools/bsnes/lib/ruby/video/glx.cpp +++ b/tools/bsnes/lib/ruby/video/glx.cpp @@ -26,6 +26,9 @@ #include #include +//#include +//#include + namespace ruby { #include "glx.hpp" diff --git a/tools/bsnes/lib/sync.sh b/tools/bsnes/lib/sync.sh index 81a8970..f9af50c 100755 --- a/tools/bsnes/lib/sync.sh +++ b/tools/bsnes/lib/sync.sh @@ -1,6 +1,15 @@ rm -r nall rm -r ruby +rm -r bpp + cp -r ../../../nall ./nall cp -r ../../../ruby ./ruby +cp -r ../../../bpp ./bpp + rm ruby/test* rm ruby/cc.* + +rm bpp/test* +rm bpp/*.bpp +rm bpp/bpp +rm bpp/cc.* diff --git a/tools/bsnes/lib/tool/opgen.cpp b/tools/bsnes/lib/tool/opgen.cpp deleted file mode 100755 index ed50771..0000000 --- a/tools/bsnes/lib/tool/opgen.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* broken -- need to port libstring to bstring */ - -#include "libbase.h" -#include "libstring.h" -#include "libstring.cpp" - -FILE *fp, *fph, *fpt; - -stringarray data, line, part, subpart; -stringarray output_table, output_header, output_op; - -struct _op_list { - stringarray name, arg; -} op_list[64]; - -int32 op_count, line_num; - -void clear_op_list() { - op_count = 0; - for(int i = 0; i < 64; i++) { - strcpy(op_list[i].name, ""); - for(int l = 0; l < 8; l++) { - strcpy(op_list[i].arg[l], ""); - } - } -} - -void gen_header() { -int i = line_num; -char t[4096]; - clear_op_list(); - while(1) { - int z = op_count++; - strcpy(part, line[i]); - strrtrim(part, "),"); - strrtrim(part, ") {"); - split(subpart, "(", part); - strcpy(op_list[z].name, subpart[0]); - split(part, ", ", subpart[1]); - for(int l = 0; l < count(part); l++) { - strcpy(op_list[z].arg[l], part[l]); - } - if(strend(line[i], " {"))break; - i++; - } - - sprintf(output_op, "void " CLASS_NAME "::op_$$() {\r\n switch(status.cycle_pos++) {\r\n"); - sprintf(output_header, "void op_$$();\r\n"); - sprintf(output_table, "optbl[$0] = &" CLASS_NAME "::op_$$;\r\n"); - - line_num = i + 1; -} - -void update_line(int i, int n) { -char t[4096]; - replace(line[i], "end;", "status.cycle_pos = 0;"); - replace(line[i], "skip;", "status.cycle_pos++;"); -} - -void gen_op() { -int i = line_num, n, c; -char t[4096]; - while(1) { - if(strmatch(line[i], "}"))break; - - n = strdec(line[i]); - sprintf(t, "%d:", n); - strltrim(line[i], t); - sprintf(t, " case %d: {\r\n", n); - strcat(output_op, t); - - update_line(i, n); - if(!strmatch(line[i], "")) { - strcat(output_op, " "); - strcat(output_op, line[i]); - strcat(output_op, "\r\n"); - } - - i++; - while(1) { - if(strptr(line[i])[1] == ':' || strptr(line[i])[2] == ':' || strmatch(line[i], "}"))break; - - update_line(i, n); - strcat(output_op, " "); - strcat(output_op, line[i]); - strcat(output_op, "\r\n"); - - i++; - } - - if(strmatch(line[i], "}")) { - strcat(output_op, " status.cycle_pos = 0;\r\n"); - } - - strcat(output_op, " } break;\r\n"); - } - strcat(output_op, " }\r\n}"); - - line_num = i + 1; -} - -void gen_final() { -string t; - for(int i = 0; i < op_count; i++) { - strcpy(t, output_op); - replace(t, "$$", op_list[i].name); - replace(t, "$0", op_list[i].arg[0]); - replace(t, "$1", op_list[i].arg[1]); - replace(t, "$2", op_list[i].arg[2]); - replace(t, "$3", op_list[i].arg[3]); - replace(t, "$4", op_list[i].arg[4]); - replace(t, "$5", op_list[i].arg[5]); - replace(t, "$6", op_list[i].arg[6]); - replace(t, "$7", op_list[i].arg[7]); - fprintf(fp, "%s\r\n\r\n", strptr(t)); - - strcpy(t, output_header); - replace(t, "$$", op_list[i].name); - fprintf(fph, "%s", strptr(t)); - - strcpy(t, output_table); - replace(t, "$$", op_list[i].name); - replace(t, "$0", op_list[i].arg[0]); - fprintf(fpt, "%s", strptr(t)); - } -} - -void generate(char *dest, char *src) { - fp = fopen(src, "rb"); - - fseek(fp, 0, SEEK_END); -int fsize = ftell(fp); - fseek(fp, 0, SEEK_SET); -char *buf = (char*)malloc(fsize + 1); - fread(buf, 1, fsize, fp); - fclose(fp); - buf[fsize] = 0; - - strcpy(data, buf); - free(buf); - replace(data, "\r\n", "\n"); - split(line, "\n", data); - - fp = fopen(dest, "wb"); - - line_num = 0; - while(line_num < count(line)) { - while(line_num < count(line) && strmatch(line[line_num], ""))line_num++; - if(line_num >= count(line))break; - - gen_header(); - gen_op(); - gen_final(); - } - - fclose(fp); -} diff --git a/tools/bsnes/lib/tool/opgen_fnptr.cpp b/tools/bsnes/lib/tool/opgen_fnptr.cpp deleted file mode 100755 index 1f948bd..0000000 --- a/tools/bsnes/lib/tool/opgen_fnptr.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* broken -- need to port libstring to bstring */ - -#include "libbase.h" -#include "libstring.h" -#include "libstring.cpp" - -FILE *fp, *fph, *fpt; - -stringarray data, line, part, subpart; -stringarray output_table, output_header, output_op; - -struct _op_list { - stringarray name, arg; -} op_list[64]; - -int32 op_count, line_num; - -void clear_op_list() { - op_count = 0; - for(int i = 0; i < 64; i++) { - strcpy(op_list[i].name, ""); - for(int l = 0; l < 8; l++) { - strcpy(op_list[i].arg[l], ""); - } - } -} - -void gen_header() { -int i = line_num; -char t[4096]; - clear_op_list(); - while(1) { - int z = op_count++; - strcpy(part, line[i]); - strrtrim(part, "),"); - strrtrim(part, ") {"); - split(subpart, "(", part); - strcpy(op_list[z].name, subpart[0]); - split(part, ", ", subpart[1]); - for(int l = 0; l < count(part); l++) { - strcpy(op_list[z].arg[l], part[l]); - } - if(strend(line[i], " {"))break; - i++; - } - - sprintf(output_op, "void " CLASS_NAME "::op_$$() {\r\n"); - sprintf(output_header, "void op_$$();\r\n"); - sprintf(output_table, "optbl[$0] = &" CLASS_NAME "::op_$$;\r\n"); - - line_num = i + 1; -} - -void update_line(int i) { -char t[4096]; - replace(line[i], "end;", "return;"); -} - -void gen_op() { -int i = line_num, n, c; -char t[4096]; - while(1) { - if(!strcmp(line[i], "}"))break; - - n = strdec(line[i]); - sprintf(t, "%d:", n); - strltrim(line[i], t); - //sprintf(t, " case %d: {\r\n", n); - //strcat(output_op, t); - - update_line(i); - if(strcmp(line[i], "")) { - strcat(output_op, " "); - strcat(output_op, line[i]); - strcat(output_op, "\r\n"); - } - - i++; - while(1) { - if(strptr(line[i])[1] == ':' || strptr(line[i])[2] == ':' || !strcmp(line[i], "}"))break; - - update_line(i); - strcat(output_op, line[i]); - strcat(output_op, "\r\n"); - - i++; - } - } - - strcat(output_op, "}"); - line_num = i + 1; -} - -void gen_final() { -string t; - for(int i = 0; i < op_count; i++) { - strcpy(t, output_op); - replace(t, "$$", op_list[i].name); - replace(t, "$0", op_list[i].arg[0]); - replace(t, "$1", op_list[i].arg[1]); - replace(t, "$2", op_list[i].arg[2]); - replace(t, "$3", op_list[i].arg[3]); - replace(t, "$4", op_list[i].arg[4]); - replace(t, "$5", op_list[i].arg[5]); - replace(t, "$6", op_list[i].arg[6]); - replace(t, "$7", op_list[i].arg[7]); - fprintf(fp, "%s\r\n\r\n", strptr(t)); - - strcpy(t, output_header); - replace(t, "$$", op_list[i].name); - fprintf(fph, "%s", strptr(t)); - - strcpy(t, output_table); - replace(t, "$$", op_list[i].name); - replace(t, "$0", op_list[i].arg[0]); - fprintf(fpt, "%s", strptr(t)); - } -} - -void generate(char *dest, char *src) { - fp = fopen(src, "rb"); - - fseek(fp, 0, SEEK_END); -int fsize = ftell(fp); - fseek(fp, 0, SEEK_SET); -char *buf = (char*)malloc(fsize + 1); - fread(buf, 1, fsize, fp); - fclose(fp); - buf[fsize] = 0; - - strcpy(data, buf); - free(buf); - replace(data, "\r\n", "\n"); - split(line, "\n", data); - - fp = fopen(dest, "wb"); - - line_num = 0; - while(line_num < count(line)) { - while(line_num < count(line) && !strcmp(line[line_num], ""))line_num++; - if(line_num >= count(line))break; - - gen_header(); - gen_op(); - gen_final(); - } - - fclose(fp); -} diff --git a/tools/bsnes/lib/tool/opgen_switch.cpp b/tools/bsnes/lib/tool/opgen_switch.cpp deleted file mode 100755 index 80da12e..0000000 --- a/tools/bsnes/lib/tool/opgen_switch.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include -using namespace nall; - -FILE *fp; - -string data, output_op; -lstring line, part, subpart; - -struct OpList { - string name; - lstring arg; -} op_list[64]; - -int32_t op_count, line_num; - -void clear_op_list() { - op_count = 0; - for(unsigned i = 0; i < 64; i++) { - strcpy(op_list[i].name, ""); - for(unsigned l = 0; l < 8; l++) { - strcpy(op_list[i].arg[l], ""); - } - } -} - -void gen_begin() { - int i = line_num; - clear_op_list(); - - while(true) { - int z = op_count++; - string temp = line[i]; - rtrim(temp, "),"); - rtrim(temp, ") {"); - split(subpart, "(", temp); - strcpy(op_list[z].name, subpart[0]); - split(part, ", ", subpart[1]); - for(unsigned l = 0; l < count(part); l++) { - strcpy(op_list[z].arg[l], part[l]); - } - if(strend(line[i], " {") == true) break; - i++; - } - - strcpy(output_op, "//$$\r\ncase $0: {\r\n"); - line_num = i + 1; -} - -void update_line(int i) { - replace(line[i], "end;", "break;"); -} - -void gen_op() { - int i = line_num, n, c; - char t[4096]; - while(true) { - if(!strcmp(line[i], "}"))break; - - //remove cycle number - n = strdec((const char*)line[i]); - sprintf(t, "%d:", n); - ltrim(line[i], t); - //sprintf(t, "//%d:\r\n", n); - //strcat(output_op, t); - - update_line(i); - if(strcmp(line[i], "")) { - strcat(output_op, " "); - strcat(output_op, line[i]); - strcat(output_op, "\r\n"); - } - - i++; - while(true) { - if(line[i][1] == ':' || line[i][2] == ':' || line[i] == "}") break; - - update_line(i); - strcat(output_op, line[i]); - strcat(output_op, "\r\n"); - - i++; - } - } - - strcat(output_op, "} break;"); - line_num = i + 1; -} - -void gen_end() { - string t; - for(unsigned i = 0; i < op_count; i++) { - t = output_op; - replace(t, "$$", op_list[i].name); - replace(t, "$0", op_list[i].arg[0]); - replace(t, "$1", op_list[i].arg[1]); - replace(t, "$2", op_list[i].arg[2]); - replace(t, "$3", op_list[i].arg[3]); - replace(t, "$4", op_list[i].arg[4]); - replace(t, "$5", op_list[i].arg[5]); - replace(t, "$6", op_list[i].arg[6]); - replace(t, "$7", op_list[i].arg[7]); - fprintf(fp, "%s\r\n\r\n", (const char*)t); - } -} - -void generate(const char *dest, const char *src) { - fread(data, src); - replace(data, "\r\n", "\n"); - split(line, "\n", data); - - fp = fopen(dest, "wb"); - string header = CLASS_NAME; - fprintf(fp, "#ifdef %s_CPP\n\n", (const char*)strupper(header)); //inclusion guard - - line_num = 0; - while(line_num < count(line)) { - while(line_num < count(line) && !strcmp(line[line_num], "")) line_num++; - if(line_num >= count(line)) break; - - gen_begin(); - gen_op(); - gen_end(); - } - - fprintf(fp, "#endif\n"); - fclose(fp); -} diff --git a/tools/bsnes/memory/memory.cpp b/tools/bsnes/memory/memory.cpp index c928f0b..326efe9 100755 --- a/tools/bsnes/memory/memory.cpp +++ b/tools/bsnes/memory/memory.cpp @@ -1,5 +1,7 @@ #include <../base.hpp> + #define MEMORY_CPP +namespace SNES { namespace memory { MMIOAccess mmio; @@ -24,18 +26,11 @@ void MMIOAccess::map(unsigned addr, MMIO &access) { mmio[(addr - 0x2000) & 0x3fff] = &access; } -MMIO* MMIOAccess::get(unsigned addr) { - return mmio[(addr - 0x2000) & 0x3fff]; -} - uint8 MMIOAccess::read(unsigned addr) { - printf("MMIOAccess::read 0x%x\n",addr); - - return mmio[(addr - 0x2000) & 0x3fff]->mmio_read(addr); + return mmio[(addr - 0x2000) & 0x3fff]->mmio_read(addr); } void MMIOAccess::write(unsigned addr, uint8 data) { - printf("MMIOAccess::write 0x%x %x\n",addr,data); mmio[(addr - 0x2000) & 0x3fff]->mmio_write(addr, data); } @@ -70,7 +65,6 @@ void Bus::map( ) { assert(bank_lo <= bank_hi); assert(addr_lo <= addr_hi); - if(access.size() == -1U) return; uint8 page_lo = addr_lo >> 8; @@ -79,8 +73,6 @@ void Bus::map( switch(mode) { case MapDirect: { - printf("Bus::map MapDirect bank_lo=0x%02x bank_hi=0x%02x addr_lo=0x%04x addr_hi=0x%04x\n", - bank_lo,bank_hi,addr_lo,addr_hi); for(unsigned bank = bank_lo; bank <= bank_hi; bank++) { for(unsigned page = page_lo; page <= page_hi; page++) { map((bank << 16) + (page << 8), access, (bank << 16) + (page << 8)); @@ -89,8 +81,6 @@ void Bus::map( } break; case MapLinear: { - printf("Bus::map MapLinear bank_lo=0x%02x bank_hi=0x%02x addr_lo=0x%04x addr_hi=0x%04x\n", - bank_lo,bank_hi,addr_lo,addr_hi); for(unsigned bank = bank_lo; bank <= bank_hi; bank++) { for(unsigned page = page_lo; page <= page_hi; page++) { map((bank << 16) + (page << 8), access, mirror(offset + index, access.size())); @@ -101,8 +91,6 @@ void Bus::map( } break; case MapShadow: { - printf("Bus::map MapShadow bank_lo=0x%02x bank_hi=0x%02x addr_lo=0x%04x addr_hi=0x%04x\n", - bank_lo,bank_hi,addr_lo,addr_hi); for(unsigned bank = bank_lo; bank <= bank_hi; bank++) { index += page_lo * 256; if(size) index %= size; @@ -119,3 +107,6 @@ void Bus::map( } break; } } + +}; + diff --git a/tools/bsnes/memory/memory.hpp b/tools/bsnes/memory/memory.hpp index 03bb628..7d58e15 100755 --- a/tools/bsnes/memory/memory.hpp +++ b/tools/bsnes/memory/memory.hpp @@ -20,52 +20,62 @@ struct UnmappedMMIO : MMIO { }; struct StaticRAM : Memory { - uint8* handle() { return data; } - unsigned size() const { return datasize; } + uint8* data() { return data_; } + unsigned size() const { return size_; } - inline uint8 read(unsigned addr) { return data[addr]; } - inline void write(unsigned addr, uint8 n) { data[addr] = n; } - inline uint8& operator[](unsigned addr) { return data[addr]; } - inline const uint8& operator[](unsigned addr) const { return data[addr]; } + inline uint8 read(unsigned addr) { return data_[addr]; } + inline void write(unsigned addr, uint8 n) { data_[addr] = n; } + inline uint8& operator[](unsigned addr) { return data_[addr]; } + inline const uint8& operator[](unsigned addr) const { return data_[addr]; } - StaticRAM(unsigned n) : datasize(n) { data = new uint8[datasize]; } - ~StaticRAM() { delete[] data; } + StaticRAM(unsigned n) : size_(n) { data_ = new uint8[size_]; } + ~StaticRAM() { delete[] data_; } private: - uint8 *data; - unsigned datasize; + uint8 *data_; + unsigned size_; }; -struct MappedRAM : Memory { - void map(uint8 *source, unsigned length) { data = source; datasize = length > 0 ? length : -1U; } - void write_protect(bool status) { write_protection = status; } - uint8* handle() { return data; } - unsigned size() const { return datasize; } +struct MappedRAM : Memory { + void reset() { + if(data_) { + delete[] data_; + data_ = 0; + } + size_ = -1U; + write_protect_ = false; + } - inline uint8 read(unsigned addr) { return data[addr]; } - inline void write(unsigned addr, uint8 n) { if(!write_protection) data[addr] = n; } - inline const uint8& operator[](unsigned addr) const { return data[addr]; } + void map(uint8 *source, unsigned length) { + reset(); + data_ = source; + size_ = data_ && length > 0 ? length : -1U; + } - MappedRAM() : data(0), datasize(0), write_protection(false) {} + void write_protect(bool status) { write_protect_ = status; } + uint8* data() { return data_; } + unsigned size() const { return size_; } + + inline uint8 read(unsigned addr) { return data_[addr]; } + inline void write(unsigned addr, uint8 n) { if(!write_protect_) data_[addr] = n; } + inline const uint8 operator[](unsigned addr) const { return data_[addr]; } + MappedRAM() : data_(0), size_(-1U), write_protect_(false) {} private: - uint8 *data; - unsigned datasize; - bool write_protection; + uint8 *data_; + unsigned size_; + bool write_protect_; }; struct MMIOAccess : Memory { void map(unsigned addr, MMIO &access); - MMIO* get(unsigned addr); uint8 read(unsigned addr); void write(unsigned addr, uint8 data); -private: MMIO *mmio[0x4000]; }; -class Bus { -public: +struct Bus { unsigned mirror(unsigned addr, unsigned size); void map(unsigned addr, Memory &access, unsigned offset); enum MapMode { MapDirect, MapLinear, MapShadow }; @@ -91,35 +101,19 @@ public: return p.access->write(p.offset + addr, data); } - void set_speed(bool fast) { - fastSpeed = fast ? 6 : 8; - } + virtual bool load_cart() { return false; } + virtual void unload_cart() {} - alwaysinline unsigned speed(unsigned addr) const { - if(addr & 0x408000) { - if(addr & 0x800000) return fastSpeed; - return 8; - } - if((addr + 0x6000) & 0x4000) return 8; - if((addr - 0x4000) & 0x7e00) return 6; - return 12; - } - - virtual bool load_cart() = 0; - virtual void unload_cart() = 0; - - virtual void power() = 0; - virtual void reset() = 0; + virtual void power() {} + virtual void reset() {} Bus() {} virtual ~Bus() {} -protected: struct Page { Memory *access; unsigned offset; } page[65536]; - unsigned fastSpeed; }; namespace memory { diff --git a/tools/bsnes/memory/smemory/mapper/chip.cpp b/tools/bsnes/memory/smemory/mapper/chip.cpp index df0da88..dd23782 100755 --- a/tools/bsnes/memory/smemory/mapper/chip.cpp +++ b/tools/bsnes/memory/smemory/mapper/chip.cpp @@ -8,19 +8,16 @@ void sBus::map_cx4() { void sBus::map_dsp1() { switch(cartridge.dsp1_mapper()) { case Cartridge::DSP1LoROM1MB: { - printf("sBus::map_dsp1 DSP1LoROM1MB\n"); map(MapDirect, 0x20, 0x3f, 0x8000, 0xffff, dsp1); map(MapDirect, 0xa0, 0xbf, 0x8000, 0xffff, dsp1); } break; case Cartridge::DSP1LoROM2MB: { - printf("sBus::map_dsp1 DSP1LoROM2MB\n"); map(MapDirect, 0x60, 0x6f, 0x0000, 0x7fff, dsp1); map(MapDirect, 0xe0, 0xef, 0x0000, 0x7fff, dsp1); } break; case Cartridge::DSP1HiROM: { - printf("sBus::map_dsp1 DSP1HiROM\n"); map(MapDirect, 0x00, 0x1f, 0x6000, 0x7fff, dsp1); map(MapDirect, 0x80, 0x9f, 0x6000, 0x7fff, dsp1); } break; @@ -28,7 +25,6 @@ void sBus::map_dsp1() { } void sBus::map_dsp2() { - printf("sBus::map_dsp2\n"); map(MapDirect, 0x20, 0x3f, 0x6000, 0x6fff, dsp2); map(MapDirect, 0x20, 0x3f, 0x8000, 0xbfff, dsp2); map(MapDirect, 0xa0, 0xbf, 0x6000, 0x6fff, dsp2); @@ -36,25 +32,21 @@ void sBus::map_dsp2() { } void sBus::map_dsp3() { - printf("sBus::map_dsp3\n"); map(MapDirect, 0x20, 0x3f, 0x8000, 0xffff, dsp3); map(MapDirect, 0xa0, 0xbf, 0x8000, 0xffff, dsp3); } void sBus::map_dsp4() { - printf("sBus::map_dsp4\n"); map(MapDirect, 0x30, 0x3f, 0x8000, 0xffff, dsp4); map(MapDirect, 0xb0, 0xbf, 0x8000, 0xffff, dsp4); } void sBus::map_obc1() { - printf("sBus::map_obc1\n"); map(MapDirect, 0x00, 0x3f, 0x6000, 0x7fff, obc1); map(MapDirect, 0x80, 0xbf, 0x6000, 0x7fff, obc1); } void sBus::map_st010() { - printf("sBus::map_st010\n"); map(MapDirect, 0x68, 0x6f, 0x0000, 0x0fff, st010); map(MapDirect, 0xe8, 0xef, 0x0000, 0x0fff, st010); } diff --git a/tools/bsnes/memory/smemory/mapper/generic.cpp b/tools/bsnes/memory/smemory/mapper/generic.cpp index 951a7a8..c419626 100755 --- a/tools/bsnes/memory/smemory/mapper/generic.cpp +++ b/tools/bsnes/memory/smemory/mapper/generic.cpp @@ -3,14 +3,12 @@ void sBus::map_generic() { switch(cartridge.mapper()) { case Cartridge::LoROM: { - printf("sBus::map_generic Cartridge::LoROM\n"); map(MapLinear, 0x00, 0x7f, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0x80, 0xff, 0x8000, 0xffff, memory::cartrom); map_generic_sram(); } break; case Cartridge::HiROM: { - printf("sBus::map_generic Cartridge::HiROM\n"); map(MapShadow, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0x40, 0x7f, 0x0000, 0xffff, memory::cartrom); map(MapShadow, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); @@ -19,7 +17,6 @@ void sBus::map_generic() { } break; case Cartridge::ExLoROM: { - printf("sBus::map_generic Cartridge::ExLoROM\n"); map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0x40, 0x7f, 0x0000, 0xffff, memory::cartrom); map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); @@ -28,7 +25,6 @@ void sBus::map_generic() { } break; case Cartridge::ExHiROM: { - printf("sBus::map_generic Cartridge::ExHiROM\n"); map(MapShadow, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x400000); map(MapLinear, 0x40, 0x7f, 0x0000, 0xffff, memory::cartrom, 0x400000); map(MapShadow, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom, 0x000000); @@ -36,8 +32,11 @@ void sBus::map_generic() { map_generic_sram(); } break; + case Cartridge::SA1ROM: { + //mapped via SA1Bus::init(); + } break; + case Cartridge::SPC7110ROM: { - printf("sBus::map_generic Cartridge::SPC7110ROM\n"); map(MapDirect, 0x00, 0x00, 0x6000, 0x7fff, spc7110); //save RAM w/custom logic map(MapShadow, 0x00, 0x0f, 0x8000, 0xffff, memory::cartrom); //program ROM map(MapDirect, 0x30, 0x30, 0x6000, 0x7fff, spc7110); //save RAM w/custom logic @@ -48,7 +47,6 @@ void sBus::map_generic() { } break; case Cartridge::BSXROM: { - printf("sBus::map_generic Cartridge::BSXROM\n"); //full map is dynamically mapped by: //src/chip/bsx/bsx_cart.cpp : BSXCart::update_memory_map(); map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); @@ -56,7 +54,6 @@ void sBus::map_generic() { } break; case Cartridge::BSCLoROM: { - printf("sBus::map_generic Cartridge::BSCLoROM\n"); map(MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom, 0x000000); map(MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x100000); map(MapLinear, 0x70, 0x7f, 0x0000, 0x7fff, memory::cartram, 0x000000); @@ -67,7 +64,6 @@ void sBus::map_generic() { } break; case Cartridge::BSCHiROM: { - printf("sBus::map_generic Cartridge::BSCHiROM\n"); map(MapShadow, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0x20, 0x3f, 0x6000, 0x7fff, memory::cartram); map(MapShadow, 0x20, 0x3f, 0x8000, 0xffff, bsxflash); @@ -81,7 +77,6 @@ void sBus::map_generic() { } break; case Cartridge::STROM: { - printf("sBus::map_generic Cartridge::STROM\n"); map(MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom); map(MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::stArom); map(MapLinear, 0x40, 0x5f, 0x8000, 0xffff, memory::stBrom); @@ -99,21 +94,15 @@ void sBus::map_generic() { void sBus::map_generic_sram() { if(memory::cartram.size() == 0 || memory::cartram.size() == -1U) { return; } - printf("sBus::map_generic_sram\n"); map(MapLinear, 0x20, 0x3f, 0x6000, 0x7fff, memory::cartram); map(MapLinear, 0xa0, 0xbf, 0x6000, 0x7fff, memory::cartram); + //research shows only games with very large ROM/RAM sizes require MAD-1 memory mapping of SRAM //otherwise, default to safer, larger SRAM address window uint16 addr_hi = (memory::cartrom.size() > 0x200000 || memory::cartram.size() > 32 * 1024) ? 0x7fff : 0xffff; - printf("sBus::map_generic_sram cart_size=%x addr_hi=0x%x\n",memory::cartram.size(),addr_hi); map(MapLinear, 0x70, 0x7f, 0x0000, addr_hi, memory::cartram); - if(cartridge.mapper() != Cartridge::LoROM){ - printf("sBus::map_generic_sram done\n"); - return; - } + if(cartridge.mapper() != Cartridge::LoROM) return; map(MapLinear, 0xf0, 0xff, 0x0000, addr_hi, memory::cartram); - printf("sBus::map_generic_sram done\n"); - } #endif diff --git a/tools/bsnes/memory/smemory/smemory.cpp b/tools/bsnes/memory/smemory/smemory.cpp index b3f1e2a..871700a 100755 --- a/tools/bsnes/memory/smemory/smemory.cpp +++ b/tools/bsnes/memory/smemory/smemory.cpp @@ -1,7 +1,7 @@ #include <../base.hpp> -#include <../chip/chip.hpp> -#include <../cart/cart.hpp> + #define SMEMORY_CPP +namespace SNES { #include "mapper/system.cpp" #include "mapper/generic.cpp" @@ -9,12 +9,11 @@ void sBus::power() { for(unsigned i = 0x2000; i <= 0x5fff; i++) memory::mmio.map(i, memory::mmio_unmapped); - for(unsigned i = 0; i < memory::wram.size(); i++) memory::wram[i] = snes.config.cpu.wram_init_value; + for(unsigned i = 0; i < memory::wram.size(); i++) memory::wram[i] = config.cpu.wram_init_value; reset(); } void sBus::reset() { - set_speed(false); } bool sBus::load_cart() { @@ -43,3 +42,6 @@ sBus::sBus() { sBus::~sBus() { } + +}; + diff --git a/tools/bsnes/ppu/bppu/bppu.cpp b/tools/bsnes/ppu/bppu/bppu.cpp index d5481f3..673b0a6 100755 --- a/tools/bsnes/ppu/bppu/bppu.cpp +++ b/tools/bsnes/ppu/bppu/bppu.cpp @@ -1,45 +1,46 @@ #include <../base.hpp> + #define BPPU_CPP +namespace SNES { #include "bppu_mmio.cpp" #include "bppu_render.cpp" void bPPU::enter() { - loop: - //H = 0 (initialize) - scanline(); - if(ivcounter() == 0) frame(); - add_clocks(10); + while(true) { + //H = 0 (initialize) + scanline(); + if(ivcounter() == 0) frame(); + add_clocks(10); - //H = 10 (OAM address reset) - if(ivcounter() == (!overscan() ? 225 : 240)) { - if(regs.display_disabled == false) { - regs.oam_addr = regs.oam_baseaddr << 1; - regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; + //H = 10 (OAM address reset) + if(ivcounter() == (!overscan() ? 225 : 240)) { + if(regs.display_disabled == false) { + regs.oam_addr = regs.oam_baseaddr << 1; + regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; + } } + add_clocks(502); + + //H = 512 (render) + render_scanline(); + add_clocks(640); + + //H = 1152 (cache OBSEL) + cache.oam_basesize = regs.oam_basesize; + cache.oam_nameselect = regs.oam_nameselect; + cache.oam_tdaddr = regs.oam_tdaddr; + add_clocks(ilineclocks() - 1152); //seek to start of next scanline } - add_clocks(502); - - //H = 512 (render) - render_scanline(); - add_clocks(640); - - //H = 1152 (cache OBSEL) - cache.oam_basesize = regs.oam_basesize; - cache.oam_nameselect = regs.oam_nameselect; - cache.oam_tdaddr = regs.oam_tdaddr; - add_clocks(ilineclocks() - 1152); //seek to start of next scanline - - goto loop; } -void bPPU::add_clocks(unsigned clocks) { +void bPPU::add_clocks(unsigned clocks) { tock(clocks); scheduler.addclocks_ppu(clocks); + scheduler.sync_ppucpu(); } void bPPU::scanline() { - snes.scanline(); line = ivcounter(); if(line == 0) { @@ -76,7 +77,7 @@ void bPPU::render_scanline() { void bPPU::frame() { PPU::frame(); - snes.frame(); + system.frame(); if(ifield() == 0) { display.interlace = regs.interlace; @@ -92,7 +93,7 @@ void bPPU::power() { for(unsigned i = 0; i < memory::cgram.size(); i++) memory::cgram[i] = 0x00; flush_tiledata_cache(); - region = (snes.region() == SNES::NTSC ? 0 : 1); //0 = NTSC, 1 = PAL + region = (system.region() == System::NTSC ? 0 : 1); //0 = NTSC, 1 = PAL //$2100 regs.display_disabled = 1; @@ -344,3 +345,5 @@ bPPU::bPPU() { bPPU::~bPPU() { free_tiledata_cache(); } +}; + diff --git a/tools/bsnes/ppu/bppu/bppu_mmio.cpp b/tools/bsnes/ppu/bppu/bppu_mmio.cpp index 8b8945f..092b9fc 100755 --- a/tools/bsnes/ppu/bppu/bppu_mmio.cpp +++ b/tools/bsnes/ppu/bppu/bppu_mmio.cpp @@ -30,7 +30,7 @@ uint8 bPPU::vram_mmio_read(uint16 addr) { } else { uint16 v = vcounter(); uint16 h = hcounter(); - uint16 ls = ((snes.region() == SNES::NTSC ? 525 : 625) >> 1) - 1; + uint16 ls = ((system.region() == System::NTSC ? 525 : 625) >> 1) - 1; if(interlace() && !field()) ls++; if(v == ls && h == 1362) { @@ -333,17 +333,17 @@ void bPPU::mmio_w2115(uint8 value) { regs.vram_incmode = !!(value & 0x80); regs.vram_mapping = (value >> 2) & 3; switch(value & 3) { - case 0: regs.vram_incsize = 1; break; - case 1: regs.vram_incsize = 32; break; - case 2: regs.vram_incsize = 128; break; - case 3: regs.vram_incsize = 128; break; + case 0: regs.vram_incsize = 1; break; + case 1: regs.vram_incsize = 32; break; + case 2: regs.vram_incsize = 128; break; + case 3: regs.vram_incsize = 128; break; } } //VMADDL void bPPU::mmio_w2116(uint8 value) { regs.vram_addr = (regs.vram_addr & 0xff00) | value; -uint16 addr = get_vram_address(); + uint16 addr = get_vram_address(); regs.vram_readbuffer = vram_mmio_read(addr + 0); regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; } @@ -351,7 +351,7 @@ uint16 addr = get_vram_address(); //VMADDH void bPPU::mmio_w2117(uint8 value) { regs.vram_addr = (value << 8) | (regs.vram_addr & 0x00ff); -uint16 addr = get_vram_address(); + uint16 addr = get_vram_address(); regs.vram_readbuffer = vram_mmio_read(addr + 0); regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; } @@ -759,21 +759,20 @@ uint8 bPPU::mmio_read(unsigned addr) { case 0x2128: case 0x2129: case 0x212a: return regs.ppu1_mdr; - case 0x2134: return mmio_r2134(); //MPYL - case 0x2135: return mmio_r2135(); //MPYM - case 0x2136: return mmio_r2136(); //MPYH - case 0x2137: return mmio_r2137(); //SLHV - case 0x2138: return mmio_r2138(); //OAMDATAREAD - case 0x2139: return mmio_r2139(); //VMDATALREAD - case 0x213a: return mmio_r213a(); //VMDATAHREAD - case 0x213b: return mmio_r213b(); //CGDATAREAD - case 0x213c: return mmio_r213c(); //OPHCT - case 0x213d: return mmio_r213d(); //OPVCT - case 0x213e: return mmio_r213e(); //STAT77 - case 0x213f: return mmio_r213f(); //STAT78 + case 0x2134: return mmio_r2134(); //MPYL + case 0x2135: return mmio_r2135(); //MPYM + case 0x2136: return mmio_r2136(); //MPYH + case 0x2137: return mmio_r2137(); //SLHV + case 0x2138: return mmio_r2138(); //OAMDATAREAD + case 0x2139: return mmio_r2139(); //VMDATALREAD + case 0x213a: return mmio_r213a(); //VMDATAHREAD + case 0x213b: return mmio_r213b(); //CGDATAREAD + case 0x213c: return mmio_r213c(); //OPHCT + case 0x213d: return mmio_r213d(); //OPVCT + case 0x213e: return mmio_r213e(); //STAT77 + case 0x213f: return mmio_r213f(); //STAT78 } - //return 0x00; return cpu.regs.mdr; } @@ -781,59 +780,60 @@ void bPPU::mmio_write(unsigned addr, uint8 data) { scheduler.sync_cpuppu(); switch(addr & 0xffff) { - case 0x2100: mmio_w2100(data); return; //INIDISP - case 0x2101: mmio_w2101(data); return; //OBSEL - case 0x2102: mmio_w2102(data); return; //OAMADDL - case 0x2103: mmio_w2103(data); return; //OAMADDH - case 0x2104: mmio_w2104(data); return; //OAMDATA - case 0x2105: mmio_w2105(data); return; //BGMODE - case 0x2106: mmio_w2106(data); return; //MOSAIC - case 0x2107: mmio_w2107(data); return; //BG1SC - case 0x2108: mmio_w2108(data); return; //BG2SC - case 0x2109: mmio_w2109(data); return; //BG3SC - case 0x210a: mmio_w210a(data); return; //BG4SC - case 0x210b: mmio_w210b(data); return; //BG12NBA - case 0x210c: mmio_w210c(data); return; //BG34NBA - case 0x210d: mmio_w210d(data); return; //BG1HOFS - case 0x210e: mmio_w210e(data); return; //BG1VOFS - case 0x210f: mmio_w210f(data); return; //BG2HOFS - case 0x2110: mmio_w2110(data); return; //BG2VOFS - case 0x2111: mmio_w2111(data); return; //BG3HOFS - case 0x2112: mmio_w2112(data); return; //BG3VOFS - case 0x2113: mmio_w2113(data); return; //BG4HOFS - case 0x2114: mmio_w2114(data); return; //BG4VOFS - case 0x2115: mmio_w2115(data); return; //VMAIN - case 0x2116: mmio_w2116(data); return; //VMADDL - case 0x2117: mmio_w2117(data); return; //VMADDH - case 0x2118: mmio_w2118(data); return; //VMDATAL - case 0x2119: mmio_w2119(data); return; //VMDATAH - case 0x211a: mmio_w211a(data); return; //M7SEL - case 0x211b: mmio_w211b(data); return; //M7A - case 0x211c: mmio_w211c(data); return; //M7B - case 0x211d: mmio_w211d(data); return; //M7C - case 0x211e: mmio_w211e(data); return; //M7D - case 0x211f: mmio_w211f(data); return; //M7X - case 0x2120: mmio_w2120(data); return; //M7Y - case 0x2121: mmio_w2121(data); return; //CGADD - case 0x2122: mmio_w2122(data); return; //CGDATA - case 0x2123: mmio_w2123(data); return; //W12SEL - case 0x2124: mmio_w2124(data); return; //W34SEL - case 0x2125: mmio_w2125(data); return; //WOBJSEL - case 0x2126: mmio_w2126(data); return; //WH0 - case 0x2127: mmio_w2127(data); return; //WH1 - case 0x2128: mmio_w2128(data); return; //WH2 - case 0x2129: mmio_w2129(data); return; //WH3 - case 0x212a: mmio_w212a(data); return; //WBGLOG - case 0x212b: mmio_w212b(data); return; //WOBJLOG - case 0x212c: mmio_w212c(data); return; //TM - case 0x212d: mmio_w212d(data); return; //TS - case 0x212e: mmio_w212e(data); return; //TMW - case 0x212f: mmio_w212f(data); return; //TSW - case 0x2130: mmio_w2130(data); return; //CGWSEL - case 0x2131: mmio_w2131(data); return; //CGADDSUB - case 0x2132: mmio_w2132(data); return; //COLDATA - case 0x2133: mmio_w2133(data); return; //SETINI + case 0x2100: return mmio_w2100(data); //INIDISP + case 0x2101: return mmio_w2101(data); //OBSEL + case 0x2102: return mmio_w2102(data); //OAMADDL + case 0x2103: return mmio_w2103(data); //OAMADDH + case 0x2104: return mmio_w2104(data); //OAMDATA + case 0x2105: return mmio_w2105(data); //BGMODE + case 0x2106: return mmio_w2106(data); //MOSAIC + case 0x2107: return mmio_w2107(data); //BG1SC + case 0x2108: return mmio_w2108(data); //BG2SC + case 0x2109: return mmio_w2109(data); //BG3SC + case 0x210a: return mmio_w210a(data); //BG4SC + case 0x210b: return mmio_w210b(data); //BG12NBA + case 0x210c: return mmio_w210c(data); //BG34NBA + case 0x210d: return mmio_w210d(data); //BG1HOFS + case 0x210e: return mmio_w210e(data); //BG1VOFS + case 0x210f: return mmio_w210f(data); //BG2HOFS + case 0x2110: return mmio_w2110(data); //BG2VOFS + case 0x2111: return mmio_w2111(data); //BG3HOFS + case 0x2112: return mmio_w2112(data); //BG3VOFS + case 0x2113: return mmio_w2113(data); //BG4HOFS + case 0x2114: return mmio_w2114(data); //BG4VOFS + case 0x2115: return mmio_w2115(data); //VMAIN + case 0x2116: return mmio_w2116(data); //VMADDL + case 0x2117: return mmio_w2117(data); //VMADDH + case 0x2118: return mmio_w2118(data); //VMDATAL + case 0x2119: return mmio_w2119(data); //VMDATAH + case 0x211a: return mmio_w211a(data); //M7SEL + case 0x211b: return mmio_w211b(data); //M7A + case 0x211c: return mmio_w211c(data); //M7B + case 0x211d: return mmio_w211d(data); //M7C + case 0x211e: return mmio_w211e(data); //M7D + case 0x211f: return mmio_w211f(data); //M7X + case 0x2120: return mmio_w2120(data); //M7Y + case 0x2121: return mmio_w2121(data); //CGADD + case 0x2122: return mmio_w2122(data); //CGDATA + case 0x2123: return mmio_w2123(data); //W12SEL + case 0x2124: return mmio_w2124(data); //W34SEL + case 0x2125: return mmio_w2125(data); //WOBJSEL + case 0x2126: return mmio_w2126(data); //WH0 + case 0x2127: return mmio_w2127(data); //WH1 + case 0x2128: return mmio_w2128(data); //WH2 + case 0x2129: return mmio_w2129(data); //WH3 + case 0x212a: return mmio_w212a(data); //WBGLOG + case 0x212b: return mmio_w212b(data); //WOBJLOG + case 0x212c: return mmio_w212c(data); //TM + case 0x212d: return mmio_w212d(data); //TS + case 0x212e: return mmio_w212e(data); //TMW + case 0x212f: return mmio_w212f(data); //TSW + case 0x2130: return mmio_w2130(data); //CGWSEL + case 0x2131: return mmio_w2131(data); //CGADDSUB + case 0x2132: return mmio_w2132(data); //COLDATA + case 0x2133: return mmio_w2133(data); //SETINI } } -#endif //ifdef BPPU_CPP +#endif + diff --git a/tools/bsnes/ppu/bppu/bppu_render_oam.cpp b/tools/bsnes/ppu/bppu/bppu_render_oam.cpp index f0da95c..f346889 100755 --- a/tools/bsnes/ppu/bppu/bppu_render_oam.cpp +++ b/tools/bsnes/ppu/bppu/bppu_render_oam.cpp @@ -1,8 +1,8 @@ #ifdef BPPU_CPP void bPPU::build_sprite_list() { - uint8 *tableA = memory::oam.handle(); - uint8 *tableB = memory::oam.handle() + 512; + uint8 *tableA = memory::oam.data(); + uint8 *tableB = memory::oam.data() + 512; for(unsigned i = 0; i < 128; i++) { unsigned x = !!(*tableB & (1 << ((i & 3) << 1))); //0x01, 0x04, 0x10, 0x40 diff --git a/tools/bsnes/ppu/counter.cpp b/tools/bsnes/ppu/counter.cpp index 17bdce7..9eaf349 100755 --- a/tools/bsnes/ppu/counter.cpp +++ b/tools/bsnes/ppu/counter.cpp @@ -1,7 +1,7 @@ #ifdef PPU_CPP //wrappers to allow PPUcounter::tick()/tock() to be inlined -bool PPUcounter::region() const { return snes.region() == SNES::NTSC ? 0 : 1; } +bool PPUcounter::region() const { return system.region() == System::NTSC ? 0 : 1; } bool PPUcounter::interlace() const { return ppu.interlace(); } void PPUcounter::scanline() { cpu.scanline(); } @@ -15,20 +15,20 @@ void PPUcounter::scanline() { cpu.scanline(); } //dot 327 range = { 1310, 1312, 1314 } uint16 PPUcounter::hdot() const { - if(region() == 0 && interlace() == false && status.vcounter == 240 && status.field == 1) { - return (status.hcounter >> 2); + if(region() == 0 && interlace() == false && vcounter() == 240 && field() == 1) { + return (hcounter() >> 2); } else { - return (status.hcounter - ((status.hcounter > 1292) << 1) - ((status.hcounter > 1310) << 1)) >> 2; + return (hcounter() - ((hcounter() > 1292) << 1) - ((hcounter() > 1310) << 1)) >> 2; } } uint16 PPUcounter::lineclocks() const { - if(region() == 0 && interlace() == false && vcounter() == 240 && status.field == 1) return 1360; + if(region() == 0 && interlace() == false && vcounter() == 240 && field() == 1) return 1360; return 1364; } uint16 PPUcounter::ilineclocks() const { - if(region() == 0 && interlace() == false && ivcounter() == 240 && status.field == 1) return 1360; + if(region() == 0 && interlace() == false && ivcounter() == 240 && ifield() == 1) return 1360; return 1364; } diff --git a/tools/bsnes/ppu/counter.hpp b/tools/bsnes/ppu/counter.hpp index 515f64e..2ab8d03 100755 --- a/tools/bsnes/ppu/counter.hpp +++ b/tools/bsnes/ppu/counter.hpp @@ -1,9 +1,7 @@ class PPUcounter { public: alwaysinline void tick() { - history.ppudiff += 2; status.hcounter += 2; - if(status.hcounter >= 1360 && status.hcounter == lineclocks()) { status.hcounter = 0; status.vcounter++; @@ -17,7 +15,6 @@ public: status.vcounter = 0; status.field = !status.field; } - scanline(); } @@ -25,6 +22,7 @@ public: history.field [history.index] = status.field; history.vcounter[history.index] = status.vcounter; history.hcounter[history.index] = status.hcounter; + history.ppudiff += 2; } alwaysinline void tock(unsigned clocks) { @@ -67,7 +65,7 @@ private: uint16 vcounter[2048]; uint16 hcounter[2048]; - unsigned index; - signed ppudiff; + int32 index; + int32 ppudiff; } history; }; diff --git a/tools/bsnes/ppu/ppu.cpp b/tools/bsnes/ppu/ppu.cpp index d933b67..73677f5 100755 --- a/tools/bsnes/ppu/ppu.cpp +++ b/tools/bsnes/ppu/ppu.cpp @@ -1,5 +1,7 @@ #include <../base.hpp> -#define PPU_CPP + +#define PPU_CPP +namespace SNES { #include "counter.cpp" @@ -25,8 +27,8 @@ void PPU::frame() { } void PPU::power() { - ppu1_version = snes.config.ppu1.version; - ppu2_version = snes.config.ppu2.version; + ppu1_version = config.ppu1.version; + ppu2_version = config.ppu2.version; } void PPU::reset() { @@ -45,3 +47,5 @@ PPU::PPU() { PPU::~PPU() { delete[] output; } +}; + diff --git a/tools/bsnes/reader/filereader.cpp b/tools/bsnes/reader/filereader.cpp deleted file mode 100755 index 4c97063..0000000 --- a/tools/bsnes/reader/filereader.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#ifdef READER_CPP - -#include "filereader.hpp" - -unsigned FileReader::size() { - return fp.size(); -} - -//This function will allocate memory even if open() fails. -//This is needed so that when SRAM files do not exist, the -//memory for the SRAM data will be allocated still. -//The memory is flushed to 0x00 when no file is opened. -uint8_t* FileReader::read(unsigned length) { - uint8_t *data = 0; - - if(length == 0) { - //read the entire file into RAM - data = new(zeromemory) uint8_t[fp.size()]; - if(fp.open()) fp.read(data, fp.size()); - } else if(length > fp.size()) { - //read the entire file into RAM, pad the rest with 0x00s - data = new(zeromemory) uint8_t[length]; - if(fp.open()) fp.read(data, fp.size()); - } else { //filesize >= length - //read only what was requested - data = new(zeromemory) uint8_t[length]; - if(fp.open()) fp.read(data, length); - } - - return data; -} - -bool FileReader::ready() { - return fp.open(); -} - -FileReader::FileReader(const char *fn) { - if(!fp.open(fn, file::mode_read)) return; - - if(fp.size() == 0) { - //empty file - fp.close(); - } -} - -FileReader::~FileReader() { - if(fp.open()) fp.close(); -} - -#endif //ifdef READER_CPP diff --git a/tools/bsnes/reader/filereader.hpp b/tools/bsnes/reader/filereader.hpp deleted file mode 100755 index c48819c..0000000 --- a/tools/bsnes/reader/filereader.hpp +++ /dev/null @@ -1,12 +0,0 @@ -class FileReader : public Reader { -public: - unsigned size(); - uint8_t* read(unsigned length = 0); - bool ready(); - - FileReader(const char *fn); - ~FileReader(); - -private: - file fp; -}; diff --git a/tools/bsnes/reader/gzreader.cpp b/tools/bsnes/reader/gzreader.cpp deleted file mode 100755 index 3bed61d..0000000 --- a/tools/bsnes/reader/gzreader.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#ifdef READER_CPP - -#include "gzreader.hpp" - -unsigned GZReader::size() { - return filesize; -} - -//This function will allocate memory even if open() fails. -//This is needed so that when SRAM files do not exist, the -//memory for the SRAM data will be allocated still. -//The memory is flushed to 0x00 when no file is opened. -uint8_t* GZReader::read(unsigned length) { - uint8_t *data = 0; - - if(length == 0) { - //read the entire file into RAM - data = new(zeromemory) uint8_t[filesize]; - if(gp) gzread(gp, data, filesize); - } else if(length > filesize) { - //read the entire file into RAM, pad the rest with 0x00s - data = new(zeromemory) uint8_t[length]; - if(gp) gzread(gp, data, filesize); - } else { //filesize >= length - //read only what was requested - data = new(zeromemory) uint8_t[length]; - if(gp) gzread(gp, data, length); - } - - return data; -} - -bool GZReader::ready() { - return (gp != 0); -} - -GZReader::GZReader(const char *fn) : gp(0) { - #if !defined(_WIN32) - fp = fopen(fn, "rb"); - #else - fp = _wfopen(utf16_t(fn), L"rb"); - #endif - if(!fp) return; - - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - - if(filesize < 4) { - //too small to be a valid GZ archive - fclose(fp); - fp = 0; - return; - } - - fseek(fp, -4, SEEK_END); - unsigned gzsize; - gzsize = fgetc(fp); - gzsize |= fgetc(fp) << 8; - gzsize |= fgetc(fp) << 16; - gzsize |= fgetc(fp) << 24; - fseek(fp, 0, SEEK_SET); - - //zlib does not support UTF-8 filenames on Windows, - //thus _wfopen() wrapper above + fileno() wrapper here. - gp = gzdopen(fileno(fp), "rb"); - if(!gp) return; - - if(gzdirect(gp) == false) filesize = gzsize; - - if(filesize == 0) { - //archive is empty - gzclose(gp); - gp = 0; - return; - } -} - -GZReader::~GZReader() { - if(gp) { - gzclose(gp); - gp = 0; - } -} - -#endif //ifdef READER_CPP diff --git a/tools/bsnes/reader/gzreader.hpp b/tools/bsnes/reader/gzreader.hpp deleted file mode 100755 index f009fe1..0000000 --- a/tools/bsnes/reader/gzreader.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "zlib/zlib.h" - -class GZReader : public Reader { -private: - FILE *fp; - gzFile gp; - unsigned filesize; - -public: - unsigned size(); - uint8_t* read(unsigned length = 0); - bool ready(); - - GZReader(const char *fn); - ~GZReader(); -}; diff --git a/tools/bsnes/reader/jma/7z.h b/tools/bsnes/reader/jma/7z.h deleted file mode 100755 index 50e1f24..0000000 --- a/tools/bsnes/reader/jma/7z.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __7Z_H -#define __7Z_H - -#include "iiostrm.h" - -bool decompress_lzma_7z(ISequentialInStream& in, unsigned in_size, ISequentialOutStream& out, unsigned out_size) throw (); -bool decompress_lzma_7z(const unsigned char* in_data, unsigned in_size, unsigned char* out_data, unsigned out_size) throw (); - -#endif - diff --git a/tools/bsnes/reader/jma/7zlzma.cpp b/tools/bsnes/reader/jma/7zlzma.cpp deleted file mode 100755 index b849d8d..0000000 --- a/tools/bsnes/reader/jma/7zlzma.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "7z.h" - -#include "lzmadec.h" - -bool decompress_lzma_7z(ISequentialInStream& in, unsigned in_size, ISequentialOutStream& out, unsigned out_size) throw () -{ - try - { - NCompress::NLZMA::CDecoder cc; - - UINT64 in_size_l = in_size; - UINT64 out_size_l = out_size; - - if (cc.ReadCoderProperties(&in) != S_OK) { return(false); } - if (cc.Code(&in, &out, &in_size_l, &out_size_l) != S_OK) { return(false); } - if (out.size_get() != out_size || out.overflow_get()) { return(false); } - - return(true); - } - catch (...) - { - return(false); - } -} - -bool decompress_lzma_7z(const unsigned char* in_data, unsigned int in_size, unsigned char* out_data, unsigned int out_size) throw () -{ - ISequentialInStream_Array in(reinterpret_cast(in_data), in_size); - ISequentialOutStream_Array out(reinterpret_cast(out_data), out_size); - - return(decompress_lzma_7z(in, in_size, out, out_size)); -} diff --git a/tools/bsnes/reader/jma/aribitcd.h b/tools/bsnes/reader/jma/aribitcd.h deleted file mode 100755 index 1fb421b..0000000 --- a/tools/bsnes/reader/jma/aribitcd.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef __COMPRESSION_BITCODER_H -#define __COMPRESSION_BITCODER_H - -#include "rngcoder.h" - -namespace NCompression { -namespace NArithmetic { - -const int kNumBitModelTotalBits = 11; -const UINT32 kBitModelTotal = (1 << kNumBitModelTotalBits); - -const int kNumMoveReducingBits = 2; - -///////////////////////////// -// CBitModel - -template -class CBitModel -{ -public: - UINT32 m_Probability; - void UpdateModel(UINT32 aSymbol) - { - /* - m_Probability -= (m_Probability + ((aSymbol - 1) & ((1 << aNumMoveBits) - 1))) >> aNumMoveBits; - m_Probability += (1 - aSymbol) << (kNumBitModelTotalBits - aNumMoveBits); - */ - if (aSymbol == 0) - m_Probability += (kBitModelTotal - m_Probability) >> aNumMoveBits; - else - m_Probability -= (m_Probability) >> aNumMoveBits; - } -public: - void Init() { m_Probability = kBitModelTotal / 2; } -}; - -template -class CBitDecoder: public CBitModel -{ -public: - UINT32 Decode(CRangeDecoder *aRangeDecoder) - { - UINT32 aNewBound = (aRangeDecoder->m_Range >> kNumBitModelTotalBits) * CBitModel::m_Probability; - if (aRangeDecoder->m_Code < aNewBound) - { - aRangeDecoder->m_Range = aNewBound; - CBitModel::m_Probability += (kBitModelTotal - CBitModel::m_Probability) >> aNumMoveBits; - if (aRangeDecoder->m_Range < kTopValue) - { - aRangeDecoder->m_Code = (aRangeDecoder->m_Code << 8) | aRangeDecoder->m_Stream.ReadByte(); - aRangeDecoder->m_Range <<= 8; - } - return 0; - } - else - { - aRangeDecoder->m_Range -= aNewBound; - aRangeDecoder->m_Code -= aNewBound; - CBitModel::m_Probability -= (CBitModel::m_Probability) >> aNumMoveBits; - if (aRangeDecoder->m_Range < kTopValue) - { - aRangeDecoder->m_Code = (aRangeDecoder->m_Code << 8) | aRangeDecoder->m_Stream.ReadByte(); - aRangeDecoder->m_Range <<= 8; - } - return 1; - } - } -}; - -}} - - -#endif diff --git a/tools/bsnes/reader/jma/ariconst.h b/tools/bsnes/reader/jma/ariconst.h deleted file mode 100755 index 751b2b7..0000000 --- a/tools/bsnes/reader/jma/ariconst.h +++ /dev/null @@ -1,29 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __ARICONST_H -#define __ARICONST_H - -#include "aribitcd.h" - - -typedef NCompression::NArithmetic::CRangeDecoder CMyRangeDecoder; -template class CMyBitDecoder: - public NCompression::NArithmetic::CBitDecoder {}; - -#endif diff --git a/tools/bsnes/reader/jma/ariprice.h b/tools/bsnes/reader/jma/ariprice.h deleted file mode 100755 index ccc398e..0000000 --- a/tools/bsnes/reader/jma/ariprice.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __COMPRESSION_ARIPRICE_H -#define __COMPRESSION_ARIPRICE_H - -namespace NCompression { -namespace NArithmetic { - -const UINT32 kNumBitPriceShiftBits = 6; -const UINT32 kBitPrice = 1 << kNumBitPriceShiftBits; - -}} - -#endif diff --git a/tools/bsnes/reader/jma/btreecd.h b/tools/bsnes/reader/jma/btreecd.h deleted file mode 100755 index acce366..0000000 --- a/tools/bsnes/reader/jma/btreecd.h +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __BITTREECODER_H -#define __BITTREECODER_H - -#include "aribitcd.h" -#include "rcdefs.h" - - -////////////////////////// -// CBitTreeDecoder - -template -class CBitTreeDecoder -{ - CMyBitDecoder m_Models[1 << m_NumBitLevels]; -public: - void Init() - { - for(UINT32 i = 1; i < (1 << m_NumBitLevels); i++) - m_Models[i].Init(); - } - UINT32 Decode(CMyRangeDecoder *aRangeDecoder) - { - UINT32 aModelIndex = 1; - RC_INIT_VAR - for(UINT32 aBitIndex = m_NumBitLevels; aBitIndex > 0; aBitIndex--) - { - // aModelIndex = (aModelIndex << 1) + m_Models[aModelIndex].Decode(aRangeDecoder); - RC_GETBIT(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex) - } - RC_FLUSH_VAR - return aModelIndex - (1 << m_NumBitLevels); - }; -}; - -//////////////////////////////// -// CReverseBitTreeDecoder - -template -class CReverseBitTreeDecoder2 -{ - CMyBitDecoder *m_Models; - UINT32 m_NumBitLevels; -public: - CReverseBitTreeDecoder2(): m_Models(0) { } - ~CReverseBitTreeDecoder2() { delete []m_Models; } - bool Create(UINT32 aNumBitLevels) - { - m_NumBitLevels = aNumBitLevels; - m_Models = new CMyBitDecoder[1 << aNumBitLevels]; - return (m_Models != 0); - } - void Init() - { - UINT32 aNumModels = 1 << m_NumBitLevels; - for(UINT32 i = 1; i < aNumModels; i++) - m_Models[i].Init(); - } - UINT32 Decode(CMyRangeDecoder *aRangeDecoder) - { - UINT32 aModelIndex = 1; - UINT32 aSymbol = 0; - RC_INIT_VAR - for(UINT32 aBitIndex = 0; aBitIndex < m_NumBitLevels; aBitIndex++) - { - // UINT32 aBit = m_Models[aModelIndex].Decode(aRangeDecoder); - // aModelIndex <<= 1; - // aModelIndex += aBit; - // aSymbol |= (aBit << aBitIndex); - RC_GETBIT2(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex, ; , aSymbol |= (1 << aBitIndex)) - } - RC_FLUSH_VAR - return aSymbol; - }; -}; -//////////////////////////// -// CReverseBitTreeDecoder2 - -template -class CReverseBitTreeDecoder -{ - CMyBitDecoder m_Models[1 << m_NumBitLevels]; -public: - void Init() - { - for(UINT32 i = 1; i < (1 << m_NumBitLevels); i++) - m_Models[i].Init(); - } - UINT32 Decode(CMyRangeDecoder *aRangeDecoder) - { - UINT32 aModelIndex = 1; - UINT32 aSymbol = 0; - RC_INIT_VAR - for(UINT32 aBitIndex = 0; aBitIndex < m_NumBitLevels; aBitIndex++) - { - // UINT32 aBit = m_Models[aModelIndex].Decode(aRangeDecoder); - // aModelIndex <<= 1; - // aModelIndex += aBit; - // aSymbol |= (aBit << aBitIndex); - RC_GETBIT2(aNumMoveBits, m_Models[aModelIndex].m_Probability, aModelIndex, ; , aSymbol |= (1 << aBitIndex)) - } - RC_FLUSH_VAR - return aSymbol; - } -}; - - - -#endif diff --git a/tools/bsnes/reader/jma/crc32.h b/tools/bsnes/reader/jma/crc32.h deleted file mode 100755 index 876a7d3..0000000 --- a/tools/bsnes/reader/jma/crc32.h +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (C) 2004-2007 NSRT Team ( http://nsrt.edgeemu.com ) - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef CRC32_H -#define CRC32_H - -namespace CRC32lib -{ - unsigned int CRC32(const unsigned char *, size_t, register unsigned int crc32 = 0xFFFFFFFF); -} - -#endif diff --git a/tools/bsnes/reader/jma/iiostrm.cpp b/tools/bsnes/reader/jma/iiostrm.cpp deleted file mode 100755 index f271996..0000000 --- a/tools/bsnes/reader/jma/iiostrm.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "portable.h" -#include "iiostrm.h" -#include "crc32.h" - -HRESULT ISequentialInStream_Array::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - if (aSize > size) - { - aSize = size; - } - - *aProcessedSize = aSize; - memcpy(aData, data, aSize); - size -= aSize; - data += aSize; - return(S_OK); -} - -HRESULT ISequentialOutStream_Array::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - if (aSize > size) - { - overflow = true; - aSize = size; - } - - *aProcessedSize = aSize; - memcpy(data, aData, aSize); - size -= aSize; - data += aSize; - total += aSize; - return(S_OK); -} - -HRESULT ISequentialInStream_String::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - if (aSize > data.size()) - { - aSize = data.size(); - } - - *aProcessedSize = aSize; - memcpy(aData, data.c_str(), aSize); - data.erase(0, aSize); - return(S_OK); -} - -HRESULT ISequentialOutStream_String::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - *aProcessedSize = aSize; - data.append((const char *)aData, aSize); - total += aSize; - return(S_OK); -} - -HRESULT ISequentialInStream_Istream::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - data.read((char *)aData, aSize); - *aProcessedSize = data.gcount(); - return(S_OK); -} - -HRESULT ISequentialOutStream_Ostream::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - *aProcessedSize = aSize; - data.write((char *)aData, aSize); - total += aSize; - return(S_OK); -} - - - -HRESULT ISequentialInStreamCRC32_Array::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - ISequentialInStream_Array::Read(aData, aSize, aProcessedSize); - crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); - return(S_OK); -} - -HRESULT ISequentialOutStreamCRC32_Array::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - ISequentialOutStream_Array::Write(aData, aSize, aProcessedSize); - crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); - return(S_OK); -} - -HRESULT ISequentialInStreamCRC32_String::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - ISequentialInStream_String::Read(aData, aSize, aProcessedSize); - crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); - return(S_OK); -} - -HRESULT ISequentialOutStreamCRC32_String::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - ISequentialOutStream_String::Write(aData, aSize, aProcessedSize); - crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); - return(S_OK); -} - -HRESULT ISequentialInStreamCRC32_Istream::Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - ISequentialInStream_Istream::Read(aData, aSize, aProcessedSize); - crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); - return(S_OK); -} - -HRESULT ISequentialOutStreamCRC32_Ostream::Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize) -{ - ISequentialOutStream_Ostream::Write(aData, aSize, aProcessedSize); - crc32 = CRC32lib::CRC32((const unsigned char *)aData, *aProcessedSize, ~crc32); - return(S_OK); -} diff --git a/tools/bsnes/reader/jma/iiostrm.h b/tools/bsnes/reader/jma/iiostrm.h deleted file mode 100755 index a5b2ab2..0000000 --- a/tools/bsnes/reader/jma/iiostrm.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __IINOUTSTREAMS_H -#define __IINOUTSTREAMS_H - -#include -#include - -#include "portable.h" - - -class ISequentialInStream -{ -public: - virtual HRESULT Read(void *, UINT32, UINT32 *) = 0; - - virtual ~ISequentialInStream() {} -}; - - -class ISequentialInStream_Array : public ISequentialInStream -{ - const char *data; - unsigned int size; -public: - ISequentialInStream_Array(const char *Adata, unsigned Asize) : data(Adata), size(Asize) { } - - HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialInStream_Array() {} -}; - -class ISequentialInStream_String : public ISequentialInStream -{ - std::string& data; -public: - ISequentialInStream_String(std::string& Adata) : data(Adata) { } - - HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialInStream_String() {} -}; - -class ISequentialInStream_Istream : public ISequentialInStream -{ - std::istream& data; -public: - ISequentialInStream_Istream(std::istream& Adata) : data(Adata) { } - - HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialInStream_Istream() {} -}; - - - -class ISequentialOutStream -{ -public: - virtual bool overflow_get() const = 0; - virtual unsigned int size_get() const = 0; - - virtual HRESULT Write(const void *, UINT32, UINT32 *) = 0; - - virtual ~ISequentialOutStream() {} -}; - - -class ISequentialOutStream_Array : public ISequentialOutStream -{ - char *data; - unsigned int size; - bool overflow; - unsigned int total; -public: - ISequentialOutStream_Array(char *Adata, unsigned Asize) : data(Adata), size(Asize), overflow(false), total(0) { } - - bool overflow_get() const { return(overflow); } - unsigned int size_get() const { return(total); } - - HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialOutStream_Array() {} -}; - -class ISequentialOutStream_String : public ISequentialOutStream -{ - std::string& data; - unsigned int total; -public: - ISequentialOutStream_String(std::string& Adata) : data(Adata), total(0) { } - - bool overflow_get() const { return(false); } - unsigned int size_get() const { return(total); } - - HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialOutStream_String() {} -}; - - -class ISequentialOutStream_Ostream : public ISequentialOutStream -{ - std::ostream& data; - unsigned int total; -public: - ISequentialOutStream_Ostream(std::ostream& Adata) : data(Adata), total(0) { } - - bool overflow_get() const { return(false); } - unsigned int size_get() const { return(total); } - - HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialOutStream_Ostream() {} -}; - - - -class ISequentialStreamCRC32 -{ -protected: - unsigned int crc32; -public: - ISequentialStreamCRC32() : crc32(0) {} - unsigned int crc32_get() const { return(crc32); } - - virtual ~ISequentialStreamCRC32() {} -}; - - -class ISequentialInStreamCRC32_Array : public ISequentialInStream_Array, public ISequentialStreamCRC32 -{ -public: - ISequentialInStreamCRC32_Array(const char *Adata, unsigned Asize) : ISequentialInStream_Array(Adata, Asize) { } - - HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialInStreamCRC32_Array() {} -}; - -class ISequentialInStreamCRC32_String : public ISequentialInStream_String, public ISequentialStreamCRC32 -{ -public: - ISequentialInStreamCRC32_String(std::string& Adata) : ISequentialInStream_String(Adata) { } - - HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialInStreamCRC32_String() {} -}; - -class ISequentialInStreamCRC32_Istream : public ISequentialInStream_Istream, public ISequentialStreamCRC32 -{ -public: - ISequentialInStreamCRC32_Istream(std::istream& Adata) : ISequentialInStream_Istream(Adata) { } - - HRESULT Read(void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialInStreamCRC32_Istream() {} -}; - - -class ISequentialOutStreamCRC32_Array : public ISequentialOutStream_Array, public ISequentialStreamCRC32 -{ -public: - ISequentialOutStreamCRC32_Array(char *Adata, unsigned Asize) : ISequentialOutStream_Array(Adata, Asize) { } - - HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialOutStreamCRC32_Array() {} -}; - -class ISequentialOutStreamCRC32_String : public ISequentialOutStream_String, public ISequentialStreamCRC32 -{ -public: - ISequentialOutStreamCRC32_String(std::string& Adata) : ISequentialOutStream_String(Adata) { } - - HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialOutStreamCRC32_String() {} -}; - - -class ISequentialOutStreamCRC32_Ostream : public ISequentialOutStream_Ostream, public ISequentialStreamCRC32 -{ -public: - ISequentialOutStreamCRC32_Ostream(std::ostream& Adata) : ISequentialOutStream_Ostream(Adata) { } - - HRESULT Write(const void *aData, UINT32 aSize, UINT32 *aProcessedSize); - - virtual ~ISequentialOutStreamCRC32_Ostream() {} -}; - -#endif diff --git a/tools/bsnes/reader/jma/inbyte.cpp b/tools/bsnes/reader/jma/inbyte.cpp deleted file mode 100755 index c727a4b..0000000 --- a/tools/bsnes/reader/jma/inbyte.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "inbyte.h" - -namespace NStream{ - -CInByte::CInByte(UINT32 aBufferSize): - m_BufferBase(0), - m_BufferSize(aBufferSize) -{ - m_BufferBase = new BYTE[m_BufferSize]; -} - -CInByte::~CInByte() -{ - delete []m_BufferBase; -} - -void CInByte::Init(ISequentialInStream *aStream) -{ - m_Stream = aStream; - m_ProcessedSize = 0; - m_Buffer = m_BufferBase; - m_BufferLimit = m_Buffer; - m_StreamWasExhausted = false; -} - -bool CInByte::ReadBlock() -{ - if (m_StreamWasExhausted) - return false; - m_ProcessedSize += (m_Buffer - m_BufferBase); - UINT32 aNumProcessedBytes; - HRESULT aResult = m_Stream->Read(m_BufferBase, m_BufferSize, &aNumProcessedBytes); - if (aResult != S_OK) - throw aResult; - m_Buffer = m_BufferBase; - m_BufferLimit = m_Buffer + aNumProcessedBytes; - m_StreamWasExhausted = (aNumProcessedBytes == 0); - return (!m_StreamWasExhausted); -} - -} diff --git a/tools/bsnes/reader/jma/inbyte.h b/tools/bsnes/reader/jma/inbyte.h deleted file mode 100755 index 53afa17..0000000 --- a/tools/bsnes/reader/jma/inbyte.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __STREAM_INBYTE_H -#define __STREAM_INBYTE_H - -#include "iiostrm.h" - -namespace NStream { - -class CInByte -{ - UINT64 m_ProcessedSize; - BYTE *m_BufferBase; - UINT32 m_BufferSize; - BYTE *m_Buffer; - BYTE *m_BufferLimit; - ISequentialInStream* m_Stream; - bool m_StreamWasExhausted; - - bool ReadBlock(); - -public: - CInByte(UINT32 aBufferSize = 0x100000); - ~CInByte(); - - void Init(ISequentialInStream *aStream); - - bool ReadByte(BYTE &aByte) - { - if(m_Buffer >= m_BufferLimit) - if(!ReadBlock()) - return false; - aByte = *m_Buffer++; - return true; - } - BYTE ReadByte() - { - if(m_Buffer >= m_BufferLimit) - if(!ReadBlock()) - return 0x0; - return *m_Buffer++; - } - void ReadBytes(void *aData, UINT32 aSize, UINT32 &aProcessedSize) - { - for(aProcessedSize = 0; aProcessedSize < aSize; aProcessedSize++) - if (!ReadByte(((BYTE *)aData)[aProcessedSize])) - return; - } - bool ReadBytes(void *aData, UINT32 aSize) - { - UINT32 aProcessedSize; - ReadBytes(aData, aSize, aProcessedSize); - return (aProcessedSize == aSize); - } - UINT64 GetProcessedSize() const { return m_ProcessedSize + (m_Buffer - m_BufferBase); } -}; - -} - -#endif diff --git a/tools/bsnes/reader/jma/jcrc32.cpp b/tools/bsnes/reader/jma/jcrc32.cpp deleted file mode 100755 index e3377d5..0000000 --- a/tools/bsnes/reader/jma/jcrc32.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright (C) 2004-2007 NSRT Team ( http://nsrt.edgeemu.com ) - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include - -namespace CRC32lib -{ - //Don't ask questions, this is the PKZip CRC32 table - const unsigned int crc32Table[256] = { - 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 }; - - - //CRC32 for char arrays - unsigned int CRC32(const unsigned char *array, size_t size, register unsigned int crc32) - { - const unsigned char *end_p = array+size; - for (register const unsigned char *p = array; p < end_p; p++) - { - crc32 = ((crc32 >> 8) & 0x00FFFFFF) ^ crc32Table[(crc32 ^ *p) & 0xFF]; - } - - return(~crc32); - } -} diff --git a/tools/bsnes/reader/jma/jma.cpp b/tools/bsnes/reader/jma/jma.cpp deleted file mode 100755 index 87e0322..0000000 --- a/tools/bsnes/reader/jma/jma.cpp +++ /dev/null @@ -1,550 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include -#include "jma.h" -using namespace std; - -#include "portable.h" -#include "7z.h" -#include "crc32.h" - -namespace JMA -{ - const char jma_magic[] = { 'J', 'M', 'A', 0, 'N' }; - const unsigned int jma_header_length = 5; - const unsigned char jma_version = 1; - const unsigned int jma_version_length = 1; - const unsigned int jma_total_header_length = jma_header_length + jma_version_length + UINT_SIZE; - - //Convert DOS/zip/JMA integer time to to time_t - time_t uint_to_time(unsigned short date, unsigned short time) - { - tm formatted_time; - - formatted_time.tm_mday = date & 0x1F; - formatted_time.tm_mon = ((date >> 5) & 0xF) - 1; - formatted_time.tm_year = ((date >> 9) & 0x7f) + 80; - formatted_time.tm_sec = (time & 0x1F) * 2; - formatted_time.tm_min = (time >> 5) & 0x3F; - formatted_time.tm_hour = (time >> 11) & 0x1F; - - return(mktime(&formatted_time)); - } - - - //Retreive the file block, what else? - void jma_open::retrieve_file_block() throw(jma_errors) - { - unsigned char uint_buffer[UINT_SIZE]; - unsigned char ushort_buffer[USHORT_SIZE]; - - //File block size is the last UINT in the file - stream.seekg(-UINT_SIZE,ios::end); - stream.read((char *)uint_buffer, UINT_SIZE); - size_t file_block_size = charp_to_uint(uint_buffer); - - //Currently at the end of the file, so that's the file size - size_t jma_file_size = stream.tellg(); - - //The file block can't be larger than the JMA file without it's header. - //This if can probably be improved - if (file_block_size >= jma_file_size-jma_total_header_length) - { - throw(JMA_BAD_FILE); - } - - //Seek to before file block so we can read the file block - stream.seekg(-((int)file_block_size+UINT_SIZE),ios::end); - - //This is needed if the file block is compressed - stringstream decompressed_file_block; - //Pointer to where to read file block from (file or decompressed buffer) - istream *file_block_stream; - - //Setup file info buffer and byte to read with - jma_file_info file_info; - char byte; - - stream.get(byte); - if (!byte) //If file block is compressed - { - //Compressed size isn't counting the byte we just read or the UINT for compressed size - size_t compressed_size = file_block_size - (1+UINT_SIZE); - - //Read decompressed size / true file block size - stream.read((char *)uint_buffer, UINT_SIZE); - file_block_size = charp_to_uint(uint_buffer); - - //Setup access methods for decompression - ISequentialInStream_Istream compressed_data(stream); - ISequentialOutStream_Ostream decompressed_data(decompressed_file_block); - - //Decompress the data - if (!decompress_lzma_7z(compressed_data, compressed_size, decompressed_data, file_block_size)) - { - throw(JMA_DECOMPRESS_FAILED); - } - - //Go to beginning, setup pointer to buffer - decompressed_file_block.seekg(0, ios::beg); - file_block_stream = &decompressed_file_block; - } - else - { - stream.putback(byte); //Putback byte, byte is part of filename, not compressed indicator - file_block_stream = &stream; - } - - - //Minimum file name length is 2 bytes, a char and a null - //Minimum comment length is 1 byte, a null - //There are currently 2 UINTs and 2 USHORTs per file - while (file_block_size >= 2+1+UINT_SIZE*2+USHORT_SIZE*2) //This does allow for a gap, but that's okay - { - //First stored in the file block is the file name null terminated - file_info.name = ""; - - file_block_stream->get(byte); - while (byte) - { - file_info.name += byte; - file_block_stream->get(byte); - } - - //There must be a file name or the file is bad - if (!file_info.name.length()) - { - throw(JMA_BAD_FILE); - } - - //Same trick as above for the comment - file_info.comment = ""; - - file_block_stream->get(byte); - while (byte) - { - file_info.comment += byte; - file_block_stream->get(byte); - } - - //Next is a UINT representing the file's size - file_block_stream->read((char *)uint_buffer, UINT_SIZE); - file_info.size = charp_to_uint(uint_buffer); - - //Followed by CRC32 - file_block_stream->read((char *)uint_buffer, UINT_SIZE); - file_info.crc32 = charp_to_uint(uint_buffer); - - //Special USHORT representation of file's date - file_block_stream->read((char *)ushort_buffer, USHORT_SIZE); - file_info.date = charp_to_ushort(ushort_buffer); - - //Special USHORT representation of file's time - file_block_stream->read((char *)ushort_buffer, USHORT_SIZE); - file_info.time = charp_to_ushort(ushort_buffer); - - file_info.buffer = 0; //Pointing to null till we decompress files - - files.push_back(file_info); //Put file info into our structure - - //Subtract size of the file info we just read - file_block_size -= file_info.name.length()+file_info.comment.length()+2+UINT_SIZE*2+USHORT_SIZE*2; - } - } - - //Constructor for opening JMA files for reading - jma_open::jma_open(const char *compressed_file_name) throw (jma_errors) - { - decompressed_buffer = 0; - compressed_buffer = 0; - - stream.open(compressed_file_name, ios::in | ios::binary); - if (!stream.is_open()) - { - throw(JMA_NO_OPEN); - } - - //Header is "JMA\0N" - unsigned char header[jma_header_length]; - stream.read((char *)header, jma_header_length); - if (memcmp(jma_magic, header, jma_header_length)) - { - throw(JMA_BAD_FILE); - } - - //Not the cleanest code but logical - stream.read((char *)header, 5); - if (*header <= jma_version) - { - chunk_size = charp_to_uint(header+1); //Chunk size is a UINT that follows version # - retrieve_file_block(); - } - else - { - throw(JMA_UNSUPPORTED_VERSION); - } - } - - //Destructor only has to close the stream if neccesary - jma_open::~jma_open() - { - if (stream.is_open()) - { - stream.close(); - } - } - - //Return a vector containing useful info about the files in the JMA - vector jma_open::get_files_info() - { - vector file_info_vector; - jma_public_file_info file_info; - - for (vector::iterator i = files.begin(); i != files.end(); i++) - { - file_info.name = i->name; - file_info.comment = i->comment; - file_info.size = i->size; - file_info.datetime = uint_to_time(i->date, i->time); - file_info.crc32 = i->crc32; - file_info_vector.push_back(file_info); - } - - return(file_info_vector); - } - - //Skip forward a given number of chunks - void jma_open::chunk_seek(unsigned int chunk_num) throw(jma_errors) - { - //Check the stream is open - if (!stream.is_open()) - { - throw(JMA_NO_OPEN); - } - - //Clear possible errors so the seek will work - stream.clear(); - - //Move forward over header - stream.seekg(jma_total_header_length, ios::beg); - - unsigned char int4_buffer[UINT_SIZE]; - - while (chunk_num--) - { - //Read in size of chunk - stream.read((char *)int4_buffer, UINT_SIZE); - - //Skip chunk plus it's CRC32 - stream.seekg(charp_to_uint(int4_buffer)+UINT_SIZE, ios::cur); - } - } - - //Return a vector of pointers to each file in the JMA, the buffer to hold all the files - //must be initilized outside. - vector jma_open::get_all_files(unsigned char *buffer) throw(jma_errors) - { - //If there's no stream we can't read from it, so exit - if (!stream.is_open()) - { - throw(JMA_NO_OPEN); - } - - //Seek to the first chunk - chunk_seek(0); - - //Set the buffer that decompressed data goes to - decompressed_buffer = buffer; - - //If the JMA is not solid - if (chunk_size) - { - unsigned char int4_buffer[UINT_SIZE]; - size_t size = get_total_size(files); - - //For each chunk in the file... - for (size_t remaining_size = size; remaining_size; remaining_size -= chunk_size) - { - //Read the compressed size - stream.read((char *)int4_buffer, UINT_SIZE); - size_t compressed_size = charp_to_uint(int4_buffer); - - //Allocate memory of the correct size to hold the compressed data in the JMA - //Throw error on failure as that is unrecoverable from - try - { - compressed_buffer = new unsigned char[compressed_size]; - } - catch (bad_alloc xa) - { - throw(JMA_NO_MEM_ALLOC); - } - - //Read all the compressed data in - stream.read((char *)compressed_buffer, compressed_size); - - //Read the expected CRC of compressed data from the file - stream.read((char *)int4_buffer, UINT_SIZE); - - //If it doesn't match, throw error and cleanup memory - if (CRC32lib::CRC32(compressed_buffer, compressed_size) != charp_to_uint(int4_buffer)) - { - delete[] compressed_buffer; - throw(JMA_BAD_FILE); - } - - //Decompress the data, cleanup memory on failure - if (!decompress_lzma_7z(compressed_buffer, compressed_size, - decompressed_buffer+size-remaining_size, - (remaining_size > chunk_size) ? chunk_size : remaining_size)) - { - delete[] compressed_buffer; - throw(JMA_DECOMPRESS_FAILED); - } - delete[] compressed_buffer; - - if (remaining_size <= chunk_size) //If we just decompressed the remainder - { - break; - } - } - } - else //Solidly compressed JMA - { - unsigned char int4_buffer[UINT_SIZE]; - - //Read the size of the compressed data - stream.read((char *)int4_buffer, UINT_SIZE); - size_t compressed_size = charp_to_uint(int4_buffer); - - //Get decompressed size - size_t size = get_total_size(files); - - //Setup access methods for decompression - ISequentialInStream_Istream compressed_data(stream); - ISequentialOutStream_Array decompressed_data(reinterpret_cast(decompressed_buffer), size); - - //Decompress the data - if (!decompress_lzma_7z(compressed_data, compressed_size, decompressed_data, size)) - { - throw(JMA_DECOMPRESS_FAILED); - } - - /* - //Allocate memory of the right size to hold the compressed data in the JMA - try - { - compressed_buffer = new unsigned char[compressed_size]; - } - catch (bad_alloc xa) - { - throw(JMA_NO_MEM_ALLOC); - } - - //Copy the compressed data into memory - stream.read((char *)compressed_buffer, compressed_size); - size_t size = get_total_size(files); - - //Read the CRC of the compressed data - stream.read((char *)int4_buffer, UINT_SIZE); - - //If it doesn't match, complain - if (CRC32lib::CRC32(compressed_buffer, compressed_size) != charp_to_uint(int4_buffer)) - { - delete[] compressed_buffer; - throw(JMA_BAD_FILE); - } - - //Decompress the data - if (!decompress_lzma_7z(compressed_buffer, compressed_size, decompressed_buffer, size)) - { - delete[] compressed_buffer; - throw(JMA_DECOMPRESS_FAILED); - } - delete[] compressed_buffer; - */ - } - - vector file_pointers; - size_t size = 0; - - //For each file, add it's pointer to the vector, size is pointer offset in the buffer - for (vector::iterator i = files.begin(); i != files.end(); i++) - { - i->buffer = decompressed_buffer+size; - file_pointers.push_back(decompressed_buffer+size); - size += i->size; - } - - //Return the vector of pointers - return(file_pointers); - } - - //Extracts the file with a given name found in the archive to the given buffer - void jma_open::extract_file(string& name, unsigned char *buffer) throw(jma_errors) - { - if (!stream.is_open()) - { - throw(JMA_NO_OPEN); - } - - size_t size_to_skip = 0; - size_t our_file_size = 0; - - //Search through the vector of file information - for (vector::iterator i = files.begin(); i != files.end(); i++) - { - if (i->name == name) - { - //Set the variable so we can tell we found it - our_file_size = i->size; - break; - } - - //Keep a running total of size - size_to_skip += i->size; - } - - if (!our_file_size) //File with the specified name was not found in the archive - { - throw(JMA_FILE_NOT_FOUND); - } - - //If the JMA only contains one file, we can skip a lot of overhead - if (files.size() == 1) - { - get_all_files(buffer); - return; - } - - if (chunk_size) //we are using non-solid archive.. - { - unsigned int chunks_to_skip = size_to_skip / chunk_size; - - //skip over requisite number of chunks - chunk_seek(chunks_to_skip); - - //Allocate memory for compressed and decompressed data - unsigned char *comp_buffer = 0, *decomp_buffer = 0; - try - { - //Compressed data size is <= non compressed size - unsigned char *combined_buffer = new unsigned char[chunk_size*2]; - comp_buffer = combined_buffer; - decomp_buffer = combined_buffer+chunk_size; - } - catch (bad_alloc xa) - { - throw(JMA_NO_MEM_ALLOC); - } - - size_t first_chunk_offset = size_to_skip % chunk_size; - unsigned char int4_buffer[UINT_SIZE]; - for (size_t i = 0; i < our_file_size;) - { - //Get size - stream.read((char *)int4_buffer, UINT_SIZE); - size_t compressed_size = charp_to_uint(int4_buffer); - - //Read all the compressed data in - stream.read((char *)comp_buffer, compressed_size); - - //Read the CRC of the compressed data - stream.read((char *)int4_buffer, UINT_SIZE); - - //If it doesn't match, complain - if (CRC32lib::CRC32(comp_buffer, compressed_size) != charp_to_uint(int4_buffer)) - { - delete[] comp_buffer; - throw(JMA_BAD_FILE); - } - - //Decompress chunk - if (!decompress_lzma_7z(comp_buffer, compressed_size, decomp_buffer, chunk_size)) - { - delete[] comp_buffer; - throw(JMA_DECOMPRESS_FAILED); - } - - size_t copy_amount = our_file_size-i > chunk_size-first_chunk_offset ? chunk_size-first_chunk_offset : our_file_size-i; - - memcpy(buffer+i, decomp_buffer+first_chunk_offset, copy_amount); - first_chunk_offset = 0; //Set to zero since this is only for the first iteration - i += copy_amount; - } - delete[] comp_buffer; - } - else //Solid JMA - { - unsigned char *decomp_buffer = 0; - try - { - decomp_buffer = new unsigned char[get_total_size(files)]; - } - catch (bad_alloc xa) - { - throw(JMA_NO_MEM_ALLOC); - } - - get_all_files(decomp_buffer); - - memcpy(buffer, decomp_buffer+size_to_skip, our_file_size); - - delete[] decomp_buffer; - } - } - - bool jma_open::is_solid() - { - return(chunk_size ? false : true); - } - - const char *jma_error_text(jma_errors error) - { - switch (error) - { - case JMA_NO_CREATE: - return("JMA could not be created"); - - case JMA_NO_MEM_ALLOC: - return("Memory for JMA could be allocated"); - - case JMA_NO_OPEN: - return("JMA could not be opened"); - - case JMA_BAD_FILE: - return("Invalid/Corrupt JMA"); - - case JMA_UNSUPPORTED_VERSION: - return("JMA version not supported"); - - case JMA_COMPRESS_FAILED: - return("JMA compression failed"); - - case JMA_DECOMPRESS_FAILED: - return("JMA decompression failed"); - - case JMA_FILE_NOT_FOUND: - return("File not found in JMA"); - } - return("Unknown error"); - } - -} - - diff --git a/tools/bsnes/reader/jma/jma.h b/tools/bsnes/reader/jma/jma.h deleted file mode 100755 index 2aaa5ca..0000000 --- a/tools/bsnes/reader/jma/jma.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef JMA_H -#define JMA_H - -#include -#include -#include -#include - -namespace JMA -{ - enum jma_errors { JMA_NO_CREATE, JMA_NO_MEM_ALLOC, JMA_NO_OPEN, JMA_BAD_FILE, - JMA_UNSUPPORTED_VERSION, JMA_COMPRESS_FAILED, JMA_DECOMPRESS_FAILED, - JMA_FILE_NOT_FOUND }; - - struct jma_file_info_base - { - std::string name; - std::string comment; - size_t size; - unsigned int crc32; - }; - - struct jma_public_file_info : jma_file_info_base - { - time_t datetime; - }; - - struct jma_file_info : jma_file_info_base - { - unsigned short date; - unsigned short time; - const unsigned char *buffer; - }; - - template - inline size_t get_total_size(std::vector& files) - { - size_t size = 0; - for (typename std::vector::iterator i = files.begin(); i != files.end(); i++) - { - size += i->size; //We do have a problem if this wraps around - } - - return(size); - } - - class jma_open - { - public: - jma_open(const char *) throw(jma_errors); - ~jma_open(); - - std::vector get_files_info(); - std::vector get_all_files(unsigned char *) throw(jma_errors); - void extract_file(std::string& name, unsigned char *) throw(jma_errors); - bool is_solid(); - - private: - std::ifstream stream; - std::vector files; - size_t chunk_size; - unsigned char *decompressed_buffer; - unsigned char *compressed_buffer; - - void chunk_seek(unsigned int) throw(jma_errors); - void retrieve_file_block() throw(jma_errors); - }; - - const char *jma_error_text(jma_errors); -} -#endif diff --git a/tools/bsnes/reader/jma/lencoder.h b/tools/bsnes/reader/jma/lencoder.h deleted file mode 100755 index 6f30e47..0000000 --- a/tools/bsnes/reader/jma/lencoder.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __LENCODER_H -#define __LENCODER_H - -#include "btreecd.h" - -namespace NLength { - -const UINT32 kNumPosStatesBitsMax = 4; -const int kNumPosStatesMax = (1 << kNumPosStatesBitsMax); - - -const int kNumPosStatesBitsEncodingMax = 4; -const int kNumPosStatesEncodingMax = (1 << kNumPosStatesBitsEncodingMax); - - -const int kNumMoveBits = 5; - -const int kNumLenBits = 3; -const int kNumLowSymbols = 1 << kNumLenBits; -const int kNumMidBits = 3; -const int kNumMidSymbols = 1 << kNumMidBits; - -const int kNumHighBits = 8; - -const int kNumSymbolsTotal = kNumLowSymbols + kNumMidSymbols + (1 << kNumHighBits); - -const int kNumSpecSymbols = kNumLowSymbols + kNumMidSymbols; - -class CDecoder -{ - CMyBitDecoder m_Choice; - CBitTreeDecoder m_LowCoder[kNumPosStatesMax]; - CMyBitDecoder m_Choice2; - CBitTreeDecoder m_MidCoder[kNumPosStatesMax]; - CBitTreeDecoder m_HighCoder; - UINT32 m_NumPosStates; -public: - void Create(UINT32 aNumPosStates) - { m_NumPosStates = aNumPosStates; } - void Init() - { - m_Choice.Init(); - for (UINT32 aPosState = 0; aPosState < m_NumPosStates; aPosState++) - { - m_LowCoder[aPosState].Init(); - m_MidCoder[aPosState].Init(); - } - m_Choice2.Init(); - m_HighCoder.Init(); - } - UINT32 Decode(CMyRangeDecoder *aRangeDecoder, UINT32 aPosState) - { - if(m_Choice.Decode(aRangeDecoder) == 0) - return m_LowCoder[aPosState].Decode(aRangeDecoder); - else - { - UINT32 aSymbol = kNumLowSymbols; - if(m_Choice2.Decode(aRangeDecoder) == 0) - aSymbol += m_MidCoder[aPosState].Decode(aRangeDecoder); - else - { - aSymbol += kNumMidSymbols; - aSymbol += m_HighCoder.Decode(aRangeDecoder); - } - return aSymbol; - } - } - -}; - -} - - -#endif diff --git a/tools/bsnes/reader/jma/litcoder.h b/tools/bsnes/reader/jma/litcoder.h deleted file mode 100755 index 639d6c5..0000000 --- a/tools/bsnes/reader/jma/litcoder.h +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __LITERALCODER_H -#define __LITERALCODER_H - -#include "aribitcd.h" -#include "rcdefs.h" - -namespace NLiteral { - -const int kNumMoveBits = 5; - -class CDecoder2 -{ - CMyBitDecoder m_Decoders[3][1 << 8]; -public: - void Init() - { - for (int i = 0; i < 3; i++) - for (int j = 1; j < (1 << 8); j++) - m_Decoders[i][j].Init(); - } - - BYTE DecodeNormal(CMyRangeDecoder *aRangeDecoder) - { - UINT32 aSymbol = 1; - RC_INIT_VAR - do - { - // aSymbol = (aSymbol << 1) | m_Decoders[0][aSymbol].Decode(aRangeDecoder); - RC_GETBIT(kNumMoveBits, m_Decoders[0][aSymbol].m_Probability, aSymbol) - } - while (aSymbol < 0x100); - RC_FLUSH_VAR - return aSymbol; - } - - BYTE DecodeWithMatchByte(CMyRangeDecoder *aRangeDecoder, BYTE aMatchByte) - { - UINT32 aSymbol = 1; - RC_INIT_VAR - do - { - UINT32 aMatchBit = (aMatchByte >> 7) & 1; - aMatchByte <<= 1; - // UINT32 aBit = m_Decoders[1 + aMatchBit][aSymbol].Decode(aRangeDecoder); - // aSymbol = (aSymbol << 1) | aBit; - UINT32 aBit; - RC_GETBIT2(kNumMoveBits, m_Decoders[1 + aMatchBit][aSymbol].m_Probability, aSymbol, - aBit = 0, aBit = 1) - if (aMatchBit != aBit) - { - while (aSymbol < 0x100) - { - // aSymbol = (aSymbol << 1) | m_Decoders[0][aSymbol].Decode(aRangeDecoder); - RC_GETBIT(kNumMoveBits, m_Decoders[0][aSymbol].m_Probability, aSymbol) - } - break; - } - } - while (aSymbol < 0x100); - RC_FLUSH_VAR - return aSymbol; - } -}; - -class CDecoder -{ - CDecoder2 *m_Coders; - UINT32 m_NumPrevBits; - UINT32 m_NumPosBits; - UINT32 m_PosMask; -public: - CDecoder(): m_Coders(0) {} - ~CDecoder() { Free(); } - void Free() - { - delete []m_Coders; - m_Coders = 0; - } - void Create(UINT32 aNumPosBits, UINT32 aNumPrevBits) - { - Free(); - m_NumPosBits = aNumPosBits; - m_PosMask = (1 << aNumPosBits) - 1; - m_NumPrevBits = aNumPrevBits; - UINT32 aNumStates = 1 << (m_NumPrevBits + m_NumPosBits); - m_Coders = new CDecoder2[aNumStates]; - } - void Init() - { - UINT32 aNumStates = 1 << (m_NumPrevBits + m_NumPosBits); - for (UINT32 i = 0; i < aNumStates; i++) - m_Coders[i].Init(); - } - UINT32 GetState(UINT32 aPos, BYTE aPrevByte) const - { return ((aPos & m_PosMask) << m_NumPrevBits) + (aPrevByte >> (8 - m_NumPrevBits)); } - BYTE DecodeNormal(CMyRangeDecoder *aRangeDecoder, UINT32 aPos, BYTE aPrevByte) - { return m_Coders[GetState(aPos, aPrevByte)].DecodeNormal(aRangeDecoder); } - BYTE DecodeWithMatchByte(CMyRangeDecoder *aRangeDecoder, UINT32 aPos, BYTE aPrevByte, BYTE aMatchByte) - { return m_Coders[GetState(aPos, aPrevByte)].DecodeWithMatchByte(aRangeDecoder, aMatchByte); } -}; - -} - -#endif diff --git a/tools/bsnes/reader/jma/lzma.cpp b/tools/bsnes/reader/jma/lzma.cpp deleted file mode 100755 index d020ed2..0000000 --- a/tools/bsnes/reader/jma/lzma.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "lzma.h" - -namespace NCompress { -namespace NLZMA { - -UINT32 kDistStart[kDistTableSizeMax]; - -static class CConstInit -{ -public: - CConstInit() - { - UINT32 aStartValue = 0; - int i; - for (i = 0; i < kDistTableSizeMax; i++) - { - kDistStart[i] = aStartValue; - aStartValue += (1 << kDistDirectBits[i]); - } - } -} g_ConstInit; - -}} diff --git a/tools/bsnes/reader/jma/lzma.h b/tools/bsnes/reader/jma/lzma.h deleted file mode 100755 index 949b70b..0000000 --- a/tools/bsnes/reader/jma/lzma.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "lencoder.h" - -#ifndef __LZMA_H -#define __LZMA_H - -namespace NCompress { -namespace NLZMA { - -const UINT32 kNumRepDistances = 4; - -const BYTE kNumStates = 12; - -const BYTE kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -const BYTE kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -const BYTE kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -const BYTE kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; - -class CState -{ -public: - BYTE m_Index; - void Init() - { m_Index = 0; } - void UpdateChar() - { m_Index = kLiteralNextStates[m_Index]; } - void UpdateMatch() - { m_Index = kMatchNextStates[m_Index]; } - void UpdateRep() - { m_Index = kRepNextStates[m_Index]; } - void UpdateShortRep() - { m_Index = kShortRepNextStates[m_Index]; } -}; - -class CBaseCoder -{ -protected: - CState m_State; - BYTE m_PreviousByte; - bool m_PeviousIsMatch; - UINT32 m_RepDistances[kNumRepDistances]; - void Init() - { - m_State.Init(); - m_PreviousByte = 0; - m_PeviousIsMatch = false; - for(UINT32 i = 0 ; i < kNumRepDistances; i++) - m_RepDistances[i] = 0; - } -}; - -const int kNumPosSlotBits = 6; -const int kDicLogSizeMax = 28; -const int kDistTableSizeMax = kDicLogSizeMax * 2; - -extern UINT32 kDistStart[kDistTableSizeMax]; -const BYTE kDistDirectBits[kDistTableSizeMax] = -{ - 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, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, - 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26 -}; - -const UINT32 kNumLenToPosStates = 4; -inline UINT32 GetLenToPosState(UINT32 aLen) -{ - aLen -= 2; - if (aLen < kNumLenToPosStates) - return aLen; - return kNumLenToPosStates - 1; -} - -const int kMatchMinLen = 2; - -const int kMatchMaxLen = kMatchMinLen + NLength::kNumSymbolsTotal - 1; - -const int kNumAlignBits = 4; -const int kAlignTableSize = 1 << kNumAlignBits; -const UINT32 kAlignMask = (kAlignTableSize - 1); - -const int kStartPosModelIndex = 4; -const int kEndPosModelIndex = 14; -const int kNumPosModels = kEndPosModelIndex - kStartPosModelIndex; - -const int kNumFullDistances = 1 << (kEndPosModelIndex / 2); - - -const int kMainChoiceLiteralIndex = 0; -const int kMainChoiceMatchIndex = 1; - -const int kMatchChoiceDistanceIndex= 0; -const int kMatchChoiceRepetitionIndex = 1; - -const int kNumMoveBitsForMainChoice = 5; -const int kNumMoveBitsForPosCoders = 5; - -const int kNumMoveBitsForAlignCoders = 5; - -const int kNumMoveBitsForPosSlotCoder = 5; - -const int kNumLitPosStatesBitsEncodingMax = 4; -const int kNumLitContextBitsMax = 8; - -}} - -#endif diff --git a/tools/bsnes/reader/jma/lzmadec.cpp b/tools/bsnes/reader/jma/lzmadec.cpp deleted file mode 100755 index ad6b570..0000000 --- a/tools/bsnes/reader/jma/lzmadec.cpp +++ /dev/null @@ -1,298 +0,0 @@ -/* -Copyright (C) 2005-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "portable.h" -#include "lzmadec.h" - -#define RETURN_E_OUTOFMEMORY_IF_FALSE(x) { if (!(x)) return E_OUTOFMEMORY; } - -namespace NCompress { -namespace NLZMA { - -HRESULT CDecoder::SetDictionarySize(UINT32 aDictionarySize) -{ - if (aDictionarySize > (1 << kDicLogSizeMax)) - return E_INVALIDARG; - - UINT32 aWindowReservSize = MyMax(aDictionarySize, UINT32(1 << 21)); - - if (m_DictionarySize != aDictionarySize) - { - m_OutWindowStream.Create(aDictionarySize, kMatchMaxLen, aWindowReservSize); - m_DictionarySize = aDictionarySize; - } - return S_OK; -} - -HRESULT CDecoder::SetLiteralProperties( - UINT32 aLiteralPosStateBits, UINT32 aLiteralContextBits) -{ - if (aLiteralPosStateBits > 8) - return E_INVALIDARG; - if (aLiteralContextBits > 8) - return E_INVALIDARG; - m_LiteralDecoder.Create(aLiteralPosStateBits, aLiteralContextBits); - return S_OK; -} - -HRESULT CDecoder::SetPosBitsProperties(UINT32 aNumPosStateBits) -{ - if (aNumPosStateBits > NLength::kNumPosStatesBitsMax) - return E_INVALIDARG; - UINT32 aNumPosStates = 1 << aNumPosStateBits; - m_LenDecoder.Create(aNumPosStates); - m_RepMatchLenDecoder.Create(aNumPosStates); - m_PosStateMask = aNumPosStates - 1; - return S_OK; -} - -CDecoder::CDecoder(): - m_DictionarySize((UINT32)-1) -{ - Create(); -} - -HRESULT CDecoder::Create() -{ - for(int i = 0; i < kNumPosModels; i++) - { - RETURN_E_OUTOFMEMORY_IF_FALSE( - m_PosDecoders[i].Create(kDistDirectBits[kStartPosModelIndex + i])); - } - return S_OK; -} - - -HRESULT CDecoder::Init(ISequentialInStream *anInStream, - ISequentialOutStream *anOutStream) -{ - m_RangeDecoder.Init(anInStream); - - m_OutWindowStream.Init(anOutStream); - - int i; - for(i = 0; i < kNumStates; i++) - { - for (UINT32 j = 0; j <= m_PosStateMask; j++) - { - m_MainChoiceDecoders[i][j].Init(); - m_MatchRepShortChoiceDecoders[i][j].Init(); - } - m_MatchChoiceDecoders[i].Init(); - m_MatchRepChoiceDecoders[i].Init(); - m_MatchRep1ChoiceDecoders[i].Init(); - m_MatchRep2ChoiceDecoders[i].Init(); - } - - m_LiteralDecoder.Init(); - - // m_RepMatchLenDecoder.Init(); - - for (i = 0; (UINT32) i < kNumLenToPosStates; i++) - m_PosSlotDecoder[i].Init(); - - for(i = 0; i < kNumPosModels; i++) - m_PosDecoders[i].Init(); - - m_LenDecoder.Init(); - m_RepMatchLenDecoder.Init(); - - m_PosAlignDecoder.Init(); - return S_OK; - -} - -HRESULT CDecoder::CodeReal(ISequentialInStream *anInStream, - ISequentialOutStream *anOutStream, - const UINT64 *anInSize, const UINT64 *anOutSize) -{ - if (anOutSize == NULL) - return E_INVALIDARG; - - Init(anInStream, anOutStream); - - CState aState; - aState.Init(); - bool aPeviousIsMatch = false; - BYTE aPreviousByte = 0; - UINT32 aRepDistances[kNumRepDistances]; - for(UINT32 i = 0 ; i < kNumRepDistances; i++) - aRepDistances[i] = 0; - - UINT64 aNowPos64 = 0; - UINT64 aSize = *anOutSize; - while(aNowPos64 < aSize) - { - UINT64 aNext = MyMin(aNowPos64 + (1 << 18), aSize); - while(aNowPos64 < aNext) - { - UINT32 aPosState = UINT32(aNowPos64) & m_PosStateMask; - if (m_MainChoiceDecoders[aState.m_Index][aPosState].Decode(&m_RangeDecoder) == (UINT32) kMainChoiceLiteralIndex) - { - // aCounts[0]++; - aState.UpdateChar(); - if(aPeviousIsMatch) - { - BYTE aMatchByte = m_OutWindowStream.GetOneByte(0 - aRepDistances[0] - 1); - aPreviousByte = m_LiteralDecoder.DecodeWithMatchByte(&m_RangeDecoder, - UINT32(aNowPos64), aPreviousByte, aMatchByte); - aPeviousIsMatch = false; - } - else - aPreviousByte = m_LiteralDecoder.DecodeNormal(&m_RangeDecoder, - UINT32(aNowPos64), aPreviousByte); - m_OutWindowStream.PutOneByte(aPreviousByte); - aNowPos64++; - } - else - { - aPeviousIsMatch = true; - UINT32 aDistance, aLen; - if(m_MatchChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == - (UINT32) kMatchChoiceRepetitionIndex) - { - if(m_MatchRepChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) - { - if(m_MatchRepShortChoiceDecoders[aState.m_Index][aPosState].Decode(&m_RangeDecoder) == 0) - { - aState.UpdateShortRep(); - aPreviousByte = m_OutWindowStream.GetOneByte(0 - aRepDistances[0] - 1); - m_OutWindowStream.PutOneByte(aPreviousByte); - aNowPos64++; - // aCounts[3 + 4]++; - continue; - } - // aCounts[3 + 0]++; - aDistance = aRepDistances[0]; - } - else - { - if(m_MatchRep1ChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) - { - aDistance = aRepDistances[1]; - aRepDistances[1] = aRepDistances[0]; - // aCounts[3 + 1]++; - } - else - { - if (m_MatchRep2ChoiceDecoders[aState.m_Index].Decode(&m_RangeDecoder) == 0) - { - // aCounts[3 + 2]++; - aDistance = aRepDistances[2]; - } - else - { - // aCounts[3 + 3]++; - aDistance = aRepDistances[3]; - aRepDistances[3] = aRepDistances[2]; - } - aRepDistances[2] = aRepDistances[1]; - aRepDistances[1] = aRepDistances[0]; - } - aRepDistances[0] = aDistance; - } - aLen = m_RepMatchLenDecoder.Decode(&m_RangeDecoder, aPosState) + kMatchMinLen; - // aCounts[aLen]++; - aState.UpdateRep(); - } - else - { - aLen = kMatchMinLen + m_LenDecoder.Decode(&m_RangeDecoder, aPosState); - aState.UpdateMatch(); - UINT32 aPosSlot = m_PosSlotDecoder[GetLenToPosState(aLen)].Decode(&m_RangeDecoder); - // aCounts[aPosSlot]++; - if (aPosSlot >= (UINT32) kStartPosModelIndex) - { - aDistance = kDistStart[aPosSlot]; - if (aPosSlot < (UINT32) kEndPosModelIndex) - aDistance += m_PosDecoders[aPosSlot - kStartPosModelIndex].Decode(&m_RangeDecoder); - else - { - aDistance += (m_RangeDecoder.DecodeDirectBits(kDistDirectBits[aPosSlot] - - kNumAlignBits) << kNumAlignBits); - aDistance += m_PosAlignDecoder.Decode(&m_RangeDecoder); - } - } - else - aDistance = aPosSlot; - - - aRepDistances[3] = aRepDistances[2]; - aRepDistances[2] = aRepDistances[1]; - aRepDistances[1] = aRepDistances[0]; - - aRepDistances[0] = aDistance; - // UpdateStat(aLen, aPosSlot); - } - if (aDistance >= aNowPos64) - throw E_INVALIDDATA; - m_OutWindowStream.CopyBackBlock(aDistance, aLen); - aNowPos64 += aLen; - aPreviousByte = m_OutWindowStream.GetOneByte(0 - 1); - } - } - } - return Flush(); -} - -HRESULT CDecoder::Code(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream, const UINT64 *anInSize, const UINT64 *anOutSize) -{ - try { - return CodeReal(anInStream, anOutStream, anInSize, anOutSize); - } catch (HRESULT& e) { - return e; - } catch (...) { - return E_FAIL; - } -} - -HRESULT CDecoder::ReadCoderProperties(ISequentialInStream *anInStream) -{ - UINT32 aNumPosStateBits; - UINT32 aLiteralPosStateBits; - UINT32 aLiteralContextBits; - UINT32 aDictionarySize; - - UINT32 aProcessesedSize; - - BYTE aByte; - RETURN_IF_NOT_S_OK(anInStream->Read(&aByte, sizeof(aByte), &aProcessesedSize)); - if (aProcessesedSize != sizeof(aByte)) - return E_INVALIDARG; - - aLiteralContextBits = aByte % 9; - BYTE aRemainder = aByte / 9; - aLiteralPosStateBits = aRemainder % 5; - aNumPosStateBits = aRemainder / 5; - - UINT8 uint_buffer[UINT_SIZE]; - RETURN_IF_NOT_S_OK(anInStream->Read(uint_buffer, sizeof(aDictionarySize), &aProcessesedSize)); - aDictionarySize = charp_to_uint(uint_buffer); - - if (aProcessesedSize != sizeof(aDictionarySize)) - return E_INVALIDARG; - - RETURN_IF_NOT_S_OK(SetDictionarySize(aDictionarySize)); - RETURN_IF_NOT_S_OK(SetLiteralProperties(aLiteralPosStateBits, aLiteralContextBits)); - RETURN_IF_NOT_S_OK(SetPosBitsProperties(aNumPosStateBits)); - - return S_OK; -} - -}} diff --git a/tools/bsnes/reader/jma/lzmadec.h b/tools/bsnes/reader/jma/lzmadec.h deleted file mode 100755 index bb91912..0000000 --- a/tools/bsnes/reader/jma/lzmadec.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __LZARITHMETIC_DECODER_H -#define __LZARITHMETIC_DECODER_H - -#include "winout.h" -#include "lzma.h" -#include "lencoder.h" -#include "litcoder.h" - -namespace NCompress { -namespace NLZMA { - -typedef CMyBitDecoder CMyBitDecoder2; - -class CDecoder -{ - NStream::NWindow::COut m_OutWindowStream; - CMyRangeDecoder m_RangeDecoder; - - CMyBitDecoder2 m_MainChoiceDecoders[kNumStates][NLength::kNumPosStatesMax]; - CMyBitDecoder2 m_MatchChoiceDecoders[kNumStates]; - CMyBitDecoder2 m_MatchRepChoiceDecoders[kNumStates]; - CMyBitDecoder2 m_MatchRep1ChoiceDecoders[kNumStates]; - CMyBitDecoder2 m_MatchRep2ChoiceDecoders[kNumStates]; - CMyBitDecoder2 m_MatchRepShortChoiceDecoders[kNumStates][NLength::kNumPosStatesMax]; - - CBitTreeDecoder m_PosSlotDecoder[kNumLenToPosStates]; - - CReverseBitTreeDecoder2 m_PosDecoders[kNumPosModels]; - CReverseBitTreeDecoder m_PosAlignDecoder; - // CBitTreeDecoder2 m_PosDecoders[kNumPosModels]; - // CBitTreeDecoder m_PosAlignDecoder; - - NLength::CDecoder m_LenDecoder; - NLength::CDecoder m_RepMatchLenDecoder; - - NLiteral::CDecoder m_LiteralDecoder; - - UINT32 m_DictionarySize; - - UINT32 m_PosStateMask; - - HRESULT Create(); - - HRESULT Init(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream); - - HRESULT Flush() { return m_OutWindowStream.Flush(); } - - HRESULT CodeReal(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream, const UINT64 *anInSize, const UINT64 *anOutSize); - -public: - - CDecoder(); - - HRESULT Code(ISequentialInStream *anInStream, ISequentialOutStream *anOutStream, const UINT64 *anInSize, const UINT64 *anOutSize); - HRESULT ReadCoderProperties(ISequentialInStream *anInStream); - - HRESULT SetDictionarySize(UINT32 aDictionarySize); - HRESULT SetLiteralProperties(UINT32 aLiteralPosStateBits, UINT32 aLiteralContextBits); - HRESULT SetPosBitsProperties(UINT32 aNumPosStateBits); -}; - -}} - -#endif diff --git a/tools/bsnes/reader/jma/portable.h b/tools/bsnes/reader/jma/portable.h deleted file mode 100755 index 12416c7..0000000 --- a/tools/bsnes/reader/jma/portable.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright (C) 2004-2007 NSRT Team ( http://nsrt.edgeemu.com ) -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __PORTABLE_H -#define __PORTABLE_H - -#include - -typedef signed char INT8; -typedef unsigned char UINT8; -typedef short INT16; -typedef unsigned short UINT16; -typedef long INT32; -typedef unsigned long UINT32; -typedef long long INT64; -typedef unsigned long long UINT64; - -typedef UINT8 BYTE; -typedef UINT16 WORD; -typedef UINT32 DWORD; - -typedef unsigned UINT_PTR; - -typedef int BOOL; -#define FALSE 0 -#define TRUE 1 - -#define HRESULT int -#define S_OK 0 -#define E_INVALIDARG -1 -#define E_OUTOFMEMORY -2 -#define E_FAIL -3 -#define E_INTERNAL_ERROR -4 -#define E_INVALIDDATA -5 - -template inline T MyMin(T a, T b) { - return a < b ? a : b; -} - -template inline T MyMax(T a, T b) { - return a > b ? a : b; -} - -#define RETURN_IF_NOT_S_OK(x) { HRESULT __aResult_ = (x); if(__aResult_ != S_OK) return __aResult_; } - - -#define UINT_SIZE (4) -#define USHORT_SIZE (2) - -//Convert an array of 4 bytes back into an integer -inline unsigned int charp_to_uint(const unsigned char buffer[UINT_SIZE]) -{ - unsigned int num = (unsigned int)buffer[3]; - num |= ((unsigned int)buffer[2]) << 8; - num |= ((unsigned int)buffer[1]) << 16; - num |= ((unsigned int)buffer[0]) << 24; - return(num); -} - -//Convert an array of 2 bytes back into a short integer -inline unsigned short charp_to_ushort(const unsigned char buffer[USHORT_SIZE]) -{ - unsigned short num = (unsigned short)buffer[1]; - num |= ((unsigned short)buffer[0]) << 8; - return(num); -} - -#endif diff --git a/tools/bsnes/reader/jma/rcdefs.h b/tools/bsnes/reader/jma/rcdefs.h deleted file mode 100755 index 6106b57..0000000 --- a/tools/bsnes/reader/jma/rcdefs.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __RCDEFS_H -#define __RCDEFS_H - -#include "aribitcd.h" -#include "ariconst.h" - -#define RC_INIT_VAR \ - UINT32 aRange = aRangeDecoder->m_Range; \ - UINT32 aCode = aRangeDecoder->m_Code; - -#define RC_FLUSH_VAR \ - aRangeDecoder->m_Range = aRange; \ - aRangeDecoder->m_Code = aCode; - -#define RC_NORMALIZE \ - if (aRange < NCompression::NArithmetic::kTopValue) \ - { \ - aCode = (aCode << 8) | aRangeDecoder->m_Stream.ReadByte(); \ - aRange <<= 8; } - -#define RC_GETBIT2(aNumMoveBits, aProb, aModelIndex, Action0, Action1) \ - {UINT32 aNewBound = (aRange >> NCompression::NArithmetic::kNumBitModelTotalBits) * aProb; \ - if (aCode < aNewBound) \ - { \ - Action0; \ - aRange = aNewBound; \ - aProb += (NCompression::NArithmetic::kBitModelTotal - aProb) >> aNumMoveBits; \ - aModelIndex <<= 1; \ - } \ - else \ - { \ - Action1; \ - aRange -= aNewBound; \ - aCode -= aNewBound; \ - aProb -= (aProb) >> aNumMoveBits; \ - aModelIndex = (aModelIndex << 1) + 1; \ - }} \ - RC_NORMALIZE - -#define RC_GETBIT(aNumMoveBits, aProb, aModelIndex) RC_GETBIT2(aNumMoveBits, aProb, aModelIndex, ; , ;) - -#endif diff --git a/tools/bsnes/reader/jma/rngcoder.h b/tools/bsnes/reader/jma/rngcoder.h deleted file mode 100755 index 711c2de..0000000 --- a/tools/bsnes/reader/jma/rngcoder.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __COMPRESSION_RANGECODER_H -#define __COMPRESSION_RANGECODER_H - -#include "inbyte.h" - -namespace NCompression { -namespace NArithmetic { - -const UINT32 kNumTopBits = 24; -const UINT32 kTopValue = (1 << kNumTopBits); - -class CRangeDecoder -{ -public: - NStream::CInByte m_Stream; - UINT32 m_Range; - UINT32 m_Code; - UINT32 m_Word; - void Normalize() - { - while (m_Range < kTopValue) - { - m_Code = (m_Code << 8) | m_Stream.ReadByte(); - m_Range <<= 8; - } - } - - void Init(ISequentialInStream *aStream) - { - m_Stream.Init(aStream); - m_Code = 0; - m_Range = UINT32(-1); - for(int i = 0; i < 5; i++) - m_Code = (m_Code << 8) | m_Stream.ReadByte(); - } - - UINT32 GetThreshold(UINT32 aTotal) - { - return (m_Code) / ( m_Range /= aTotal); - } - - void Decode(UINT32 aStart, UINT32 aSize, UINT32 aTotal) - { - m_Code -= aStart * m_Range; - m_Range *= aSize; - Normalize(); - } - - /* - UINT32 DecodeDirectBitsDiv(UINT32 aNumTotalBits) - { - m_Range >>= aNumTotalBits; - UINT32 aThreshold = m_Code / m_Range; - m_Code -= aThreshold * m_Range; - - Normalize(); - return aThreshold; - } - - UINT32 DecodeDirectBitsDiv2(UINT32 aNumTotalBits) - { - if (aNumTotalBits <= kNumBottomBits) - return DecodeDirectBitsDiv(aNumTotalBits); - UINT32 aResult = DecodeDirectBitsDiv(aNumTotalBits - kNumBottomBits) << kNumBottomBits; - return (aResult | DecodeDirectBitsDiv(kNumBottomBits)); - } - */ - - UINT32 DecodeDirectBits(UINT32 aNumTotalBits) - { - UINT32 aRange = m_Range; - UINT32 aCode = m_Code; - UINT32 aResult = 0; - for (UINT32 i = aNumTotalBits; i > 0; i--) - { - aRange >>= 1; - /* - aResult <<= 1; - if (aCode >= aRange) - { - aCode -= aRange; - aResult |= 1; - } - */ - UINT32 t = (aCode - aRange) >> 31; - aCode -= aRange & (t - 1); - // aRange = aRangeTmp + ((aRange & 1) & (1 - t)); - aResult = (aResult << 1) | (1 - t); - - if (aRange < kTopValue) - { - aCode = (aCode << 8) | m_Stream.ReadByte(); - aRange <<= 8; - } - } - m_Range = aRange; - m_Code = aCode; - return aResult; - } - - UINT32 DecodeBit(UINT32 aSize0, UINT32 aNumTotalBits) - { - UINT32 aNewBound = (m_Range >> aNumTotalBits) * aSize0; - UINT32 aSymbol; - if (m_Code < aNewBound) - { - aSymbol = 0; - m_Range = aNewBound; - } - else - { - aSymbol = 1; - m_Code -= aNewBound; - m_Range -= aNewBound; - } - Normalize(); - return aSymbol; - } - - UINT64 GetProcessedSize() {return m_Stream.GetProcessedSize(); } -}; - -}} - -#endif diff --git a/tools/bsnes/reader/jma/winout.cpp b/tools/bsnes/reader/jma/winout.cpp deleted file mode 100755 index 1f33885..0000000 --- a/tools/bsnes/reader/jma/winout.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "winout.h" - -namespace NStream { -namespace NWindow { - -void COut::Create(UINT32 aKeepSizeBefore, UINT32 aKeepSizeAfter, UINT32 aKeepSizeReserv) -{ - m_Pos = 0; - m_PosLimit = aKeepSizeReserv + aKeepSizeBefore; - m_KeepSizeBefore = aKeepSizeBefore; - m_KeepSizeAfter = aKeepSizeAfter; - m_KeepSizeReserv = aKeepSizeReserv; - m_StreamPos = 0; - m_MoveFrom = m_KeepSizeReserv; - m_WindowSize = aKeepSizeBefore; - UINT32 aBlockSize = m_KeepSizeBefore + m_KeepSizeAfter + m_KeepSizeReserv; - delete []m_Buffer; - m_Buffer = new BYTE[aBlockSize]; -} - -COut::~COut() -{ - delete []m_Buffer; -} - -void COut::SetWindowSize(UINT32 aWindowSize) -{ - m_WindowSize = aWindowSize; - m_MoveFrom = m_KeepSizeReserv + m_KeepSizeBefore - aWindowSize; -} - -void COut::Init(ISequentialOutStream *aStream, bool aSolid) -{ - m_Stream = aStream; - - if(aSolid) - m_StreamPos = m_Pos; - else - { - m_Pos = 0; - m_PosLimit = m_KeepSizeReserv + m_KeepSizeBefore; - m_StreamPos = 0; - } -} - -HRESULT COut::Flush() -{ - UINT32 aSize = m_Pos - m_StreamPos; - if(aSize == 0) - return S_OK; - UINT32 aProcessedSize; - HRESULT aResult = m_Stream->Write(m_Buffer + m_StreamPos, aSize, &aProcessedSize); - if (aResult != S_OK) - return aResult; - if (aSize != aProcessedSize) - return E_FAIL; - m_StreamPos = m_Pos; - return S_OK; -} - -void COut::MoveBlockBackward() -{ - HRESULT aResult = Flush(); - if (aResult != S_OK) - throw aResult; - memmove(m_Buffer, m_Buffer + m_MoveFrom, m_WindowSize + m_KeepSizeAfter); - m_Pos -= m_MoveFrom; - m_StreamPos -= m_MoveFrom; -} - -}} diff --git a/tools/bsnes/reader/jma/winout.h b/tools/bsnes/reader/jma/winout.h deleted file mode 100755 index 38e06bd..0000000 --- a/tools/bsnes/reader/jma/winout.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -Copyright (C) 2002 Andrea Mazzoleni ( http://advancemame.sf.net ) -Copyright (C) 2001-4 Igor Pavlov ( http://www.7-zip.org ) - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License version 2.1 as published by the Free Software Foundation. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef __STREAM_WINDOWOUT_H -#define __STREAM_WINDOWOUT_H - -#include "iiostrm.h" - -namespace NStream { -namespace NWindow { - -// m_KeepSizeBefore: how mach BYTEs must be in buffer before m_Pos; -// m_KeepSizeAfter: how mach BYTEs must be in buffer after m_Pos; -// m_KeepSizeReserv: how mach BYTEs must be in buffer for Moving Reserv; -// must be >= aKeepSizeAfter; // test it - -class COut -{ - BYTE *m_Buffer; - UINT32 m_Pos; - UINT32 m_PosLimit; - UINT32 m_KeepSizeBefore; - UINT32 m_KeepSizeAfter; - UINT32 m_KeepSizeReserv; - UINT32 m_StreamPos; - - UINT32 m_WindowSize; - UINT32 m_MoveFrom; - - ISequentialOutStream *m_Stream; - - virtual void MoveBlockBackward(); -public: - COut(): m_Buffer(0), m_Stream(0) {} - virtual ~COut(); - void Create(UINT32 aKeepSizeBefore, - UINT32 aKeepSizeAfter, UINT32 aKeepSizeReserv = (1<<17)); - void SetWindowSize(UINT32 aWindowSize); - - void Init(ISequentialOutStream *aStream, bool aSolid = false); - HRESULT Flush(); - - UINT32 GetCurPos() const { return m_Pos; } - const BYTE *GetPointerToCurrentPos() const { return m_Buffer + m_Pos;}; - - void CopyBackBlock(UINT32 aDistance, UINT32 aLen) - { - if (m_Pos >= m_PosLimit) - MoveBlockBackward(); - BYTE *p = m_Buffer + m_Pos; - aDistance++; - for(UINT32 i = 0; i < aLen; i++) - p[i] = p[i - aDistance]; - m_Pos += aLen; - } - - void PutOneByte(BYTE aByte) - { - if (m_Pos >= m_PosLimit) - MoveBlockBackward(); - m_Buffer[m_Pos++] = aByte; - } - - BYTE GetOneByte(UINT32 anIndex) const - { - return m_Buffer[m_Pos + anIndex]; - } - - BYTE *GetBuffer() const { return m_Buffer; } -}; - -}} - -#endif diff --git a/tools/bsnes/reader/jmareader.cpp b/tools/bsnes/reader/jmareader.cpp deleted file mode 100755 index 2e879a0..0000000 --- a/tools/bsnes/reader/jmareader.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef READER_CPP - -#include "jmareader.hpp" -#include "jma/jma.h" - -unsigned JMAReader::size() { - return filesize; -} - -uint8_t* JMAReader::read(unsigned length) { - uint8_t *data = 0; - if(!filesize) return 0; - - if(length <= filesize) { - //read the entire file into RAM - data = new(zeromemory) uint8_t[filesize]; - JMAFile.extract_file(cname, data); - } else if(length > filesize) { - //read the entire file into RAM, pad the rest with 0x00s - data = new(zeromemory) uint8_t[length]; - JMAFile.extract_file(cname, data); - } - - return data; -} - -JMAReader::JMAReader(const char *fn) : JMAFile(fn), filesize(0) { - std::vector file_info = JMAFile.get_files_info(); - for(std::vector::iterator i = file_info.begin(); i != file_info.end(); i++) { - //Check for valid ROM based on size - if((i->size <= 0x1000000 + 512) && (i->size > filesize)) { - cname = i->name; - filesize = i->size; - } - } -} - -#endif //ifdef READER_CPP diff --git a/tools/bsnes/reader/jmareader.hpp b/tools/bsnes/reader/jmareader.hpp deleted file mode 100755 index c3d1275..0000000 --- a/tools/bsnes/reader/jmareader.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "jma/jma.h" - -class JMAReader : public Reader { -public: - unsigned size(); - uint8_t* read(unsigned length = 0); - - JMAReader(const char *fn); - -private: - JMA::jma_open JMAFile; - unsigned filesize; - std::string cname; -}; diff --git a/tools/bsnes/reader/reader.cpp b/tools/bsnes/reader/reader.cpp deleted file mode 100755 index 035c712..0000000 --- a/tools/bsnes/reader/reader.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include <../base.hpp> -#define READER_CPP - -#include "reader.hpp" -#include "filereader.cpp" - -#if defined(GZIP_SUPPORT) - #include "gzreader.cpp" - #include "zipreader.cpp" -#endif - -#if defined(JMA_SUPPORT) - #include "jmareader.cpp" -#endif - -Reader::Type Reader::detect(const char *fn, bool inspectheader) { - file fp; - if(!fp.open(fn, file::mode_read)) return Unknown; - - uint8_t p[8]; - memset(p, 0, sizeof p); - fp.read(p, 8); - fp.close(); - - if(inspectheader == true) { - //inspect file header to determine type - if(p[0] == 0x1f && p[1] == 0x8b && p[2] == 0x08 && p[3] <= 0x1f) return GZIP; - if(p[0] == 0x50 && p[1] == 0x4b && p[2] == 0x03 && p[3] == 0x04) return ZIP; - if(p[0] == 0x4a && p[1] == 0x4d && p[2] == 0x41 && p[3] == 0x00 && p[4] == 0x4e) return JMA; - } else { - //check file extension to determine type - if(striend(fn, ".gz")) return GZIP; - if(striend(fn, ".zip") || striend(fn, ".z")) return ZIP; - if(striend(fn, ".jma")) return JMA; - } - return Normal; -} diff --git a/tools/bsnes/reader/reader.hpp b/tools/bsnes/reader/reader.hpp deleted file mode 100755 index 1dd1944..0000000 --- a/tools/bsnes/reader/reader.hpp +++ /dev/null @@ -1,15 +0,0 @@ -class Reader { -public: - enum Type { - Unknown, - Normal, - GZIP, - ZIP, - JMA, - }; - - static Type detect(const char *fn, bool inspectheader); - virtual unsigned size() = 0; - virtual uint8_t* read(unsigned length = 0) = 0; - virtual bool ready() { return true; } //can only call read() when ready() returns true -}; diff --git a/tools/bsnes/reader/zipreader.cpp b/tools/bsnes/reader/zipreader.cpp deleted file mode 100755 index ea35dbd..0000000 --- a/tools/bsnes/reader/zipreader.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#ifdef READER_CPP - -#include "zipreader.hpp" - -unsigned ZipReader::size() { - return filesize; -} - -uint8_t* ZipReader::read(unsigned length) { - if(!filesize) return 0; - - uint8_t *data = 0; - if(length <= filesize) { - //read the entire file into RAM - data = new(zeromemory) uint8_t[filesize]; - unzReadCurrentFile(zipfile, data, filesize); - } else { /* length > filesize */ - //read the entire file into RAM, pad the rest with 0x00s - data = new(zeromemory) uint8_t[length]; - unzReadCurrentFile(zipfile, data, filesize); - } - - return data; -} - -bool ZipReader::ready() { - return zipready; -} - -ZipReader::ZipReader(const char *fn) : filesize(0), zipready(false) { - unz_file_info cFileInfo; //Create variable to hold info for a compressed file - char cFileName[sizeof(cname)]; - - if(zipfile = unzOpen(fn)) { //Open zip file - for(int cFile = unzGoToFirstFile(zipfile); cFile == UNZ_OK; cFile = unzGoToNextFile(zipfile)) { - //Gets info on current file, and places it in cFileInfo - unzGetCurrentFileInfo(zipfile, &cFileInfo, cFileName, sizeof(cname), 0, 0, 0, 0); - - //verify uncompressed file is not bigger than max ROM size - if((cFileInfo.uncompressed_size <= 0x1000000 + 512) && (cFileInfo.uncompressed_size > filesize)) { - strcpy(cname, cFileName); - filesize = cFileInfo.uncompressed_size; - } - } - - if(filesize) { - unzLocateFile(zipfile, cname, 1); - unzOpenCurrentFile(zipfile); - zipready = true; - } - } -} - -ZipReader::~ZipReader() { - if(zipfile) { - unzCloseCurrentFile(zipfile); - unzClose(zipfile); - } -} - -#endif //ifdef READER_CPP diff --git a/tools/bsnes/reader/zipreader.hpp b/tools/bsnes/reader/zipreader.hpp deleted file mode 100755 index 94639ab..0000000 --- a/tools/bsnes/reader/zipreader.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "zlib/unzip.h" - -#define ZIP_MAX_FILE_NAME PATH_MAX - -class ZipReader : public Reader { -public: - unsigned size(); - uint8_t* read(unsigned length = 0); - bool ready(); - - ZipReader(const char *fn); - ~ZipReader(); - -private: - unzFile zipfile; - unsigned filesize; - bool zipready; - char cname[PATH_MAX]; -}; diff --git a/tools/bsnes/reader/zlib/adler32.c b/tools/bsnes/reader/zlib/adler32.c deleted file mode 100755 index 58cdf06..0000000 --- a/tools/bsnes/reader/zlib/adler32.c +++ /dev/null @@ -1,149 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: adler32.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -#define BASE 65521UL /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware */ -#ifdef NO_DIVIDE -# define MOD(a) \ - do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD4(a) \ - do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD4(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 > BASE) sum1 -= BASE; - if (sum1 > BASE) sum1 -= BASE; - if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 > BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} diff --git a/tools/bsnes/reader/zlib/compress.c b/tools/bsnes/reader/zlib/compress.c deleted file mode 100755 index 1b7f07a..0000000 --- a/tools/bsnes/reader/zlib/compress.c +++ /dev/null @@ -1,79 +0,0 @@ -/* compress.c -- compress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: compress.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ -int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - stream.opaque = (voidpf)0; - - err = deflateInit(&stream, level); - if (err != Z_OK) return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -/* =========================================================================== - */ -int ZEXPORT compress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ - return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); -} - -/* =========================================================================== - If the default memLevel or windowBits for deflateInit() is changed, then - this function needs to be updated. - */ -uLong ZEXPORT compressBound (sourceLen) - uLong sourceLen; -{ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; -} diff --git a/tools/bsnes/reader/zlib/crc32.c b/tools/bsnes/reader/zlib/crc32.c deleted file mode 100755 index fe16f0c..0000000 --- a/tools/bsnes/reader/zlib/crc32.c +++ /dev/null @@ -1,423 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id: crc32.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - -/* Definitions for doing the crc four data bytes at a time. */ -#ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - unsigned long c; - int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const unsigned long FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const unsigned long FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = (u4)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register u4 c; - register const u4 FAR *buf4; - - c = REV((u4)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(REV(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case */ - if (len2 == 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320L; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} diff --git a/tools/bsnes/reader/zlib/crc32.h b/tools/bsnes/reader/zlib/crc32.h deleted file mode 100755 index 8053b61..0000000 --- a/tools/bsnes/reader/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const unsigned long FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/tools/bsnes/reader/zlib/crypt.h b/tools/bsnes/reader/zlib/crypt.h deleted file mode 100755 index 622f4bc..0000000 --- a/tools/bsnes/reader/zlib/crypt.h +++ /dev/null @@ -1,132 +0,0 @@ -/* crypt.h -- base code for crypt/uncrypt ZIPfile - - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This code is a modified version of crypting code in Infozip distribution - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - - If you don't need crypting in your application, just define symbols - NOCRYPT and NOUNCRYPT. - - This code support the "Traditional PKWARE Encryption". - - The new AES encryption added on Zip format by Winzip (see the page - http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong - Encryption is not supported. -*/ - -#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) - -/*********************************************************************** - * Return the next byte in the pseudo-random sequence - */ -static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) -{ - unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an - * unpredictable manner on 16-bit systems; not a problem - * with any known compiler so far, though */ - - temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; - return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); -} - -/*********************************************************************** - * Update the encryption keys with the next byte of plain text - */ -static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) -{ - (*(pkeys+0)) = CRC32((*(pkeys+0)), c); - (*(pkeys+1)) += (*(pkeys+0)) & 0xff; - (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; - { - register int keyshift = (int)((*(pkeys+1)) >> 24); - (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); - } - return c; -} - - -/*********************************************************************** - * Initialize the encryption keys and the random header according to - * the given password. - */ -static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) -{ - *(pkeys+0) = 305419896L; - *(pkeys+1) = 591751049L; - *(pkeys+2) = 878082192L; - while (*passwd != '\0') { - update_keys(pkeys,pcrc_32_tab,(int)*passwd); - passwd++; - } -} - -#define zdecode(pkeys,pcrc_32_tab,c) \ - (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) - -#define zencode(pkeys,pcrc_32_tab,c,t) \ - (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) - -#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED - -#define RAND_HEAD_LEN 12 - /* "last resort" source for second part of crypt seed pattern */ -# ifndef ZCR_SEED2 -# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ -# endif - -static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) - const char *passwd; /* password string */ - unsigned char *buf; /* where to write header */ - int bufSize; - unsigned long* pkeys; - const unsigned long* pcrc_32_tab; - unsigned long crcForCrypting; -{ - int n; /* index in random header */ - int t; /* temporary */ - int c; /* random byte */ - unsigned char header[RAND_HEAD_LEN-2]; /* random header */ - static unsigned calls = 0; /* ensure different random header each time */ - - if (bufSize> 7) & 0xff; - header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); - } - /* Encrypt random header (last two bytes is high word of crc) */ - init_keys(passwd, pkeys, pcrc_32_tab); - for (n = 0; n < RAND_HEAD_LEN-2; n++) - { - buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); - } - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); - return n; -} - -#endif diff --git a/tools/bsnes/reader/zlib/deflate.c b/tools/bsnes/reader/zlib/deflate.c deleted file mode 100755 index d08ce26..0000000 --- a/tools/bsnes/reader/zlib/deflate.c +++ /dev/null @@ -1,1736 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id: deflate.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifndef FASTEST -#ifdef ASMV - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif -#endif -local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ - deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) - return Z_STREAM_ERROR; - - s = strm->state; - if (s->wrap) - strm->adler = adler32(strm->adler, dictionary, dictLength); - - if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); - dictionary += dictLength - length; /* use the tail of the dictionary */ - } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); - } - if (hash_head) hash_head = 0; /* to make compiler happy */ - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - lm_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) - z_streamp strm; - gz_headerp head; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) - z_streamp strm; - int bits; - int value; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if (func != configuration_table[level].func && strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; - s->nice_match = nice_length; - s->max_chain_length = max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds - * for every combination of windowBits and memLevel, as well as wrap. - * But even the conservative upper bound of about 14% expansion does not - * seem onerous for output buffer allocation. - */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ - deflate_state *s; - uLong destLen; - - /* conservative upper bound */ - destLen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; - - /* if can't get parameters, return conservative bound */ - if (strm == Z_NULL || strm->state == Z_NULL) - return destLen; - - /* if not default parameters, return conservative bound */ - s = strm->state; - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return destLen; - - /* default settings: return tight bound for that case */ - return compressBound(sourceLen); -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending(strm) - z_streamp strm; -{ - unsigned len = strm->state->pending; - - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, strm->state->pending_out, len); - strm->next_out += len; - strm->state->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && flush <= old_flush && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = (*(configuration_table[s->level].func))(s, flush); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } - else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy(dest, source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); - } -#endif - zmemcpy(buf, strm->next_in, len); - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ -#endif /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for level == 1 or strategy == Z_RLE only - */ -local uInt longest_match_fast(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - register unsigned n, m; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - /* %%% avoid this when Z_RLE */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) return; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, eof) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (eof)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, eof) { \ - FLUSH_BLOCK_ONLY(s, eof); \ - if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head = NIL; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ -#ifdef FASTEST - if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || - (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { - s->match_length = longest_match_fast (s, hash_head); - } -#else - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } -#endif - /* longest_match() or longest_match_fast() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head = NIL; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } - /* longest_match() or longest_match_fast() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - s->match_available = 0; - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif /* FASTEST */ - -#if 0 -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt run; /* length of run */ - uInt max; /* maximum length of run */ - uInt prev; /* byte at distance one to match */ - Bytef *scan; /* scan for end of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. - */ - if (s->lookahead < MAX_MATCH) { - fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - run = 0; - if (s->strstart > 0) { /* if there is a previous byte, that is */ - max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; - scan = s->window + s->strstart - 1; - prev = *scan++; - do { - if (*scan++ != prev) - break; - } while (++run < max); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (run >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, run); - _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); - s->lookahead -= run; - s->strstart += run; - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif diff --git a/tools/bsnes/reader/zlib/deflate.h b/tools/bsnes/reader/zlib/deflate.h deleted file mode 100755 index be7b168..0000000 --- a/tools/bsnes/reader/zlib/deflate.h +++ /dev/null @@ -1,331 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2004 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id: deflate.h,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - - /* in trees.c */ -void _tr_init OF((deflate_state *s)); -int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); -void _tr_align OF((deflate_state *s)); -void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch _length_code[]; - extern uch _dist_code[]; -#else - extern const uch _length_code[]; - extern const uch _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ diff --git a/tools/bsnes/reader/zlib/gzio.c b/tools/bsnes/reader/zlib/gzio.c deleted file mode 100755 index 6538d6c..0000000 --- a/tools/bsnes/reader/zlib/gzio.c +++ /dev/null @@ -1,1026 +0,0 @@ -/* gzio.c -- IO on .gz files - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. - */ - -/* @(#) $Id: gzio.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#include - -#include "zutil.h" - -#ifdef NO_DEFLATE /* for compatibility with old definition */ -# define NO_GZCOMPRESS -#endif - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -#ifndef Z_BUFSIZE -# ifdef MAXSEG_64K -# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ -# else -# define Z_BUFSIZE 16384 -# endif -#endif -#ifndef Z_PRINTF_BUFSIZE -# define Z_PRINTF_BUFSIZE 4096 -#endif - -#ifdef __MVS__ -# pragma map (fdopen , "\174\174FDOPEN") - FILE *fdopen(int, const char *); -#endif - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern void free OF((voidpf ptr)); -#endif - -#define ALLOC(size) malloc(size) -#define TRYFREE(p) {if (p) free(p);} - -static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ - -/* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ - -typedef struct gz_stream { - z_stream stream; - int z_err; /* error code for last stream operation */ - int z_eof; /* set if end of input file */ - FILE *file; /* .gz file */ - Byte *inbuf; /* input buffer */ - Byte *outbuf; /* output buffer */ - uLong crc; /* crc32 of uncompressed data */ - char *msg; /* error message */ - char *path; /* path name for debugging only */ - int transparent; /* 1 if input file is not a .gz file */ - char mode; /* 'w' or 'r' */ - z_off_t start; /* start of compressed data in file (header skipped) */ - z_off_t in; /* bytes into deflate or inflate */ - z_off_t out; /* bytes out of deflate or inflate */ - int back; /* one character push-back */ - int last; /* true if push-back is last character */ -} gz_stream; - - -local gzFile gz_open OF((const char *path, const char *mode, int fd)); -local int do_flush OF((gzFile file, int flush)); -local int get_byte OF((gz_stream *s)); -local void check_header OF((gz_stream *s)); -local int destroy OF((gz_stream *s)); -local void putLong OF((FILE *file, uLong x)); -local uLong getLong OF((gz_stream *s)); - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb"). The file is given either by file descriptor - or path name (if fd == -1). - gz_open returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). -*/ -local gzFile gz_open (path, mode, fd) - const char *path; - const char *mode; - int fd; -{ - int err; - int level = Z_DEFAULT_COMPRESSION; /* compression level */ - int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ - char *p = (char*)mode; - gz_stream *s; - char fmode[80]; /* copy of mode, without the compression level */ - char *m = fmode; - - if (!path || !mode) return Z_NULL; - - s = (gz_stream *)ALLOC(sizeof(gz_stream)); - if (!s) return Z_NULL; - - s->stream.zalloc = (alloc_func)0; - s->stream.zfree = (free_func)0; - s->stream.opaque = (voidpf)0; - s->stream.next_in = s->inbuf = Z_NULL; - s->stream.next_out = s->outbuf = Z_NULL; - s->stream.avail_in = s->stream.avail_out = 0; - s->file = NULL; - s->z_err = Z_OK; - s->z_eof = 0; - s->in = 0; - s->out = 0; - s->back = EOF; - s->crc = crc32(0L, Z_NULL, 0); - s->msg = NULL; - s->transparent = 0; - - s->path = (char*)ALLOC(strlen(path)+1); - if (s->path == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - strcpy(s->path, path); /* do this early for debugging */ - - s->mode = '\0'; - do { - if (*p == 'r') s->mode = 'r'; - if (*p == 'w' || *p == 'a') s->mode = 'w'; - if (*p >= '0' && *p <= '9') { - level = *p - '0'; - } else if (*p == 'f') { - strategy = Z_FILTERED; - } else if (*p == 'h') { - strategy = Z_HUFFMAN_ONLY; - } else if (*p == 'R') { - strategy = Z_RLE; - } else { - *m++ = *p; /* copy the mode */ - } - } while (*p++ && m != fmode + sizeof(fmode)); - if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateInit2(&(s->stream), level, - Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); - /* windowBits is passed < 0 to suppress zlib header */ - - s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); -#endif - if (err != Z_OK || s->outbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } else { - s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); - - err = inflateInit2(&(s->stream), -MAX_WBITS); - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are - * present after the compressed stream. - */ - if (err != Z_OK || s->inbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } - s->stream.avail_out = Z_BUFSIZE; - - errno = 0; - s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); - - if (s->file == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - if (s->mode == 'w') { - /* Write a very simple .gz header: - */ - fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], - Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); - s->start = 10L; - /* We use 10L instead of ftell(s->file) to because ftell causes an - * fflush on some systems. This version of the library doesn't use - * start anyway in write mode, so this initialization is not - * necessary. - */ - } else { - check_header(s); /* skip the .gz header */ - s->start = ftell(s->file) - s->stream.avail_in; - } - - return (gzFile)s; -} - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. -*/ -gzFile ZEXPORT gzopen (path, mode) - const char *path; - const char *mode; -{ - return gz_open (path, mode, -1); -} - -/* =========================================================================== - Associate a gzFile with the file descriptor fd. fd is not dup'ed here - to mimic the behavio(u)r of fdopen. -*/ -gzFile ZEXPORT gzdopen (fd, mode) - int fd; - const char *mode; -{ - char name[46]; /* allow for up to 128-bit integers */ - - if (fd < 0) return (gzFile)Z_NULL; - sprintf(name, "", fd); /* for debugging */ - - return gz_open (name, mode, fd); -} - -/* =========================================================================== - * Update the compression level and strategy - */ -int ZEXPORT gzsetparams (file, level, strategy) - gzFile file; - int level; - int strategy; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - /* Make room to allow flushing */ - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - } - s->stream.avail_out = Z_BUFSIZE; - } - - return deflateParams (&(s->stream), level, strategy); -} - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ -local int get_byte(s) - gz_stream *s; -{ - if (s->z_eof) return EOF; - if (s->stream.avail_in == 0) { - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) s->z_err = Z_ERRNO; - return EOF; - } - s->stream.next_in = s->inbuf; - } - s->stream.avail_in--; - return *(s->stream.next_in)++; -} - -/* =========================================================================== - Check the gzip header of a gz_stream opened for reading. Set the stream - mode to transparent if the gzip magic header is not present; set s->err - to Z_DATA_ERROR if the magic header is present but the rest of the header - is incorrect. - IN assertion: the stream s has already been created sucessfully; - s->stream.avail_in is zero for the first time, but may be non-zero - for concatenated .gz files. -*/ -local void check_header(s) - gz_stream *s; -{ - int method; /* method byte */ - int flags; /* flags byte */ - uInt len; - int c; - - /* Assure two bytes in the buffer so we can peek ahead -- handle case - where first byte of header is at the end of the buffer after the last - gzip segment */ - len = s->stream.avail_in; - if (len < 2) { - if (len) s->inbuf[0] = s->stream.next_in[0]; - errno = 0; - len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); - if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; - s->stream.avail_in += len; - s->stream.next_in = s->inbuf; - if (s->stream.avail_in < 2) { - s->transparent = s->stream.avail_in; - return; - } - } - - /* Peek ahead to check the gzip magic header */ - if (s->stream.next_in[0] != gz_magic[0] || - s->stream.next_in[1] != gz_magic[1]) { - s->transparent = 1; - return; - } - s->stream.avail_in -= 2; - s->stream.next_in += 2; - - /* Check the rest of the gzip header */ - method = get_byte(s); - flags = get_byte(s); - if (method != Z_DEFLATED || (flags & RESERVED) != 0) { - s->z_err = Z_DATA_ERROR; - return; - } - - /* Discard time, xflags and OS code: */ - for (len = 0; len < 6; len++) (void)get_byte(s); - - if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ - len = (uInt)get_byte(s); - len += ((uInt)get_byte(s))<<8; - /* len is garbage if EOF but the loop below will quit anyway */ - while (len-- != 0 && get_byte(s) != EOF) ; - } - if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ - for (len = 0; len < 2; len++) (void)get_byte(s); - } - s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; -} - - /* =========================================================================== - * Cleanup then free the given gz_stream. Return a zlib error code. - Try freeing in the reverse order of allocations. - */ -local int destroy (s) - gz_stream *s; -{ - int err = Z_OK; - - if (!s) return Z_STREAM_ERROR; - - TRYFREE(s->msg); - - if (s->stream.state != NULL) { - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateEnd(&(s->stream)); -#endif - } else if (s->mode == 'r') { - err = inflateEnd(&(s->stream)); - } - } - if (s->file != NULL && fclose(s->file)) { -#ifdef ESPIPE - if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ -#endif - err = Z_ERRNO; - } - if (s->z_err < 0) err = s->z_err; - - TRYFREE(s->inbuf); - TRYFREE(s->outbuf); - TRYFREE(s->path); - TRYFREE(s); - return err; -} - -/* =========================================================================== - Reads the given number of uncompressed bytes from the compressed file. - gzread returns the number of bytes actually read (0 for end of file). -*/ -int ZEXPORT gzread (file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - Bytef *start = (Bytef*)buf; /* starting point for crc computation */ - Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ - - if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; - - if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; - if (s->z_err == Z_STREAM_END) return 0; /* EOF */ - - next_out = (Byte*)buf; - s->stream.next_out = (Bytef*)buf; - s->stream.avail_out = len; - - if (s->stream.avail_out && s->back != EOF) { - *next_out++ = s->back; - s->stream.next_out++; - s->stream.avail_out--; - s->back = EOF; - s->out++; - start++; - if (s->last) { - s->z_err = Z_STREAM_END; - return 1; - } - } - - while (s->stream.avail_out != 0) { - - if (s->transparent) { - /* Copy first the lookahead bytes: */ - uInt n = s->stream.avail_in; - if (n > s->stream.avail_out) n = s->stream.avail_out; - if (n > 0) { - zmemcpy(s->stream.next_out, s->stream.next_in, n); - next_out += n; - s->stream.next_out = next_out; - s->stream.next_in += n; - s->stream.avail_out -= n; - s->stream.avail_in -= n; - } - if (s->stream.avail_out > 0) { - s->stream.avail_out -= - (uInt)fread(next_out, 1, s->stream.avail_out, s->file); - } - len -= s->stream.avail_out; - s->in += len; - s->out += len; - if (len == 0) s->z_eof = 1; - return (int)len; - } - if (s->stream.avail_in == 0 && !s->z_eof) { - - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) { - s->z_err = Z_ERRNO; - break; - } - } - s->stream.next_in = s->inbuf; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = inflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - - if (s->z_err == Z_STREAM_END) { - /* Check CRC and original size */ - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - start = s->stream.next_out; - - if (getLong(s) != s->crc) { - s->z_err = Z_DATA_ERROR; - } else { - (void)getLong(s); - /* The uncompressed length returned by above getlong() may be - * different from s->out in case of concatenated .gz files. - * Check for such files: - */ - check_header(s); - if (s->z_err == Z_OK) { - inflateReset(&(s->stream)); - s->crc = crc32(0L, Z_NULL, 0); - } - } - } - if (s->z_err != Z_OK || s->z_eof) break; - } - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - - if (len == s->stream.avail_out && - (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) - return -1; - return (int)(len - s->stream.avail_out); -} - - -/* =========================================================================== - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ -int ZEXPORT gzgetc(file) - gzFile file; -{ - unsigned char c; - - return gzread(file, &c, 1) == 1 ? c : -1; -} - - -/* =========================================================================== - Push one byte back onto the stream. -*/ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; - s->back = c; - s->out--; - s->last = (s->z_err == Z_STREAM_END); - if (s->last) s->z_err = Z_OK; - s->z_eof = 0; - return c; -} - - -/* =========================================================================== - Reads bytes from the compressed file until len-1 characters are - read, or a newline character is read and transferred to buf, or an - end-of-file condition is encountered. The string is then terminated - with a null character. - gzgets returns buf, or Z_NULL in case of error. - - The current implementation is not optimized at all. -*/ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ - char *b = buf; - if (buf == Z_NULL || len <= 0) return Z_NULL; - - while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; - *buf = '\0'; - return b == buf && len > 0 ? Z_NULL : b; -} - - -#ifndef NO_GZCOMPRESS -/* =========================================================================== - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of bytes actually written (0 in case of error). -*/ -int ZEXPORT gzwrite (file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.next_in = (Bytef*)buf; - s->stream.avail_in = len; - - while (s->stream.avail_in != 0) { - - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - break; - } - s->stream.avail_out = Z_BUFSIZE; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - if (s->z_err != Z_OK) break; - } - s->crc = crc32(s->crc, (const Bytef *)buf, len); - - return (int)(len - s->stream.avail_in); -} - - -/* =========================================================================== - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). -*/ -#ifdef STDC -#include - -int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) -{ - char buf[Z_PRINTF_BUFSIZE]; - va_list va; - int len; - - buf[sizeof(buf) - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(buf, format, va); - va_end(va); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = vsprintf(buf, format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(buf, sizeof(buf), format, va); - va_end(va); - len = strlen(buf); -# else - len = vsnprintf(buf, sizeof(buf), format, va); - va_end(va); -# endif -#endif - if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, (unsigned)len); -} -#else /* not ANSI C */ - -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ - char buf[Z_PRINTF_BUFSIZE]; - int len; - - buf[sizeof(buf) - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(buf); -# else - len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#endif - if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, len); -} -#endif - -/* =========================================================================== - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ - unsigned char cc = (unsigned char) c; /* required for big endian systems */ - - return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; -} - - -/* =========================================================================== - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ -int ZEXPORT gzputs(file, s) - gzFile file; - const char *s; -{ - return gzwrite(file, (char*)s, (unsigned)strlen(s)); -} - - -/* =========================================================================== - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. -*/ -local int do_flush (file, flush) - gzFile file; - int flush; -{ - uInt len; - int done = 0; - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.avail_in = 0; /* should be zero already anyway */ - - for (;;) { - len = Z_BUFSIZE - s->stream.avail_out; - - if (len != 0) { - if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { - s->z_err = Z_ERRNO; - return Z_ERRNO; - } - s->stream.next_out = s->outbuf; - s->stream.avail_out = Z_BUFSIZE; - } - if (done) break; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), flush); - s->out -= s->stream.avail_out; - - /* Ignore the second of two consecutive flushes: */ - if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; - - /* deflate has finished flushing only when it hasn't used up - * all the available space in the output buffer: - */ - done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); - - if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; - } - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} - -int ZEXPORT gzflush (file, flush) - gzFile file; - int flush; -{ - gz_stream *s = (gz_stream*)file; - int err = do_flush (file, flush); - - if (err) return err; - fflush(s->file); - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} -#endif /* NO_GZCOMPRESS */ - -/* =========================================================================== - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error. - SEEK_END is not implemented, returns error. - In this version of the library, gzseek can be extremely slow. -*/ -z_off_t ZEXPORT gzseek (file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || whence == SEEK_END || - s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { - return -1L; - } - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return -1L; -#else - if (whence == SEEK_SET) { - offset -= s->in; - } - if (offset < 0) return -1L; - - /* At this point, offset is the number of zero bytes to write. */ - if (s->inbuf == Z_NULL) { - s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ - if (s->inbuf == Z_NULL) return -1L; - zmemzero(s->inbuf, Z_BUFSIZE); - } - while (offset > 0) { - uInt size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (uInt)offset; - - size = gzwrite(file, s->inbuf, size); - if (size == 0) return -1L; - - offset -= size; - } - return s->in; -#endif - } - /* Rest of function is for reading only */ - - /* compute absolute position */ - if (whence == SEEK_CUR) { - offset += s->out; - } - if (offset < 0) return -1L; - - if (s->transparent) { - /* map to fseek */ - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; - - s->in = s->out = offset; - return offset; - } - - /* For a negative seek, rewind and use positive seek */ - if (offset >= s->out) { - offset -= s->out; - } else if (gzrewind(file) < 0) { - return -1L; - } - /* offset is now the number of bytes to skip. */ - - if (offset != 0 && s->outbuf == Z_NULL) { - s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); - if (s->outbuf == Z_NULL) return -1L; - } - if (offset && s->back != EOF) { - s->back = EOF; - s->out++; - offset--; - if (s->last) s->z_err = Z_STREAM_END; - } - while (offset > 0) { - int size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (int)offset; - - size = gzread(file, s->outbuf, (uInt)size); - if (size <= 0) return -1L; - offset -= size; - } - return s->out; -} - -/* =========================================================================== - Rewinds input file. -*/ -int ZEXPORT gzrewind (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return -1; - - s->z_err = Z_OK; - s->z_eof = 0; - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - s->crc = crc32(0L, Z_NULL, 0); - if (!s->transparent) (void)inflateReset(&s->stream); - s->in = 0; - s->out = 0; - return fseek(s->file, s->start, SEEK_SET); -} - -/* =========================================================================== - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. -*/ -z_off_t ZEXPORT gztell (file) - gzFile file; -{ - return gzseek(file, 0L, SEEK_CUR); -} - -/* =========================================================================== - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ -int ZEXPORT gzeof (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - /* With concatenated compressed files that can have embedded - * crc trailers, z_eof is no longer the only/best indicator of EOF - * on a gz_stream. Handle end-of-stream error explicitly here. - */ - if (s == NULL || s->mode != 'r') return 0; - if (s->z_eof) return 1; - return s->z_err == Z_STREAM_END; -} - -/* =========================================================================== - Returns 1 if reading and doing so transparently, otherwise zero. -*/ -int ZEXPORT gzdirect (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return 0; - return s->transparent; -} - -/* =========================================================================== - Outputs a long in LSB order to the given file -*/ -local void putLong (file, x) - FILE *file; - uLong x; -{ - int n; - for (n = 0; n < 4; n++) { - fputc((int)(x & 0xff), file); - x >>= 8; - } -} - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets z_err in case - of error. -*/ -local uLong getLong (s) - gz_stream *s; -{ - uLong x = (uLong)get_byte(s); - int c; - - x += ((uLong)get_byte(s))<<8; - x += ((uLong)get_byte(s))<<16; - c = get_byte(s); - if (c == EOF) s->z_err = Z_DATA_ERROR; - x += ((uLong)c)<<24; - return x; -} - -/* =========================================================================== - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. -*/ -int ZEXPORT gzclose (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return Z_STREAM_ERROR; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return Z_STREAM_ERROR; -#else - if (do_flush (file, Z_FINISH) != Z_OK) - return destroy((gz_stream*)file); - - putLong (s->file, s->crc); - putLong (s->file, (uLong)(s->in & 0xffffffff)); -#endif - } - return destroy((gz_stream*)file); -} - -#ifdef STDC -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -/* =========================================================================== - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ -const char * ZEXPORT gzerror (file, errnum) - gzFile file; - int *errnum; -{ - char *m; - gz_stream *s = (gz_stream*)file; - - if (s == NULL) { - *errnum = Z_STREAM_ERROR; - return (const char*)ERR_MSG(Z_STREAM_ERROR); - } - *errnum = s->z_err; - if (*errnum == Z_OK) return (const char*)""; - - m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); - - if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); - - TRYFREE(s->msg); - s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); - if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); - strcpy(s->msg, s->path); - strcat(s->msg, ": "); - strcat(s->msg, m); - return (const char*)s->msg; -} - -/* =========================================================================== - Clear the error and end-of-file flags, and do the same for the real file. -*/ -void ZEXPORT gzclearerr (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return; - if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; - s->z_eof = 0; - clearerr(s->file); -} diff --git a/tools/bsnes/reader/zlib/inffast.c b/tools/bsnes/reader/zlib/inffast.c deleted file mode 100755 index 8868d6e..0000000 --- a/tools/bsnes/reader/zlib/inffast.c +++ /dev/null @@ -1,724 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef __FALSE__ - -void inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - struct inffast_ar { - void *esp; /* esp save */ - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ - unsigned wsize; /* window size or zero if not using window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned status; /* this is set when state changes */ - } ar; - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - ar.in = strm->next_in; - ar.last = ar.in + (strm->avail_in - 5); - ar.out = strm->next_out; - ar.beg = ar.out - (start - strm->avail_out); - ar.end = ar.out + (strm->avail_out - 257); - ar.wsize = state->wsize; - ar.write = state->write; - ar.window = state->window; - ar.hold = state->hold; - ar.bits = state->bits; - ar.lcode = state->lencode; - ar.dcode = state->distcode; - ar.lmask = (1U << state->lenbits) - 1; - ar.dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - - /* align in on 2 byte boundary */ - if (((unsigned long)(void *)ar.in & 0x1) != 0) { - ar.hold += (unsigned long)*ar.in++ << ar.bits; - ar.bits += 8; - } - - __asm__ __volatile__ ( -" leal %0, %%eax\n" -" pushf\n" -" pushl %%ebp\n" -" movl %%esp, (%%eax)\n" -" movl %%eax, %%esp\n" -" movl 4(%%esp), %%esi\n" /* esi = in */ -" movl 12(%%esp), %%edi\n" /* edi = out */ -" movl 36(%%esp), %%edx\n" /* edx = hold */ -" movl 40(%%esp), %%ebx\n" /* ebx = bits */ -" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ - -" cld\n" -" jmp .L_do_loop\n" - -".L_while_test:\n" -" cmpl %%edi, 20(%%esp)\n" -" jbe .L_break_loop\n" -" cmpl %%esi, 8(%%esp)\n" -" jbe .L_break_loop\n" - -".L_do_loop:\n" -" cmpb $15, %%bl\n" -" ja .L_get_length_code\n" /* if (15 < bits) */ - -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ - -".L_get_length_code:\n" -" movl 52(%%esp), %%eax\n" /* eax = lmask */ -" andl %%edx, %%eax\n" /* eax &= hold */ -" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ - -".L_dolen:\n" -" movb %%ah, %%cl\n" /* cl = this.bits */ -" subb %%ah, %%bl\n" /* bits -= this.bits */ -" shrl %%cl, %%edx\n" /* hold >>= this.bits */ - -" testb %%al, %%al\n" -" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ - -" shrl $16, %%eax\n" /* output this.val char */ -" stosb\n" -" jmp .L_while_test\n" - -".L_test_for_length_base:\n" -" movl %%eax, %%ecx\n" /* len = this */ -" shrl $16, %%ecx\n" /* len = this.val */ -" movl %%ecx, 60(%%esp)\n" /* len = this */ -" movb %%al, %%cl\n" - -" testb $16, %%al\n" -" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ -" andb $15, %%cl\n" /* op &= 15 */ -" jz .L_decode_distance\n" /* if (!op) */ -" cmpb %%cl, %%bl\n" -" jae .L_add_bits_to_len\n" /* if (op <= bits) */ - -" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ -" movb %%ch, %%cl\n" /* move op back to ecx */ - -".L_add_bits_to_len:\n" -" movl $1, %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" subb %%cl, %%bl\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" shrl %%cl, %%edx\n" -" addl %%eax, 60(%%esp)\n" /* len += hold & mask[op] */ - -".L_decode_distance:\n" -" cmpb $15, %%bl\n" -" ja .L_get_distance_code\n" /* if (15 < bits) */ - -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ - -".L_get_distance_code:\n" -" movl 56(%%esp), %%eax\n" /* eax = dmask */ -" movl 48(%%esp), %%ecx\n" /* ecx = dcode */ -" andl %%edx, %%eax\n" /* eax &= hold */ -" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ - -".L_dodist:\n" -" movl %%eax, %%ebp\n" /* dist = this */ -" shrl $16, %%ebp\n" /* dist = this.val */ -" movb %%ah, %%cl\n" -" subb %%ah, %%bl\n" /* bits -= this.bits */ -" shrl %%cl, %%edx\n" /* hold >>= this.bits */ -" movb %%al, %%cl\n" /* cl = this.op */ - -" testb $16, %%al\n" /* if ((op & 16) == 0) */ -" jz .L_test_for_second_level_dist\n" -" andb $15, %%cl\n" /* op &= 15 */ -" jz .L_check_dist_one\n" -" cmpb %%cl, %%bl\n" -" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ - -" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ -" xorl %%eax, %%eax\n" -" lodsw\n" /* al = *(ushort *)in++ */ -" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ -" addb $16, %%bl\n" /* bits += 16 */ -" shll %%cl, %%eax\n" -" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ -" movb %%ch, %%cl\n" /* move op back to ecx */ - -".L_add_bits_to_dist:\n" -" movl $1, %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" /* (1 << op) - 1 */ -" subb %%cl, %%bl\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" shrl %%cl, %%edx\n" -" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ - -".L_check_window:\n" -" movl %%esi, 4(%%esp)\n" /* save in so from can use it's reg */ -" movl %%edi, %%eax\n" -" subl 16(%%esp), %%eax\n" /* nbytes = out - beg */ - -" cmpl %%ebp, %%eax\n" -" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ - -" movl 60(%%esp), %%ecx\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ - -" subl $3, %%ecx\n" /* copy from to out */ -" movb (%%esi), %%al\n" -" movb %%al, (%%edi)\n" -" movb 1(%%esi), %%al\n" -" movb 2(%%esi), %%ah\n" -" addl $3, %%esi\n" -" movb %%al, 1(%%edi)\n" -" movb %%ah, 2(%%edi)\n" -" addl $3, %%edi\n" -" rep movsb\n" - -" movl 4(%%esp), %%esi\n" /* move in back to %esi, toss from */ -" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ -" jmp .L_while_test\n" - -".L_check_dist_one:\n" -" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ -" jne .L_check_window\n" -" cmpl %%edi, 16(%%esp)\n" -" je .L_check_window\n" - -" decl %%edi\n" -" movl 60(%%esp), %%ecx\n" -" movb (%%edi), %%al\n" -" subl $3, %%ecx\n" - -" movb %%al, 1(%%edi)\n" /* memset out with from[-1] */ -" movb %%al, 2(%%edi)\n" -" movb %%al, 3(%%edi)\n" -" addl $4, %%edi\n" -" rep stosb\n" -" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ -" jmp .L_while_test\n" - -".L_test_for_second_level_length:\n" -" testb $64, %%al\n" -" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ - -" movl $1, %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" addl 60(%%esp), %%eax\n" /* eax += this.val */ -" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ -" jmp .L_dolen\n" - -".L_test_for_second_level_dist:\n" -" testb $64, %%al\n" -" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ - -" movl $1, %%eax\n" -" shll %%cl, %%eax\n" -" decl %%eax\n" -" andl %%edx, %%eax\n" /* eax &= hold */ -" addl %%ebp, %%eax\n" /* eax += this.val */ -" movl 48(%%esp), %%ecx\n" /* ecx = dcode */ -" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ -" jmp .L_dodist\n" - -".L_clip_window:\n" -" movl %%eax, %%ecx\n" -" movl 24(%%esp), %%eax\n" /* prepare for dist compare */ -" negl %%ecx\n" /* nbytes = -nbytes */ -" movl 32(%%esp), %%esi\n" /* from = window */ - -" cmpl %%ebp, %%eax\n" -" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ - -" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ -" cmpl $0, 28(%%esp)\n" -" jne .L_wrap_around_window\n" /* if (write != 0) */ - -" subl %%ecx, %%eax\n" -" addl %%eax, %%esi\n" /* from += wsize - nbytes */ - -" movl 60(%%esp), %%eax\n" -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy1\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ -" jmp .L_do_copy1\n" - -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy1\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ -" jmp .L_do_copy1\n" - -".L_wrap_around_window:\n" -" movl 28(%%esp), %%eax\n" -" cmpl %%eax, %%ecx\n" -" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ - -" addl 24(%%esp), %%esi\n" -" addl %%eax, %%esi\n" -" subl %%ecx, %%esi\n" /* from += wsize + write - nbytes */ -" subl %%eax, %%ecx\n" /* nbytes -= write */ - -" movl 60(%%esp), %%eax\n" -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy1\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl 32(%%esp), %%esi\n" /* from = window */ -" movl 28(%%esp), %%ecx\n" /* nbytes = write */ -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy1\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ -" jmp .L_do_copy1\n" - -".L_contiguous_in_window:\n" -" addl %%eax, %%esi\n" -" subl %%ecx, %%esi\n" /* from += write - nbytes */ - -" movl 60(%%esp), %%eax\n" -" cmpl %%ecx, %%eax\n" -" jbe .L_do_copy1\n" /* if (nbytes >= len) */ - -" subl %%ecx, %%eax\n" /* len -= nbytes */ -" rep movsb\n" -" movl %%edi, %%esi\n" -" subl %%ebp, %%esi\n" /* from = out - dist */ - -".L_do_copy1:\n" -" movl %%eax, %%ecx\n" -" rep movsb\n" - -" movl 4(%%esp), %%esi\n" /* move in back to %esi, toss from */ -" movl 44(%%esp), %%ebp\n" /* ebp = lcode */ -" jmp .L_while_test\n" - -".L_test_for_end_of_block:\n" -" testb $32, %%al\n" -" jz .L_invalid_literal_length_code\n" -" movl $1, 68(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_literal_length_code:\n" -" movl $2, 68(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_distance_code:\n" -" movl $3, 68(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_invalid_distance_too_far:\n" -" movl 4(%%esp), %%esi\n" -" movl $4, 68(%%esp)\n" -" jmp .L_break_loop_with_status\n" - -".L_break_loop:\n" -" movl $0, 68(%%esp)\n" - -".L_break_loop_with_status:\n" -/* put in, out, bits, and hold back into ar and pop esp */ -" movl %%esi, 4(%%esp)\n" -" movl %%edi, 12(%%esp)\n" -" movl %%ebx, 40(%%esp)\n" -" movl %%edx, 36(%%esp)\n" -" movl (%%esp), %%esp\n" -" popl %%ebp\n" -" popf\n" - : - : "m" (ar) - : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" - ); - - - if (ar.status > 1) { - if (ar.status == 2) - strm->msg = "invalid literal/length code"; - else if (ar.status == 3) - strm->msg = "invalid distance code"; - else - strm->msg = "invalid distance too far back"; - state->mode = BAD; - } - else if ( ar.status == 1 ) { - state->mode = TYPE; - } - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - ar.len = ar.bits >> 3; - ar.in -= ar.len; - ar.bits -= ar.len << 3; - ar.hold &= (1U << ar.bits) - 1; - - /* update state and return */ - strm->next_in = ar.in; - strm->next_out = ar.out; - strm->avail_in = (unsigned)(ar.in < ar.last ? 5 + (ar.last - ar.in) : - 5 - (ar.in - ar.last)); - strm->avail_out = (unsigned)(ar.out < ar.end ? 257 + (ar.end - ar.out) : - 257 - (ar.out - ar.end)); - state->hold = ar.hold; - state->bits = ar.bits; - return; -} - -#else - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code this; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - write = state->write; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - this = lcode[hold & lmask]; - dolen: - op = (unsigned)(this.bits); - hold >>= op; - bits -= op; - op = (unsigned)(this.op); - if (op == 0) { /* literal */ - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - PUP(out) = (unsigned char)(this.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(this.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - this = dcode[hold & dmask]; - dodist: - op = (unsigned)(this.bits); - hold >>= op; - bits -= op; - op = (unsigned)(this.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(this.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - from = window - OFF; - if (write == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += write - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - this = dcode[this.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - this = lcode[this.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !i386 */ diff --git a/tools/bsnes/reader/zlib/inffast.h b/tools/bsnes/reader/zlib/inffast.h deleted file mode 100755 index 1e88d2d..0000000 --- a/tools/bsnes/reader/zlib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/tools/bsnes/reader/zlib/inffixed.h b/tools/bsnes/reader/zlib/inffixed.h deleted file mode 100755 index 75ed4b5..0000000 --- a/tools/bsnes/reader/zlib/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/tools/bsnes/reader/zlib/inflate.c b/tools/bsnes/reader/zlib/inflate.c deleted file mode 100755 index 792fdee..0000000 --- a/tools/bsnes/reader/zlib/inflate.c +++ /dev/null @@ -1,1368 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->wsize = 0; - state->whave = 0; - state->write = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; -} - -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { - ZFREE(strm, state); - strm->state = Z_NULL; - return Z_STREAM_ERROR; - } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow(strm, out) -z_streamp strm; -unsigned out; -{ - struct inflate_state FAR *state; - unsigned copy, dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->write = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; - if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->write; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; - state->whave = state->wsize; - } - else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; - } - else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* build code tables */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - break; - } - for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if (this.op && (this.op & 0xf0) == 0) { - last = this; - for (;;) { - this = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(this.bits); - state->length = (unsigned)this.val; - if ((int)(this.op) == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - state->mode = LIT; - break; - } - if (this.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - if (this.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(this.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->mode = DIST; - case DIST: - for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; - PULLBYTE(); - } - if ((this.op & 0xf0) == 0) { - last = this; - for (;;) { - this = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(this.bits); - if (this.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)this.val; - state->extra = (unsigned)(this.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->write - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - REVERSE(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - struct inflate_state FAR *state; - unsigned long id; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary id */ - if (state->mode == DICT) { - id = adler32(0L, Z_NULL, 0); - id = adler32(id, dictionary, dictLength); - if (id != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -unsigned char FAR *buf; -unsigned len; -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} diff --git a/tools/bsnes/reader/zlib/inflate.h b/tools/bsnes/reader/zlib/inflate.h deleted file mode 100755 index 07bd3e7..0000000 --- a/tools/bsnes/reader/zlib/inflate.h +++ /dev/null @@ -1,115 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ - LENGTH, /* i: waiting for 32-bit length (gzip) */ - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to the BAD or MEM mode -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 7K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ -}; diff --git a/tools/bsnes/reader/zlib/inftrees.c b/tools/bsnes/reader/zlib/inftrees.c deleted file mode 100755 index 8a9c13f..0000000 --- a/tools/bsnes/reader/zlib/inftrees.c +++ /dev/null @@ -1,329 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code this; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 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}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 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, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)1; - this.val = (unsigned short)0; - *(*table)++ = this; /* make a table to force an error */ - *(*table)++ = this; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min <= MAXBITS; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - this.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - this.op = (unsigned char)0; - this.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - this.op = (unsigned char)(extra[work[sym]]); - this.val = base[work[sym]]; - } - else { - this.op = (unsigned char)(32 + 64); /* end of block */ - this.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = this; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)(len - drop); - this.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - this.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = this; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/tools/bsnes/reader/zlib/inftrees.h b/tools/bsnes/reader/zlib/inftrees.h deleted file mode 100755 index b1104c8..0000000 --- a/tools/bsnes/reader/zlib/inftrees.h +++ /dev/null @@ -1,55 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1444 code structures (852 for length/literals - and 592 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 2048 -#define MAXD 592 - -/* Type of code to build for inftable() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -extern int inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); diff --git a/tools/bsnes/reader/zlib/ioapi.c b/tools/bsnes/reader/zlib/ioapi.c deleted file mode 100755 index d2ddb60..0000000 --- a/tools/bsnes/reader/zlib/ioapi.c +++ /dev/null @@ -1,193 +0,0 @@ -/* ioapi.c -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#include -#include -#include - -#if defined(_WIN32) -#define WIN32_LEAN_AND_MEAN -//needed for MultiByteToWideChar() -#include -#endif - -#include "zlib.h" -#include "ioapi.h" - - - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -voidpf ZCALLBACK fopen_file_func OF(( - voidpf opaque, - const char* filename, - int mode)); - -uLong ZCALLBACK fread_file_func OF(( - voidpf opaque, - voidpf stream, - void* buf, - uLong size)); - -uLong ZCALLBACK fwrite_file_func OF(( - voidpf opaque, - voidpf stream, - const void* buf, - uLong size)); - -long ZCALLBACK ftell_file_func OF(( - voidpf opaque, - voidpf stream)); - -long ZCALLBACK fseek_file_func OF(( - voidpf opaque, - voidpf stream, - uLong offset, - int origin)); - -int ZCALLBACK fclose_file_func OF(( - voidpf opaque, - voidpf stream)); - -int ZCALLBACK ferror_file_func OF(( - voidpf opaque, - voidpf stream)); - - -voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) - voidpf opaque; - const char* filename; - int mode; -{ - FILE* file = NULL; - const char* mode_fopen = NULL; - if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) - mode_fopen = "rb"; - else - if (mode & ZLIB_FILEFUNC_MODE_EXISTING) - mode_fopen = "r+b"; - else - if (mode & ZLIB_FILEFUNC_MODE_CREATE) - mode_fopen = "wb"; - - if ((filename!=NULL) && (mode_fopen != NULL)) { - //[2008-10-17 byuu] wrap Win32 fopen() to support UTF-8 filenames - #if !defined(_WIN32) - file = fopen(filename, mode_fopen); - #else - wchar_t wfilename[_MAX_PATH + 1]; - wchar_t wmode_fopen[_MAX_PATH + 1]; - MultiByteToWideChar(CP_UTF8, 0, filename, -1, wfilename, _MAX_PATH); - MultiByteToWideChar(CP_UTF8, 0, mode_fopen, -1, wmode_fopen, _MAX_PATH); - file = _wfopen(wfilename, wmode_fopen); - #endif - } - return file; -} - - -uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - - -uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - const void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - -long ZCALLBACK ftell_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - long ret; - ret = ftell((FILE *)stream); - return ret; -} - -long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) - voidpf opaque; - voidpf stream; - uLong offset; - int origin; -{ - int fseek_origin=0; - long ret; - switch (origin) - { - case ZLIB_FILEFUNC_SEEK_CUR : - fseek_origin = SEEK_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END : - fseek_origin = SEEK_END; - break; - case ZLIB_FILEFUNC_SEEK_SET : - fseek_origin = SEEK_SET; - break; - default: return -1; - } - ret = 0; - fseek((FILE *)stream, offset, fseek_origin); - return ret; -} - -int ZCALLBACK fclose_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = fclose((FILE *)stream); - return ret; -} - -int ZCALLBACK ferror_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = ferror((FILE *)stream); - return ret; -} - -void fill_fopen_filefunc (pzlib_filefunc_def) - zlib_filefunc_def* pzlib_filefunc_def; -{ - pzlib_filefunc_def->zopen_file = fopen_file_func; - pzlib_filefunc_def->zread_file = fread_file_func; - pzlib_filefunc_def->zwrite_file = fwrite_file_func; - pzlib_filefunc_def->ztell_file = ftell_file_func; - pzlib_filefunc_def->zseek_file = fseek_file_func; - pzlib_filefunc_def->zclose_file = fclose_file_func; - pzlib_filefunc_def->zerror_file = ferror_file_func; - pzlib_filefunc_def->opaque = NULL; -} diff --git a/tools/bsnes/reader/zlib/ioapi.h b/tools/bsnes/reader/zlib/ioapi.h deleted file mode 100755 index 7d457ba..0000000 --- a/tools/bsnes/reader/zlib/ioapi.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ioapi.h -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#ifndef _ZLIBIOAPI_H -#define _ZLIBIOAPI_H - - -#define ZLIB_FILEFUNC_SEEK_CUR (1) -#define ZLIB_FILEFUNC_SEEK_END (2) -#define ZLIB_FILEFUNC_SEEK_SET (0) - -#define ZLIB_FILEFUNC_MODE_READ (1) -#define ZLIB_FILEFUNC_MODE_WRITE (2) -#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) - -#define ZLIB_FILEFUNC_MODE_EXISTING (4) -#define ZLIB_FILEFUNC_MODE_CREATE (8) - - -#ifndef ZCALLBACK - -#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) -#define ZCALLBACK CALLBACK -#else -#define ZCALLBACK -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); -typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); -typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); -typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); - -typedef struct zlib_filefunc_def_s -{ - open_file_func zopen_file; - read_file_func zread_file; - write_file_func zwrite_file; - tell_file_func ztell_file; - seek_file_func zseek_file; - close_file_func zclose_file; - testerror_file_func zerror_file; - voidpf opaque; -} zlib_filefunc_def; - - - -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); - -#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) -#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) -#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) -#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) -#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) -#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/tools/bsnes/reader/zlib/trees.c b/tools/bsnes/reader/zlib/trees.c deleted file mode 100755 index ecd62b5..0000000 --- a/tools/bsnes/reader/zlib/trees.c +++ /dev/null @@ -1,1219 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2005 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id: trees.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {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}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {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}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); -local void set_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (value << s->bi_valid); - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ - s->bi_buf |= (val << s->bi_valid);\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void _tr_init(s) - deflate_state *s; -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ -#ifdef DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree(s) - deflate_state *s; -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void _tr_stored_block(s, buf, stored_len, eof) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. - */ -void _tr_align(s) - deflate_state *s; -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -void _tr_flush_block(s, buf, stored_len, eof) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ -{ - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - int max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is binary or text */ - if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) - set_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, eof); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+eof, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { - send_bits(s, (DYN_TREES<<1)+eof, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (eof) { - bi_windup(s); -#ifdef DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*eof)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int _tr_tally (s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - ct_data *ltree; /* literal tree */ - ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; -} - -/* =========================================================================== - * Set the data type to BINARY or TEXT, using a crude approximation: - * set it to Z_TEXT if all symbols are either printable characters (33 to 255) - * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local void set_data_type(s) - deflate_state *s; -{ - int n; - - for (n = 0; n < 9; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - if (n == 9) - for (n = 14; n < 32; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/tools/bsnes/reader/zlib/trees.h b/tools/bsnes/reader/zlib/trees.h deleted file mode 100755 index 72facf9..0000000 --- a/tools/bsnes/reader/zlib/trees.h +++ /dev/null @@ -1,128 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; - diff --git a/tools/bsnes/reader/zlib/unzip.c b/tools/bsnes/reader/zlib/unzip.c deleted file mode 100755 index 1e05038..0000000 --- a/tools/bsnes/reader/zlib/unzip.c +++ /dev/null @@ -1,1605 +0,0 @@ -/* unzip.c -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - Read unzip.h for more info -*/ - -/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of -compatibility with older software. The following is from the original crypt.c. Code -woven in by Terry Thorsen 1/2003. -*/ -/* - Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - - See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. - If, for some reason, all these files are missing, the Info-ZIP license - also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html -*/ -/* - crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - */ - -/* - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - */ - - -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - - -#ifndef CASESENSITIVITYDEFAULT_NO -# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) -# define CASESENSITIVITYDEFAULT_NO -# endif -#endif - - -#ifndef UNZ_BUFSIZE -#define UNZ_BUFSIZE (16384) -#endif - -#ifndef UNZ_MAXFILENAMEINZIP -#define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - - - - -const char unz_copyright[] = - " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info_internal_s -{ - uLong offset_curfile;/* relative offset of local header 4 bytes */ -} unz_file_info_internal; - - -/* file_in_zip_read_info_s contain internal information about a file in zipfile, - when reading and decompress it */ -typedef struct -{ - char *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - - uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ - uLong stream_initialised; /* flag set if stream structure is initialised*/ - - uLong offset_local_extrafield;/* offset of the local extra field */ - uInt size_local_extrafield;/* size of the local extra field */ - uLong pos_local_extrafield; /* position in the local extra field in read*/ - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - uLong rest_read_compressed; /* number of byte to be decompressed */ - uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - int raw; -} file_in_zip_read_info_s; - - -/* unz_s contain internal information about the zipfile -*/ -typedef struct -{ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - unz_global_info gi; /* public global information */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - uLong num_file; /* number of the current file in the zipfile*/ - uLong pos_in_central_dir; /* pos of the current file in the central dir*/ - uLong current_file_ok; /* flag about the usability of the current file*/ - uLong central_pos; /* position of the beginning of the central dir*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info cur_file_info; /* public info about the current file in zip*/ - unz_file_info_internal cur_file_info_internal; /* private info about it*/ - file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current - file if we are decompressing it */ - int encrypted; -# ifndef NOUNCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; -# endif -} unz_s; - - -#ifndef NOUNCRYPT -#include "crypt.h" -#endif - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ - - -local int unzlocal_getByte OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; -{ - unsigned char c; - int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) - { - *pi = (int)c; - return UNZ_OK; - } - else - { - if (ZERROR(*pzlib_filefunc_def,filestream)) - return UNZ_ERRNO; - else - return UNZ_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unzlocal_getShort OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i = 0; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unzlocal_getLong OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i = 0; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - - -/* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (fileName1,fileName2) - const char* fileName1; - const char* fileName2; -{ - for (;;) - { - char c1=*(fileName1++); - char c2=*(fileName2++); - if ((c1>='a') && (c1<='z')) - c1 -= 0x20; - if ((c2>='a') && (c2<='z')) - c2 -= 0x20; - if (c1=='\0') - return ((c2=='\0') ? 0 : -1); - if (c2=='\0') - return 1; - if (c1c2) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; -{ - if (iCaseSensitivity==0) - iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; - - if (iCaseSensitivity==1) - return strcmp(fileName1,fileName2); - - return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} - -#ifndef BUFREADCOMMENT -#define BUFREADCOMMENT (0x400) -#endif - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong unzlocal_SearchCentralDir OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream)); - -local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; - - - uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) - break; - - if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer - "zlib/zlib114.zip". - If the zipfile cannot be opened (file doesn't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ -extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) - const char *path; - zlib_filefunc_def* pzlib_filefunc_def; -{ - unz_s us; - unz_s *s; - uLong central_pos,uL; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - - int err=UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - if (pzlib_filefunc_def==NULL) - fill_fopen_filefunc(&us.z_filefunc); - else - us.z_filefunc = *pzlib_filefunc_def; - - us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, - path, - ZLIB_FILEFUNC_MODE_READ | - ZLIB_FILEFUNC_MODE_EXISTING); - if (us.filestream==NULL) - return NULL; - - central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); - if (central_pos==0) - err=UNZ_ERRNO; - - if (ZSEEK(us.z_filefunc, us.filestream, - central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - /* the signature, already checked */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of the disk with the start of the central directory */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((number_entry_CD!=us.gi.number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=UNZ_BADZIPFILE; - - /* size of the central directory */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* zipfile comment length */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((central_pospfile_in_zip_read!=NULL) - unzCloseCurrentFile(file); - - ZCLOSE(s->z_filefunc, s->filestream); - TRYFREE(s); - return UNZ_OK; -} - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; -{ - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - *pglobal_info=s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; -{ - uLong uDate; - uDate = (uLong)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; - - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; -} - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info *pfile_info, - unz_file_info_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err=UNZ_OK; - uLong uMagic; - long lSeek=0; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (ZSEEK(s->z_filefunc, s->filestream, - s->pos_in_central_dir+s->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - - /* we check the magic */ - if (err==UNZ_OK) - { - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x02014b50) - err=UNZ_BADZIPFILE; - } - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) - err=UNZ_ERRNO; - - unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - - lSeek+=file_info.size_filename; - if ((err==UNZ_OK) && (szFileName!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_filename0) && (fileNameBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek -= uSizeRead; - } - - - if ((err==UNZ_OK) && (extraField!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - } - if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek += file_info.size_file_extra - uSizeRead; - } - else - lSeek+=file_info.size_file_extra; - - - if ((err==UNZ_OK) && (szComment!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - } - if ((file_info.size_file_comment>0) && (commentBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek+=file_info.size_file_comment - uSizeRead; - } - else - lSeek+=file_info.size_file_comment; - - if ((err==UNZ_OK) && (pfile_info!=NULL)) - *pfile_info=file_info; - - if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) - *pfile_info_internal=file_info_internal; - - return err; -} - - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. -*/ -extern int ZEXPORT unzGetCurrentFileInfo (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; -{ - int err=UNZ_OK; - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - s->pos_in_central_dir=s->offset_central_dir; - s->num_file=0; - err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ - if (s->num_file+1==s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; -{ - unz_s* s; - int err; - - /* We remember the 'current' position in the file so that we can jump - * back there if we fail. - */ - unz_file_info cur_file_infoSaved; - unz_file_info_internal cur_file_info_internalSaved; - uLong num_fileSaved; - uLong pos_in_central_dirSaved; - - - if (file==NULL) - return UNZ_PARAMERROR; - - if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - /* Save the current state */ - num_fileSaved = s->num_file; - pos_in_central_dirSaved = s->pos_in_central_dir; - cur_file_infoSaved = s->cur_file_info; - cur_file_info_internalSaved = s->cur_file_info_internal; - - err = unzGoToFirstFile(file); - - while (err == UNZ_OK) - { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; - err = unzGetCurrentFileInfo(file,NULL, - szCurrentFileName,sizeof(szCurrentFileName)-1, - NULL,0,NULL,0); - if (err == UNZ_OK) - { - if (unzStringFileNameCompare(szCurrentFileName, - szFileName,iCaseSensitivity)==0) - return UNZ_OK; - err = unzGoToNextFile(file); - } - } - - /* We failed, so restore the state of the 'current file' to where we - * were. - */ - s->num_file = num_fileSaved ; - s->pos_in_central_dir = pos_in_central_dirSaved ; - s->cur_file_info = cur_file_infoSaved; - s->cur_file_info_internal = cur_file_info_internalSaved; - return err; -} - - -/* -/////////////////////////////////////////// -// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) -// I need random access -// -// Further optimization could be realized by adding an ability -// to cache the directory in memory. The goal being a single -// comprehensive file read to put the file I need in a memory. -*/ - -/* -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; // offset in file - uLong num_of_file; // # of file -} unz_file_pos; -*/ - -extern int ZEXPORT unzGetFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - file_pos->pos_in_zip_directory = s->pos_in_central_dir; - file_pos->num_of_file = s->num_file; - - return UNZ_OK; -} - -extern int ZEXPORT unzGoToFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - int err; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - /* jump to the right spot */ - s->pos_in_central_dir = file_pos->pos_in_zip_directory; - s->num_file = file_pos->num_of_file; - - /* set the current file */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - /* return results */ - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* -// Unzip Helper Functions - should be here? -/////////////////////////////////////////// -*/ - -/* - Read the local header of the current zipfile - Check the coherency of the local header and info in the end of central - directory about this file - store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) -*/ -local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; -{ - uLong uMagic,uData,uFlags; - uLong size_filename; - uLong size_extra_field; - int err=UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + - s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - - if (err==UNZ_OK) - { - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x04034b50) - err=UNZ_BADZIPFILE; - } - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; -/* - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) - err=UNZ_BADZIPFILE; -*/ - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) - err=UNZ_BADZIPFILE; - - if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) - err=UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) - err=UNZ_ERRNO; - *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + - SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) - unzFile file; - int* method; - int* level; - int raw; - const char* password; -{ - int err=UNZ_OK; - uInt iSizeVar; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uLong offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ -# ifndef NOUNCRYPT - char source[12]; -# else - if (password != NULL) - return UNZ_PARAMERROR; -# endif - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, - &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip_read_info_s*) - ALLOC(sizeof(file_in_zip_read_info_s)); - if (pfile_in_zip_read_info==NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield=0; - pfile_in_zip_read_info->raw=raw; - - if (pfile_in_zip_read_info->read_buffer==NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised=0; - - if (method!=NULL) - *method = (int)s->cur_file_info.compression_method; - - if (level!=NULL) - { - *level = 6; - switch (s->cur_file_info.flag & 0x06) - { - case 6 : *level = 1; break; - case 4 : *level = 2; break; - case 2 : *level = 9; break; - } - } - - if ((s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; - pfile_in_zip_read_info->crc32=0; - pfile_in_zip_read_info->compression_method = - s->cur_file_info.compression_method; - pfile_in_zip_read_info->filestream=s->filestream; - pfile_in_zip_read_info->z_filefunc=s->z_filefunc; - pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; - - pfile_in_zip_read_info->stream.total_out = 0; - - if ((s->cur_file_info.compression_method==Z_DEFLATED) && - (!raw)) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - pfile_in_zip_read_info->stream.next_in = (voidpf)0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=1; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - pfile_in_zip_read_info->rest_read_compressed = - s->cur_file_info.compressed_size ; - pfile_in_zip_read_info->rest_read_uncompressed = - s->cur_file_info.uncompressed_size ; - - - pfile_in_zip_read_info->pos_in_zipfile = - s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + - iSizeVar; - - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - s->pfile_in_zip_read = pfile_in_zip_read_info; - -# ifndef NOUNCRYPT - if (password != NULL) - { - int i; - s->pcrc_32_tab = get_crc_table(); - init_keys(password,s->keys,s->pcrc_32_tab); - if (ZSEEK(s->z_filefunc, s->filestream, - s->pfile_in_zip_read->pos_in_zipfile + - s->pfile_in_zip_read->byte_before_the_zipfile, - SEEK_SET)!=0) - return UNZ_INTERNALERROR; - if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) - return UNZ_INTERNALERROR; - - for (i = 0; i<12; i++) - zdecode(s->keys,s->pcrc_32_tab,source[i]); - - s->pfile_in_zip_read->pos_in_zipfile+=12; - s->encrypted=1; - } -# endif - - - return UNZ_OK; -} - -extern int ZEXPORT unzOpenCurrentFile (file) - unzFile file; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); -} - -extern int ZEXPORT unzOpenCurrentFilePassword (file, password) - unzFile file; - const char* password; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, password); -} - -extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) - unzFile file; - int* method; - int* level; - int raw; -{ - return unzOpenCurrentFile3(file, method, level, raw, NULL); -} - -/* - Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; -{ - int err=UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->read_buffer == NULL)) - return UNZ_END_OF_LIST_OF_FILE; - if (len==0) - return 0; - - pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - - if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && - (!(pfile_in_zip_read_info->raw))) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - - if ((len>pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in) && - (pfile_in_zip_read_info->raw)) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in; - - while (pfile_in_zip_read_info->stream.avail_out>0) - { - if ((pfile_in_zip_read_info->stream.avail_in==0) && - (pfile_in_zip_read_info->rest_read_compressed>0)) - { - uInt uReadThis = UNZ_BUFSIZE; - if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; - if (uReadThis == 0) - return UNZ_EOF; - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->pos_in_zipfile + - pfile_in_zip_read_info->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->read_buffer, - uReadThis)!=uReadThis) - return UNZ_ERRNO; - - -# ifndef NOUNCRYPT - if(s->encrypted) - { - uInt i; - for(i=0;iread_buffer[i] = - zdecode(s->keys,s->pcrc_32_tab, - pfile_in_zip_read_info->read_buffer[i]); - } -# endif - - - pfile_in_zip_read_info->pos_in_zipfile += uReadThis; - - pfile_in_zip_read_info->rest_read_compressed-=uReadThis; - - pfile_in_zip_read_info->stream.next_in = - (Bytef*)pfile_in_zip_read_info->read_buffer; - pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; - } - - if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) - { - uInt uDoCopy,i ; - - if ((pfile_in_zip_read_info->stream.avail_in == 0) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - return (iRead==0) ? UNZ_EOF : iRead; - - if (pfile_in_zip_read_info->stream.avail_out < - pfile_in_zip_read_info->stream.avail_in) - uDoCopy = pfile_in_zip_read_info->stream.avail_out ; - else - uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - - for (i=0;istream.next_out+i) = - *(pfile_in_zip_read_info->stream.next_in+i); - - pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy); - pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore,uTotalOutAfter; - const Bytef *bufBefore; - uLong uOutThis; - int flush=Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err=inflate(&pfile_in_zip_read_info->stream,flush); - - if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) - err = Z_DATA_ERROR; - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter-uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32(pfile_in_zip_read_info->crc32,bufBefore, - (uInt)(uOutThis)); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); - - if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; - if (err!=Z_OK) - break; - } - } - - if (err==Z_OK) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern z_off_t ZEXPORT unztell (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - return (z_off_t)pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int ZEXPORT unzeof (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - return 1; - else - return 0; -} - - - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - size_to_read = (pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield); - - if (buf==NULL) - return (int)size_to_read; - - if (len>size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now==0) - return 0; - - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->offset_local_extrafield + - pfile_in_zip_read_info->pos_local_extrafield, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - buf,read_now)!=read_now) - return UNZ_ERRNO; - - return (int)read_now; -} - -/* - Close the file in zip opened with unzipOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ -extern int ZEXPORT unzCloseCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && - (!pfile_in_zip_read_info->raw)) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err=UNZ_CRCERROR; - } - - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read=NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; -{ - unz_s* s; - uLong uReadThis ; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - uReadThis = uSizeBuf; - if (uReadThis>s->gi.size_comment) - uReadThis = s->gi.size_comment; - - if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (uReadThis>0) - { - *szComment='\0'; - if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) - return UNZ_ERRNO; - } - - if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) - *(szComment+s->gi.size_comment)='\0'; - return (int)uReadThis; -} - -/* Additions by RX '2004 */ -extern uLong ZEXPORT unzGetOffset (file) - unzFile file; -{ - unz_s* s; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return 0; - if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) - if (s->num_file==s->gi.number_entry) - return 0; - return s->pos_in_central_dir; -} - -extern int ZEXPORT unzSetOffset (file, pos) - unzFile file; - uLong pos; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - s->pos_in_central_dir = pos; - s->num_file = s->gi.number_entry; /* hack */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} diff --git a/tools/bsnes/reader/zlib/unzip.h b/tools/bsnes/reader/zlib/unzip.h deleted file mode 100755 index b247937..0000000 --- a/tools/bsnes/reader/zlib/unzip.h +++ /dev/null @@ -1,354 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - - Multi volume ZipFile (span) are not supported. - Encryption compatible with pkzip 2.04g only supported - Old compressions used by old PKZip 1.x are not supported - - - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ - -/* for more info about .ZIP format, see - http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip - http://www.info-zip.org/pub/infozip/doc/ - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip -*/ - -#ifndef _unz_H -#define _unz_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in - the central dir on this disk */ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; -} unz_file_info; - -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) -*/ - - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer - "zlib/zlib113.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ - -extern unzFile ZEXPORT unzOpen2 OF((const char *path, - zlib_filefunc_def* pzlib_filefunc_def)); -/* - Open a Zip file, like unzOpen, but provide a set of file low level API - for read/write the zip file (see ioapi.h) -*/ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ - - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ - - -/***************************************************************************/ -/* Unzip package allow you browse the directory of the zipfile */ - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ - -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ - - -/* ****************************************** */ -/* Ryan supplied functions */ -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; /* offset in zip file directory */ - uLong num_of_file; /* # of file */ -} unz_file_pos; - -extern int ZEXPORT unzGetFilePos( - unzFile file, - unz_file_pos* file_pos); - -extern int ZEXPORT unzGoToFilePos( - unzFile file, - unz_file_pos* file_pos); - -/* ****************************************** */ - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); -/* - Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about - the current file - if szFileName!=NULL, the filemane string will be copied in szFileName - (fileNameBufferSize is the size of the buffer) - if extraField!=NULL, the extra field information will be copied in extraField - (extraFieldBufferSize is the size of the buffer). - This is the Central-header version of the extra field - if szComment!=NULL, the comment string of the file will be copied in szComment - (commentBufferSize is the size of the buffer) -*/ - -/***************************************************************************/ -/* for reading the content of the current zipfile, you can open it, read data - from it, and close it (you can close it before reading all the file) - */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* - Open for reading data the current file in the zipfile. - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, - const char* password)); -/* - Open for reading data the current file in the zipfile. - password is a crypting password - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, - int* method, - int* level, - int raw)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, - int* method, - int* level, - int raw, - const char* password)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* - Close the file in zip opened with unzOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -/* - Give the current position in uncompressed data -*/ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* - return 1 if the end of file was reached, 0 elsewhere -*/ - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ - -/***************************************************************************/ - -/* Get the current file offset */ -extern uLong ZEXPORT unzGetOffset (unzFile file); - -/* Set the current file offset */ -extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); - - - -#ifdef __cplusplus -} -#endif - -#endif /* _unz_H */ diff --git a/tools/bsnes/reader/zlib/zconf.h b/tools/bsnes/reader/zlib/zconf.h deleted file mode 100755 index eb5a9ce..0000000 --- a/tools/bsnes/reader/zlib/zconf.h +++ /dev/null @@ -1,332 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zconf.h,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/tools/bsnes/reader/zlib/zip.c b/tools/bsnes/reader/zlib/zip.c deleted file mode 100755 index 2dc74df..0000000 --- a/tools/bsnes/reader/zlib/zip.c +++ /dev/null @@ -1,1220 +0,0 @@ -/* zip.c -- IO on .zip files using zlib - Version 1.01e, February 12th, 2005 - - 27 Dec 2004 Rolf Kalbermatter - Modification to zipOpen2 to support globalComment retrieval. - - Copyright (C) 1998-2005 Gilles Vollant - - Read zip.h for more info -*/ - - -#include -#include -#include -#include -#include "zlib.h" -#include "zip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -#ifndef VERSIONMADEBY -# define VERSIONMADEBY (0x0) /* platform depedent */ -#endif - -#ifndef Z_BUFSIZE -#define Z_BUFSIZE (16384) -#endif - -#ifndef Z_MAXFILENAMEINZIP -#define Z_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -/* -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) -*/ - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -#ifndef DEF_MEM_LEVEL -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -#endif -const char zip_copyright[] = - " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - - -#define SIZEDATA_INDATABLOCK (4096-(4*4)) - -#define LOCALHEADERMAGIC (0x04034b50) -#define CENTRALHEADERMAGIC (0x02014b50) -#define ENDHEADERMAGIC (0x06054b50) - -#define FLAG_LOCALHEADER_OFFSET (0x06) -#define CRC_LOCALHEADER_OFFSET (0x0e) - -#define SIZECENTRALHEADER (0x2e) /* 46 */ - -typedef struct linkedlist_datablock_internal_s -{ - struct linkedlist_datablock_internal_s* next_datablock; - uLong avail_in_this_block; - uLong filled_in_this_block; - uLong unused; /* for future use and alignement */ - unsigned char data[SIZEDATA_INDATABLOCK]; -} linkedlist_datablock_internal; - -typedef struct linkedlist_data_s -{ - linkedlist_datablock_internal* first_block; - linkedlist_datablock_internal* last_block; -} linkedlist_data; - - -typedef struct -{ - z_stream stream; /* zLib stream structure for inflate */ - int stream_initialised; /* 1 is stream is initialised */ - uInt pos_in_buffered_data; /* last written byte in buffered_data */ - - uLong pos_local_header; /* offset of the local header of the file - currenty writing */ - char* central_header; /* central header data for the current file */ - uLong size_centralheader; /* size of the central header for cur file */ - uLong flag; /* flag of the file currently writing */ - - int method; /* compression method of file currenty wr.*/ - int raw; /* 1 for directly writing raw data */ - Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ - uLong dosDate; - uLong crc32; - int encrypt; -#ifndef NOCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; - int crypt_header_size; -#endif -} curfile_info; - -typedef struct -{ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - linkedlist_data central_dir;/* datablock with central dir in construction*/ - int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ - curfile_info ci; /* info on the file curretly writing */ - - uLong begin_pos; /* position of the beginning of the zipfile */ - uLong add_position_when_writting_offset; - uLong number_entry; -#ifndef NO_ADDFILEINEXISTINGZIP - char *globalcomment; -#endif -} zip_internal; - - - -#ifndef NOCRYPT -#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED -#include "crypt.h" -#endif - -local linkedlist_datablock_internal* allocate_new_datablock() -{ - linkedlist_datablock_internal* ldi; - ldi = (linkedlist_datablock_internal*) - ALLOC(sizeof(linkedlist_datablock_internal)); - if (ldi!=NULL) - { - ldi->next_datablock = NULL ; - ldi->filled_in_this_block = 0 ; - ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; - } - return ldi; -} - -local void free_datablock(ldi) - linkedlist_datablock_internal* ldi; -{ - while (ldi!=NULL) - { - linkedlist_datablock_internal* ldinext = ldi->next_datablock; - TRYFREE(ldi); - ldi = ldinext; - } -} - -local void init_linkedlist(ll) - linkedlist_data* ll; -{ - ll->first_block = ll->last_block = NULL; -} - -/* -local void free_linkedlist(ll) - linkedlist_data* ll; -{ - free_datablock(ll->first_block); - ll->first_block = ll->last_block = NULL; -} -*/ - -local int add_data_in_datablock(ll,buf,len) - linkedlist_data* ll; - const void* buf; - uLong len; -{ - linkedlist_datablock_internal* ldi; - const unsigned char* from_copy; - - if (ll==NULL) - return ZIP_INTERNALERROR; - - if (ll->last_block == NULL) - { - ll->first_block = ll->last_block = allocate_new_datablock(); - if (ll->first_block == NULL) - return ZIP_INTERNALERROR; - } - - ldi = ll->last_block; - from_copy = (unsigned char*)buf; - - while (len>0) - { - uInt copy_this; - uInt i; - unsigned char* to_copy; - - if (ldi->avail_in_this_block==0) - { - ldi->next_datablock = allocate_new_datablock(); - if (ldi->next_datablock == NULL) - return ZIP_INTERNALERROR; - ldi = ldi->next_datablock ; - ll->last_block = ldi; - } - - if (ldi->avail_in_this_block < len) - copy_this = (uInt)ldi->avail_in_this_block; - else - copy_this = (uInt)len; - - to_copy = &(ldi->data[ldi->filled_in_this_block]); - - for (i=0;ifilled_in_this_block += copy_this; - ldi->avail_in_this_block -= copy_this; - from_copy += copy_this ; - len -= copy_this; - } - return ZIP_OK; -} - - - -/****************************************************************************/ - -#ifndef NO_ADDFILEINEXISTINGZIP -/* =========================================================================== - Inputs a long in LSB order to the given file - nbByte == 1, 2 or 4 (byte, short or long) -*/ - -local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, uLong x, int nbByte)); -local int ziplocal_putValue (pzlib_filefunc_def, filestream, x, nbByte) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong x; - int nbByte; -{ - unsigned char buf[4]; - int n; - for (n = 0; n < nbByte; n++) - { - buf[n] = (unsigned char)(x & 0xff); - x >>= 8; - } - if (x != 0) - { /* data overflow - hack for ZIP64 (X Roche) */ - for (n = 0; n < nbByte; n++) - { - buf[n] = 0xff; - } - } - - if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) - return ZIP_ERRNO; - else - return ZIP_OK; -} - -local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); -local void ziplocal_putValue_inmemory (dest, x, nbByte) - void* dest; - uLong x; - int nbByte; -{ - unsigned char* buf=(unsigned char*)dest; - int n; - for (n = 0; n < nbByte; n++) { - buf[n] = (unsigned char)(x & 0xff); - x >>= 8; - } - - if (x != 0) - { /* data overflow - hack for ZIP64 */ - for (n = 0; n < nbByte; n++) - { - buf[n] = 0xff; - } - } -} - -/****************************************************************************/ - - -local uLong ziplocal_TmzDateToDosDate(ptm,dosDate) - const tm_zip* ptm; - uLong dosDate; -{ - uLong year = (uLong)ptm->tm_year; - if (year>1980) - year-=1980; - else if (year>80) - year-=80; - return - (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | - ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); -} - - -/****************************************************************************/ - -local int ziplocal_getByte OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int ziplocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; -{ - unsigned char c; - int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) - { - *pi = (int)c; - return ZIP_OK; - } - else - { - if (ZERROR(*pzlib_filefunc_def,filestream)) - return ZIP_ERRNO; - else - return ZIP_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int ziplocal_getShort OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int ziplocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x; - int i = 0; - int err; - - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==ZIP_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int ziplocal_getLong OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int ziplocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x = 0; - int i = 0; - int err; - - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<16; - - if (err==ZIP_OK) - err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==ZIP_OK) - *pX = x; - else - *pX = 0; - return err; -} - -#ifndef BUFREADCOMMENT -#define BUFREADCOMMENT (0x400) -#endif -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong ziplocal_SearchCentralDir OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream)); - -local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; - - - uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) - break; - - if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} -#endif /* !NO_ADDFILEINEXISTINGZIP*/ - -/************************************************************/ -extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def) - const char *pathname; - int append; - zipcharpc* globalcomment; - zlib_filefunc_def* pzlib_filefunc_def; -{ - zip_internal ziinit; - zip_internal* zi; - int err=ZIP_OK; - - - if (pzlib_filefunc_def==NULL) - fill_fopen_filefunc(&ziinit.z_filefunc); - else - ziinit.z_filefunc = *pzlib_filefunc_def; - - ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) - (ziinit.z_filefunc.opaque, - pathname, - (append == APPEND_STATUS_CREATE) ? - (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : - (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); - - if (ziinit.filestream == NULL) - return NULL; - ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); - ziinit.in_opened_file_inzip = 0; - ziinit.ci.stream_initialised = 0; - ziinit.number_entry = 0; - ziinit.add_position_when_writting_offset = 0; - init_linkedlist(&(ziinit.central_dir)); - - - zi = (zip_internal*)ALLOC(sizeof(zip_internal)); - if (zi==NULL) - { - ZCLOSE(ziinit.z_filefunc,ziinit.filestream); - return NULL; - } - - /* now we add file in a zipfile */ -# ifndef NO_ADDFILEINEXISTINGZIP - ziinit.globalcomment = NULL; - if (append == APPEND_STATUS_ADDINZIP) - { - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory */ - uLong central_pos,uL; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry; - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - uLong size_comment; - - central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); - if (central_pos==0) - err=ZIP_ERRNO; - - if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, - central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=ZIP_ERRNO; - - /* the signature, already checked */ - if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) - err=ZIP_ERRNO; - - /* number of this disk */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) - err=ZIP_ERRNO; - - /* number of the disk with the start of the central directory */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) - err=ZIP_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) - err=ZIP_ERRNO; - - /* total number of entries in the central dir */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) - err=ZIP_ERRNO; - - if ((number_entry_CD!=number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=ZIP_BADZIPFILE; - - /* size of the central directory */ - if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) - err=ZIP_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) - err=ZIP_ERRNO; - - /* zipfile global comment length */ - if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) - err=ZIP_ERRNO; - - if ((central_pos0) - { - ziinit.globalcomment = ALLOC(size_comment+1); - if (ziinit.globalcomment) - { - size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); - ziinit.globalcomment[size_comment]=0; - } - } - - byte_before_the_zipfile = central_pos - - (offset_central_dir+size_central_dir); - ziinit.add_position_when_writting_offset = byte_before_the_zipfile; - - { - uLong size_central_dir_to_read = size_central_dir; - size_t buf_size = SIZEDATA_INDATABLOCK; - void* buf_read = (void*)ALLOC(buf_size); - if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, - offset_central_dir + byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET) != 0) - err=ZIP_ERRNO; - - while ((size_central_dir_to_read>0) && (err==ZIP_OK)) - { - uLong read_this = SIZEDATA_INDATABLOCK; - if (read_this > size_central_dir_to_read) - read_this = size_central_dir_to_read; - if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) - err=ZIP_ERRNO; - - if (err==ZIP_OK) - err = add_data_in_datablock(&ziinit.central_dir,buf_read, - (uLong)read_this); - size_central_dir_to_read-=read_this; - } - TRYFREE(buf_read); - } - ziinit.begin_pos = byte_before_the_zipfile; - ziinit.number_entry = number_entry_CD; - - if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, - offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=ZIP_ERRNO; - } - - if (globalcomment) - { - *globalcomment = ziinit.globalcomment; - } -# endif /* !NO_ADDFILEINEXISTINGZIP*/ - - if (err != ZIP_OK) - { -# ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(ziinit.globalcomment); -# endif /* !NO_ADDFILEINEXISTINGZIP*/ - TRYFREE(zi); - return NULL; - } - else - { - *zi = ziinit; - return (zipFile)zi; - } -} - -extern zipFile ZEXPORT zipOpen (pathname, append) - const char *pathname; - int append; -{ - return zipOpen2(pathname,append,NULL,NULL); -} - -extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; - int raw; - int windowBits; - int memLevel; - int strategy; - const char* password; - uLong crcForCrypting; -{ - zip_internal* zi; - uInt size_filename; - uInt size_comment; - uInt i; - int err = ZIP_OK; - -# ifdef NOCRYPT - if (password != NULL) - return ZIP_PARAMERROR; -# endif - - if (file == NULL) - return ZIP_PARAMERROR; - if ((method!=0) && (method!=Z_DEFLATED)) - return ZIP_PARAMERROR; - - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 1) - { - err = zipCloseFileInZip (file); - if (err != ZIP_OK) - return err; - } - - - if (filename==NULL) - filename="-"; - - if (comment==NULL) - size_comment = 0; - else - size_comment = (uInt)strlen(comment); - - size_filename = (uInt)strlen(filename); - - if (zipfi == NULL) - zi->ci.dosDate = 0; - else - { - if (zipfi->dosDate != 0) - zi->ci.dosDate = zipfi->dosDate; - else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); - } - - zi->ci.flag = 0; - if ((level==8) || (level==9)) - zi->ci.flag |= 2; - if ((level==2)) - zi->ci.flag |= 4; - if ((level==1)) - zi->ci.flag |= 6; - if (password != NULL) - zi->ci.flag |= 1; - - zi->ci.crc32 = 0; - zi->ci.method = method; - zi->ci.encrypt = 0; - zi->ci.stream_initialised = 0; - zi->ci.pos_in_buffered_data = 0; - zi->ci.raw = raw; - zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; - zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + - size_extrafield_global + size_comment; - zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); - - ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); - /* version info */ - ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); - ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); - ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); - ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); - ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); - ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ - ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ - ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ - ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); - ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); - ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); - ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ - - if (zipfi==NULL) - ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); - else - ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); - - if (zipfi==NULL) - ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); - else - ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); - - ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); - - for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); - - for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = - *(((const char*)extrafield_global)+i); - - for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ - size_extrafield_global+i) = *(comment+i); - if (zi->ci.central_header == NULL) - return ZIP_INTERNALERROR; - - /* write the local header */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); - - if ((err==ZIP_OK) && (size_filename>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) - err = ZIP_ERRNO; - - if ((err==ZIP_OK) && (size_extrafield_local>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) - !=size_extrafield_local) - err = ZIP_ERRNO; - - zi->ci.stream.avail_in = (uInt)0; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - zi->ci.stream.total_in = 0; - zi->ci.stream.total_out = 0; - - if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - { - zi->ci.stream.zalloc = (alloc_func)0; - zi->ci.stream.zfree = (free_func)0; - zi->ci.stream.opaque = (voidpf)0; - - if (windowBits>0) - windowBits = -windowBits; - - err = deflateInit2(&zi->ci.stream, level, - Z_DEFLATED, windowBits, memLevel, strategy); - - if (err==Z_OK) - zi->ci.stream_initialised = 1; - } -# ifndef NOCRYPT - zi->ci.crypt_header_size = 0; - if ((err==Z_OK) && (password != NULL)) - { - unsigned char bufHead[RAND_HEAD_LEN]; - unsigned int sizeHead; - zi->ci.encrypt = 1; - zi->ci.pcrc_32_tab = get_crc_table(); - /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ - - sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); - zi->ci.crypt_header_size = sizeHead; - - if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) - err = ZIP_ERRNO; - } -# endif - - if (err==Z_OK) - zi->in_opened_file_inzip = 1; - return err; -} - -extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; - int raw; -{ - return zipOpenNewFileInZip3 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0); -} - -extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level) - zipFile file; - const char* filename; - const zip_fileinfo* zipfi; - const void* extrafield_local; - uInt size_extrafield_local; - const void* extrafield_global; - uInt size_extrafield_global; - const char* comment; - int method; - int level; -{ - return zipOpenNewFileInZip2 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0); -} - -local int zipFlushWriteBuffer(zi) - zip_internal* zi; -{ - int err=ZIP_OK; - - if (zi->ci.encrypt != 0) - { -#ifndef NOCRYPT - uInt i; - int t; - for (i=0;ici.pos_in_buffered_data;i++) - zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, - zi->ci.buffered_data[i],t); -#endif - } - if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) - !=zi->ci.pos_in_buffered_data) - err = ZIP_ERRNO; - zi->ci.pos_in_buffered_data = 0; - return err; -} - -extern int ZEXPORT zipWriteInFileInZip (file, buf, len) - zipFile file; - const void* buf; - unsigned len; -{ - zip_internal* zi; - int err=ZIP_OK; - - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 0) - return ZIP_PARAMERROR; - - zi->ci.stream.next_in = (void*)buf; - zi->ci.stream.avail_in = len; - zi->ci.crc32 = crc32(zi->ci.crc32,buf,len); - - while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) - { - if (zi->ci.stream.avail_out == 0) - { - if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - - - if(err != ZIP_OK) - break; - - if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - { - uLong uTotalOutBefore = zi->ci.stream.total_out; - err=deflate(&zi->ci.stream, Z_NO_FLUSH); - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; - - } - else - { - uInt copy_this,i; - if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) - copy_this = zi->ci.stream.avail_in; - else - copy_this = zi->ci.stream.avail_out; - for (i=0;ici.stream.next_out)+i) = - *(((const char*)zi->ci.stream.next_in)+i); - { - zi->ci.stream.avail_in -= copy_this; - zi->ci.stream.avail_out-= copy_this; - zi->ci.stream.next_in+= copy_this; - zi->ci.stream.next_out+= copy_this; - zi->ci.stream.total_in+= copy_this; - zi->ci.stream.total_out+= copy_this; - zi->ci.pos_in_buffered_data += copy_this; - } - } - } - - return err; -} - -extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32) - zipFile file; - uLong uncompressed_size; - uLong crc32; -{ - zip_internal* zi; - uLong compressed_size; - int err=ZIP_OK; - - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 0) - return ZIP_PARAMERROR; - zi->ci.stream.avail_in = 0; - - if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - while (err==ZIP_OK) - { - uLong uTotalOutBefore; - if (zi->ci.stream.avail_out == 0) - { - if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) - err = ZIP_ERRNO; - zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; - zi->ci.stream.next_out = zi->ci.buffered_data; - } - uTotalOutBefore = zi->ci.stream.total_out; - err=deflate(&zi->ci.stream, Z_FINISH); - zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; - } - - if (err==Z_STREAM_END) - err=ZIP_OK; /* this is normal */ - - if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) - if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) - err = ZIP_ERRNO; - - if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) - { - err=deflateEnd(&zi->ci.stream); - zi->ci.stream_initialised = 0; - } - - if (!zi->ci.raw) - { - crc32 = (uLong)zi->ci.crc32; - uncompressed_size = (uLong)zi->ci.stream.total_in; - } - compressed_size = (uLong)zi->ci.stream.total_out; -# ifndef NOCRYPT - compressed_size += zi->ci.crypt_header_size; -# endif - - ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ - ziplocal_putValue_inmemory(zi->ci.central_header+20, - compressed_size,4); /*compr size*/ - if (zi->ci.stream.data_type == Z_ASCII) - ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); - ziplocal_putValue_inmemory(zi->ci.central_header+24, - uncompressed_size,4); /*uncompr size*/ - - if (err==ZIP_OK) - err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, - (uLong)zi->ci.size_centralheader); - free(zi->ci.central_header); - - if (err==ZIP_OK) - { - long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); - if (ZSEEK(zi->z_filefunc,zi->filestream, - zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) - err = ZIP_ERRNO; - - if (err==ZIP_OK) - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ - - if (err==ZIP_OK) /* compressed size, unknown */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); - - if (err==ZIP_OK) /* uncompressed size, unknown */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); - - if (ZSEEK(zi->z_filefunc,zi->filestream, - cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) - err = ZIP_ERRNO; - } - - zi->number_entry ++; - zi->in_opened_file_inzip = 0; - - return err; -} - -extern int ZEXPORT zipCloseFileInZip (file) - zipFile file; -{ - return zipCloseFileInZipRaw (file,0,0); -} - -extern int ZEXPORT zipClose (file, global_comment) - zipFile file; - const char* global_comment; -{ - zip_internal* zi; - int err = 0; - uLong size_centraldir = 0; - uLong centraldir_pos_inzip; - uInt size_global_comment; - if (file == NULL) - return ZIP_PARAMERROR; - zi = (zip_internal*)file; - - if (zi->in_opened_file_inzip == 1) - { - err = zipCloseFileInZip (file); - } - -#ifndef NO_ADDFILEINEXISTINGZIP - if (global_comment==NULL) - global_comment = zi->globalcomment; -#endif - if (global_comment==NULL) - size_global_comment = 0; - else - size_global_comment = (uInt)strlen(global_comment); - - centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); - if (err==ZIP_OK) - { - linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; - while (ldi!=NULL) - { - if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream, - ldi->data,ldi->filled_in_this_block) - !=ldi->filled_in_this_block ) - err = ZIP_ERRNO; - - size_centraldir += ldi->filled_in_this_block; - ldi = ldi->next_datablock; - } - } - free_datablock(zi->central_dir.first_block); - - if (err==ZIP_OK) /* Magic End */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); - - if (err==ZIP_OK) /* number of this disk */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); - - if (err==ZIP_OK) /* number of the disk with the start of the central directory */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); - - if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); - - if (err==ZIP_OK) /* total number of entries in the central dir */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); - - if (err==ZIP_OK) /* size of the central directory */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); - - if (err==ZIP_OK) /* offset of start of central directory with respect to the - starting disk number */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, - (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); - - if (err==ZIP_OK) /* zipfile comment length */ - err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); - - if ((err==ZIP_OK) && (size_global_comment>0)) - if (ZWRITE(zi->z_filefunc,zi->filestream, - global_comment,size_global_comment) != size_global_comment) - err = ZIP_ERRNO; - - if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) - if (err == ZIP_OK) - err = ZIP_ERRNO; - -#ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(zi->globalcomment); -#endif - TRYFREE(zi); - - return err; -} diff --git a/tools/bsnes/reader/zlib/zip.h b/tools/bsnes/reader/zlib/zip.h deleted file mode 100755 index acacce8..0000000 --- a/tools/bsnes/reader/zlib/zip.h +++ /dev/null @@ -1,235 +0,0 @@ -/* zip.h -- IO for compress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This unzip package allow creates .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - Multi volume ZipFile (span) are not supported. - Encryption compatible with pkzip 2.04g only supported - Old compressions used by old PKZip 1.x are not supported - - For uncompress .zip file, look at unzip.h - - - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.html for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ - -/* for more info about .ZIP format, see - http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip - http://www.info-zip.org/pub/infozip/doc/ - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip -*/ - -#ifndef _zip_H -#define _zip_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagzipFile__ { int unused; } zipFile__; -typedef zipFile__ *zipFile; -#else -typedef voidp zipFile; -#endif - -#define ZIP_OK (0) -#define ZIP_EOF (0) -#define ZIP_ERRNO (Z_ERRNO) -#define ZIP_PARAMERROR (-102) -#define ZIP_BADZIPFILE (-103) -#define ZIP_INTERNALERROR (-104) - -#ifndef DEF_MEM_LEVEL -# if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -# else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -# endif -#endif -/* default memLevel */ - -/* tm_zip contain date/time info */ -typedef struct tm_zip_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_zip; - -typedef struct -{ - tm_zip tmz_date; /* date in understandable format */ - uLong dosDate; /* if dos_date == 0, tmu_date is used */ -/* uLong flag; */ /* general purpose bit flag 2 bytes */ - - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ -} zip_fileinfo; - -typedef const char* zipcharpc; - - -#define APPEND_STATUS_CREATE (0) -#define APPEND_STATUS_CREATEAFTER (1) -#define APPEND_STATUS_ADDINZIP (2) - -extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); -/* - Create a zipfile. - pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on - an Unix computer "zlib/zlib113.zip". - if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip - will be created at the end of the file. - (useful if the file contain a self extractor code) - if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will - add files in existing zip (be sure you don't add file that doesn't exist) - If the zipfile cannot be opened, the return value is NULL. - Else, the return value is a zipFile Handle, usable with other function - of this zip package. -*/ - -/* Note : there is no delete function into a zipfile. - If you want delete file into a zipfile, you must open a zipfile, and create another - Of couse, you can use RAW reading and writing to copy the file you did not want delte -*/ - -extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, - int append, - zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc_def)); - -extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level)); -/* - Open a file in the ZIP for writing. - filename : the filename in zip (if NULL, '-' without quote will be used - *zipfi contain supplemental information - if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local - contains the extrafield data the the local header - if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global - contains the extrafield data the the local header - if comment != NULL, comment contain the comment string - method contain the compression method (0 for store, Z_DEFLATED for deflate) - level contain the level of compression (can be Z_DEFAULT_COMPRESSION) -*/ - - -extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw)); - -/* - Same than zipOpenNewFileInZip, except if raw=1, we write raw file - */ - -extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCtypting)); - -/* - Same than zipOpenNewFileInZip2, except - windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 - password : crypting password (NULL for no crypting) - crcForCtypting : crc of file to compress (needed for crypting) - */ - - -extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, - const void* buf, - unsigned len)); -/* - Write data in the zipfile -*/ - -extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); -/* - Close the current file in the zipfile -*/ - -extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, - uLong uncompressed_size, - uLong crc32)); -/* - Close the current file in the zipfile, for fiel opened with - parameter raw=1 in zipOpenNewFileInZip2 - uncompressed_size and crc32 are value for the uncompressed size -*/ - -extern int ZEXPORT zipClose OF((zipFile file, - const char* global_comment)); -/* - Close the zipfile -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* _zip_H */ diff --git a/tools/bsnes/reader/zlib/zlib.h b/tools/bsnes/reader/zlib/zlib.h deleted file mode 100755 index 0228179..0000000 --- a/tools/bsnes/reader/zlib/zlib.h +++ /dev/null @@ -1,1357 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 - - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns 1 if file is being read directly without decompression, otherwise - zero. -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); -/* - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - -/* - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/tools/bsnes/reader/zlib/zutil.c b/tools/bsnes/reader/zlib/zutil.c deleted file mode 100755 index 8b278e3..0000000 --- a/tools/bsnes/reader/zlib/zutil.c +++ /dev/null @@ -1,318 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zutil.c,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#include "zutil.h" - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() -{ - uLong flags; - - flags = 0; - switch (sizeof(uInt)) { - case 2: break; - case 4: flags += 1; break; - case 8: flags += 2; break; - default: flags += 3; - } - switch (sizeof(uLong)) { - case 2: break; - case 4: flags += 1 << 2; break; - case 8: flags += 2 << 2; break; - default: flags += 3 << 2; - } - switch (sizeof(voidpf)) { - case 2: break; - case 4: flags += 1 << 4; break; - case 8: flags += 2 << 4; break; - default: flags += 3 << 4; - } - switch (sizeof(z_off_t)) { - case 2: break; - case 4: flags += 1 << 6; break; - case 8: flags += 2 << 6; break; - default: flags += 3 << 6; - } -#ifdef DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#ifdef STDC -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -} - -#ifdef DEBUG - -# ifndef verbose -# define verbose 0 -# endif -int z_verbose = verbose; - -void z_error (m) - char *m; -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(err) - int err; -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ - int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/tools/bsnes/reader/zlib/zutil.h b/tools/bsnes/reader/zlib/zutil.h deleted file mode 100755 index c7ad800..0000000 --- a/tools/bsnes/reader/zlib/zutil.h +++ /dev/null @@ -1,269 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id: zutil.h,v 1.3 2005/07/27 18:15:11 nach Exp $ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#define ZLIB_INTERNAL -#include "zlib.h" - -#ifdef STDC -# ifndef _WIN32_WCE -# include -# endif -# include -# include -#endif -#ifdef NO_ERRNO_H -# ifdef _WIN32_WCE - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. We rename it to - * avoid conflict with other libraries that use the same workaround. - */ -# define errno z_errno -# endif - extern int errno; -#else -# ifndef _WIN32_WCE -# include -# endif -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -# ifdef M_I86 - #include -# endif -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include - extern int z_verbose; - extern void z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - - -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -#endif /* ZUTIL_H */ diff --git a/tools/bsnes/smp/dsmp.cpp b/tools/bsnes/smp/dsmp.cpp deleted file mode 100755 index 1cc6c00..0000000 --- a/tools/bsnes/smp/dsmp.cpp +++ /dev/null @@ -1,312 +0,0 @@ -#ifdef SMP_CPP - -//virtual function, see src/cpu/dcpu.cpp -//for explanation of this function -bool SMP::in_opcode() { return false; } - -uint16 SMP::__relb(int8 offset, int op_len) { - uint16 pc = regs.pc + op_len; - return pc + offset; -} - -void SMP::disassemble_opcode(char *output) { - char *s, t[512]; - uint8 op, op0, op1; - uint16 opw, opdp0, opdp1; - s = output; - - if(in_opcode() == true) { - strcpy(s, "..???? "); - return; - } - - sprintf(s, "..%.4x ", regs.pc); - - op = ram_read(regs.pc); - op0 = ram_read(regs.pc + 1); - op1 = ram_read(regs.pc + 2); - opw = (op0) | (op1 << 8); - opdp0 = ((regs.p.p)?0x100:0x000) + op0; - opdp1 = ((regs.p.p)?0x100:0x000) + op1; - - strcpy(t, " "); - - switch(op) { - case 0x00: sprintf(t, "nop"); break; - case 0x01: sprintf(t, "tcall 0"); break; - case 0x02: sprintf(t, "set0 $%.3x", opdp0); break; - case 0x03: sprintf(t, "bbs0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x04: sprintf(t, "or a,$%.3x", opdp0); break; - case 0x05: sprintf(t, "or a,$%.4x", opw); break; - case 0x06: sprintf(t, "or a,(x)"); break; - case 0x07: sprintf(t, "or a,($%.3x+x)", opdp0); break; - case 0x08: sprintf(t, "or a,#$%.2x", op0); break; - case 0x09: sprintf(t, "or $%.3x,$%.3x", opdp1, opdp0); break; - case 0x0a: sprintf(t, "or1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; - case 0x0b: sprintf(t, "asl $%.3x", opdp0); break; - case 0x0c: sprintf(t, "asl $%.4x", opw); break; - case 0x0d: sprintf(t, "push p"); break; - case 0x0e: sprintf(t, "tset $%.4x,a", opw); break; - case 0x0f: sprintf(t, "brk"); break; - case 0x10: sprintf(t, "bpl $%.4x", __relb(op0, 2)); break; - case 0x11: sprintf(t, "tcall 1"); break; - case 0x12: sprintf(t, "clr0 $%.3x", opdp0); break; - case 0x13: sprintf(t, "bbc0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x14: sprintf(t, "or a,$%.3x+x", opdp0); break; - case 0x15: sprintf(t, "or a,$%.4x+x", opw); break; - case 0x16: sprintf(t, "or a,$%.4x+y", opw); break; - case 0x17: sprintf(t, "or a,($%.3x)+y", opdp0); break; - case 0x18: sprintf(t, "or $%.3x,#$%.2x", opdp1, op0); break; - case 0x19: sprintf(t, "or (x),(y)"); break; - case 0x1a: sprintf(t, "decw $%.3x", opdp0); break; - case 0x1b: sprintf(t, "asl $%.3x+x", opdp0); break; - case 0x1c: sprintf(t, "asl a"); break; - case 0x1d: sprintf(t, "dec x"); break; - case 0x1e: sprintf(t, "cmp x,$%.4x", opw); break; - case 0x1f: sprintf(t, "jmp ($%.4x+x)", opw); break; - case 0x20: sprintf(t, "clrp"); break; - case 0x21: sprintf(t, "tcall 2"); break; - case 0x22: sprintf(t, "set1 $%.3x", opdp0); break; - case 0x23: sprintf(t, "bbs1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x24: sprintf(t, "and a,$%.3x", opdp0); break; - case 0x25: sprintf(t, "and a,$%.4x", opw); break; - case 0x26: sprintf(t, "and a,(x)"); break; - case 0x27: sprintf(t, "and a,($%.3x+x)", opdp0); break; - case 0x28: sprintf(t, "and a,#$%.2x", op0); break; - case 0x29: sprintf(t, "and $%.3x,$%.3x", opdp1, opdp0); break; - case 0x2a: sprintf(t, "or1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break; - case 0x2b: sprintf(t, "rol $%.3x", opdp0); break; - case 0x2c: sprintf(t, "rol $%.4x", opw); break; - case 0x2d: sprintf(t, "push a"); break; - case 0x2e: sprintf(t, "cbne $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x2f: sprintf(t, "bra $%.4x", __relb(op0, 2)); break; - case 0x30: sprintf(t, "bmi $%.4x", __relb(op0, 2)); break; - case 0x31: sprintf(t, "tcall 3"); break; - case 0x32: sprintf(t, "clr1 $%.3x", opdp0); break; - case 0x33: sprintf(t, "bbc1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x34: sprintf(t, "and a,$%.3x+x", opdp0); break; - case 0x35: sprintf(t, "and a,$%.4x+x", opw); break; - case 0x36: sprintf(t, "and a,$%.4x+y", opw); break; - case 0x37: sprintf(t, "and a,($%.3x)+y", opdp0); break; - case 0x38: sprintf(t, "and $%.3x,#$%.2x", opdp1, op0); break; - case 0x39: sprintf(t, "and (x),(y)"); break; - case 0x3a: sprintf(t, "incw $%.3x", opdp0); break; - case 0x3b: sprintf(t, "rol $%.3x+x", opdp0); break; - case 0x3c: sprintf(t, "rol a"); break; - case 0x3d: sprintf(t, "inc x"); break; - case 0x3e: sprintf(t, "cmp x,$%.3x", opdp0); break; - case 0x3f: sprintf(t, "call $%.4x", opw); break; - case 0x40: sprintf(t, "setp"); break; - case 0x41: sprintf(t, "tcall 4"); break; - case 0x42: sprintf(t, "set2 $%.3x", opdp0); break; - case 0x43: sprintf(t, "bbs2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x44: sprintf(t, "eor a,$%.3x", opdp0); break; - case 0x45: sprintf(t, "eor a,$%.4x", opw); break; - case 0x46: sprintf(t, "eor a,(x)"); break; - case 0x47: sprintf(t, "eor a,($%.3x+x)", opdp0); break; - case 0x48: sprintf(t, "eor a,#$%.2x", op0); break; - case 0x49: sprintf(t, "eor $%.3x,$%.3x", opdp1, opdp0); break; - case 0x4a: sprintf(t, "and1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; - case 0x4b: sprintf(t, "lsr $%.3x", opdp0); break; - case 0x4c: sprintf(t, "lsr $%.4x", opw); break; - case 0x4d: sprintf(t, "push x"); break; - case 0x4e: sprintf(t, "tclr $%.4x,a", opw); break; - case 0x4f: sprintf(t, "pcall $ff%.2x", op0); break; - case 0x50: sprintf(t, "bvc $%.4x", __relb(op0, 2)); break; - case 0x51: sprintf(t, "tcall 5"); break; - case 0x52: sprintf(t, "clr2 $%.3x", opdp0); break; - case 0x53: sprintf(t, "bbc2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x54: sprintf(t, "eor a,$%.3x+x", opdp0); break; - case 0x55: sprintf(t, "eor a,$%.4x+x", opw); break; - case 0x56: sprintf(t, "eor a,$%.4x+y", opw); break; - case 0x57: sprintf(t, "eor a,($%.3x)+y", opdp0); break; - case 0x58: sprintf(t, "eor $%.3x,#$%.2x", opdp1, op0); break; - case 0x59: sprintf(t, "eor (x),(y)"); break; - case 0x5a: sprintf(t, "cmpw ya,$%.3x", opdp0); break; - case 0x5b: sprintf(t, "lsr $%.3x+x", opdp0); break; - case 0x5c: sprintf(t, "lsr a"); break; - case 0x5d: sprintf(t, "mov x,a"); break; - case 0x5e: sprintf(t, "cmp y,$%.4x", opw); break; - case 0x5f: sprintf(t, "jmp $%.4x", opw); break; - case 0x60: sprintf(t, "clrc"); break; - case 0x61: sprintf(t, "tcall 6"); break; - case 0x62: sprintf(t, "set3 $%.3x", opdp0); break; - case 0x63: sprintf(t, "bbs3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x64: sprintf(t, "cmp a,$%.3x", opdp0); break; - case 0x65: sprintf(t, "cmp a,$%.4x", opw); break; - case 0x66: sprintf(t, "cmp a,(x)"); break; - case 0x67: sprintf(t, "cmp a,($%.3x+x)", opdp0); break; - case 0x68: sprintf(t, "cmp a,#$%.2x", op0); break; - case 0x69: sprintf(t, "cmp $%.3x,$%.3x", opdp1, opdp0); break; - case 0x6a: sprintf(t, "and1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break; - case 0x6b: sprintf(t, "ror $%.3x", opdp0); break; - case 0x6c: sprintf(t, "ror $%.4x", opw); break; - case 0x6d: sprintf(t, "push y"); break; - case 0x6e: sprintf(t, "dbnz $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x6f: sprintf(t, "ret"); break; - case 0x70: sprintf(t, "bvs $%.4x", __relb(op0, 2)); break; - case 0x71: sprintf(t, "tcall 7"); break; - case 0x72: sprintf(t, "clr3 $%.3x", opdp0); break; - case 0x73: sprintf(t, "bbc3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x74: sprintf(t, "cmp a,$%.3x+x", opdp0); break; - case 0x75: sprintf(t, "cmp a,$%.4x+x", opw); break; - case 0x76: sprintf(t, "cmp a,$%.4x+y", opw); break; - case 0x77: sprintf(t, "cmp a,($%.3x)+y", opdp0); break; - case 0x78: sprintf(t, "cmp $%.3x,#$%.2x", opdp1, op0); break; - case 0x79: sprintf(t, "cmp (x),(y)"); break; - case 0x7a: sprintf(t, "addw ya,$%.3x", opdp0); break; - case 0x7b: sprintf(t, "ror $%.3x+x", opdp0); break; - case 0x7c: sprintf(t, "ror a"); break; - case 0x7d: sprintf(t, "mov a,x"); break; - case 0x7e: sprintf(t, "cmp y,$%.3x", opdp0); break; - case 0x7f: sprintf(t, "reti"); break; - case 0x80: sprintf(t, "setc"); break; - case 0x81: sprintf(t, "tcall 8"); break; - case 0x82: sprintf(t, "set4 $%.3x", opdp0); break; - case 0x83: sprintf(t, "bbs4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x84: sprintf(t, "adc a,$%.3x", opdp0); break; - case 0x85: sprintf(t, "adc a,$%.4x", opw); break; - case 0x86: sprintf(t, "adc a,(x)"); break; - case 0x87: sprintf(t, "adc a,($%.3x+x)", opdp0); break; - case 0x88: sprintf(t, "adc a,#$%.2x", op0); break; - case 0x89: sprintf(t, "adc $%.3x,$%.3x", opdp1, opdp0); break; - case 0x8a: sprintf(t, "eor1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; - case 0x8b: sprintf(t, "dec $%.3x", opdp0); break; - case 0x8c: sprintf(t, "dec $%.4x", opw); break; - case 0x8d: sprintf(t, "mov y,#$%.2x", op0); break; - case 0x8e: sprintf(t, "pop p"); break; - case 0x8f: sprintf(t, "mov $%.3x,#$%.2x", opdp1, op0); break; - case 0x90: sprintf(t, "bcc $%.4x", __relb(op0, 2)); break; - case 0x91: sprintf(t, "tcall 9"); break; - case 0x92: sprintf(t, "clr4 $%.3x", opdp0); break; - case 0x93: sprintf(t, "bbc4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0x94: sprintf(t, "adc a,$%.3x+x", opdp0); break; - case 0x95: sprintf(t, "adc a,$%.4x+x", opw); break; - case 0x96: sprintf(t, "adc a,$%.4x+y", opw); break; - case 0x97: sprintf(t, "adc a,($%.3x)+y", opdp0); break; - case 0x98: sprintf(t, "adc $%.3x,#$%.2x", opdp1, op0); break; - case 0x99: sprintf(t, "adc (x),(y)"); break; - case 0x9a: sprintf(t, "subw ya,$%.3x", opdp0); break; - case 0x9b: sprintf(t, "dec $%.3x+x", opdp0); break; - case 0x9c: sprintf(t, "dec a"); break; - case 0x9d: sprintf(t, "mov x,sp"); break; - case 0x9e: sprintf(t, "div ya,x"); break; - case 0x9f: sprintf(t, "xcn a"); break; - case 0xa0: sprintf(t, "ei"); break; - case 0xa1: sprintf(t, "tcall 10"); break; - case 0xa2: sprintf(t, "set5 $%.3x", opdp0); break; - case 0xa3: sprintf(t, "bbs5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0xa4: sprintf(t, "sbc a,$%.3x", opdp0); break; - case 0xa5: sprintf(t, "sbc a,$%.4x", opw); break; - case 0xa6: sprintf(t, "sbc a,(x)"); break; - case 0xa7: sprintf(t, "sbc a,($%.3x+x)", opdp0); break; - case 0xa8: sprintf(t, "sbc a,#$%.2x", op0); break; - case 0xa9: sprintf(t, "sbc $%.3x,$%.3x", opdp1, opdp0); break; - case 0xaa: sprintf(t, "mov1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; - case 0xab: sprintf(t, "inc $%.3x", opdp0); break; - case 0xac: sprintf(t, "inc $%.4x", opw); break; - case 0xad: sprintf(t, "cmp y,#$%.2x", op0); break; - case 0xae: sprintf(t, "pop a"); break; - case 0xaf: sprintf(t, "mov (x)+,a"); break; - case 0xb0: sprintf(t, "bcs $%.4x", __relb(op0, 2)); break; - case 0xb1: sprintf(t, "tcall 11"); break; - case 0xb2: sprintf(t, "clr5 $%.3x", opdp0); break; - case 0xb3: sprintf(t, "bbc5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0xb4: sprintf(t, "sbc a,$%.3x+x", opdp0); break; - case 0xb5: sprintf(t, "sbc a,$%.4x+x", opw); break; - case 0xb6: sprintf(t, "sbc a,$%.4x+y", opw); break; - case 0xb7: sprintf(t, "sbc a,($%.3x)+y", opdp0); break; - case 0xb8: sprintf(t, "sbc $%.3x,#$%.2x", opdp1, op0); break; - case 0xb9: sprintf(t, "sbc (x),(y)"); break; - case 0xba: sprintf(t, "movw ya,$%.3x", opdp0); break; - case 0xbb: sprintf(t, "inc $%.3x+x", opdp0); break; - case 0xbc: sprintf(t, "inc a"); break; - case 0xbd: sprintf(t, "mov sp,x"); break; - case 0xbe: sprintf(t, "das a"); break; - case 0xbf: sprintf(t, "mov a,(x)+"); break; - case 0xc0: sprintf(t, "di"); break; - case 0xc1: sprintf(t, "tcall 12"); break; - case 0xc2: sprintf(t, "set6 $%.3x", opdp0); break; - case 0xc3: sprintf(t, "bbs6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0xc4: sprintf(t, "mov $%.3x,a", opdp0); break; - case 0xc5: sprintf(t, "mov $%.4x,a", opw); break; - case 0xc6: sprintf(t, "mov (x),a"); break; - case 0xc7: sprintf(t, "mov ($%.3x+x),a", opdp0); break; - case 0xc8: sprintf(t, "cmp x,#$%.2x", op0); break; - case 0xc9: sprintf(t, "mov $%.4x,x", opw); break; - case 0xca: sprintf(t, "mov1 $%.4x:%d,c", opw & 0x1fff, opw >> 13); break; - case 0xcb: sprintf(t, "mov $%.3x,y", opdp0); break; - case 0xcc: sprintf(t, "mov $%.4x,y", opw); break; - case 0xcd: sprintf(t, "mov x,#$%.2x", op0); break; - case 0xce: sprintf(t, "pop x"); break; - case 0xcf: sprintf(t, "mul ya"); break; - case 0xd0: sprintf(t, "bne $%.4x", __relb(op0, 2)); break; - case 0xd1: sprintf(t, "tcall 13"); break; - case 0xd2: sprintf(t, "clr6 $%.3x", opdp0); break; - case 0xd3: sprintf(t, "bbc6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0xd4: sprintf(t, "mov $%.3x+x,a", opdp0); break; - case 0xd5: sprintf(t, "mov $%.4x+x,a", opw); break; - case 0xd6: sprintf(t, "mov $%.4x+y,a", opw); break; - case 0xd7: sprintf(t, "mov ($%.3x)+y,a", opdp0); break; - case 0xd8: sprintf(t, "mov $%.3x,x", opdp0); break; - case 0xd9: sprintf(t, "mov $%.3x+y,x", opdp0); break; - case 0xda: sprintf(t, "movw $%.3x,ya", opdp0); break; - case 0xdb: sprintf(t, "mov $%.3x+x,y", opdp0); break; - case 0xdc: sprintf(t, "dec y"); break; - case 0xdd: sprintf(t, "mov a,y"); break; - case 0xde: sprintf(t, "cbne $%.3x+x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0xdf: sprintf(t, "daa a"); break; - case 0xe0: sprintf(t, "clrv"); break; - case 0xe1: sprintf(t, "tcall 14"); break; - case 0xe2: sprintf(t, "set7 $%.3x", opdp0); break; - case 0xe3: sprintf(t, "bbs7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0xe4: sprintf(t, "mov a,$%.3x", opdp0); break; - case 0xe5: sprintf(t, "mov a,$%.4x", opw); break; - case 0xe6: sprintf(t, "mov a,(x)"); break; - case 0xe7: sprintf(t, "mov a,($%.3x+x)", opdp0); break; - case 0xe8: sprintf(t, "mov a,#$%.2x", op0); break; - case 0xe9: sprintf(t, "mov x,$%.4x", opw); break; - case 0xea: sprintf(t, "not1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; - case 0xeb: sprintf(t, "mov y,$%.3x", opdp0); break; - case 0xec: sprintf(t, "mov y,$%.4x", opw); break; - case 0xed: sprintf(t, "notc"); break; - case 0xee: sprintf(t, "pop y"); break; - case 0xef: sprintf(t, "sleep"); break; - case 0xf0: sprintf(t, "beq $%.4x", __relb(op0, 2)); break; - case 0xf1: sprintf(t, "tcall 15"); break; - case 0xf2: sprintf(t, "clr7 $%.3x", opdp0); break; - case 0xf3: sprintf(t, "bbc7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; - case 0xf4: sprintf(t, "mov a,$%.3x+x", opdp0); break; - case 0xf5: sprintf(t, "mov a,$%.4x+x", opw); break; - case 0xf6: sprintf(t, "mov a,$%.4x+y", opw); break; - case 0xf7: sprintf(t, "mov a,($%.3x)+y", opdp0); break; - case 0xf8: sprintf(t, "mov x,$%.3x", opdp0); break; - case 0xf9: sprintf(t, "mov x,$%.3x+y", opdp0); break; - case 0xfa: sprintf(t, "mov $%.3x,$%.3x", opdp1, opdp0); break; - case 0xfb: sprintf(t, "mov y,$%.3x+x", opdp0); break; - case 0xfc: sprintf(t, "inc y"); break; - case 0xfd: sprintf(t, "mov y,a"); break; - case 0xfe: sprintf(t, "dbnz y,$%.4x", __relb(op0, 2)); break; - case 0xff: sprintf(t, "stop"); break; - } - - t[strlen(t)] = ' '; - strcat(s, t); - - sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ", - regs.a, regs.x, regs.y, regs.sp, regs.ya); - strcat(s, t); - - sprintf(t, "%c%c%c%c%c%c%c%c", - regs.p.n ? 'N' : 'n', - regs.p.v ? 'V' : 'v', - regs.p.p ? 'P' : 'p', - regs.p.b ? 'B' : 'b', - regs.p.h ? 'H' : 'h', - regs.p.i ? 'I' : 'i', - regs.p.z ? 'Z' : 'z', - regs.p.c ? 'C' : 'c'); - strcat(s, t); -} - -#endif //ifdef SMP_CPP diff --git a/tools/bsnes/smp/iplrom.hpp b/tools/bsnes/smp/iplrom.hpp deleted file mode 100755 index eafbd7b..0000000 --- a/tools/bsnes/smp/iplrom.hpp +++ /dev/null @@ -1,40 +0,0 @@ -//this is the IPLROM for the S-SMP coprocessor. -//the S-SMP does not allow writing to the IPLROM. -//all writes are instead mapped to the extended -//RAM region, accessible when $f1.d7 is clear. - -const uint8_t SMP::iplrom[64] = { -/*ffc0*/ 0xcd, 0xef, //mov x,#$ef -/*ffc2*/ 0xbd, //mov sp,x -/*ffc3*/ 0xe8, 0x00, //mov a,#$00 -/*ffc5*/ 0xc6, //mov (x),a -/*ffc6*/ 0x1d, //dec x -/*ffc7*/ 0xd0, 0xfc, //bne $ffc5 -/*ffc9*/ 0x8f, 0xaa, 0xf4, //mov $f4,#$aa -/*ffcc*/ 0x8f, 0xbb, 0xf5, //mov $f5,#$bb -/*ffcf*/ 0x78, 0xcc, 0xf4, //cmp $f4,#$cc -/*ffd2*/ 0xd0, 0xfb, //bne $ffcf -/*ffd4*/ 0x2f, 0x19, //bra $ffef -/*ffd6*/ 0xeb, 0xf4, //mov y,$f4 -/*ffd8*/ 0xd0, 0xfc, //bne $ffd6 -/*ffda*/ 0x7e, 0xf4, //cmp y,$f4 -/*ffdc*/ 0xd0, 0x0b, //bne $ffe9 -/*ffde*/ 0xe4, 0xf5, //mov a,$f5 -/*ffe0*/ 0xcb, 0xf4, //mov $f4,y -/*ffe2*/ 0xd7, 0x00, //mov ($00)+y,a -/*ffe4*/ 0xfc, //inc y -/*ffe5*/ 0xd0, 0xf3, //bne $ffda -/*ffe7*/ 0xab, 0x01, //inc $01 -/*ffe9*/ 0x10, 0xef, //bpl $ffda -/*ffeb*/ 0x7e, 0xf4, //cmp y,$f4 -/*ffed*/ 0x10, 0xeb, //bpl $ffda -/*ffef*/ 0xba, 0xf6, //movw ya,$f6 -/*fff1*/ 0xda, 0x00, //movw $00,ya -/*fff3*/ 0xba, 0xf4, //movw ya,$f4 -/*fff5*/ 0xc4, 0xf4, //mov $f4,a -/*fff7*/ 0xdd, //mov a,y -/*fff8*/ 0x5d, //mov x,a -/*fff9*/ 0xd0, 0xdb, //bne $ffd6 -/*fffb*/ 0x1f, 0x00, 0x00, //jmp ($0000+x) -/*fffe*/ 0xc0, 0xff //reset vector location ($ffc0) -}; diff --git a/tools/bsnes/smp/smp.cpp b/tools/bsnes/smp/smp.cpp index 6392ac2..66960a3 100755 --- a/tools/bsnes/smp/smp.cpp +++ b/tools/bsnes/smp/smp.cpp @@ -1,5 +1,47 @@ #include <../base.hpp> + #define SMP_CPP +namespace SNES { + +//this is the IPLROM for the S-SMP coprocessor. +//the S-SMP does not allow writing to the IPLROM. +//all writes are instead mapped to the extended +//RAM region, accessible when $f1.d7 is clear. -#include "iplrom.hpp" -#include "dsmp.cpp" +const uint8_t SMP::iplrom[64] = { +/*ffc0*/ 0xcd, 0xef, //mov x,#$ef +/*ffc2*/ 0xbd, //mov sp,x +/*ffc3*/ 0xe8, 0x00, //mov a,#$00 +/*ffc5*/ 0xc6, //mov (x),a +/*ffc6*/ 0x1d, //dec x +/*ffc7*/ 0xd0, 0xfc, //bne $ffc5 +/*ffc9*/ 0x8f, 0xaa, 0xf4, //mov $f4,#$aa +/*ffcc*/ 0x8f, 0xbb, 0xf5, //mov $f5,#$bb +/*ffcf*/ 0x78, 0xcc, 0xf4, //cmp $f4,#$cc +/*ffd2*/ 0xd0, 0xfb, //bne $ffcf +/*ffd4*/ 0x2f, 0x19, //bra $ffef +/*ffd6*/ 0xeb, 0xf4, //mov y,$f4 +/*ffd8*/ 0xd0, 0xfc, //bne $ffd6 +/*ffda*/ 0x7e, 0xf4, //cmp y,$f4 +/*ffdc*/ 0xd0, 0x0b, //bne $ffe9 +/*ffde*/ 0xe4, 0xf5, //mov a,$f5 +/*ffe0*/ 0xcb, 0xf4, //mov $f4,y +/*ffe2*/ 0xd7, 0x00, //mov ($00)+y,a +/*ffe4*/ 0xfc, //inc y +/*ffe5*/ 0xd0, 0xf3, //bne $ffda +/*ffe7*/ 0xab, 0x01, //inc $01 +/*ffe9*/ 0x10, 0xef, //bpl $ffda +/*ffeb*/ 0x7e, 0xf4, //cmp y,$f4 +/*ffed*/ 0x10, 0xeb, //bpl $ffda +/*ffef*/ 0xba, 0xf6, //movw ya,$f6 +/*fff1*/ 0xda, 0x00, //movw $00,ya +/*fff3*/ 0xba, 0xf4, //movw ya,$f4 +/*fff5*/ 0xc4, 0xf4, //mov $f4,a +/*fff7*/ 0xdd, //mov a,y +/*fff8*/ 0x5d, //mov x,a +/*fff9*/ 0xd0, 0xdb, //bne $ffd6 +/*fffb*/ 0x1f, 0x00, 0x00, //jmp ($0000+x) +/*fffe*/ 0xc0, 0xff //reset vector location ($ffc0) +}; +}; + diff --git a/tools/bsnes/smp/smp.hpp b/tools/bsnes/smp/smp.hpp index d4e39b9..e472ef6 100755 --- a/tools/bsnes/smp/smp.hpp +++ b/tools/bsnes/smp/smp.hpp @@ -1,13 +1,11 @@ class SMP { public: virtual void enter() = 0; - - #include "smpregs.hpp" - regs_t regs; static const uint8_t iplrom[64]; virtual uint8 ram_read(uint16 addr) = 0; - virtual void ram_write(uint16 addr, uint8 value) = 0; + virtual void ram_write(uint16 addr, uint8 value) = 0; + //$f4-$f7 virtual uint8 port_read(uint8 port) = 0; virtual void port_write(uint8 port, uint8 value) = 0; @@ -15,11 +13,6 @@ public: virtual void power() = 0; virtual void reset() = 0; - //debugging functions - virtual bool in_opcode(); - void disassemble_opcode(char *output); - inline uint16 __relb(int8 offset, int op_len); - SMP() {} virtual ~SMP() {} }; diff --git a/tools/bsnes/smp/smpregs.hpp b/tools/bsnes/smp/smpregs.hpp deleted file mode 100755 index d1ac5c3..0000000 --- a/tools/bsnes/smp/smpregs.hpp +++ /dev/null @@ -1,31 +0,0 @@ -struct flag_t { - bool n, v, p, b, h, i, z, c; - - inline operator unsigned() const { - return (n << 7) + (v << 6) + (p << 5) + (b << 4) - + (h << 3) + (i << 2) + (z << 1) + (c << 0); - } - - inline unsigned operator=(uint8_t data) { - n = data & 0x80; v = data & 0x40; p = data & 0x20; b = data & 0x10; - h = data & 0x08; i = data & 0x04; z = data & 0x02; c = data & 0x01; - return data; - } - - inline unsigned operator|=(unsigned data) { return operator=(operator unsigned() | data); } - inline unsigned operator^=(unsigned data) { return operator=(operator unsigned() ^ data); } - inline unsigned operator&=(unsigned data) { return operator=(operator unsigned() & data); } - - flag_t() : n(0), v(0), p(0), b(0), h(0), i(0), z(0), c(0) {} -}; - -struct regs_t { - uint16_t pc; - union { - uint16 ya; - struct { uint8 order_lsb2(a, y); }; - }; - uint8_t x, sp; - flag_t p; - regs_t() : pc(0), ya(0), x(0), sp(0) {} -}; diff --git a/tools/bsnes/smp/ssmp/core/cc.sh b/tools/bsnes/smp/ssmp/core/cc.sh deleted file mode 100755 index 6b94ac7..0000000 --- a/tools/bsnes/smp/ssmp/core/cc.sh +++ /dev/null @@ -1,4 +0,0 @@ -g++ -c ssmpgen.cpp -I../../../lib -g++ -c ../../../lib/nall/string.cpp -I../../../lib -g++ -o ssmpgen ssmpgen.o string.o -rm *.o diff --git a/tools/bsnes/smp/ssmp/core/clean.sh b/tools/bsnes/smp/ssmp/core/clean.sh deleted file mode 100755 index b62bcbc..0000000 --- a/tools/bsnes/smp/ssmp/core/clean.sh +++ /dev/null @@ -1 +0,0 @@ -rm ssmpgen diff --git a/tools/bsnes/smp/ssmp/core/core.cpp b/tools/bsnes/smp/ssmp/core/core.cpp deleted file mode 100755 index b3c600c..0000000 --- a/tools/bsnes/smp/ssmp/core/core.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#ifdef SSMP_CPP - -#include "opfn.cpp" - -void sSMP::enter() { loop: - tracer.trace_smpop(); //traces SMP opcode (only if tracer is enabled) - - status.in_opcode = true; - switch(op_readpc()) { - #include "op_mov.cpp" - #include "op_pc.cpp" - #include "op_read.cpp" - #include "op_rmw.cpp" - #include "op_misc.cpp" - } - status.in_opcode = false; - - goto loop; -} - -#endif //ifdef SSMP_CPP diff --git a/tools/bsnes/smp/ssmp/core/core.hpp b/tools/bsnes/smp/ssmp/core/core.hpp deleted file mode 100755 index cf4fd47..0000000 --- a/tools/bsnes/smp/ssmp/core/core.hpp +++ /dev/null @@ -1,19 +0,0 @@ - uint16 dp, sp, rd, wr, bit, ya; - - bool in_opcode() { return status.in_opcode; } - - uint8 op_adc (uint8 x, uint8 y); - uint16 op_addw(uint16 x, uint16 y); - uint8 op_and (uint8 x, uint8 y); - uint8 op_cmp (uint8 x, uint8 y); - uint16 op_cmpw(uint16 x, uint16 y); - uint8 op_eor (uint8 x, uint8 y); - uint8 op_inc (uint8 x); - uint8 op_dec (uint8 x); - uint8 op_or (uint8 x, uint8 y); - uint8 op_sbc (uint8 x, uint8 y); - uint16 op_subw(uint16 x, uint16 y); - uint8 op_asl (uint8 x); - uint8 op_lsr (uint8 x); - uint8 op_rol (uint8 x); - uint8 op_ror (uint8 x); diff --git a/tools/bsnes/smp/ssmp/core/op_misc.b b/tools/bsnes/smp/ssmp/core/op_misc.b deleted file mode 100755 index a6baba9..0000000 --- a/tools/bsnes/smp/ssmp/core/op_misc.b +++ /dev/null @@ -1,163 +0,0 @@ -nop(0x00) { -1:op_io(); -} - -sleep(0xef), -stop(0xff) { -1:op_io(); -2:op_io(); - regs.pc--; -} - -xcn(0x9f) { -1:op_io(); -2:op_io(); -3:op_io(); -4:op_io(); - regs.a = (regs.a >> 4) | (regs.a << 4); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -daa(0xdf) { -1:op_io(); -2:op_io(); - if(regs.p.c || (regs.a) > 0x99) { - regs.a += 0x60; - regs.p.c = 1; - } - if(regs.p.h || (regs.a & 15) > 0x09) { - regs.a += 0x06; - } - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -das(0xbe) { -1:op_io(); -2:op_io(); - if(!regs.p.c || (regs.a) > 0x99) { - regs.a -= 0x60; - regs.p.c = 0; - } - if(!regs.p.h || (regs.a & 15) > 0x09) { - regs.a -= 0x06; - } - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -clrc(0x60, regs.p.c = 0), -clrp(0x20, regs.p.p = 0), -setc(0x80, regs.p.c = 1), -setp(0x40, regs.p.p = 1) { -1:op_io(); - $1; -} - -clrv(0xe0) { -1:op_io(); - regs.p.v = 0; - regs.p.h = 0; -} - -notc(0xed) { -1:op_io(); -2:op_io(); - regs.p.c = !regs.p.c; -} - -ei(0xa0, 1), -di(0xc0, 0) { -1:op_io(); -2:op_io(); - regs.p.i = $1; -} - -set0_dp(0x02, rd |= 0x01), -clr0_dp(0x12, rd &= ~0x01), -set1_dp(0x22, rd |= 0x02), -clr1_dp(0x32, rd &= ~0x02), -set2_dp(0x42, rd |= 0x04), -clr2_dp(0x52, rd &= ~0x04), -set3_dp(0x62, rd |= 0x08), -clr3_dp(0x72, rd &= ~0x08), -set4_dp(0x82, rd |= 0x10), -clr4_dp(0x92, rd &= ~0x10), -set5_dp(0xa2, rd |= 0x20), -clr5_dp(0xb2, rd &= ~0x20), -set6_dp(0xc2, rd |= 0x40), -clr6_dp(0xd2, rd &= ~0x40), -set7_dp(0xe2, rd |= 0x80), -clr7_dp(0xf2, rd &= ~0x80) { -1:dp = op_readpc(); -2:rd = op_readdp(dp); -3:$1; - op_writedp(dp, rd); -} - -push_a(0x2d, a), -push_x(0x4d, x), -push_y(0x6d, y), -push_p(0x0d, p) { -1:op_io(); -2:op_io(); -3:op_writestack(regs.$1); -} - -pop_a(0xae, a), -pop_x(0xce, x), -pop_y(0xee, y), -pop_p(0x8e, p) { -1:op_io(); -2:op_io(); -3:regs.$1 = op_readstack(); -} - -mul_ya(0xcf) { -1:op_io(); -2:op_io(); -3:op_io(); -4:op_io(); -5:op_io(); -6:op_io(); -7:op_io(); -8:op_io(); - ya = regs.y * regs.a; - regs.a = ya; - regs.y = ya >> 8; -//result is set based on y (high-byte) only - regs.p.n = !!(regs.y & 0x80); - regs.p.z = (regs.y == 0); -} - -div_ya_x(0x9e) { -1:op_io(); -2:op_io(); -3:op_io(); -4:op_io(); -5:op_io(); -6:op_io(); -7:op_io(); -8:op_io(); -9:op_io(); -10:op_io(); -11:op_io(); - ya = regs.ya; -//overflow set if quotient >= 256 - regs.p.v = !!(regs.y >= regs.x); - regs.p.h = !!((regs.y & 15) >= (regs.x & 15)); - if(regs.y < (regs.x << 1)) { - //if quotient is <= 511 (will fit into 9-bit result) - regs.a = ya / regs.x; - regs.y = ya % regs.x; - } else { - //otherwise, the quotient won't fit into regs.p.v + regs.a - //this emulates the odd behavior of the S-SMP in this case - regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x); - regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x); - } -//result is set based on a (quotient) only - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} diff --git a/tools/bsnes/smp/ssmp/core/op_misc.cpp b/tools/bsnes/smp/ssmp/core/op_misc.cpp deleted file mode 100755 index a778b9e..0000000 --- a/tools/bsnes/smp/ssmp/core/op_misc.cpp +++ /dev/null @@ -1,349 +0,0 @@ -#ifdef SSMP_CPP - -//nop -case 0x00: { - op_io(); -} break; - -//sleep -case 0xef: { - op_io(); - op_io(); - regs.pc--; -} break; - -//stop -case 0xff: { - op_io(); - op_io(); - regs.pc--; -} break; - -//xcn -case 0x9f: { - op_io(); - op_io(); - op_io(); - op_io(); - regs.a = (regs.a >> 4) | (regs.a << 4); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//daa -case 0xdf: { - op_io(); - op_io(); - if(regs.p.c || (regs.a) > 0x99) { - regs.a += 0x60; - regs.p.c = 1; - } - if(regs.p.h || (regs.a & 15) > 0x09) { - regs.a += 0x06; - } - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//das -case 0xbe: { - op_io(); - op_io(); - if(!regs.p.c || (regs.a) > 0x99) { - regs.a -= 0x60; - regs.p.c = 0; - } - if(!regs.p.h || (regs.a & 15) > 0x09) { - regs.a -= 0x06; - } - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//clrc -case 0x60: { - op_io(); - regs.p.c = 0; -} break; - -//clrp -case 0x20: { - op_io(); - regs.p.p = 0; -} break; - -//setc -case 0x80: { - op_io(); - regs.p.c = 1; -} break; - -//setp -case 0x40: { - op_io(); - regs.p.p = 1; -} break; - -//clrv -case 0xe0: { - op_io(); - regs.p.v = 0; - regs.p.h = 0; -} break; - -//notc -case 0xed: { - op_io(); - op_io(); - regs.p.c = !regs.p.c; -} break; - -//ei -case 0xa0: { - op_io(); - op_io(); - regs.p.i = 1; -} break; - -//di -case 0xc0: { - op_io(); - op_io(); - regs.p.i = 0; -} break; - -//set0_dp -case 0x02: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x01; - op_writedp(dp, rd); -} break; - -//clr0_dp -case 0x12: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x01; - op_writedp(dp, rd); -} break; - -//set1_dp -case 0x22: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x02; - op_writedp(dp, rd); -} break; - -//clr1_dp -case 0x32: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x02; - op_writedp(dp, rd); -} break; - -//set2_dp -case 0x42: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x04; - op_writedp(dp, rd); -} break; - -//clr2_dp -case 0x52: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x04; - op_writedp(dp, rd); -} break; - -//set3_dp -case 0x62: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x08; - op_writedp(dp, rd); -} break; - -//clr3_dp -case 0x72: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x08; - op_writedp(dp, rd); -} break; - -//set4_dp -case 0x82: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x10; - op_writedp(dp, rd); -} break; - -//clr4_dp -case 0x92: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x10; - op_writedp(dp, rd); -} break; - -//set5_dp -case 0xa2: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x20; - op_writedp(dp, rd); -} break; - -//clr5_dp -case 0xb2: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x20; - op_writedp(dp, rd); -} break; - -//set6_dp -case 0xc2: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x40; - op_writedp(dp, rd); -} break; - -//clr6_dp -case 0xd2: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x40; - op_writedp(dp, rd); -} break; - -//set7_dp -case 0xe2: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= 0x80; - op_writedp(dp, rd); -} break; - -//clr7_dp -case 0xf2: { - dp = op_readpc(); - rd = op_readdp(dp); - rd &= ~0x80; - op_writedp(dp, rd); -} break; - -//push_a -case 0x2d: { - op_io(); - op_io(); - op_writestack(regs.a); -} break; - -//push_x -case 0x4d: { - op_io(); - op_io(); - op_writestack(regs.x); -} break; - -//push_y -case 0x6d: { - op_io(); - op_io(); - op_writestack(regs.y); -} break; - -//push_p -case 0x0d: { - op_io(); - op_io(); - op_writestack(regs.p); -} break; - -//pop_a -case 0xae: { - op_io(); - op_io(); - regs.a = op_readstack(); -} break; - -//pop_x -case 0xce: { - op_io(); - op_io(); - regs.x = op_readstack(); -} break; - -//pop_y -case 0xee: { - op_io(); - op_io(); - regs.y = op_readstack(); -} break; - -//pop_p -case 0x8e: { - op_io(); - op_io(); - regs.p = op_readstack(); -} break; - -//mul_ya -case 0xcf: { - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - ya = regs.y * regs.a; - regs.a = ya; - regs.y = ya >> 8; -//result is set based on y (high-byte) only - regs.p.n = !!(regs.y & 0x80); - regs.p.z = (regs.y == 0); -} break; - -//div_ya_x -case 0x9e: { - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - op_io(); - ya = regs.ya; -//overflow set if quotient >= 256 - regs.p.v = !!(regs.y >= regs.x); - regs.p.h = !!((regs.y & 15) >= (regs.x & 15)); - if(regs.y < (regs.x << 1)) { - //if quotient is <= 511 (will fit into 9-bit result) - regs.a = ya / regs.x; - regs.y = ya % regs.x; - } else { - //otherwise, the quotient won't fit into regs.p.v + regs.a - //this emulates the odd behavior of the S-SMP in this case - regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x); - regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x); - } -//result is set based on a (quotient) only - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -#endif diff --git a/tools/bsnes/smp/ssmp/core/op_mov.b b/tools/bsnes/smp/ssmp/core/op_mov.b deleted file mode 100755 index dee821a..0000000 --- a/tools/bsnes/smp/ssmp/core/op_mov.b +++ /dev/null @@ -1,217 +0,0 @@ -mov_a_x(0x7d, a, x), -mov_a_y(0xdd, a, y), -mov_x_a(0x5d, x, a), -mov_y_a(0xfd, y, a), -mov_x_sp(0x9d, x, sp) { -1:op_io(); - regs.$1 = regs.$2; - regs.p.n = !!(regs.$1 & 0x80); - regs.p.z = (regs.$1 == 0); -} - -mov_sp_x(0xbd, sp, x) { -1:op_io(); - regs.$1 = regs.$2; -} - -mov_a_const(0xe8, a), -mov_x_const(0xcd, x), -mov_y_const(0x8d, y) { -1:regs.$1 = op_readpc(); - regs.p.n = !!(regs.$1 & 0x80); - regs.p.z = (regs.$1 == 0); -} - -mov_a_ix(0xe6) { -1:op_io(); -2:regs.a = op_readdp(regs.x); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -mov_a_ixinc(0xbf) { -1:op_io(); -2:regs.a = op_readdp(regs.x++); -3:op_io(); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -mov_a_dp(0xe4, a), -mov_x_dp(0xf8, x), -mov_y_dp(0xeb, y) { -1:sp = op_readpc(); -2:regs.$1 = op_readdp(sp); - regs.p.n = !!(regs.$1 & 0x80); - regs.p.z = (regs.$1 == 0); -} - -mov_a_dpx(0xf4, a, x), -mov_x_dpy(0xf9, x, y), -mov_y_dpx(0xfb, y, x) { -1:sp = op_readpc(); -2:op_io(); -3:regs.$1 = op_readdp(sp + regs.$2); - regs.p.n = !!(regs.$1 & 0x80); - regs.p.z = (regs.$1 == 0); -} - -mov_a_addr(0xe5, a), -mov_x_addr(0xe9, x), -mov_y_addr(0xec, y) { -1:sp = op_readpc(); -2:sp |= op_readpc() << 8; -3:regs.$1 = op_readaddr(sp); - regs.p.n = !!(regs.$1 & 0x80); - regs.p.z = (regs.$1 == 0); -} - -mov_a_addrx(0xf5, x), -mov_a_addry(0xf6, y) { -1:sp = op_readpc(); -2:sp |= op_readpc() << 8; -3:op_io(); -4:regs.a = op_readaddr(sp + regs.$1); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -mov_a_idpx(0xe7) { -1:dp = op_readpc() + regs.x; -2:op_io(); -3:sp = op_readdp(dp); -4:sp |= op_readdp(dp + 1) << 8; -5:regs.a = op_readaddr(sp); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -mov_a_idpy(0xf7) { -1:dp = op_readpc(); -2:op_io(); -3:sp = op_readdp(dp); -4:sp |= op_readdp(dp + 1) << 8; -5:regs.a = op_readaddr(sp + regs.y); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} - -mov_dp_dp(0xfa) { -1:sp = op_readpc(); -2:rd = op_readdp(sp); -3:dp = op_readpc(); -4:op_writedp(dp, rd); -} - -mov_dp_const(0x8f) { -1:rd = op_readpc(); -2:dp = op_readpc(); -3:op_readdp(dp); -4:op_writedp(dp, rd); -} - -mov_ix_a(0xc6) { -1:op_io(); -2:op_readdp(regs.x); -3:op_writedp(regs.x, regs.a); -} - -mov_ixinc_a(0xaf) { -1:op_io(); -2:op_io(); -3:op_writedp(regs.x++, regs.a); -} - -mov_dp_a(0xc4, a), -mov_dp_x(0xd8, x), -mov_dp_y(0xcb, y) { -1:dp = op_readpc(); -2:op_readdp(dp); -3:op_writedp(dp, regs.$1); -} - -mov_dpx_a(0xd4, x, a), -mov_dpy_x(0xd9, y, x), -mov_dpx_y(0xdb, x, y) { -1:dp = op_readpc(); -2:op_io(); - dp += regs.$1; -3:op_readdp(dp); -4:op_writedp(dp, regs.$2); -} - -mov_addr_a(0xc5, a), -mov_addr_x(0xc9, x), -mov_addr_y(0xcc, y) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:op_readaddr(dp); -4:op_writeaddr(dp, regs.$1); -} - -mov_addrx_a(0xd5, x), -mov_addry_a(0xd6, y) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:op_io(); - dp += regs.$1; -4:op_readaddr(dp); -5:op_writeaddr(dp, regs.a); -} - -mov_idpx_a(0xc7) { -1:sp = op_readpc(); -2:op_io(); - sp += regs.x; -3:dp = op_readdp(sp); -4:dp |= op_readdp(sp + 1) << 8; -5:op_readaddr(dp); -6:op_writeaddr(dp, regs.a); -} - -mov_idpy_a(0xd7) { -1:sp = op_readpc(); -2:dp = op_readdp(sp); -3:dp |= op_readdp(sp + 1) << 8; -4:op_io(); - dp += regs.y; -5:op_readaddr(dp); -6:op_writeaddr(dp, regs.a); -} - -movw_ya_dp(0xba) { -1:sp = op_readpc(); -2:regs.a = op_readdp(sp); -3:op_io(); -4:regs.y = op_readdp(sp + 1); - regs.p.n = !!(regs.ya & 0x8000); - regs.p.z = (regs.ya == 0); -} - -movw_dp_ya(0xda) { -1:dp = op_readpc(); -2:op_readdp(dp); -3:op_writedp(dp, regs.a); -4:op_writedp(dp + 1, regs.y); -} - -mov1_c_bit(0xaa) { -1:sp = op_readpc(); -2:sp |= op_readpc() << 8; -3:bit = sp >> 13; - sp &= 0x1fff; - rd = op_readaddr(sp); - regs.p.c = !!(rd & (1 << bit)); -} - -mov1_bit_c(0xca) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - if(regs.p.c)rd |= (1 << bit); - else rd &= ~(1 << bit); -4:op_io(); -5:op_writeaddr(dp, rd); -} diff --git a/tools/bsnes/smp/ssmp/core/op_mov.cpp b/tools/bsnes/smp/ssmp/core/op_mov.cpp deleted file mode 100755 index 0389039..0000000 --- a/tools/bsnes/smp/ssmp/core/op_mov.cpp +++ /dev/null @@ -1,392 +0,0 @@ -#ifdef SSMP_CPP - -//mov_a_x -case 0x7d: { - op_io(); - regs.a = regs.x; - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_a_y -case 0xdd: { - op_io(); - regs.a = regs.y; - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_x_a -case 0x5d: { - op_io(); - regs.x = regs.a; - regs.p.n = !!(regs.x & 0x80); - regs.p.z = (regs.x == 0); -} break; - -//mov_y_a -case 0xfd: { - op_io(); - regs.y = regs.a; - regs.p.n = !!(regs.y & 0x80); - regs.p.z = (regs.y == 0); -} break; - -//mov_x_sp -case 0x9d: { - op_io(); - regs.x = regs.sp; - regs.p.n = !!(regs.x & 0x80); - regs.p.z = (regs.x == 0); -} break; - -//mov_sp_x -case 0xbd: { - op_io(); - regs.sp = regs.x; -} break; - -//mov_a_const -case 0xe8: { - regs.a = op_readpc(); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_x_const -case 0xcd: { - regs.x = op_readpc(); - regs.p.n = !!(regs.x & 0x80); - regs.p.z = (regs.x == 0); -} break; - -//mov_y_const -case 0x8d: { - regs.y = op_readpc(); - regs.p.n = !!(regs.y & 0x80); - regs.p.z = (regs.y == 0); -} break; - -//mov_a_ix -case 0xe6: { - op_io(); - regs.a = op_readdp(regs.x); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_a_ixinc -case 0xbf: { - op_io(); - regs.a = op_readdp(regs.x++); - op_io(); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_a_dp -case 0xe4: { - sp = op_readpc(); - regs.a = op_readdp(sp); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_x_dp -case 0xf8: { - sp = op_readpc(); - regs.x = op_readdp(sp); - regs.p.n = !!(regs.x & 0x80); - regs.p.z = (regs.x == 0); -} break; - -//mov_y_dp -case 0xeb: { - sp = op_readpc(); - regs.y = op_readdp(sp); - regs.p.n = !!(regs.y & 0x80); - regs.p.z = (regs.y == 0); -} break; - -//mov_a_dpx -case 0xf4: { - sp = op_readpc(); - op_io(); - regs.a = op_readdp(sp + regs.x); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_x_dpy -case 0xf9: { - sp = op_readpc(); - op_io(); - regs.x = op_readdp(sp + regs.y); - regs.p.n = !!(regs.x & 0x80); - regs.p.z = (regs.x == 0); -} break; - -//mov_y_dpx -case 0xfb: { - sp = op_readpc(); - op_io(); - regs.y = op_readdp(sp + regs.x); - regs.p.n = !!(regs.y & 0x80); - regs.p.z = (regs.y == 0); -} break; - -//mov_a_addr -case 0xe5: { - sp = op_readpc(); - sp |= op_readpc() << 8; - regs.a = op_readaddr(sp); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_x_addr -case 0xe9: { - sp = op_readpc(); - sp |= op_readpc() << 8; - regs.x = op_readaddr(sp); - regs.p.n = !!(regs.x & 0x80); - regs.p.z = (regs.x == 0); -} break; - -//mov_y_addr -case 0xec: { - sp = op_readpc(); - sp |= op_readpc() << 8; - regs.y = op_readaddr(sp); - regs.p.n = !!(regs.y & 0x80); - regs.p.z = (regs.y == 0); -} break; - -//mov_a_addrx -case 0xf5: { - sp = op_readpc(); - sp |= op_readpc() << 8; - op_io(); - regs.a = op_readaddr(sp + regs.x); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_a_addry -case 0xf6: { - sp = op_readpc(); - sp |= op_readpc() << 8; - op_io(); - regs.a = op_readaddr(sp + regs.y); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_a_idpx -case 0xe7: { - dp = op_readpc() + regs.x; - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - regs.a = op_readaddr(sp); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_a_idpy -case 0xf7: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - regs.a = op_readaddr(sp + regs.y); - regs.p.n = !!(regs.a & 0x80); - regs.p.z = (regs.a == 0); -} break; - -//mov_dp_dp -case 0xfa: { - sp = op_readpc(); - rd = op_readdp(sp); - dp = op_readpc(); - op_writedp(dp, rd); -} break; - -//mov_dp_const -case 0x8f: { - rd = op_readpc(); - dp = op_readpc(); - op_readdp(dp); - op_writedp(dp, rd); -} break; - -//mov_ix_a -case 0xc6: { - op_io(); - op_readdp(regs.x); - op_writedp(regs.x, regs.a); -} break; - -//mov_ixinc_a -case 0xaf: { - op_io(); - op_io(); - op_writedp(regs.x++, regs.a); -} break; - -//mov_dp_a -case 0xc4: { - dp = op_readpc(); - op_readdp(dp); - op_writedp(dp, regs.a); -} break; - -//mov_dp_x -case 0xd8: { - dp = op_readpc(); - op_readdp(dp); - op_writedp(dp, regs.x); -} break; - -//mov_dp_y -case 0xcb: { - dp = op_readpc(); - op_readdp(dp); - op_writedp(dp, regs.y); -} break; - -//mov_dpx_a -case 0xd4: { - dp = op_readpc(); - op_io(); - dp += regs.x; - op_readdp(dp); - op_writedp(dp, regs.a); -} break; - -//mov_dpy_x -case 0xd9: { - dp = op_readpc(); - op_io(); - dp += regs.y; - op_readdp(dp); - op_writedp(dp, regs.x); -} break; - -//mov_dpx_y -case 0xdb: { - dp = op_readpc(); - op_io(); - dp += regs.x; - op_readdp(dp); - op_writedp(dp, regs.y); -} break; - -//mov_addr_a -case 0xc5: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_readaddr(dp); - op_writeaddr(dp, regs.a); -} break; - -//mov_addr_x -case 0xc9: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_readaddr(dp); - op_writeaddr(dp, regs.x); -} break; - -//mov_addr_y -case 0xcc: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_readaddr(dp); - op_writeaddr(dp, regs.y); -} break; - -//mov_addrx_a -case 0xd5: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - dp += regs.x; - op_readaddr(dp); - op_writeaddr(dp, regs.a); -} break; - -//mov_addry_a -case 0xd6: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - dp += regs.y; - op_readaddr(dp); - op_writeaddr(dp, regs.a); -} break; - -//mov_idpx_a -case 0xc7: { - sp = op_readpc(); - op_io(); - sp += regs.x; - dp = op_readdp(sp); - dp |= op_readdp(sp + 1) << 8; - op_readaddr(dp); - op_writeaddr(dp, regs.a); -} break; - -//mov_idpy_a -case 0xd7: { - sp = op_readpc(); - dp = op_readdp(sp); - dp |= op_readdp(sp + 1) << 8; - op_io(); - dp += regs.y; - op_readaddr(dp); - op_writeaddr(dp, regs.a); -} break; - -//movw_ya_dp -case 0xba: { - sp = op_readpc(); - regs.a = op_readdp(sp); - op_io(); - regs.y = op_readdp(sp + 1); - regs.p.n = !!(regs.ya & 0x8000); - regs.p.z = (regs.ya == 0); -} break; - -//movw_dp_ya -case 0xda: { - dp = op_readpc(); - op_readdp(dp); - op_writedp(dp, regs.a); - op_writedp(dp + 1, regs.y); -} break; - -//mov1_c_bit -case 0xaa: { - sp = op_readpc(); - sp |= op_readpc() << 8; - bit = sp >> 13; - sp &= 0x1fff; - rd = op_readaddr(sp); - regs.p.c = !!(rd & (1 << bit)); -} break; - -//mov1_bit_c -case 0xca: { - dp = op_readpc(); - dp |= op_readpc() << 8; - bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - if(regs.p.c)rd |= (1 << bit); - else rd &= ~(1 << bit); - op_io(); - op_writeaddr(dp, rd); -} break; - -#endif diff --git a/tools/bsnes/smp/ssmp/core/op_pc.b b/tools/bsnes/smp/ssmp/core/op_pc.b deleted file mode 100755 index affaf84..0000000 --- a/tools/bsnes/smp/ssmp/core/op_pc.b +++ /dev/null @@ -1,179 +0,0 @@ -bra(0x2f, 0), -beq(0xf0, !regs.p.z), -bne(0xd0, regs.p.z), -bcs(0xb0, !regs.p.c), -bcc(0x90, regs.p.c), -bvs(0x70, !regs.p.v), -bvc(0x50, regs.p.v), -bmi(0x30, !regs.p.n), -bpl(0x10, regs.p.n) { -1:rd = op_readpc(); - if($1)end; -2:op_io(); -3:op_io(); - regs.pc += (int8)rd; -} - -bbs0(0x03, 0x01, !=), -bbc0(0x13, 0x01, ==), -bbs1(0x23, 0x02, !=), -bbc1(0x33, 0x02, ==), -bbs2(0x43, 0x04, !=), -bbc2(0x53, 0x04, ==), -bbs3(0x63, 0x08, !=), -bbc3(0x73, 0x08, ==), -bbs4(0x83, 0x10, !=), -bbc4(0x93, 0x10, ==), -bbs5(0xa3, 0x20, !=), -bbc5(0xb3, 0x20, ==), -bbs6(0xc3, 0x40, !=), -bbc6(0xd3, 0x40, ==), -bbs7(0xe3, 0x80, !=), -bbc7(0xf3, 0x80, ==) { -1:dp = op_readpc(); -2:sp = op_readdp(dp); -3:rd = op_readpc(); -4:op_io(); - if((sp & $1) $2 $1)end; -5:op_io(); -6:op_io(); - regs.pc += (int8)rd; -} - -cbne_dp(0x2e) { -1:dp = op_readpc(); -2:sp = op_readdp(dp); -3:rd = op_readpc(); -4:op_io(); - if(regs.a == sp)end; -5:op_io(); -6:op_io(); - regs.pc += (int8)rd; -} - -cbne_dpx(0xde) { -1:dp = op_readpc(); -2:op_io(); -3:sp = op_readdp(dp + regs.x); -4:rd = op_readpc(); -5:op_io(); - if(regs.a == sp)end; -6:op_io(); -7:op_io(); - regs.pc += (int8)rd; -} - -dbnz_dp(0x6e) { -1:dp = op_readpc(); -2:wr = op_readdp(dp); -3:op_writedp(dp, --wr); -4:rd = op_readpc(); - if(wr == 0x00)end; -5:op_io(); -6:op_io(); - regs.pc += (int8)rd; -} - -dbnz_y(0xfe) { -1:rd = op_readpc(); -2:op_io(); - regs.y--; -3:op_io(); - if(regs.y == 0x00)end; -4:op_io(); -5:op_io(); - regs.pc += (int8)rd; -} - -jmp_addr(0x5f) { -1:rd = op_readpc(); -2:rd |= op_readpc() << 8; - regs.pc = rd; -} - -jmp_iaddrx(0x1f) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:op_io(); - dp += regs.x; -4:rd = op_readaddr(dp); -5:rd |= op_readaddr(dp + 1) << 8; - regs.pc = rd; -} - -call(0x3f) { -1:rd = op_readpc(); -2:rd |= op_readpc() << 8; -3:op_io(); -4:op_io(); -5:op_io(); -6:op_writestack(regs.pc >> 8); -7:op_writestack(regs.pc); - regs.pc = rd; -} - -pcall(0x4f) { -1:rd = op_readpc(); -2:op_io(); -3:op_io(); -4:op_writestack(regs.pc >> 8); -5:op_writestack(regs.pc); - regs.pc = 0xff00 | rd; -} - -tcall_0(0x01, 0), -tcall_1(0x11, 1), -tcall_2(0x21, 2), -tcall_3(0x31, 3), -tcall_4(0x41, 4), -tcall_5(0x51, 5), -tcall_6(0x61, 6), -tcall_7(0x71, 7), -tcall_8(0x81, 8), -tcall_9(0x91, 9), -tcall_10(0xa1, 10), -tcall_11(0xb1, 11), -tcall_12(0xc1, 12), -tcall_13(0xd1, 13), -tcall_14(0xe1, 14), -tcall_15(0xf1, 15) { -1:dp = 0xffde - ($1 << 1); - rd = op_readaddr(dp); -2:rd |= op_readaddr(dp + 1) << 8; -3:op_io(); -4:op_io(); -5:op_io(); -6:op_writestack(regs.pc >> 8); -7:op_writestack(regs.pc); - regs.pc = rd; -} - -brk(0x0f) { -1:rd = op_readaddr(0xffde); -2:rd |= op_readaddr(0xffdf) << 8; -3:op_io(); -4:op_io(); -5:op_writestack(regs.pc >> 8); -6:op_writestack(regs.pc); -7:op_writestack(regs.p); - regs.pc = rd; - regs.p.b = 1; - regs.p.i = 0; -} - -ret(0x6f) { -1:rd = op_readstack(); -2:rd |= op_readstack() << 8; -3:op_io(); -4:op_io(); - regs.pc = rd; -} - -reti(0x7f) { -1:regs.p = op_readstack(); -2:rd = op_readstack(); -3:rd |= op_readstack() << 8; -4:op_io(); -5:op_io(); - regs.pc = rd; -} diff --git a/tools/bsnes/smp/ssmp/core/op_pc.cpp b/tools/bsnes/smp/ssmp/core/op_pc.cpp deleted file mode 100755 index b9b5992..0000000 --- a/tools/bsnes/smp/ssmp/core/op_pc.cpp +++ /dev/null @@ -1,606 +0,0 @@ -#ifdef SSMP_CPP - -//bra -case 0x2f: { - rd = op_readpc(); - if(0)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//beq -case 0xf0: { - rd = op_readpc(); - if(!regs.p.z)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bne -case 0xd0: { - rd = op_readpc(); - if(regs.p.z)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bcs -case 0xb0: { - rd = op_readpc(); - if(!regs.p.c)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bcc -case 0x90: { - rd = op_readpc(); - if(regs.p.c)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bvs -case 0x70: { - rd = op_readpc(); - if(!regs.p.v)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bvc -case 0x50: { - rd = op_readpc(); - if(regs.p.v)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bmi -case 0x30: { - rd = op_readpc(); - if(!regs.p.n)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bpl -case 0x10: { - rd = op_readpc(); - if(regs.p.n)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs0 -case 0x03: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x01) != 0x01)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc0 -case 0x13: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x01) == 0x01)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs1 -case 0x23: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x02) != 0x02)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc1 -case 0x33: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x02) == 0x02)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs2 -case 0x43: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x04) != 0x04)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc2 -case 0x53: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x04) == 0x04)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs3 -case 0x63: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x08) != 0x08)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc3 -case 0x73: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x08) == 0x08)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs4 -case 0x83: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x10) != 0x10)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc4 -case 0x93: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x10) == 0x10)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs5 -case 0xa3: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x20) != 0x20)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc5 -case 0xb3: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x20) == 0x20)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs6 -case 0xc3: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x40) != 0x40)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc6 -case 0xd3: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x40) == 0x40)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbs7 -case 0xe3: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x80) != 0x80)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//bbc7 -case 0xf3: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if((sp & 0x80) == 0x80)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//cbne_dp -case 0x2e: { - dp = op_readpc(); - sp = op_readdp(dp); - rd = op_readpc(); - op_io(); - if(regs.a == sp)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//cbne_dpx -case 0xde: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp + regs.x); - rd = op_readpc(); - op_io(); - if(regs.a == sp)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//dbnz_dp -case 0x6e: { - dp = op_readpc(); - wr = op_readdp(dp); - op_writedp(dp, --wr); - rd = op_readpc(); - if(wr == 0x00)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//dbnz_y -case 0xfe: { - rd = op_readpc(); - op_io(); - regs.y--; - op_io(); - if(regs.y == 0x00)break; - op_io(); - op_io(); - regs.pc += (int8)rd; -} break; - -//jmp_addr -case 0x5f: { - rd = op_readpc(); - rd |= op_readpc() << 8; - regs.pc = rd; -} break; - -//jmp_iaddrx -case 0x1f: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - dp += regs.x; - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - regs.pc = rd; -} break; - -//call -case 0x3f: { - rd = op_readpc(); - rd |= op_readpc() << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//pcall -case 0x4f: { - rd = op_readpc(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = 0xff00 | rd; -} break; - -//tcall_0 -case 0x01: { - dp = 0xffde - (0 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_1 -case 0x11: { - dp = 0xffde - (1 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_2 -case 0x21: { - dp = 0xffde - (2 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_3 -case 0x31: { - dp = 0xffde - (3 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_4 -case 0x41: { - dp = 0xffde - (4 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_5 -case 0x51: { - dp = 0xffde - (5 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_6 -case 0x61: { - dp = 0xffde - (6 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_7 -case 0x71: { - dp = 0xffde - (7 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_8 -case 0x81: { - dp = 0xffde - (8 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_9 -case 0x91: { - dp = 0xffde - (9 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_10 -case 0xa1: { - dp = 0xffde - (10 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_11 -case 0xb1: { - dp = 0xffde - (11 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_12 -case 0xc1: { - dp = 0xffde - (12 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_13 -case 0xd1: { - dp = 0xffde - (13 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_14 -case 0xe1: { - dp = 0xffde - (14 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//tcall_15 -case 0xf1: { - dp = 0xffde - (15 << 1); - rd = op_readaddr(dp); - rd |= op_readaddr(dp + 1) << 8; - op_io(); - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - regs.pc = rd; -} break; - -//brk -case 0x0f: { - rd = op_readaddr(0xffde); - rd |= op_readaddr(0xffdf) << 8; - op_io(); - op_io(); - op_writestack(regs.pc >> 8); - op_writestack(regs.pc); - op_writestack(regs.p); - regs.pc = rd; - regs.p.b = 1; - regs.p.i = 0; -} break; - -//ret -case 0x6f: { - rd = op_readstack(); - rd |= op_readstack() << 8; - op_io(); - op_io(); - regs.pc = rd; -} break; - -//reti -case 0x7f: { - regs.p = op_readstack(); - rd = op_readstack(); - rd |= op_readstack() << 8; - op_io(); - op_io(); - regs.pc = rd; -} break; - -#endif diff --git a/tools/bsnes/smp/ssmp/core/op_read.b b/tools/bsnes/smp/ssmp/core/op_read.b deleted file mode 100755 index fd2f9d8..0000000 --- a/tools/bsnes/smp/ssmp/core/op_read.b +++ /dev/null @@ -1,205 +0,0 @@ -adc_a_const(0x88, adc, a), -and_a_const(0x28, and, a), -cmp_a_const(0x68, cmp, a), -cmp_x_const(0xc8, cmp, x), -cmp_y_const(0xad, cmp, y), -eor_a_const(0x48, eor, a), -or_a_const(0x08, or, a), -sbc_a_const(0xa8, sbc, a) { -1:rd = op_readpc(); - regs.$2 = op_$1(regs.$2, rd); -} - -adc_a_ix(0x86, adc), -and_a_ix(0x26, and), -cmp_a_ix(0x66, cmp), -eor_a_ix(0x46, eor), -or_a_ix(0x06, or), -sbc_a_ix(0xa6, sbc) { -1:op_io(); -2:rd = op_readdp(regs.x); - regs.a = op_$1(regs.a, rd); -} - -adc_a_dp(0x84, adc, a), -and_a_dp(0x24, and, a), -cmp_a_dp(0x64, cmp, a), -cmp_x_dp(0x3e, cmp, x), -cmp_y_dp(0x7e, cmp, y), -eor_a_dp(0x44, eor, a), -or_a_dp(0x04, or, a), -sbc_a_dp(0xa4, sbc, a) { -1:dp = op_readpc(); -2:rd = op_readdp(dp); - regs.$2 = op_$1(regs.$2, rd); -} - -adc_a_dpx(0x94, adc), -and_a_dpx(0x34, and), -cmp_a_dpx(0x74, cmp), -eor_a_dpx(0x54, eor), -or_a_dpx(0x14, or), -sbc_a_dpx(0xb4, sbc) { -1:dp = op_readpc(); -2:op_io(); -3:rd = op_readdp(dp + regs.x); - regs.a = op_$1(regs.a, rd); -} - -adc_a_addr(0x85, adc, a), -and_a_addr(0x25, and, a), -cmp_a_addr(0x65, cmp, a), -cmp_x_addr(0x1e, cmp, x), -cmp_y_addr(0x5e, cmp, y), -eor_a_addr(0x45, eor, a), -or_a_addr(0x05, or, a), -sbc_a_addr(0xa5, sbc, a) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:rd = op_readaddr(dp); - regs.$2 = op_$1(regs.$2, rd); -} - -adc_a_addrx(0x95, adc, x), -adc_a_addry(0x96, adc, y), -and_a_addrx(0x35, and, x), -and_a_addry(0x36, and, y), -cmp_a_addrx(0x75, cmp, x), -cmp_a_addry(0x76, cmp, y), -eor_a_addrx(0x55, eor, x), -eor_a_addry(0x56, eor, y), -or_a_addrx(0x15, or, x), -or_a_addry(0x16, or, y), -sbc_a_addrx(0xb5, sbc, x), -sbc_a_addry(0xb6, sbc, y) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:op_io(); -4:rd = op_readaddr(dp + regs.$2); - regs.a = op_$1(regs.a, rd); -} - -adc_a_idpx(0x87, adc), -and_a_idpx(0x27, and), -cmp_a_idpx(0x67, cmp), -eor_a_idpx(0x47, eor), -or_a_idpx(0x07, or), -sbc_a_idpx(0xa7, sbc) { -1:dp = op_readpc() + regs.x; -2:op_io(); -3:sp = op_readdp(dp); -4:sp |= op_readdp(dp + 1) << 8; -5:rd = op_readaddr(sp); - regs.a = op_$1(regs.a, rd); -} - -adc_a_idpy(0x97, adc), -and_a_idpy(0x37, and), -cmp_a_idpy(0x77, cmp), -eor_a_idpy(0x57, eor), -or_a_idpy(0x17, or), -sbc_a_idpy(0xb7, sbc) { -1:dp = op_readpc(); -2:op_io(); -3:sp = op_readdp(dp); -4:sp |= op_readdp(dp + 1) << 8; -5:rd = op_readaddr(sp + regs.y); - regs.a = op_$1(regs.a, rd); -} - -adc_ix_iy(0x99, adc, 1), -and_ix_iy(0x39, and, 1), -cmp_ix_iy(0x79, cmp, 0), -eor_ix_iy(0x59, eor, 1), -or_ix_iy(0x19, or, 1), -sbc_ix_iy(0xb9, sbc, 1) { -1:op_io(); -2:rd = op_readdp(regs.y); -3:wr = op_readdp(regs.x); - wr = op_$1(wr, rd); -4:($2) ? op_writedp(regs.x, wr) : op_io(); -} - -adc_dp_dp(0x89, adc, 1), -and_dp_dp(0x29, and, 1), -cmp_dp_dp(0x69, cmp, 0), -eor_dp_dp(0x49, eor, 1), -or_dp_dp(0x09, or, 1), -sbc_dp_dp(0xa9, sbc, 1) { -1:sp = op_readpc(); -2:rd = op_readdp(sp); -3:dp = op_readpc(); -4:wr = op_readdp(dp); -5:wr = op_$1(wr, rd); - ($2) ? op_writedp(dp, wr) : op_io(); -} - -adc_dp_const(0x98, adc, 1), -and_dp_const(0x38, and, 1), -cmp_dp_const(0x78, cmp, 0), -eor_dp_const(0x58, eor, 1), -or_dp_const(0x18, or, 1), -sbc_dp_const(0xb8, sbc, 1) { -1:rd = op_readpc(); -2:dp = op_readpc(); -3:wr = op_readdp(dp); -4:wr = op_$1(wr, rd); - ($2) ? op_writedp(dp, wr) : op_io(); -} - -addw_ya_dp(0x7a, addw), -subw_ya_dp(0x9a, subw) { -1:dp = op_readpc(); -2:rd = op_readdp(dp); -3:op_io(); -4:rd |= op_readdp(dp + 1) << 8; - regs.ya = op_$1(regs.ya, rd); -} - -cmpw_ya_dp(0x5a) { -1:dp = op_readpc(); -2:rd = op_readdp(dp); -3:rd |= op_readdp(dp + 1) << 8; - op_cmpw(regs.ya, rd); -} - -and1_bit(0x4a, !!), -and1_notbit(0x6a, !) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - regs.p.c = regs.p.c & $1(rd & (1 << bit)); -} - -eor1_bit(0x8a) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); -4:op_io(); - regs.p.c = regs.p.c ^ !!(rd & (1 << bit)); -} - -not1_bit(0xea) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - rd ^= (1 << bit); -4:op_writeaddr(dp, rd); -} - -or1_bit(0x0a, !!), -or1_notbit(0x2a, !) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); -4:op_io(); - regs.p.c = regs.p.c | $1(rd & (1 << bit)); -} diff --git a/tools/bsnes/smp/ssmp/core/op_read.cpp b/tools/bsnes/smp/ssmp/core/op_read.cpp deleted file mode 100755 index 3f8f77f..0000000 --- a/tools/bsnes/smp/ssmp/core/op_read.cpp +++ /dev/null @@ -1,747 +0,0 @@ -#ifdef SSMP_CPP - -//adc_a_const -case 0x88: { - rd = op_readpc(); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_const -case 0x28: { - rd = op_readpc(); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_const -case 0x68: { - rd = op_readpc(); - regs.a = op_cmp(regs.a, rd); -} break; - -//cmp_x_const -case 0xc8: { - rd = op_readpc(); - regs.x = op_cmp(regs.x, rd); -} break; - -//cmp_y_const -case 0xad: { - rd = op_readpc(); - regs.y = op_cmp(regs.y, rd); -} break; - -//eor_a_const -case 0x48: { - rd = op_readpc(); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_const -case 0x08: { - rd = op_readpc(); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_const -case 0xa8: { - rd = op_readpc(); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_a_ix -case 0x86: { - op_io(); - rd = op_readdp(regs.x); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_ix -case 0x26: { - op_io(); - rd = op_readdp(regs.x); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_ix -case 0x66: { - op_io(); - rd = op_readdp(regs.x); - regs.a = op_cmp(regs.a, rd); -} break; - -//eor_a_ix -case 0x46: { - op_io(); - rd = op_readdp(regs.x); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_ix -case 0x06: { - op_io(); - rd = op_readdp(regs.x); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_ix -case 0xa6: { - op_io(); - rd = op_readdp(regs.x); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_a_dp -case 0x84: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_dp -case 0x24: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_dp -case 0x64: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.a = op_cmp(regs.a, rd); -} break; - -//cmp_x_dp -case 0x3e: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.x = op_cmp(regs.x, rd); -} break; - -//cmp_y_dp -case 0x7e: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.y = op_cmp(regs.y, rd); -} break; - -//eor_a_dp -case 0x44: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_dp -case 0x04: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_dp -case 0xa4: { - dp = op_readpc(); - rd = op_readdp(dp); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_a_dpx -case 0x94: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_dpx -case 0x34: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_dpx -case 0x74: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - regs.a = op_cmp(regs.a, rd); -} break; - -//eor_a_dpx -case 0x54: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_dpx -case 0x14: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_dpx -case 0xb4: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_a_addr -case 0x85: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_addr -case 0x25: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_addr -case 0x65: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.a = op_cmp(regs.a, rd); -} break; - -//cmp_x_addr -case 0x1e: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.x = op_cmp(regs.x, rd); -} break; - -//cmp_y_addr -case 0x5e: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.y = op_cmp(regs.y, rd); -} break; - -//eor_a_addr -case 0x45: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_addr -case 0x05: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_addr -case 0xa5: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_a_addrx -case 0x95: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.x); - regs.a = op_adc(regs.a, rd); -} break; - -//adc_a_addry -case 0x96: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.y); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_addrx -case 0x35: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.x); - regs.a = op_and(regs.a, rd); -} break; - -//and_a_addry -case 0x36: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.y); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_addrx -case 0x75: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.x); - regs.a = op_cmp(regs.a, rd); -} break; - -//cmp_a_addry -case 0x76: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.y); - regs.a = op_cmp(regs.a, rd); -} break; - -//eor_a_addrx -case 0x55: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.x); - regs.a = op_eor(regs.a, rd); -} break; - -//eor_a_addry -case 0x56: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.y); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_addrx -case 0x15: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.x); - regs.a = op_or(regs.a, rd); -} break; - -//or_a_addry -case 0x16: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.y); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_addrx -case 0xb5: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.x); - regs.a = op_sbc(regs.a, rd); -} break; - -//sbc_a_addry -case 0xb6: { - dp = op_readpc(); - dp |= op_readpc() << 8; - op_io(); - rd = op_readaddr(dp + regs.y); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_a_idpx -case 0x87: { - dp = op_readpc() + regs.x; - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_idpx -case 0x27: { - dp = op_readpc() + regs.x; - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_idpx -case 0x67: { - dp = op_readpc() + regs.x; - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp); - regs.a = op_cmp(regs.a, rd); -} break; - -//eor_a_idpx -case 0x47: { - dp = op_readpc() + regs.x; - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_idpx -case 0x07: { - dp = op_readpc() + regs.x; - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_idpx -case 0xa7: { - dp = op_readpc() + regs.x; - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_a_idpy -case 0x97: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp + regs.y); - regs.a = op_adc(regs.a, rd); -} break; - -//and_a_idpy -case 0x37: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp + regs.y); - regs.a = op_and(regs.a, rd); -} break; - -//cmp_a_idpy -case 0x77: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp + regs.y); - regs.a = op_cmp(regs.a, rd); -} break; - -//eor_a_idpy -case 0x57: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp + regs.y); - regs.a = op_eor(regs.a, rd); -} break; - -//or_a_idpy -case 0x17: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp + regs.y); - regs.a = op_or(regs.a, rd); -} break; - -//sbc_a_idpy -case 0xb7: { - dp = op_readpc(); - op_io(); - sp = op_readdp(dp); - sp |= op_readdp(dp + 1) << 8; - rd = op_readaddr(sp + regs.y); - regs.a = op_sbc(regs.a, rd); -} break; - -//adc_ix_iy -case 0x99: { - op_io(); - rd = op_readdp(regs.y); - wr = op_readdp(regs.x); - wr = op_adc(wr, rd); - (1) ? op_writedp(regs.x, wr) : op_io(); -} break; - -//and_ix_iy -case 0x39: { - op_io(); - rd = op_readdp(regs.y); - wr = op_readdp(regs.x); - wr = op_and(wr, rd); - (1) ? op_writedp(regs.x, wr) : op_io(); -} break; - -//cmp_ix_iy -case 0x79: { - op_io(); - rd = op_readdp(regs.y); - wr = op_readdp(regs.x); - wr = op_cmp(wr, rd); - (0) ? op_writedp(regs.x, wr) : op_io(); -} break; - -//eor_ix_iy -case 0x59: { - op_io(); - rd = op_readdp(regs.y); - wr = op_readdp(regs.x); - wr = op_eor(wr, rd); - (1) ? op_writedp(regs.x, wr) : op_io(); -} break; - -//or_ix_iy -case 0x19: { - op_io(); - rd = op_readdp(regs.y); - wr = op_readdp(regs.x); - wr = op_or(wr, rd); - (1) ? op_writedp(regs.x, wr) : op_io(); -} break; - -//sbc_ix_iy -case 0xb9: { - op_io(); - rd = op_readdp(regs.y); - wr = op_readdp(regs.x); - wr = op_sbc(wr, rd); - (1) ? op_writedp(regs.x, wr) : op_io(); -} break; - -//adc_dp_dp -case 0x89: { - sp = op_readpc(); - rd = op_readdp(sp); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_adc(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//and_dp_dp -case 0x29: { - sp = op_readpc(); - rd = op_readdp(sp); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_and(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//cmp_dp_dp -case 0x69: { - sp = op_readpc(); - rd = op_readdp(sp); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_cmp(wr, rd); - (0) ? op_writedp(dp, wr) : op_io(); -} break; - -//eor_dp_dp -case 0x49: { - sp = op_readpc(); - rd = op_readdp(sp); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_eor(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//or_dp_dp -case 0x09: { - sp = op_readpc(); - rd = op_readdp(sp); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_or(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//sbc_dp_dp -case 0xa9: { - sp = op_readpc(); - rd = op_readdp(sp); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_sbc(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//adc_dp_const -case 0x98: { - rd = op_readpc(); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_adc(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//and_dp_const -case 0x38: { - rd = op_readpc(); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_and(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//cmp_dp_const -case 0x78: { - rd = op_readpc(); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_cmp(wr, rd); - (0) ? op_writedp(dp, wr) : op_io(); -} break; - -//eor_dp_const -case 0x58: { - rd = op_readpc(); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_eor(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//or_dp_const -case 0x18: { - rd = op_readpc(); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_or(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//sbc_dp_const -case 0xb8: { - rd = op_readpc(); - dp = op_readpc(); - wr = op_readdp(dp); - wr = op_sbc(wr, rd); - (1) ? op_writedp(dp, wr) : op_io(); -} break; - -//addw_ya_dp -case 0x7a: { - dp = op_readpc(); - rd = op_readdp(dp); - op_io(); - rd |= op_readdp(dp + 1) << 8; - regs.ya = op_addw(regs.ya, rd); -} break; - -//subw_ya_dp -case 0x9a: { - dp = op_readpc(); - rd = op_readdp(dp); - op_io(); - rd |= op_readdp(dp + 1) << 8; - regs.ya = op_subw(regs.ya, rd); -} break; - -//cmpw_ya_dp -case 0x5a: { - dp = op_readpc(); - rd = op_readdp(dp); - rd |= op_readdp(dp + 1) << 8; - op_cmpw(regs.ya, rd); -} break; - -//and1_bit -case 0x4a: { - dp = op_readpc(); - dp |= op_readpc() << 8; - bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - regs.p.c = regs.p.c & !!(rd & (1 << bit)); -} break; - -//and1_notbit -case 0x6a: { - dp = op_readpc(); - dp |= op_readpc() << 8; - bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - regs.p.c = regs.p.c & !(rd & (1 << bit)); -} break; - -//eor1_bit -case 0x8a: { - dp = op_readpc(); - dp |= op_readpc() << 8; - bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - op_io(); - regs.p.c = regs.p.c ^ !!(rd & (1 << bit)); -} break; - -//not1_bit -case 0xea: { - dp = op_readpc(); - dp |= op_readpc() << 8; - bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - rd ^= (1 << bit); - op_writeaddr(dp, rd); -} break; - -//or1_bit -case 0x0a: { - dp = op_readpc(); - dp |= op_readpc() << 8; - bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - op_io(); - regs.p.c = regs.p.c | !!(rd & (1 << bit)); -} break; - -//or1_notbit -case 0x2a: { - dp = op_readpc(); - dp |= op_readpc() << 8; - bit = dp >> 13; - dp &= 0x1fff; - rd = op_readaddr(dp); - op_io(); - regs.p.c = regs.p.c | !(rd & (1 << bit)); -} break; - -#endif diff --git a/tools/bsnes/smp/ssmp/core/op_rmw.b b/tools/bsnes/smp/ssmp/core/op_rmw.b deleted file mode 100755 index 425574e..0000000 --- a/tools/bsnes/smp/ssmp/core/op_rmw.b +++ /dev/null @@ -1,74 +0,0 @@ -inc_a(0xbc, inc, a), -inc_x(0x3d, inc, x), -inc_y(0xfc, inc, y), -dec_a(0x9c, dec, a), -dec_x(0x1d, dec, x), -dec_y(0xdc, dec, y), -asl_a(0x1c, asl, a), -lsr_a(0x5c, lsr, a), -rol_a(0x3c, rol, a), -ror_a(0x7c, ror, a) { -1:op_io(); - regs.$2 = op_$1(regs.$2); -} - -inc_dp(0xab, inc), -dec_dp(0x8b, dec), -asl_dp(0x0b, asl), -lsr_dp(0x4b, lsr), -rol_dp(0x2b, rol), -ror_dp(0x6b, ror) { -1:dp = op_readpc(); -2:rd = op_readdp(dp); -3:rd = op_$1(rd); - op_writedp(dp, rd); -} - -inc_dpx(0xbb, inc), -dec_dpx(0x9b, dec), -asl_dpx(0x1b, asl), -lsr_dpx(0x5b, lsr), -rol_dpx(0x3b, rol), -ror_dpx(0x7b, ror) { -1:dp = op_readpc(); -2:op_io(); -3:rd = op_readdp(dp + regs.x); -4:rd = op_$1(rd); - op_writedp(dp + regs.x, rd); -} - -inc_addr(0xac, inc), -dec_addr(0x8c, dec), -asl_addr(0x0c, asl), -lsr_addr(0x4c, lsr), -rol_addr(0x2c, rol), -ror_addr(0x6c, ror) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:rd = op_readaddr(dp); -4:rd = op_$1(rd); - op_writeaddr(dp, rd); -} - -tset_addr_a(0x0e, |), -tclr_addr_a(0x4e, &~) { -1:dp = op_readpc(); -2:dp |= op_readpc() << 8; -3:rd = op_readaddr(dp); - regs.p.n = !!((regs.a - rd) & 0x80); - regs.p.z = ((regs.a - rd) == 0); -4:op_readaddr(dp); -5:op_writeaddr(dp, rd $1 regs.a); -} - -incw_dp(0x3a, ++), -decw_dp(0x1a, --) { -1:dp = op_readpc(); -2:rd = op_readdp(dp); - rd$1; -3:op_writedp(dp++, rd); -4:rd += op_readdp(dp) << 8; -5:op_writedp(dp, rd >> 8); - regs.p.n = !!(rd & 0x8000); - regs.p.z = (rd == 0); -} diff --git a/tools/bsnes/smp/ssmp/core/op_rmw.cpp b/tools/bsnes/smp/ssmp/core/op_rmw.cpp deleted file mode 100755 index 7bba31b..0000000 --- a/tools/bsnes/smp/ssmp/core/op_rmw.cpp +++ /dev/null @@ -1,265 +0,0 @@ -#ifdef SSMP_CPP - -//inc_a -case 0xbc: { - op_io(); - regs.a = op_inc(regs.a); -} break; - -//inc_x -case 0x3d: { - op_io(); - regs.x = op_inc(regs.x); -} break; - -//inc_y -case 0xfc: { - op_io(); - regs.y = op_inc(regs.y); -} break; - -//dec_a -case 0x9c: { - op_io(); - regs.a = op_dec(regs.a); -} break; - -//dec_x -case 0x1d: { - op_io(); - regs.x = op_dec(regs.x); -} break; - -//dec_y -case 0xdc: { - op_io(); - regs.y = op_dec(regs.y); -} break; - -//asl_a -case 0x1c: { - op_io(); - regs.a = op_asl(regs.a); -} break; - -//lsr_a -case 0x5c: { - op_io(); - regs.a = op_lsr(regs.a); -} break; - -//rol_a -case 0x3c: { - op_io(); - regs.a = op_rol(regs.a); -} break; - -//ror_a -case 0x7c: { - op_io(); - regs.a = op_ror(regs.a); -} break; - -//inc_dp -case 0xab: { - dp = op_readpc(); - rd = op_readdp(dp); - rd = op_inc(rd); - op_writedp(dp, rd); -} break; - -//dec_dp -case 0x8b: { - dp = op_readpc(); - rd = op_readdp(dp); - rd = op_dec(rd); - op_writedp(dp, rd); -} break; - -//asl_dp -case 0x0b: { - dp = op_readpc(); - rd = op_readdp(dp); - rd = op_asl(rd); - op_writedp(dp, rd); -} break; - -//lsr_dp -case 0x4b: { - dp = op_readpc(); - rd = op_readdp(dp); - rd = op_lsr(rd); - op_writedp(dp, rd); -} break; - -//rol_dp -case 0x2b: { - dp = op_readpc(); - rd = op_readdp(dp); - rd = op_rol(rd); - op_writedp(dp, rd); -} break; - -//ror_dp -case 0x6b: { - dp = op_readpc(); - rd = op_readdp(dp); - rd = op_ror(rd); - op_writedp(dp, rd); -} break; - -//inc_dpx -case 0xbb: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - rd = op_inc(rd); - op_writedp(dp + regs.x, rd); -} break; - -//dec_dpx -case 0x9b: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - rd = op_dec(rd); - op_writedp(dp + regs.x, rd); -} break; - -//asl_dpx -case 0x1b: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - rd = op_asl(rd); - op_writedp(dp + regs.x, rd); -} break; - -//lsr_dpx -case 0x5b: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - rd = op_lsr(rd); - op_writedp(dp + regs.x, rd); -} break; - -//rol_dpx -case 0x3b: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - rd = op_rol(rd); - op_writedp(dp + regs.x, rd); -} break; - -//ror_dpx -case 0x7b: { - dp = op_readpc(); - op_io(); - rd = op_readdp(dp + regs.x); - rd = op_ror(rd); - op_writedp(dp + regs.x, rd); -} break; - -//inc_addr -case 0xac: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - rd = op_inc(rd); - op_writeaddr(dp, rd); -} break; - -//dec_addr -case 0x8c: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - rd = op_dec(rd); - op_writeaddr(dp, rd); -} break; - -//asl_addr -case 0x0c: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - rd = op_asl(rd); - op_writeaddr(dp, rd); -} break; - -//lsr_addr -case 0x4c: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - rd = op_lsr(rd); - op_writeaddr(dp, rd); -} break; - -//rol_addr -case 0x2c: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - rd = op_rol(rd); - op_writeaddr(dp, rd); -} break; - -//ror_addr -case 0x6c: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - rd = op_ror(rd); - op_writeaddr(dp, rd); -} break; - -//tset_addr_a -case 0x0e: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.p.n = !!((regs.a - rd) & 0x80); - regs.p.z = ((regs.a - rd) == 0); - op_readaddr(dp); - op_writeaddr(dp, rd | regs.a); -} break; - -//tclr_addr_a -case 0x4e: { - dp = op_readpc(); - dp |= op_readpc() << 8; - rd = op_readaddr(dp); - regs.p.n = !!((regs.a - rd) & 0x80); - regs.p.z = ((regs.a - rd) == 0); - op_readaddr(dp); - op_writeaddr(dp, rd &~ regs.a); -} break; - -//incw_dp -case 0x3a: { - dp = op_readpc(); - rd = op_readdp(dp); - rd++; - op_writedp(dp++, rd); - rd += op_readdp(dp) << 8; - op_writedp(dp, rd >> 8); - regs.p.n = !!(rd & 0x8000); - regs.p.z = (rd == 0); -} break; - -//decw_dp -case 0x1a: { - dp = op_readpc(); - rd = op_readdp(dp); - rd--; - op_writedp(dp++, rd); - rd += op_readdp(dp) << 8; - op_writedp(dp, rd >> 8); - regs.p.n = !!(rd & 0x8000); - regs.p.z = (rd == 0); -} break; - -#endif diff --git a/tools/bsnes/smp/ssmp/core/opfn.cpp b/tools/bsnes/smp/ssmp/core/opfn.cpp deleted file mode 100755 index 8e9b3ea..0000000 --- a/tools/bsnes/smp/ssmp/core/opfn.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#ifdef SSMP_CPP - -uint8 sSMP::op_adc(uint8 x, uint8 y) { - int r = x + y + regs.p.c; - regs.p.n = r & 0x80; - regs.p.v = ~(x ^ y) & (x ^ r) & 0x80; - regs.p.h = (x ^ y ^ r) & 0x10; - regs.p.z = (uint8)r == 0; - regs.p.c = r > 0xff; - return r; -} - -uint16 sSMP::op_addw(uint16 x, uint16 y) { - uint16 r; - regs.p.c = 0; - r = op_adc(x, y); - r |= op_adc(x >> 8, y >> 8) << 8; - regs.p.z = r == 0; - return r; -} - -uint8 sSMP::op_and(uint8 x, uint8 y) { - x &= y; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_cmp(uint8 x, uint8 y) { - int r = x - y; - regs.p.n = r & 0x80; - regs.p.z = (uint8)r == 0; - regs.p.c = r >= 0; - return x; -} - -uint16 sSMP::op_cmpw(uint16 x, uint16 y) { - int r = x - y; - regs.p.n = r & 0x8000; - regs.p.z = (uint16)r == 0; - regs.p.c = r >= 0; - return x; -} - -uint8 sSMP::op_eor(uint8 x, uint8 y) { - x ^= y; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_or(uint8 x, uint8 y) { - x |= y; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_sbc(uint8 x, uint8 y) { - int r = x - y - !regs.p.c; - regs.p.n = r & 0x80; - regs.p.v = (x ^ y) & (x ^ r) & 0x80; - regs.p.h = !((x ^ y ^ r) & 0x10); - regs.p.z = (uint8)r == 0; - regs.p.c = r >= 0; - return r; -} - -uint16 sSMP::op_subw(uint16 x, uint16 y) { - uint16 r; - regs.p.c = 1; - r = op_sbc(x, y); - r |= op_sbc(x >> 8, y >> 8) << 8; - regs.p.z = r == 0; - return r; -} - -uint8 sSMP::op_inc(uint8 x) { - x++; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_dec(uint8 x) { - x--; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_asl(uint8 x) { - regs.p.c = x & 0x80; - x <<= 1; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_lsr(uint8 x) { - regs.p.c = x & 0x01; - x >>= 1; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_rol(uint8 x) { - unsigned carry = (unsigned)regs.p.c; - regs.p.c = x & 0x80; - x = (x << 1) | carry; - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -uint8 sSMP::op_ror(uint8 x) { - unsigned carry = (unsigned)regs.p.c << 7; - regs.p.c = x & 0x01; - x = carry | (x >> 1); - regs.p.n = x & 0x80; - regs.p.z = x == 0; - return x; -} - -#endif //ifdef SSMP_CPP diff --git a/tools/bsnes/smp/ssmp/core/ssmpgen.cpp b/tools/bsnes/smp/ssmp/core/ssmpgen.cpp deleted file mode 100755 index b6a67db..0000000 --- a/tools/bsnes/smp/ssmp/core/ssmpgen.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#define CLASS_NAME "sSMP" -#include - -int main() { - generate("op_mov.cpp", "op_mov.b"); - generate("op_pc.cpp", "op_pc.b"); - generate("op_read.cpp", "op_read.b"); - generate("op_rmw.cpp", "op_rmw.b"); - generate("op_misc.cpp", "op_misc.b"); - - return 0; -} diff --git a/tools/bsnes/smp/ssmp/memory/memory.cpp b/tools/bsnes/smp/ssmp/memory/memory.cpp index 431b87d..e3594bd 100755 --- a/tools/bsnes/smp/ssmp/memory/memory.cpp +++ b/tools/bsnes/smp/ssmp/memory/memory.cpp @@ -1,34 +1,29 @@ #ifdef SSMP_CPP -alwaysinline -uint8 sSMP::ram_read(uint16 addr) { +alwaysinline uint8 sSMP::ram_read(uint16 addr) { if(addr < 0xffc0) return memory::apuram[addr]; if(status.iplrom_enabled == false) return memory::apuram[addr]; return iplrom[addr & 0x3f]; } -alwaysinline -void sSMP::ram_write(uint16 addr, uint8 data) { +alwaysinline void sSMP::ram_write(uint16 addr, uint8 data) { //writes to $ffc0-$ffff always go to spcram, even if the iplrom is enabled memory::apuram[addr] = data; } // -alwaysinline -uint8 sSMP::port_read(uint8 port) { +alwaysinline uint8 sSMP::port_read(uint8 port) { return memory::apuram[0xf4 + (port & 3)]; } -alwaysinline -void sSMP::port_write(uint8 port, uint8 data) { +alwaysinline void sSMP::port_write(uint8 port, uint8 data) { memory::apuram[0xf4 + (port & 3)] = data; } // -alwaysinline -uint8 sSMP::op_busread(uint16 addr) { +alwaysinline uint8 sSMP::op_busread(uint16 addr) { uint8 r; if((addr & 0xfff0) == 0x00f0) { //addr >= 0x00f0 && addr <= 0x00ff @@ -94,8 +89,7 @@ uint8 sSMP::op_busread(uint16 addr) { return r; } -alwaysinline -void sSMP::op_buswrite(uint16 addr, uint8 data) { +alwaysinline void sSMP::op_buswrite(uint16 addr, uint8 data) { if((addr & 0xfff0) == 0x00f0) { //addr >= 0x00f0 && addr >= 0x00ff if(status.mmio_disabled == true) return; @@ -228,42 +222,6 @@ void sSMP::op_write(uint16 addr, uint8 data) { op_buswrite(addr, data); tick_timers(); } - -// - -alwaysinline -uint8 sSMP::op_readpc() { - return op_read(regs.pc++); -} - -alwaysinline -uint8 sSMP::op_readstack() { - return op_read(0x0100 | ++regs.sp); -} - -alwaysinline -void sSMP::op_writestack(uint8 data) { - op_write(0x0100 | regs.sp--, data); -} - -alwaysinline -uint8 sSMP::op_readaddr(uint16 addr) { - return op_read(addr); -} - -alwaysinline -void sSMP::op_writeaddr(uint16 addr, uint8 data) { - op_write(addr, data); -} - -alwaysinline -uint8 sSMP::op_readdp(uint8 addr) { - return op_read((unsigned(regs.p.p) << 8) + addr); -} - -alwaysinline -void sSMP::op_writedp(uint8 addr, uint8 data) { - op_write((unsigned(regs.p.p) << 8) + addr, data); -} -#endif //ifdef SSMP_CPP +#endif + diff --git a/tools/bsnes/smp/ssmp/memory/memory.hpp b/tools/bsnes/smp/ssmp/memory/memory.hpp index d6e36d5..79141b6 100755 --- a/tools/bsnes/smp/ssmp/memory/memory.hpp +++ b/tools/bsnes/smp/ssmp/memory/memory.hpp @@ -4,26 +4,10 @@ uint8 port_read(uint8 port); void port_write(uint8 port, uint8 data); - //====================== - //core SMP bus functions - //====================== uint8 op_busread(uint16 addr); void op_buswrite(uint16 addr, uint8 data); void op_io(); uint8 op_read(uint16 addr); void op_write(uint16 addr, uint8 data); - - //=================================================== - //helper memory addressing functions used by SMP core - //=================================================== - uint8 op_readpc(); - - uint8 op_readstack(); - void op_writestack(uint8 data); - - uint8 op_readaddr(uint16 addr); - void op_writeaddr(uint16 addr, uint8 data); - - uint8 op_readdp(uint8 addr); - void op_writedp(uint8 addr, uint8 data); + diff --git a/tools/bsnes/smp/ssmp/ssmp.cpp b/tools/bsnes/smp/ssmp/ssmp.cpp index 8ec73bc..1a49cd9 100755 --- a/tools/bsnes/smp/ssmp/ssmp.cpp +++ b/tools/bsnes/smp/ssmp/ssmp.cpp @@ -1,17 +1,27 @@ #include <../base.hpp> -#define SSMP_CPP + +#define SSMP_CPP +namespace SNES { -#include "core/core.cpp" #include "memory/memory.cpp" -#include "timing/timing.cpp" +#include "timing/timing.cpp" + +void sSMP::enter() { + while(true) { + tracer.trace_smpop(); //traces SMP opcode (only if tracer is enabled) + + (this->*opcode_table[op_readpc()])(); + + //forcefully sync S-CPU and S-SMP, in case chips are not communicating + static unsigned counter = 0; + if(++counter >= 128) { + counter = 0; + scheduler.sync_smpcpu(); + } + } +} void sSMP::power() { - for(unsigned i = 0; i < memory::apuram.size(); i++) { - //SNES hardware APURAM contains pseudo-random data upon power up (exact formula is unknown.) - //memory::apuram.write(i, (i & 32) ? 0xff : 0x00); - memory::apuram.write(i, 0x00); - } - //targets not initialized/changed upon reset t0.target = 0; t1.target = 0; @@ -28,6 +38,10 @@ void sSMP::reset() { regs.sp = 0xef; regs.p = 0x02; + for(unsigned i = 0; i < memory::apuram.size(); i++) { + memory::apuram.write(i, 0x00); + } + status.clock_counter = 0; status.dsp_counter = 0; @@ -63,8 +77,11 @@ void sSMP::reset() { t2.stage3_ticks = 0; } -sSMP::sSMP() { +sSMP::sSMP() { + initialize_opcode_table(); } sSMP::~sSMP() { } +}; + diff --git a/tools/bsnes/smp/ssmp/ssmp.hpp b/tools/bsnes/smp/ssmp/ssmp.hpp index c8389b2..f3aebe2 100755 --- a/tools/bsnes/smp/ssmp/ssmp.hpp +++ b/tools/bsnes/smp/ssmp/ssmp.hpp @@ -1,8 +1,7 @@ -class sSMP : public SMP { +class sSMP : public SMP, public SMPcore { public: void enter(); - #include "core/core.hpp" #include "memory/memory.hpp" #include "timing/timing.hpp" diff --git a/tools/bsnes/smp/ssmp/timing/timing.cpp b/tools/bsnes/smp/ssmp/timing/timing.cpp index 80d9a79..7014666 100755 --- a/tools/bsnes/smp/ssmp/timing/timing.cpp +++ b/tools/bsnes/smp/ssmp/timing/timing.cpp @@ -2,6 +2,11 @@ void sSMP::add_clocks(unsigned clocks) { scheduler.addclocks_smp(clocks); + #if !defined(DSP_STATE_MACHINE) + scheduler.sync_smpdsp(); + #else + while(scheduler.clock.smpdsp < 0) dsp.enter(); + #endif } void sSMP::tick_timers() { diff --git a/tools/bsnes/smp/ssmp/timing/timing.hpp b/tools/bsnes/smp/ssmp/timing/timing.hpp index e72b39c..76ec7c6 100755 --- a/tools/bsnes/smp/ssmp/timing/timing.hpp +++ b/tools/bsnes/smp/ssmp/timing/timing.hpp @@ -1,4 +1,4 @@ -template +template class sSMPTimer { public: uint8 target; @@ -31,4 +31,4 @@ public: alwaysinline void add_clocks(unsigned clocks); alwaysinline void tick_timers(); - uint32 clocks_executed(); + uint32_t clocks_executed(); diff --git a/tools/bsnes/snes/audio/audio.cpp b/tools/bsnes/snes/audio/audio.cpp deleted file mode 100755 index 5dd800b..0000000 --- a/tools/bsnes/snes/audio/audio.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifdef SNES_CPP - -void SNES::Audio::update(uint16 l_sample, uint16 r_sample) { - snesinterface.audio_sample(l_sample, r_sample); -} - -void SNES::Audio::init() { -} - -#endif //ifdef SNES_CPP diff --git a/tools/bsnes/snes/audio/audio.hpp b/tools/bsnes/snes/audio/audio.hpp deleted file mode 100755 index 2643d91..0000000 --- a/tools/bsnes/snes/audio/audio.hpp +++ /dev/null @@ -1,7 +0,0 @@ -class Audio { -public: - void update(uint16 l_sample, uint16 r_sample); - void init(); - - friend class SNES; -} audio; diff --git a/tools/bsnes/snes/input/input.cpp b/tools/bsnes/snes/input/input.cpp deleted file mode 100755 index dcf3cc0..0000000 --- a/tools/bsnes/snes/input/input.cpp +++ /dev/null @@ -1,341 +0,0 @@ -#ifdef SNES_CPP - -uint8 SNES::Input::port_read(bool portnumber) { - port_t &p = port[portnumber]; - - switch(p.device) { - case DeviceJoypad: { - if(p.counter0 >= 16) return 1; - unsigned deviceid = (portnumber == 0 ? DeviceIDJoypad1 : DeviceIDJoypad2); - return snesinterface.input_poll(deviceid, p.counter0++); - } //case DeviceJoypad - - case DeviceMultitap: { - if(cpu.joylatch()) return 2; //when latch is high -- data2 = 1, data1 = 0 - - unsigned deviceidx, deviceid0, deviceid1; - if(portnumber == 0) { - if(cpu.pio() & 0x40) { - deviceidx = p.counter0; - if(deviceidx >= 16) return 3; - p.counter0++; - - deviceid0 = DeviceIDMultitap1A; - deviceid1 = DeviceIDMultitap1B; - } else { - deviceidx = p.counter1; - if(deviceidx >= 16) return 3; - p.counter1++; - - deviceid0 = DeviceIDMultitap1C; - deviceid1 = DeviceIDMultitap1D; - } - } else { - if(cpu.pio() & 0x80) { - deviceidx = p.counter0; - if(deviceidx >= 16) return 3; - p.counter0++; - - deviceid0 = DeviceIDMultitap2A; - deviceid1 = DeviceIDMultitap2B; - } else { - deviceidx = p.counter1; - if(deviceidx >= 16) return 3; - p.counter1++; - - deviceid0 = DeviceIDMultitap2C; - deviceid1 = DeviceIDMultitap2D; - } - } - - return (snesinterface.input_poll(deviceid0, deviceidx) << 0) - | (snesinterface.input_poll(deviceid1, deviceidx) << 1); - } //case DeviceMultitap - - case DeviceMouse: { - if(p.counter0 >= 32) return 1; - unsigned deviceid = (portnumber == 0 ? DeviceIDMouse1 : DeviceIDMouse2); - - int position_x = snesinterface.input_poll(deviceid, MouseX); //-n = left, 0 = center, +n = right - int position_y = snesinterface.input_poll(deviceid, MouseY); //-n = up, 0 = center, +n = right - - bool direction_x = position_x < 0; //0 = right, 1 = left - bool direction_y = position_y < 0; //0 = down, 1 = up - - if(position_x < 0) position_x = -position_x; //abs(position_x) - if(position_y < 0) position_y = -position_y; //abs(position_x) - - position_x = min(127, position_x); //range = 0 - 127 - position_y = min(127, position_y); //range = 0 - 127 - - switch(p.counter0++) { default: - case 0: return 0; - case 1: return 0; - case 2: return 0; - case 3: return 0; - case 4: return 0; - case 5: return 0; - case 6: return 0; - case 7: return 0; - - case 8: return snesinterface.input_poll(deviceid, MouseRight); - case 9: return snesinterface.input_poll(deviceid, MouseLeft); - case 10: return 0; //speed (0 = slow, 1 = normal, 2 = fast, 3 = unused) - case 11: return 0; // || - - case 12: return 0; //signature - case 13: return 0; // || - case 14: return 0; // || - case 15: return 1; // || - - case 16: return (direction_y) & 1; - case 17: return (position_y >> 6) & 1; - case 18: return (position_y >> 5) & 1; - case 19: return (position_y >> 4) & 1; - case 20: return (position_y >> 3) & 1; - case 21: return (position_y >> 2) & 1; - case 22: return (position_y >> 1) & 1; - case 23: return (position_y >> 0) & 1; - - case 24: return (direction_x) & 1; - case 25: return (position_x >> 6) & 1; - case 26: return (position_x >> 5) & 1; - case 27: return (position_x >> 4) & 1; - case 28: return (position_x >> 3) & 1; - case 29: return (position_x >> 2) & 1; - case 30: return (position_x >> 1) & 1; - case 31: return (position_x >> 0) & 1; - } - } //case DeviceMouse - - case DeviceSuperScope: { - if(portnumber == 0) break; //Super Scope in port 1 not supported ... - if(p.counter0 >= 8) return 1; - - if(p.counter0 == 0) { - //turbo is a switch; toggle is edge sensitive - bool turbo = snesinterface.input_poll(DeviceIDSuperScope, SuperScopeTurbo); - if(turbo && !p.superscope.turbolock) { - p.superscope.turbo = !p.superscope.turbo; //toggle state - p.superscope.turbolock = true; - } else if(!turbo) { - p.superscope.turbolock = false; - } - - //trigger is a button - //if turbo is active, trigger is level sensitive; otherwise it is edge sensitive - p.superscope.trigger = false; - bool trigger = snesinterface.input_poll(DeviceIDSuperScope, SuperScopeTrigger); - if(trigger && (p.superscope.turbo || !p.superscope.triggerlock)) { - p.superscope.trigger = true; - p.superscope.triggerlock = true; - } else if(!trigger) { - p.superscope.triggerlock = false; - } - - //cursor is a button; it is always level sensitive - p.superscope.cursor = snesinterface.input_poll(DeviceIDSuperScope, SuperScopeCursor); - - //pause is a button; it is always edge sensitive - p.superscope.pause = false; - bool pause = snesinterface.input_poll(DeviceIDSuperScope, SuperScopePause); - if(pause && !p.superscope.pauselock) { - p.superscope.pause = true; - p.superscope.pauselock = true; - } else if(!pause) { - p.superscope.pauselock = false; - } - - p.superscope.offscreen = - p.superscope.x < 0 || p.superscope.x >= 256 - || p.superscope.y < 0 || p.superscope.y >= (ppu.overscan() ? 240 : 225); - } - - switch(p.counter0++) { - case 0: return p.superscope.trigger; - case 1: return p.superscope.cursor; - case 2: return p.superscope.turbo; - case 3: return p.superscope.pause; - case 4: return 0; - case 5: return 0; - case 6: return p.superscope.offscreen; - case 7: return 0; //noise (1 = yes) - } - } //case DeviceSuperScope - - case DeviceJustifier: - case DeviceJustifiers: { - if(portnumber == 0) break; //Justifier in port 1 not supported ... - if(p.counter0 >= 32) return 1; - - if(p.counter0 == 0) { - p.justifier.trigger1 = snesinterface.input_poll(DeviceIDJustifier1, JustifierTrigger); - p.justifier.start1 = snesinterface.input_poll(DeviceIDJustifier1, JustifierStart); - - if(p.device == DeviceJustifiers) { - p.justifier.trigger2 = snesinterface.input_poll(DeviceIDJustifier2, JustifierTrigger); - p.justifier.start2 = snesinterface.input_poll(DeviceIDJustifier2, JustifierStart); - } else { - p.justifier.x2 = -1; - p.justifier.y2 = -1; - - p.justifier.trigger2 = false; - p.justifier.start2 = false; - } - } - - switch(p.counter0++) { - case 0: return 0; - case 1: return 0; - case 2: return 0; - case 3: return 0; - case 4: return 0; - case 5: return 0; - case 6: return 0; - case 7: return 0; - case 8: return 0; - case 9: return 0; - case 10: return 0; - case 11: return 0; - - case 12: return 1; //signature - case 13: return 1; // || - case 14: return 1; // || - case 15: return 0; // || - - case 16: return 0; - case 17: return 1; - case 18: return 0; - case 19: return 1; - case 20: return 0; - case 21: return 1; - case 22: return 0; - case 23: return 1; - - case 24: return p.justifier.trigger1; - case 25: return p.justifier.trigger2; - case 26: return p.justifier.start1; - case 27: return p.justifier.start2; - case 28: return p.justifier.active; - - case 29: return 0; - case 30: return 0; - case 31: return 0; - } - } //case DeviceJustifier(s) - } //switch(p.device) - - //no device connected - return 0; -} - -//scan all input; update cursor positions if needed -void SNES::Input::update() { - snesinterface.input_poll(); - port_t &p = port[1]; - - switch(p.device) { - case DeviceSuperScope: { - int x = snesinterface.input_poll(DeviceIDSuperScope, SuperScopeX); - int y = snesinterface.input_poll(DeviceIDSuperScope, SuperScopeY); - x += p.superscope.x; - y += p.superscope.y; - p.superscope.x = max(-16, min(256 + 16, x)); - p.superscope.y = max(-16, min(240 + 16, y)); - - latchx = p.superscope.x; - latchy = p.superscope.y; - } break; - - case DeviceJustifier: - case DeviceJustifiers: { - int x1 = snesinterface.input_poll(DeviceIDJustifier1, JustifierX); - int y1 = snesinterface.input_poll(DeviceIDJustifier1, JustifierY); - x1 += p.justifier.x1; - y1 += p.justifier.y1; - p.justifier.x1 = max(-16, min(256 + 16, x1)); - p.justifier.y1 = max(-16, min(240 + 16, y1)); - - int x2 = snesinterface.input_poll(DeviceIDJustifier2, JustifierX); - int y2 = snesinterface.input_poll(DeviceIDJustifier2, JustifierY); - x2 += p.justifier.x2; - y2 += p.justifier.y2; - p.justifier.x2 = max(-16, min(256 + 16, x2)); - p.justifier.y2 = max(-16, min(240 + 16, y2)); - - if(p.justifier.active == 0) { - latchx = p.justifier.x1; - latchy = p.justifier.y1; - } else { - latchx = (p.device == DeviceJustifiers ? p.justifier.x2 : -1); - latchy = (p.device == DeviceJustifiers ? p.justifier.y2 : -1); - } - } break; - } -} - -void SNES::Input::port_set_device(bool portnumber, unsigned device) { - port_t &p = port[portnumber]; - - p.device = device; - p.counter0 = 0; - p.counter1 = 0; - - //set iobit to true if device is capable of latching PPU counters - iobit = port[1].device == DeviceSuperScope - || port[1].device == DeviceJustifier - || port[1].device == DeviceJustifiers; - latchx = -1; - latchy = -1; - - if(device == DeviceSuperScope) { - p.superscope.x = 256 / 2; - p.superscope.y = 240 / 2; - - p.superscope.trigger = false; - p.superscope.cursor = false; - p.superscope.turbo = false; - p.superscope.pause = false; - p.superscope.offscreen = false; - - p.superscope.turbolock = false; - p.superscope.triggerlock = false; - p.superscope.pauselock = false; - } else if(device == DeviceJustifier) { - p.justifier.active = 0; - p.justifier.x1 = 256 / 2; - p.justifier.y1 = 240 / 2; - p.justifier.x2 = -1; - p.justifier.y2 = -1; - - p.justifier.trigger1 = false; - p.justifier.trigger2 = false; - p.justifier.start1 = false; - p.justifier.start2 = false; - } else if(device == DeviceJustifiers) { - p.justifier.active = 0; - p.justifier.x1 = 256 / 2 - 16; - p.justifier.y1 = 240 / 2; - p.justifier.x2 = 256 / 2 + 16; - p.justifier.y2 = 240 / 2; - - p.justifier.trigger1 = false; - p.justifier.trigger2 = false; - p.justifier.start1 = false; - p.justifier.start2 = false; - } -} - -void SNES::Input::poll() { - port[0].counter0 = 0; - port[0].counter1 = 0; - port[1].counter0 = 0; - port[1].counter1 = 0; - - port[1].justifier.active = !port[1].justifier.active; -} - -void SNES::Input::init() { -} - -#endif //ifdef SNES_CPP diff --git a/tools/bsnes/snes/input/input.hpp b/tools/bsnes/snes/input/input.hpp deleted file mode 100755 index ac86b9b..0000000 --- a/tools/bsnes/snes/input/input.hpp +++ /dev/null @@ -1,115 +0,0 @@ -class Input { -public: - enum Device { - DeviceNone, - DeviceJoypad, - DeviceMultitap, - DeviceMouse, - DeviceSuperScope, - DeviceJustifier, - DeviceJustifiers, - }; - - enum DeviceID { - DeviceIDNone, - DeviceIDJoypad1, - DeviceIDJoypad2, - DeviceIDMultitap1A, - DeviceIDMultitap1B, - DeviceIDMultitap1C, - DeviceIDMultitap1D, - DeviceIDMultitap2A, - DeviceIDMultitap2B, - DeviceIDMultitap2C, - DeviceIDMultitap2D, - DeviceIDMouse1, - DeviceIDMouse2, - DeviceIDSuperScope, - DeviceIDJustifier1, - DeviceIDJustifier2, - }; - - enum JoypadID { - JoypadB = 0, JoypadY = 1, - JoypadSelect = 2, JoypadStart = 3, - JoypadUp = 4, JoypadDown = 5, - JoypadLeft = 6, JoypadRight = 7, - JoypadA = 8, JoypadX = 9, - JoypadL = 10, JoypadR = 11, - }; - - enum MouseID { - MouseX = 0, MouseY = 1, - MouseLeft = 2, MouseRight = 3, - }; - - enum SuperScopeID { - SuperScopeX = 0, SuperScopeY = 1, - SuperScopeTrigger = 2, SuperScopeCursor = 3, - SuperScopeTurbo = 4, SuperScopePause = 5, - }; - - enum JustifierID { - JustifierX = 0, JustifierY = 1, - JustifierTrigger = 2, JustifierStart = 3, - }; - - uint8 port_read(bool port); - void port_set_device(bool port, unsigned device); - void init(); - void poll(); - void update(); - - //light guns (Super Scope, Justifier(s)) strobe IOBit whenever the CRT - //beam cannon is detected. this needs to be tested at the cycle level - //(hence inlining here for speed) to avoid 'dead space' during DRAM refresh. - //iobit is updated during port_set_device(), - //latchx, latchy are updated during update() (once per frame) - alwaysinline void tick() { - //only test if Super Scope or Justifier is connected - if(iobit) { - if(ppu.vcounter() == latchy //test Y cursor position - && ppu.hcounter() == latchx << 2 //test X cursor position (cycles == pixels << 2) - && latchy < (ppu.overscan() ? 240 : 225) //verify Y is not offscreen - && latchx < 256 //verify X is not offscreen - ) ppu.latch_counters(); - } - } - struct port_t { - unsigned device; - unsigned counter0; //read counters - unsigned counter1; - - struct superscope_t { - int x, y; - - bool trigger; - bool cursor; - bool turbo; - bool pause; - bool offscreen; - - bool turbolock; - bool triggerlock; - bool pauselock; - } superscope; - - struct justifier_t { - bool active; - - int x1, x2; - int y1, y2; - - bool trigger1, trigger2; - bool start1, start2; - } justifier; - } port[2]; - - -private: - bool iobit; - uint16_t latchx, latchy; - - friend class SNES; - -} input; diff --git a/tools/bsnes/snes/interface/interface.hpp b/tools/bsnes/snes/interface/interface.hpp deleted file mode 100755 index 2656c20..0000000 --- a/tools/bsnes/snes/interface/interface.hpp +++ /dev/null @@ -1,17 +0,0 @@ -//==================== -//SNES interface class -//==================== -//Interfaces SNES core with platform-specific functionality (video, audio, input, ...) - -class SNESInterface { -public: - void video_refresh(uint16_t *data, unsigned pitch, unsigned *line, unsigned width, unsigned height); - void audio_sample(uint16_t l_sample, uint16_t r_sample); - void input_poll(); - int16_t input_poll(unsigned deviceid, unsigned id); - - void init(); - void term(); -}; - -extern SNESInterface snesinterface; diff --git a/tools/bsnes/snes/scheduler/scheduler.cpp b/tools/bsnes/snes/scheduler/scheduler.cpp deleted file mode 100755 index 512e33c..0000000 --- a/tools/bsnes/snes/scheduler/scheduler.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#ifdef SNES_CPP - -Scheduler scheduler; - -void threadentry_cpu() { cpu.enter(); } -void threadentry_smp() { smp.enter(); } -void threadentry_ppu() { ppu.enter(); } -void threadentry_dsp() { dsp.enter(); } - -void Scheduler::enter() { - switch(clock.active) { - case THREAD_CPU: co_switch(thread_cpu); break; - case THREAD_SMP: co_switch(thread_smp); break; - case THREAD_PPU: co_switch(thread_ppu); break; - case THREAD_DSP: co_switch(thread_dsp); break; - } -} - -void Scheduler::exit() { - co_switch(thread_snes); -} - -void Scheduler::init() { - clock.cpu_freq = snes.region() == SNES::NTSC - ? snes.config.cpu.ntsc_clock_rate - : snes.config.cpu.pal_clock_rate; - clock.smp_freq = snes.region() == SNES::NTSC - ? snes.config.smp.ntsc_clock_rate - : snes.config.smp.pal_clock_rate; - - clock.active = THREAD_CPU; - clock.cpuppu = 0; - clock.cpusmp = 0; - clock.smpdsp = 0; - - if(thread_cpu) co_delete(thread_cpu); - if(thread_smp) co_delete(thread_smp); - if(thread_ppu) co_delete(thread_ppu); - if(thread_dsp) co_delete(thread_dsp); - - thread_snes = co_active(); - thread_cpu = co_create(65536 * sizeof(void*), threadentry_cpu); - thread_smp = co_create(65536 * sizeof(void*), threadentry_smp); - thread_ppu = co_create(65536 * sizeof(void*), threadentry_ppu); - thread_dsp = co_create(65536 * sizeof(void*), threadentry_dsp); -} - -Scheduler::Scheduler() { - thread_snes = 0; - thread_cpu = 0; - thread_smp = 0; - thread_ppu = 0; - thread_dsp = 0; -} - -#endif //ifdef SNES_CPP diff --git a/tools/bsnes/snes/scheduler/scheduler.hpp b/tools/bsnes/snes/scheduler/scheduler.hpp deleted file mode 100755 index 114ca2d..0000000 --- a/tools/bsnes/snes/scheduler/scheduler.hpp +++ /dev/null @@ -1,123 +0,0 @@ -class Scheduler { -public: - cothread_t thread_snes; - cothread_t thread_cpu; - cothread_t thread_smp; - cothread_t thread_ppu; - cothread_t thread_dsp; - - enum ActiveThread { - THREAD_CPU, - THREAD_SMP, - THREAD_PPU, - THREAD_DSP, - }; - - struct { - unsigned cpu_freq; - unsigned smp_freq; - - ActiveThread active; - int64 cpuppu; - int64 cpusmp; - int64 smpdsp; - } clock; - - //========== - //CPU <> PPU - //========== - - alwaysinline void sync_cpuppu() { - if(clock.cpuppu < 0) { - clock.active = THREAD_PPU; - co_switch(thread_ppu); - } - } - - alwaysinline void sync_ppucpu() { - if(clock.cpuppu >= 0) { - clock.active = THREAD_CPU; - co_switch(thread_cpu); - } - } - - //========== - //CPU <> SMP - //========== - - alwaysinline void sync_cpusmp() { - if(clock.cpusmp < 0) { - clock.active = THREAD_SMP; - co_switch(thread_smp); - } - } - - alwaysinline void sync_smpcpu() { - if(clock.cpusmp >= 0) { - clock.active = THREAD_CPU; - co_switch(thread_cpu); - } - } - - //========== - //SMP <> DSP - //========== - - alwaysinline void sync_smpdsp() { - if(clock.smpdsp < 0) { - clock.active = THREAD_DSP; - co_switch(thread_dsp); - } - } - - alwaysinline void sync_dspsmp() { - if(clock.smpdsp >= 0) { - clock.active = THREAD_SMP; - co_switch(thread_smp); - } - } - - //====== - //timing - //====== - - alwaysinline void addclocks_cpu(unsigned clocks) { - clock.cpuppu -= clocks; - sync_cpuppu(); - - clock.cpusmp -= clocks * (uint64)clock.smp_freq; - if(clock.cpusmp < -(20000 * (int64)24000000)) sync_cpusmp(); - } - - alwaysinline void addclocks_ppu(unsigned clocks) { - clock.cpuppu += clocks; - sync_ppucpu(); - } - - alwaysinline void addclocks_smp(unsigned clocks) { - clock.cpusmp += clocks * (uint64)clock.cpu_freq; - if(clock.cpusmp > +(20000 * (int64)24000000)) sync_smpcpu(); - - clock.smpdsp -= clocks; - #if !defined(USE_STATE_MACHINE) - sync_smpdsp(); - #else - while(clock.smpdsp < 0) dsp.enter(); - #endif - } - - alwaysinline void addclocks_dsp(unsigned clocks) { - clock.smpdsp += clocks; - #if !defined(USE_STATE_MACHINE) - sync_dspsmp(); - #endif - } - - void enter(); - void exit(); - void init(); - - Scheduler(); -}; - -extern Scheduler scheduler; diff --git a/tools/bsnes/snes/snes.cpp b/tools/bsnes/snes/snes.cpp deleted file mode 100755 index 84b706f..0000000 --- a/tools/bsnes/snes/snes.cpp +++ /dev/null @@ -1,210 +0,0 @@ -#include <../base.hpp> -#include <../chip/chip.hpp> -#include <../cart/cart.hpp> -#define SNES_CPP - -SNES snes; -BUSCORE bus; -CPUCORE cpu; -SMPCORE smp; -DSPCORE dsp; -PPUCORE ppu; - -BSXBase bsxbase; -BSXCart bsxcart; -BSXFlash bsxflash; -SRTC srtc; -SDD1 sdd1; -SPC7110 spc7110; -Cx4 cx4; -DSP1 dsp1; -DSP2 dsp2; -DSP3 dsp3; -DSP4 dsp4; -OBC1 obc1; -ST010 st010; - -#include "scheduler/scheduler.cpp" -#include "tracer/tracer.cpp" - -#include "video/video.cpp" -#include "audio/audio.cpp" -#include "input/input.cpp" - -void SNES::run() { -} - -void SNES::runtoframe() { - scheduler.enter(); -} - -void SNES::init() { - bsxbase.init(); - bsxcart.init(); - bsxflash.init(); - srtc.init(); - sdd1.init(); - spc7110.init(); - cx4.init(); - dsp1.init(); - dsp2.init(); - dsp3.init(); - dsp4.init(); - obc1.init(); - st010.init(); - - video.init(); - audio.init(); - input.init(); - snesinterface.init(); -} - -void SNES::term() { - snesinterface.term(); -} - -void SNES::power() { - snes_region = max(0, min(2, snes.config.region)); - snes_expansion = max(0, min(1, snes.config.expansion_port)); - - if(snes_region == Autodetect) { - snes_region = (cartridge.region() == Cartridge::NTSC ? NTSC : PAL); - } - - scheduler.init(); - - ppu.PPUcounter::reset(); - cpu.power(); - smp.power(); - dsp.power(); - ppu.power(); - bus.power(); - - if(expansion() == ExpansionBSX) bsxbase.power(); - if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.power(); - if(cartridge.bsx_flash_loaded()) bsxflash.power(); - - if(cartridge.has_srtc()) srtc.power(); - if(cartridge.has_sdd1()) sdd1.power(); - if(cartridge.has_spc7110()) spc7110.power(); - if(cartridge.has_cx4()) cx4.power(); - if(cartridge.has_dsp1()) dsp1.power(); - if(cartridge.has_dsp2()) dsp2.power(); - if(cartridge.has_dsp3()) dsp3.power(); - if(cartridge.has_dsp4()) dsp4.power(); - if(cartridge.has_obc1()) obc1.power(); - if(cartridge.has_st010()) st010.power(); - - for(unsigned i = 0x2100; i <= 0x213f; i++) memory::mmio.map(i, ppu); - for(unsigned i = 0x2140; i <= 0x217f; i++) memory::mmio.map(i, cpu); - for(unsigned i = 0x2180; i <= 0x2183; i++) memory::mmio.map(i, cpu); - for(unsigned i = 0x4016; i <= 0x4017; i++) memory::mmio.map(i, cpu); - for(unsigned i = 0x4200; i <= 0x421f; i++) memory::mmio.map(i, cpu); - for(unsigned i = 0x4300; i <= 0x437f; i++) memory::mmio.map(i, cpu); - - if(expansion() == ExpansionBSX) bsxbase.enable(); - if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.enable(); - if(cartridge.bsx_flash_loaded()) bsxflash.enable(); - - if(cartridge.has_srtc()) srtc.enable(); - if(cartridge.has_sdd1()) sdd1.enable(); - if(cartridge.has_spc7110()) spc7110.enable(); - if(cartridge.has_cx4()) cx4.enable(); - if(cartridge.has_dsp1()) dsp1.enable(); - if(cartridge.has_dsp2()) dsp2.enable(); - if(cartridge.has_dsp3()) dsp3.enable(); - if(cartridge.has_dsp4()) dsp4.enable(); - if(cartridge.has_obc1()) obc1.enable(); - if(cartridge.has_st010()) st010.enable(); - - input.port_set_device(0, snes.config.controller_port1); - input.port_set_device(1, snes.config.controller_port2); - input.update(); - video.update(); -} - -void SNES::reset() { - scheduler.init(); - - ppu.PPUcounter::reset(); - cpu.reset(); - smp.reset(); - dsp.reset(); - ppu.reset(); - bus.reset(); - - if(expansion() == ExpansionBSX) bsxbase.reset(); - if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.reset(); - if(cartridge.bsx_flash_loaded()) bsxflash.reset(); - - if(cartridge.has_srtc()) srtc.reset(); - if(cartridge.has_sdd1()) sdd1.reset(); - if(cartridge.has_spc7110()) spc7110.reset(); - if(cartridge.has_cx4()) cx4.reset(); - if(cartridge.has_dsp1()) dsp1.reset(); - if(cartridge.has_dsp2()) dsp2.reset(); - if(cartridge.has_dsp3()) dsp3.reset(); - if(cartridge.has_dsp4()) dsp4.reset(); - if(cartridge.has_obc1()) obc1.reset(); - if(cartridge.has_st010()) st010.reset(); - - input.port_set_device(0, snes.config.controller_port1); - input.port_set_device(1, snes.config.controller_port2); - input.update(); - video.update(); -} - -void SNES::scanline() { - video.scanline(); - - if(ppu.vcounter() == 241) { - input.update(); - video.update(); - scheduler.exit(); - } -} - -void SNES::frame() { -} - -SNES::Region SNES::region() const { - return (SNES::Region)snes_region; -} - -SNES::ExpansionPortDevice SNES::expansion() const { - return (SNES::ExpansionPortDevice)snes_expansion; -} - -SNES::SNES() : snes_region(NTSC), snes_expansion(ExpansionNone) { - config.controller_port1 = Input::DeviceJoypad; - config.controller_port2 = Input::DeviceJoypad; - config.expansion_port = ExpansionBSX; - config.region = Autodetect; - - config.file.autodetect_type = false; - config.file.bypass_patch_crc32 = false; - - config.path.base = ""; - config.path.user = ""; - config.path.current = ""; - config.path.rom = ""; - config.path.save = ""; - config.path.patch = ""; - config.path.cheat = ""; - config.path.data = ""; - config.path.bsx = ""; - config.path.st = ""; - - config.cpu.version = 2; - config.cpu.ntsc_clock_rate = 21477272; - config.cpu.pal_clock_rate = 21281370; - config.cpu.alu_mul_delay = 2; - config.cpu.alu_div_delay = 2; - config.cpu.wram_init_value = 0x55; - - config.smp.ntsc_clock_rate = 32041 * 768; - config.smp.pal_clock_rate = 32041 * 768; - - config.ppu1.version = 1; - config.ppu2.version = 3; -} diff --git a/tools/bsnes/snes/snes.hpp b/tools/bsnes/snes/snes.hpp deleted file mode 100755 index 20fd742..0000000 --- a/tools/bsnes/snes/snes.hpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "interface/interface.hpp" -#include "scheduler/scheduler.hpp" -#include "tracer/tracer.hpp" - -class VideoFilter; - -class SNES { -public: - enum Region { NTSC = 0, PAL = 1 }; - enum RegionAutodetect { Autodetect = 2 }; - enum ExpansionPortDevice { ExpansionNone = 0, ExpansionBSX = 1 }; - - struct Config { - unsigned controller_port1; - unsigned controller_port2; - unsigned expansion_port; - unsigned region; - - struct File { - bool autodetect_type; - bool bypass_patch_crc32; - } file; - - struct Path { - string base; //binary path - string user; //user profile path (bsnes.cfg, ...) - string current; //current working directory (path to currently loaded cartridge) - string rom, save, patch, cheat, data; - string bsx, st; - } path; - - struct CPU { - unsigned version; - unsigned ntsc_clock_rate; - unsigned pal_clock_rate; - unsigned alu_mul_delay; - unsigned alu_div_delay; - unsigned wram_init_value; - } cpu; - - struct SMP { - unsigned ntsc_clock_rate; - unsigned pal_clock_rate; - } smp; - - struct PPU1 { - unsigned version; - } ppu1; - - struct PPU2 { - unsigned version; - } ppu2; - } config; - - //system functions - virtual void run(); - virtual void runtoframe(); - - virtual void init(); - virtual void term(); - virtual void power(); - virtual void reset(); - - virtual void frame(); - virtual void scanline(); - - //return *active* region / expansion port device information - //settings cached upon power-on - Region region() const; - ExpansionPortDevice expansion() const; - - #include "video/video.hpp" - #include "audio/audio.hpp" - #include "input/input.hpp" - - SNES(); - virtual ~SNES() {} - -private: - unsigned snes_region; - unsigned snes_expansion; -}; - -extern SNES snes; diff --git a/tools/bsnes/snes/tracer/tracer.cpp b/tools/bsnes/snes/tracer/tracer.cpp deleted file mode 100755 index dbfdb7b..0000000 --- a/tools/bsnes/snes/tracer/tracer.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#ifdef SNES_CPP - -Tracer tracer; - -void tprintf(const char *s, ...) { - if(tracer.enabled() == false) return; - - char str[4096]; - va_list args; - va_start(args, s); - vsprintf(str, s, args); - va_end(args); - fprintf(tracer.fp, "%s\r\n", str); -} - -void Tracer::trace_cpuop() { - if(enabled() == false) return; - if(cpuop_enabled() == false) return; - if(cpu.in_opcode() == true) return; - - if(cpuopmask_enabled() == true) { - unsigned addr = cpu.regs.pc.d; - if(settings.cpuopmasktbl[addr >> 3] & 0x80 >> (addr & 7)) return; - settings.cpuopmasktbl[addr >> 3] |= 0x80 >> (addr & 7); - } - - char t[1024]; - cpu.disassemble_opcode(t); - fprintf(fp, "%s\r\n", t); -} - -void Tracer::trace_smpop() { - if(enabled() == false) return; - if(smpop_enabled() == false) return; - if(smp.in_opcode() == true) return; - - if(smpopmask_enabled() == true) { - unsigned addr = smp.regs.pc; - if(settings.smpopmasktbl[addr >> 3] & 0x80 >> (addr & 7)) return; - settings.smpopmasktbl[addr >> 3] |= 0x80 >> (addr & 7); - } - - char t[1024]; - smp.disassemble_opcode(t); - fprintf(fp, "%s\r\n", t); -} - -void Tracer::enable(bool en) { - if(en == true && enabled() == false) { - fp = fopen(Cartridge::filepath("trace.log", snes.config.path.data), "wb"); - } else if(en == false && enabled() == true) { - fclose(fp); - fp = 0; - } - - settings.enabled = en; -} - -void Tracer::cpuopmask_enable(bool en) { - if(en == true && cpuopmask_enabled() == false) { - settings.cpuopmasktbl = new(zeromemory) uint8_t[0x200000]; - } else if(en == false && cpuopmask_enabled() == true) { - delete[] settings.cpuopmasktbl; - } - - settings.cpuopmask = en; -} - -void Tracer::smpopmask_enable(bool en) { - if(en == true && smpopmask_enabled() == false) { - settings.smpopmasktbl = new(zeromemory) uint8_t[0x2000]; - } else if(en == false && smpopmask_enabled() == true) { - delete[] settings.smpopmasktbl; - } - - settings.smpopmask = en; -} - -Tracer::Tracer() { - fp = 0; - - settings.cpuop = false; - settings.cpuopmask = false; - settings.cpuopmasktbl = 0; - - settings.smpop = false; - settings.smpopmask = false; - settings.smpopmasktbl = 0; -} - -Tracer::~Tracer() { -} - -#endif //ifdef SNES_CPP diff --git a/tools/bsnes/snes/tracer/tracer.hpp b/tools/bsnes/snes/tracer/tracer.hpp deleted file mode 100755 index 882a2c2..0000000 --- a/tools/bsnes/snes/tracer/tracer.hpp +++ /dev/null @@ -1,45 +0,0 @@ -void tprintf(const char *s, ...); - -class Tracer { -private: - -FILE *fp; - -struct { - bool enabled; - - bool cpuop; - bool cpuopmask; - uint8 *cpuopmasktbl; - - bool smpop; - bool smpopmask; - uint8 *smpopmasktbl; -} settings; - -public: - void enable(bool en); - bool enabled() { return settings.enabled; } - - void cpuop_enable(bool en) { settings.cpuop = en; } - bool cpuop_enabled() { return settings.cpuop; } - - void cpuopmask_enable(bool en); - bool cpuopmask_enabled() { return settings.cpuopmask; } - - void smpop_enable(bool en) { settings.smpop = en; } - bool smpop_enabled() { return settings.smpop; } - - void smpopmask_enable(bool en); - bool smpopmask_enabled() { return settings.smpopmask; } - - void trace_cpuop(); - void trace_smpop(); - - Tracer(); - ~Tracer(); - - friend void tprintf(const char *s, ...); -}; - -extern Tracer tracer; diff --git a/tools/bsnes/snes/video/video.cpp b/tools/bsnes/snes/video/video.cpp deleted file mode 100755 index a88712c..0000000 --- a/tools/bsnes/snes/video/video.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#ifdef SNES_CPP - -const uint8_t SNES::Video::cursor[15 * 15] = { - 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0, - 0,0,0,0,1,1,2,2,2,1,1,0,0,0,0, - 0,0,0,1,2,2,1,2,1,2,2,1,0,0,0, - 0,0,1,2,1,1,0,1,0,1,1,2,1,0,0, - 0,1,2,1,0,0,0,1,0,0,0,1,2,1,0, - 0,1,2,1,0,0,1,2,1,0,0,1,2,1,0, - 1,2,1,0,0,1,1,2,1,1,0,0,1,2,1, - 1,2,2,1,1,2,2,2,2,2,1,1,2,2,1, - 1,2,1,0,0,1,1,2,1,1,0,0,1,2,1, - 0,1,2,1,0,0,1,2,1,0,0,1,2,1,0, - 0,1,2,1,0,0,0,1,0,0,0,1,2,1,0, - 0,0,1,2,1,1,0,1,0,1,1,2,1,0,0, - 0,0,0,1,2,2,1,2,1,2,2,1,0,0,0, - 0,0,0,0,1,1,2,2,2,1,1,0,0,0,0, - 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0, -}; - -void SNES::Video::draw_cursor(uint16_t color, int x, int y) { - for(int cy = 0; cy < 15; cy++) { - int vy = y + cy - 7; - if(vy <= 0 || vy >= 240) continue; //do not draw offscreen - - bool hires = (pline_width[vy] == 512); - for(int cx = 0; cx < 15; cx++) { - int vx = x + cx - 7; - if(vx < 0 || vx >= 256) continue; //do not draw offscreen - uint8_t pixel = cursor[cy * 15 + cx]; - if(pixel == 0) continue; - uint16_t pixelcolor = (pixel == 1) ? 0 : color; - - if(hires == false) { - *((uint16_t*)ppu.output + vy * 1024 + 0 + vx) = pixelcolor; - *((uint16_t*)ppu.output + vy * 1024 + 512 + vx) = pixelcolor; - } else { - *((uint16_t*)ppu.output + vy * 1024 + 0 + vx * 2 + 0) = pixelcolor; - *((uint16_t*)ppu.output + vy * 1024 + 512 + vx * 2 + 0) = pixelcolor; - *((uint16_t*)ppu.output + vy * 1024 + 0 + vx * 2 + 1) = pixelcolor; - *((uint16_t*)ppu.output + vy * 1024 + 512 + vx * 2 + 1) = pixelcolor; - } - } - } -} - -void SNES::Video::update() { - uint16_t *data = (uint16_t*)ppu.output; - unsigned width, height; - - switch(snes.input.port[1].device) { - case SNES::Input::DeviceSuperScope: draw_cursor(0x001f, snes.input.port[1].superscope.x, snes.input.port[1].superscope.y); break; - case SNES::Input::DeviceJustifiers: draw_cursor(0x02e0, snes.input.port[1].justifier.x2, snes.input.port[1].justifier.y2); //fallthrough - case SNES::Input::DeviceJustifier: draw_cursor(0x001f, snes.input.port[1].justifier.x1, snes.input.port[1].justifier.y1); break; - } - - unsigned yoffset = 1; //scanline 0 is always black, skip this line for video output - if(mode == ModeNTSC && ppu.overscan()) yoffset += 8; //NTSC overscan centers x240 height image - - switch(mode) { default: - case ModeNTSC: { width = 256; height = 224; } break; - case ModePAL: { width = 256; height = 239; } break; - } - - if(frame_hires) width <<= 1; - if(frame_interlace) height <<= 1; - - snesinterface.video_refresh( - data + yoffset * 1024, - /* pitch = */ height <= 240 ? 2048 : 1024, - /* line[] = */ height <= 240 ? (pline_width + yoffset) : (iline_width + yoffset * 2), - width, height - ); - - frame_hires = false; - frame_interlace = false; -} - -void SNES::Video::scanline() { - unsigned y = ppu.vcounter(); - if(y >= 240) return; - - unsigned width = (ppu.hires() == false ? 256 : 512); - pline_width[y] = width; - iline_width[y * 2 + (int)ppu.field()] = width; - - frame_hires |= ppu.hires(); - frame_interlace |= ppu.interlace(); -} - -void SNES::Video::set_mode(Mode mode_) { - mode = mode_; -} - -void SNES::Video::init() { - for(unsigned i = 0; i < 240; i++) pline_width[i] = 256; - for(unsigned i = 0; i < 480; i++) iline_width[i] = 256; - frame_hires = false; - frame_interlace = false; - set_mode(ModeNTSC); -} - -#endif //ifdef SNES_CPP diff --git a/tools/bsnes/snes/video/video.hpp b/tools/bsnes/snes/video/video.hpp deleted file mode 100755 index 310b1d9..0000000 --- a/tools/bsnes/snes/video/video.hpp +++ /dev/null @@ -1,25 +0,0 @@ -class Video { -public: - enum Mode { - ModeNTSC, - ModePAL, - }; - void set_mode(Mode); - -private: - Mode mode; - bool frame_hires; - bool frame_interlace; - - unsigned pline_width[240]; //progressive - unsigned iline_width[480]; //interlace - - void update(); - void scanline(); - void init(); - - static const uint8_t cursor[15 * 15]; - void draw_cursor(uint16_t color, int x, int y); - - friend class SNES; -} video; diff --git a/tools/bsnes/ui_qt/Makefile b/tools/bsnes/ui_qt/Makefile index 05bfa76..e5d9e42 100755 --- a/tools/bsnes/ui_qt/Makefile +++ b/tools/bsnes/ui_qt/Makefile @@ -1,94 +1,66 @@ -############################## -### platform configuration ### -############################## - objects := main $(if $(call streq,$(platform),win),resource) $(objects) - -ifeq ($(platform),mac) - moc = moc - rcc = rcc - link +=-F/Developer/SDKs/Qt/lib \ - -L/Developer/SDKs/Qt/lib \ - -framework QtOpenGL \ - -framework QtGui \ - -framework Carbon \ - -framework AppKit \ - -framework QtCore - qtflags= -I/Developer/SDKs/Qt/include/ \ - -I/Developer/SDKs/Qt/include/Qt \ - -I/Developer/SDKs/Qt/include/QtCore \ - -I/Developer/SDKs/Qt/include/QtGui - + +ifeq ($(moc),) +moc := moc +endif + +ifeq ($(rcc),) +rcc := rcc endif -ifeq ($(platform),x) # X11 - moc = moc-qt4 - rcc = rcc - link += $(call mklib,Xtst) - link += `pkg-config --libs QtCore QtGui` - qtflags = `pkg-config --cflags QtCore QtGui` -else ifeq ($(platform),win) # Windows - qtdir = c:/qt450 - link += $(call mklibpath,$(qtdir)/lib) - link += $(call mklibpath,$(qtdir)/plugins/imageformats) +ifeq ($(platform),x) + #qtflags = `pkg-config --cflags QtCore QtGui` + link += `pkg-config --libs QtCore QtGui` + qtflags = -I/Developer/SDKs/Qt/include -I/Developer/SDKs/Qt/include/QtCore -I/Developer/SDKs/Qt/include/QtGui -I/System/Library/Frameworks/OpenGL.framework/Versions/A/Headers -I/System/Library/Frameworks/AGL.framework/Headers -I/Developer/SDKs/Qt/include/QtOpenGL + + link = -F/Developer/SDKs/Qt/lib -L/Developer/SDKs/Qt/lib -framework QtOpenGL -L/Developer/SDKs/Qt/lib -F/Developer/SDKs/Qt/lib -framework QtGui -framework Carbon -framework AppKit -framework QtCore -lz -lm -framework ApplicationServices -framework OpenGL -framework AGL -L/opt/local/lib -lSDLmain -lSDL -Wl,-framework,Cocoa -lXext -lX11 -lz + + link = -F/Developer/SDKs/Qt/lib -L/Developer/SDKs/Qt/lib -framework QtOpenGL -L/Developer/SDKs/Qt/lib -F/Developer/SDKs/Qt/lib -framework QtGui -framework Carbon -framework AppKit -framework QtCore -lz -lm -framework ApplicationServices -framework OpenGL -framework AGL -L/opt/local/lib -lSDL -Wl,-framework,Cocoa -lXext -lX11 -lz -lgl + + + +else ifeq ($(platform),win) + ifeq ($(qtpath),) + # find Qt install directory from PATH environment variable + qtpath := $(foreach path,$(subst ;, ,$(PATH)),$(if $(wildcard $(path)/$(moc).exe),$(path))) + qtpath := $(strip $(qtpath)) + qtpath := $(subst \,/,$(qtpath)) + qtpath := $(patsubst %/bin,%,$(qtpath)) + endif - link += $(call mklib,mingw32) - link += $(call mklib,qtmain) - link += $(call mklib,QtGui) - link += $(call mklib,comdlg32) - link += $(call mklib,oleaut32) - link += $(call mklib,imm32) - link += $(call mklib,winmm) - link += $(call mklib,winspool) - link += $(call mklib,msimg32) - link += $(call mklib,QtCore) - link += $(call mklib,ole32) - link += $(call mklib,advapi32) - link += $(call mklib,ws2_32) - link += $(call mklib,uuid) - link += $(call mklib,gdi32) + qtflags := -I$(qtpath)/include + qtflags += -I$(qtpath)/include/QtCore + qtflags += -I$(qtpath)/include/QtGui + + link += -L$(qtpath)/lib + link += -L$(qtpath)/plugins/imageformats + + link += -lmingw32 -lqtmain -lQtGui -lcomdlg32 -loleaut32 -limm32 -lwinmm + link += -lwinspool -lmsimg32 -lQtCore -lole32 -ladvapi32 -lws2_32 -luuid -lgdi32 # optional image-file support: - # link += $(call mklib,qjpeg) - # link += $(call mklib,qmng) - - qtflags = $(call mkincpath,$(qtdir)/include) - qtflags += $(call mkincpath,$(qtdir)/include/QtCore) - qtflags += $(call mkincpath,$(qtdir)/include/QtGui) + # link += -lqjpeg -lqmng endif -moc_objects = \ - $(ui)/base/main.moc \ - $(ui)/base/loader.moc \ - $(ui)/base/htmlviewer.moc \ - $(ui)/base/about.moc \ - $(ui)/settings/settings.moc \ - $(ui)/settings/video.moc \ - $(ui)/settings/audio.moc \ - $(ui)/settings/input.moc \ - $(ui)/settings/paths.moc \ - $(ui)/settings/cheateditor.moc \ - $(ui)/settings/advanced.moc \ - $(ui)/settings/utility/inputcapture.moc \ - $(ui)/settings/utility/codeeditor.moc \ +moc_headers := $(call rwildcard,$(ui)/,%.mh) +moc_objects := $(patsubst %.mh,%.moc,$(moc_headers)) ############# ### rules ### ############# -%.moc: $<; $(moc) $(patsubst %.moc,%.hpp,$@) -o $@ -$(foreach object,$(moc_objects),$(eval $(object): $(patsubst %.moc,%.hpp,$(object)))) +# automatically run moc on all .mh (.MocHeader) files +%.moc: $<; $(moc) -f $< -o $@ +$(foreach f,$(moc_objects),$(eval $f: $(patsubst %.moc,%.mh,$f))) -obj/main.$(obj): $(ui)/main.cpp \ -$(ui)/* $(ui)/input/* $(ui)/utility/* $(ui)/base/* $(ui)/settings/* $(ui)/settings/utility/* \ -data/* +obj/main.o: $(ui)/main.cpp $(call rwildcard,$(ui)/) $(call compile,$(qtflags)) $(ui)/resource/resource.rcc: $(ui)/resource/resource.qrc data/* $(rcc) $(ui)/resource/resource.qrc -o $(ui)/resource/resource.rcc -obj/resource.$(obj): $(ui)/resource/resource.rc - windres $(ui)/resource/resource.rc obj/resource.$(obj) +obj/resource.o: $(ui)/resource/resource.rc + windres $(ui)/resource/resource.rc obj/resource.o ############### ### targets ### @@ -96,5 +68,5 @@ obj/resource.$(obj): $(ui)/resource/resource.rc ui_build: $(ui)/resource/resource.rcc $(moc_objects); ui_clean: - -$(foreach object,$(moc_objects),@$(call delete,$(object))) + -$(foreach f,$(moc_objects),@$(call delete,$f)) -@$(call delete,$(ui)/resource/resource.rcc) diff --git a/tools/bsnes/ui_qt/base/about.hpp b/tools/bsnes/ui_qt/base/about.hpp deleted file mode 100755 index 8312394..0000000 --- a/tools/bsnes/ui_qt/base/about.hpp +++ /dev/null @@ -1,16 +0,0 @@ -class AboutWindow : public QObject { - Q_OBJECT - -public: - QWidget *window; - QVBoxLayout *layout; - struct Logo : public QWidget { - void paintEvent(QPaintEvent*); - } *logo; - QLabel *info; - QWidget *spacer; - - void setup(); - -public slots: -} *winAbout; diff --git a/tools/bsnes/ui_qt/base/htmlviewer.hpp b/tools/bsnes/ui_qt/base/htmlviewer.hpp deleted file mode 100755 index b76fdfc..0000000 --- a/tools/bsnes/ui_qt/base/htmlviewer.hpp +++ /dev/null @@ -1,13 +0,0 @@ -class HtmlViewerWindow : public QObject { - Q_OBJECT - -public: - QWidget *window; - QVBoxLayout *layout; - QTextBrowser *document; - - void setup(); - void show(const char *title, const char *htmlData); - -public slots: -} *winHtmlViewer; diff --git a/tools/bsnes/ui_qt/base/loader.cpp b/tools/bsnes/ui_qt/base/loader.cpp index 1842205..e19720b 100755 --- a/tools/bsnes/ui_qt/base/loader.cpp +++ b/tools/bsnes/ui_qt/base/loader.cpp @@ -93,7 +93,7 @@ void LoaderWindow::loadBsxSlottedCartridge(const char *filebase, const char *fil slot1File->setText(fileSlot1); syncUi(); - mode = ModeBsxSlotted; + mode = SNES::Cartridge::ModeBsxSlotted; showWindow("Load BS-X Slotted Cartridge"); } @@ -109,7 +109,7 @@ void LoaderWindow::loadBsxCartridge(const char *fileBase, const char *fileSlot1) slot1File->setText(fileSlot1); syncUi(); - mode = ModeBsx; + mode = SNES::Cartridge::ModeBsx; showWindow("Load BS-X Cartridge"); } @@ -127,8 +127,24 @@ void LoaderWindow::loadSufamiTurboCartridge(const char *fileBase, const char *fi slot2File->setText(fileSlot2); syncUi(); - mode = ModeSufamiTurbo; + mode = SNES::Cartridge::ModeSufamiTurbo; showWindow("Load Sufami Turbo Cartridge"); +} + +void LoaderWindow::loadSuperGameBoyCartridge(const char *fileBase, const char *fileSlot1) { + window->hide(); + baseLabel->show(), baseFile->show(), baseBrowse->show(), baseClear->show(); + slot1Label->show(), slot1File->show(), slot1Browse->show(), slot1Clear->show(); + slot2Label->hide(), slot2File->hide(), slot2Browse->hide(), slot2Clear->hide(); + + slot1Label->setText("Game Boy cartridge:"); + + baseFile->setText(fileBase); + slot1File->setText(fileSlot1); + + syncUi(); + mode = SNES::Cartridge::ModeSuperGameBoy; + showWindow("Load Super Game Boy Cartridge"); } void LoaderWindow::showWindow(const char *title) { @@ -177,18 +193,23 @@ void LoaderWindow::onLoad() { string slot2 = slot2File->text().toUtf8().data(); switch(mode) { - case ModeBsxSlotted: { + case SNES::Cartridge::ModeBsxSlotted: { utility.loadCartridgeBsxSlotted(base, slot1); } break; - case ModeBsx: { - snes.config.path.bsx = base; + case SNES::Cartridge::ModeBsx: { + config.path.bsx = base; utility.loadCartridgeBsx(base, slot1); } break; - case ModeSufamiTurbo: { - snes.config.path.st = base; + case SNES::Cartridge::ModeSufamiTurbo: { + config.path.st = base; utility.loadCartridgeSufamiTurbo(base, slot1, slot2); + } break; + + case SNES::Cartridge::ModeSuperGameBoy: { + config.path.sgb = base; + utility.loadCartridgeSuperGameBoy(base, slot1); } break; } } diff --git a/tools/bsnes/ui_qt/base/loader.hpp b/tools/bsnes/ui_qt/base/loader.hpp deleted file mode 100755 index fdf6d2e..0000000 --- a/tools/bsnes/ui_qt/base/loader.hpp +++ /dev/null @@ -1,45 +0,0 @@ -class LoaderWindow : public QObject { - Q_OBJECT - -public: - QWidget *window; - QVBoxLayout *layout; - QGridLayout *grid; - QLabel *baseLabel; - QLineEdit *baseFile; - QPushButton *baseBrowse; - QPushButton *baseClear; - QLabel *slot1Label; - QLineEdit *slot1File; - QPushButton *slot1Browse; - QPushButton *slot1Clear; - QLabel *slot2Label; - QLineEdit *slot2File; - QPushButton *slot2Browse; - QPushButton *slot2Clear; - QHBoxLayout *controls; - QPushButton *load; - QPushButton *cancel; - QWidget *spacer; - - void setup(); - void syncUi(); - void loadBsxSlottedCartridge(const char*, const char*); - void loadBsxCartridge(const char*, const char*); - void loadSufamiTurboCartridge(const char*, const char*, const char*); - -public slots: - void selectBaseCartridge(); - void clearBaseCartridge(); - void selectSlot1Cartridge(); - void clearSlot1Cartridge(); - void selectSlot2Cartridge(); - void clearSlot2Cartridge(); - - void onLoad(); - void onCancel(); - -private: - enum mode_t { ModeBsxSlotted, ModeBsx, ModeSufamiTurbo } mode; - void showWindow(const char *title); -} *winLoader; diff --git a/tools/bsnes/ui_qt/base/main.cpp b/tools/bsnes/ui_qt/base/main.cpp index 6d2d8bd..8e60bfd 100755 --- a/tools/bsnes/ui_qt/base/main.cpp +++ b/tools/bsnes/ui_qt/base/main.cpp @@ -3,7 +3,7 @@ void MainWindow::setup() { window->setObjectName("main-window"); window->setWindowTitle(BSNES_TITLE); - system = window->menuBar()->addMenu("&System"); + system = window->menuBar()->addMenu("System"); system_load = system->addAction("&Load Cartridge ..."); system->addSeparator(); system_power = system->addMenu("&Power"); @@ -41,7 +41,7 @@ void MainWindow::setup() { system_exit = system->addAction("E&xit"); system_exit->setMenuRole(QAction::QuitRole); - settings = window->menuBar()->addMenu("S&ettings"); + settings = window->menuBar()->addMenu("Settings"); settings_videoMode = settings->addMenu("&Video Mode"); settings_videoMode_1x = settings_videoMode->addAction("Scale &1x"); settings_videoMode_1x->setCheckable(true); @@ -110,7 +110,7 @@ void MainWindow::setup() { settings_configuration = settings->addAction("&Configuration ..."); settings_configuration->setMenuRole(QAction::PreferencesRole); - help = window->menuBar()->addMenu("&Help"); + help = window->menuBar()->addMenu("Help"); help_documentation = help->addAction("Documentation ..."); help_license = help->addAction("License ..."); help->addSeparator(); @@ -195,22 +195,22 @@ void MainWindow::setup() { } void MainWindow::syncUi() { - system_power->setEnabled(cartridge.loaded()); + system_power->setEnabled(SNES::cartridge.loaded()); system_power_on->setChecked (application.power == true); system_power_off->setChecked(application.power == false); - system_reset->setEnabled(cartridge.loaded() && application.power); + system_reset->setEnabled(SNES::cartridge.loaded() && application.power); - system_port1_none->setChecked (snes.config.controller_port1 == SNES::Input::DeviceNone); - system_port1_joypad->setChecked (snes.config.controller_port1 == SNES::Input::DeviceJoypad); - system_port1_multitap->setChecked (snes.config.controller_port1 == SNES::Input::DeviceMultitap); - system_port1_mouse->setChecked (snes.config.controller_port1 == SNES::Input::DeviceMouse); - system_port2_none->setChecked (snes.config.controller_port2 == SNES::Input::DeviceNone); - system_port2_joypad->setChecked (snes.config.controller_port2 == SNES::Input::DeviceJoypad); - system_port2_multitap->setChecked (snes.config.controller_port2 == SNES::Input::DeviceMultitap); - system_port2_mouse->setChecked (snes.config.controller_port2 == SNES::Input::DeviceMouse); - system_port2_superscope->setChecked(snes.config.controller_port2 == SNES::Input::DeviceSuperScope); - system_port2_justifier->setChecked (snes.config.controller_port2 == SNES::Input::DeviceJustifier); - system_port2_justifiers->setChecked(snes.config.controller_port2 == SNES::Input::DeviceJustifiers); + system_port1_none->setChecked (SNES::config.controller_port1 == SNES::Input::DeviceNone); + system_port1_joypad->setChecked (SNES::config.controller_port1 == SNES::Input::DeviceJoypad); + system_port1_multitap->setChecked (SNES::config.controller_port1 == SNES::Input::DeviceMultitap); + system_port1_mouse->setChecked (SNES::config.controller_port1 == SNES::Input::DeviceMouse); + system_port2_none->setChecked (SNES::config.controller_port2 == SNES::Input::DeviceNone); + system_port2_joypad->setChecked (SNES::config.controller_port2 == SNES::Input::DeviceJoypad); + system_port2_multitap->setChecked (SNES::config.controller_port2 == SNES::Input::DeviceMultitap); + system_port2_mouse->setChecked (SNES::config.controller_port2 == SNES::Input::DeviceMouse); + system_port2_superscope->setChecked(SNES::config.controller_port2 == SNES::Input::DeviceSuperScope); + system_port2_justifier->setChecked (SNES::config.controller_port2 == SNES::Input::DeviceJustifier); + system_port2_justifiers->setChecked(SNES::config.controller_port2 == SNES::Input::DeviceJustifiers); settings_videoMode_1x->setChecked (config.video.context->multiplier == 1); settings_videoMode_2x->setChecked (config.video.context->multiplier == 2); @@ -252,17 +252,17 @@ void MainWindow::powerOn() { utility.modifySystemState(Utility::PowerOn); } void MainWindow::powerOff() { utility.modifySystemState(Utility::PowerOff); } void MainWindow::reset() { utility.modifySystemState(Utility::Reset); } -void MainWindow::setPort1None() { snes.config.controller_port1 = SNES::Input::DeviceNone; utility.updateControllers(); syncUi(); } -void MainWindow::setPort1Joypad() { snes.config.controller_port1 = SNES::Input::DeviceJoypad; utility.updateControllers(); syncUi(); } -void MainWindow::setPort1Multitap() { snes.config.controller_port1 = SNES::Input::DeviceMultitap; utility.updateControllers(); syncUi(); } -void MainWindow::setPort1Mouse() { snes.config.controller_port1 = SNES::Input::DeviceMouse; utility.updateControllers(); syncUi(); } -void MainWindow::setPort2None() { snes.config.controller_port2 = SNES::Input::DeviceNone; utility.updateControllers(); syncUi(); } -void MainWindow::setPort2Joypad() { snes.config.controller_port2 = SNES::Input::DeviceJoypad; utility.updateControllers(); syncUi(); } -void MainWindow::setPort2Multitap() { snes.config.controller_port2 = SNES::Input::DeviceMultitap; utility.updateControllers(); syncUi(); } -void MainWindow::setPort2Mouse() { snes.config.controller_port2 = SNES::Input::DeviceMouse; utility.updateControllers(); syncUi(); } -void MainWindow::setPort2SuperScope() { snes.config.controller_port2 = SNES::Input::DeviceSuperScope; utility.updateControllers(); syncUi(); } -void MainWindow::setPort2Justifier() { snes.config.controller_port2 = SNES::Input::DeviceJustifier; utility.updateControllers(); syncUi(); } -void MainWindow::setPort2Justifiers() { snes.config.controller_port2 = SNES::Input::DeviceJustifiers; utility.updateControllers(); syncUi(); } +void MainWindow::setPort1None() { SNES::config.controller_port1 = SNES::Input::DeviceNone; utility.updateControllers(); syncUi(); } +void MainWindow::setPort1Joypad() { SNES::config.controller_port1 = SNES::Input::DeviceJoypad; utility.updateControllers(); syncUi(); } +void MainWindow::setPort1Multitap() { SNES::config.controller_port1 = SNES::Input::DeviceMultitap; utility.updateControllers(); syncUi(); } +void MainWindow::setPort1Mouse() { SNES::config.controller_port1 = SNES::Input::DeviceMouse; utility.updateControllers(); syncUi(); } +void MainWindow::setPort2None() { SNES::config.controller_port2 = SNES::Input::DeviceNone; utility.updateControllers(); syncUi(); } +void MainWindow::setPort2Joypad() { SNES::config.controller_port2 = SNES::Input::DeviceJoypad; utility.updateControllers(); syncUi(); } +void MainWindow::setPort2Multitap() { SNES::config.controller_port2 = SNES::Input::DeviceMultitap; utility.updateControllers(); syncUi(); } +void MainWindow::setPort2Mouse() { SNES::config.controller_port2 = SNES::Input::DeviceMouse; utility.updateControllers(); syncUi(); } +void MainWindow::setPort2SuperScope() { SNES::config.controller_port2 = SNES::Input::DeviceSuperScope; utility.updateControllers(); syncUi(); } +void MainWindow::setPort2Justifier() { SNES::config.controller_port2 = SNES::Input::DeviceJustifier; utility.updateControllers(); syncUi(); } +void MainWindow::setPort2Justifiers() { SNES::config.controller_port2 = SNES::Input::DeviceJustifiers; utility.updateControllers(); syncUi(); } void MainWindow::quit() { application.terminate = true; @@ -356,7 +356,7 @@ void CanvasObject::dropEvent(QDropEvent *event) { //custom video render and mouse capture functionality QPaintEngine* CanvasWidget::paintEngine() const { - if(cartridge.loaded()) return 0; + if(SNES::cartridge.loaded()) return 0; return QWidget::paintEngine(); } diff --git a/tools/bsnes/ui_qt/base/main.hpp b/tools/bsnes/ui_qt/base/main.hpp deleted file mode 100755 index f24638a..0000000 --- a/tools/bsnes/ui_qt/base/main.hpp +++ /dev/null @@ -1,129 +0,0 @@ -class CanvasObject : public QWidget { -public: - void dragEnterEvent(QDragEnterEvent*); - void dropEvent(QDropEvent*); -}; - -class CanvasWidget : public CanvasObject { -public: - QPaintEngine* paintEngine() const; - void mouseReleaseEvent(QMouseEvent*); - void paintEvent(QPaintEvent*); -}; - -class MainWindow : public QObject { - Q_OBJECT - -public: - struct Window : public QMainWindow { - void closeEvent(QCloseEvent*); - } *window; - QVBoxLayout *layout; - QMenu *system; - QAction *system_load; - QMenu *system_power; - QAction *system_power_on; - QAction *system_power_off; - QAction *system_reset; - QMenu *system_port1; - QAction *system_port1_none; - QAction *system_port1_joypad; - QAction *system_port1_multitap; - QAction *system_port1_mouse; - QMenu *system_port2; - QAction *system_port2_none; - QAction *system_port2_joypad; - QAction *system_port2_multitap; - QAction *system_port2_mouse; - QAction *system_port2_superscope; - QAction *system_port2_justifier; - QAction *system_port2_justifiers; - QAction *system_exit; - QMenu *settings; - QMenu *settings_videoMode; - QAction *settings_videoMode_1x; - QAction *settings_videoMode_2x; - QAction *settings_videoMode_3x; - QAction *settings_videoMode_4x; - QAction *settings_videoMode_max; - QAction *settings_videoMode_correctAspectRatio; - QAction *settings_videoMode_fullscreen; - QAction *settings_videoMode_ntsc; - QAction *settings_videoMode_pal; - QMenu *settings_videoFilter; - QAction *settings_videoFilter_point; - QAction *settings_videoFilter_linear; - QAction *settings_videoFilter_none; - QAction *settings_videoFilter_scanline; - QAction *settings_videoFilter_scale2x; - QAction *settings_videoFilter_hq2x; - QAction *settings_videoFilter_ntsc; - QAction *settings_muteAudio; - QMenu *settings_emulationSpeed; - QAction *settings_emulationSpeed_slowest; - QAction *settings_emulationSpeed_slow; - QAction *settings_emulationSpeed_normal; - QAction *settings_emulationSpeed_fast; - QAction *settings_emulationSpeed_fastest; - QAction *settings_emulationSpeed_syncVideo; - QAction *settings_emulationSpeed_syncAudio; - QAction *settings_configuration; - QMenu *help; - QAction *help_documentation; - QAction *help_license; - QAction *help_about; - // - CanvasObject *canvasContainer; - QVBoxLayout *canvasLayout; - CanvasWidget *canvas; - QLabel *systemState; - - void setup(); - void syncUi(); - -public slots: - void loadCartridge(); - void powerOn(); - void powerOff(); - void reset(); - void setPort1None(); - void setPort1Joypad(); - void setPort1Multitap(); - void setPort1Mouse(); - void setPort2None(); - void setPort2Joypad(); - void setPort2Multitap(); - void setPort2Mouse(); - void setPort2SuperScope(); - void setPort2Justifier(); - void setPort2Justifiers(); - void quit(); - void setVideoMode1x(); - void setVideoMode2x(); - void setVideoMode3x(); - void setVideoMode4x(); - void setVideoModeMax(); - void toggleAspectCorrection(); - void toggleFullscreen(); - void setVideoNtsc(); - void setVideoPal(); - void setPointFilter(); - void setLinearFilter(); - void setNoFilter(); - void setScanlineFilter(); - void setScale2xFilter(); - void setHq2xFilter(); - void setNtscFilter(); - void muteAudio(); - void setSpeedSlowest(); - void setSpeedSlow(); - void setSpeedNormal(); - void setSpeedFast(); - void setSpeedFastest(); - void syncVideo(); - void syncAudio(); - void showConfigWindow(); - void showDocumentation(); - void showLicense(); - void showAbout(); -} *winMain; diff --git a/tools/bsnes/ui_qt/config.cpp b/tools/bsnes/ui_qt/config.cpp index e764d63..7afb259 100755 --- a/tools/bsnes/ui_qt/config.cpp +++ b/tools/bsnes/ui_qt/config.cpp @@ -1,10 +1,23 @@ class Configuration : public configuration { -public: +public: struct System { string video, audio, input; bool crashedOnLastRun; unsigned speed; - } system; + } system; + + struct File { + bool autodetect_type; + bool bypass_patch_crc32; + } file; + + struct Path { + string base; //binary path + string user; //user profile path (bsnes.cfg, ...) + string current; //current working directory (path to currently loaded cartridge) + string rom, save, patch, cheat, data; + string bsx, st, sgb; + } path; struct Video { bool isFullscreen; @@ -70,34 +83,23 @@ public: //external //======== - attach(snes.config.controller_port1 = SNES::Input::DeviceJoypad, "snes.controllerPort1"); - attach(snes.config.controller_port2 = SNES::Input::DeviceJoypad, "snes.controllerPort2"); - attach(snes.config.expansion_port = SNES::ExpansionBSX, "snes.expansionPort"); - attach(snes.config.region = SNES::Autodetect, "snes.region"); + attach(SNES::config.controller_port1 = SNES::Input::DeviceJoypad, "snes.controllerPort1"); + attach(SNES::config.controller_port2 = SNES::Input::DeviceJoypad, "snes.controllerPort2"); + attach(SNES::config.expansion_port = SNES::System::ExpansionBSX, "snes.expansionPort"); + attach(SNES::config.region = SNES::System::Autodetect, "snes.region"); - attach(snes.config.file.autodetect_type = false, "file.autodetectType"); - attach(snes.config.file.bypass_patch_crc32 = false, "file.bypassPatchCrc32"); + attach(SNES::config.cpu.version = 2, "cpu.version", "Valid version(s) are: 1, 2"); + attach(SNES::config.cpu.ntsc_clock_rate = 21477272, "cpu.ntscClockRate"); + attach(SNES::config.cpu.pal_clock_rate = 21281370, "cpu.palClockRate"); + attach(SNES::config.cpu.alu_mul_delay = 2, "cpu.aluMulDelay"); + attach(SNES::config.cpu.alu_div_delay = 2, "cpu.aluDivDelay"); + attach(SNES::config.cpu.wram_init_value = 0x55, "cpu.wramInitValue"); - attach(snes.config.path.rom = "", "path.rom"); - attach(snes.config.path.save = "", "path.save"); - attach(snes.config.path.patch = "", "path.patch"); - attach(snes.config.path.cheat = "", "path.cheat"); - attach(snes.config.path.data = "", "path.data"); - attach(snes.config.path.bsx = "", "path.bsx"); - attach(snes.config.path.st = "", "path.st"); + attach(SNES::config.smp.ntsc_clock_rate = 32041 * 768, "smp.ntscClockRate"); + attach(SNES::config.smp.pal_clock_rate = 32041 * 768, "smp.palClockRate"); - attach(snes.config.cpu.version = 2, "cpu.version", "Valid version(s) are: 1, 2"); - attach(snes.config.cpu.ntsc_clock_rate = 21477272, "cpu.ntscClockRate"); - attach(snes.config.cpu.pal_clock_rate = 21281370, "cpu.palClockRate"); - attach(snes.config.cpu.alu_mul_delay = 2, "cpu.aluMulDelay"); - attach(snes.config.cpu.alu_div_delay = 2, "cpu.aluDivDelay"); - attach(snes.config.cpu.wram_init_value = 0x55, "cpu.wramInitValue"); - - attach(snes.config.smp.ntsc_clock_rate = 32041 * 768, "smp.ntscClockRate"); - attach(snes.config.smp.pal_clock_rate = 32041 * 768, "smp.palClockRate"); - - attach(snes.config.ppu1.version = 1, "ppu1.version", "Valid version(s) are: 1"); - attach(snes.config.ppu2.version = 3, "ppu2.version", "Valid version(s) are: 1, 2, 3"); + attach(SNES::config.ppu1.version = 1, "ppu1.version", "Valid version(s) are: 1"); + attach(SNES::config.ppu2.version = 3, "ppu2.version", "Valid version(s) are: 1, 2, 3"); //======== //internal @@ -107,7 +109,19 @@ public: attach(system.audio = "", "system.audio"); attach(system.input = "", "system.input"); attach(system.crashedOnLastRun = false, "system.crashedOnLastRun"); - attach(system.speed = 2, "system.speed"); + attach(system.speed = 2, "system.speed"); + + attach(file.autodetect_type = false, "file.autodetectType"); + attach(file.bypass_patch_crc32 = false, "file.bypassPatchCrc32"); + + attach(path.rom = "", "path.rom"); + attach(path.save = "", "path.save"); + attach(path.patch = "", "path.patch"); + attach(path.cheat = "", "path.cheat"); + attach(path.data = "", "path.data"); + attach(path.bsx = "", "path.bsx"); + attach(path.st = "", "path.st"); + attach(path.sgb = "", "path.sgb"); video.context = &video.windowed; attach(video.isFullscreen = false, "video.isFullscreen"); diff --git a/tools/bsnes/ui_qt/interface.cpp b/tools/bsnes/ui_qt/interface.cpp index 4a343ee..cc2ee82 100755 --- a/tools/bsnes/ui_qt/interface.cpp +++ b/tools/bsnes/ui_qt/interface.cpp @@ -1,31 +1,27 @@ -SNESInterface snesinterface; - -void SNESInterface::video_refresh(uint16_t *data, unsigned pitch, unsigned *line, unsigned width, unsigned height) { - uint32_t *output; - unsigned outpitch; - if(video.lock(output, outpitch) == true) { - unsigned outwidth, outheight; - libfilter::filter.render(output, outpitch, outwidth, outheight, data, pitch, line, width, height); - video.unlock(); - video.refresh(outwidth, outheight); +class Interface : public SNES::Interface { +public: + void video_refresh(uint16_t *data, unsigned pitch, unsigned *line, unsigned width, unsigned height) { + uint32_t *output; + unsigned outpitch; + if(video.lock(output, outpitch) == true) { + unsigned outwidth, outheight; + libfilter::filter.render(output, outpitch, outwidth, outheight, data, pitch, line, width, height); + video.unlock(); + video.refresh(outwidth, outheight); + } } -} -void SNESInterface::audio_sample(uint16_t left, uint16_t right) { - if(config.audio.mute) left = right = 0; - audio.sample(left, right); -} + void audio_sample(uint16_t left, uint16_t right) { + if(config.audio.mute) left = right = 0; + audio.sample(left, right); + } -void SNESInterface::input_poll() { - inputManager.poll(); -} + void input_poll() { + inputManager.poll(); + } -int16_t SNESInterface::input_poll(unsigned deviceid, unsigned id) { - return inputManager.getStatus(deviceid, id); -} - -void SNESInterface::init() { -} - -void SNESInterface::term() { -} + int16_t input_poll(unsigned deviceid, unsigned id) { + return inputManager.getStatus(deviceid, id); + } +} interface; + diff --git a/tools/bsnes/ui_qt/main.cpp b/tools/bsnes/ui_qt/main.cpp index 764b55a..ad9cb4a 100755 --- a/tools/bsnes/ui_qt/main.cpp +++ b/tools/bsnes/ui_qt/main.cpp @@ -51,30 +51,30 @@ void Application::initPaths(const char *basename) { } if(strend(temp, "/") == false) strcat(temp, "/"); - snes.config.path.base = temp; + config.path.base = temp; } else { - snes.config.path.base = ""; + config.path.base = ""; } if(userpath(temp)) { strtr(temp, "\\", "/"); if(strend(temp, "/") == false) strcat(temp, "/"); - snes.config.path.user = temp; + config.path.user = temp; } else { - snes.config.path.user = ""; + config.path.user = ""; } char cwd[PATH_MAX]; - snes.config.path.current = getcwd(cwd); + config.path.current = getcwd(cwd); } void Application::locateFile(string &filename, bool createDataDirectory) { //first, check if file exists in executable directory (single-user mode) - string temp = string() << snes.config.path.base << filename; + string temp = string() << config.path.base << filename; if(file::exists(temp) == false) { //if not, use user data path (multi-user mode) - temp = snes.config.path.user; + temp = config.path.user; temp << ".bsnes"; if(createDataDirectory) mkdir(temp); //ensure directory exists temp << "/" << filename; @@ -104,7 +104,7 @@ int Application::main(int argc, char **argv) { config.load(configFilename); init(); - snes.init(); + SNES::system.init(&interface); if(argc == 2) { //if valid file was specified on the command-line, attempt to load it now @@ -117,7 +117,8 @@ int Application::main(int argc, char **argv) { inputManager.refresh(); if(config.input.focusPolicy == Configuration::Input::FocusPolicyPauseEmulation) { - bool inactive = (winMain->window->isActiveWindow() == false); + bool inactive = (winMain->window->isActiveWindow() == false) + || (winMain->window->isMinimized() == true); if(!autopause && inactive) { autopause = true; audio.clear(); @@ -128,15 +129,31 @@ int Application::main(int argc, char **argv) { autopause = false; } - if(cartridge.loaded() && !pause && !autopause) { - snes.runtoframe(); + if(SNES::cartridge.loaded() && !pause && !autopause) { + SNES::system.runtoframe(); } else { usleep(20 * 1000); + } + + clock_t currentTime = clock(); + autosaveTime += currentTime - clockTime; + screensaverTime += currentTime - clockTime; + clockTime = currentTime; + + if(autosaveTime >= CLOCKS_PER_SEC * 60) { + //auto-save RAM once per minute in case of emulator crash + autosaveTime = 0; + utility.saveMemory(); + } + + if(screensaverTime >= CLOCKS_PER_SEC * 30) { + //supress screen saver every 30 seconds so it will not trigger during gameplay + screensaverTime = 0; + supressScreenSaver(); } - - supressScreenSaver(); } - + + utility.unloadCartridge(); config.save(configFilename); return 0; } @@ -149,7 +166,11 @@ Application::Application() { terminate = false; power = false; pause = false; - autopause = false; + autopause = false; + + clockTime = clock(); + autosaveTime = 0; + screensaverTime = 0; } Application::~Application() { diff --git a/tools/bsnes/ui_qt/main.hpp b/tools/bsnes/ui_qt/main.hpp index 73227f2..ba64fac 100755 --- a/tools/bsnes/ui_qt/main.hpp +++ b/tools/bsnes/ui_qt/main.hpp @@ -10,15 +10,25 @@ //Q_IMPORT_PLUGIN(QMngPlugin) #include <../base.hpp> -#include <../cart/cart.hpp> #include -#include #include using namespace nall; #include -using namespace ruby; +using namespace ruby; + +#include +#include + +#if defined(GZIP_SUPPORT) + #include + #include +#endif + +#if defined(JMA_SUPPORT) + #include +#endif #include @@ -38,7 +48,11 @@ public: bool terminate; //set to true to terminate main() loop and exit emulator bool power; bool pause; - bool autopause; + bool autopause; + + clock_t clockTime; + clock_t autosaveTime; + clock_t screensaverTime; string configFilename; string styleSheetFilename; diff --git a/tools/bsnes/ui_qt/platform.cpp b/tools/bsnes/ui_qt/platform.cpp index 9cdb339..a7e9c53 100755 --- a/tools/bsnes/ui_qt/platform.cpp +++ b/tools/bsnes/ui_qt/platform.cpp @@ -53,12 +53,22 @@ void supressScreenSaver() { //handled by event filter above } -#else +#else #define None XNone #define Window XWindow - #include + #include #undef None - #undef Window + #undef Window + + struct LibXtst : public library { + function XTestFakeKeyEvent; + + LibXtst() { + if(open("Xtst")) { + XTestFakeKeyEvent = sym("XTestFakeKeyEvent"); + } + } + } libXtst; //POSIX-compatible (Linux, BSD, etc.) char* userpath(char *path) { @@ -77,12 +87,8 @@ void initargs(int &argc, char **&argv) { } - void supressScreenSaver() { - static clock_t delta_x = 0, delta_y = 0; - - delta_y = clock(); - if(delta_y - delta_x < CLOCKS_PER_SEC * 20) return; - delta_x = delta_y; + void supressScreenSaver() { + if(!libXtst.XTestFakeKeyEvent) return; //XSetScreenSaver(timeout = 0) does not work //XResetScreenSaver() does not work @@ -91,9 +97,9 @@ //XSendEvent(KeyPressMask) does not work //use XTest extension to send fake keypress every ~20 seconds. //keycode of 255 does not map to any actual key, - //but it will block screensaver and power management. + //but it will block screensaver and power management. Display *display = XOpenDisplay(0); - //XTestFakeKeyEvent(display, 255, True, 0); - //XTestFakeKeyEvent(display, 255, False, 0); + libXtst.XTestFakeKeyEvent(display, 255, True, 0); + libXtst.XTestFakeKeyEvent(display, 255, False, 0); } #endif diff --git a/tools/bsnes/ui_qt/settings/advanced.cpp b/tools/bsnes/ui_qt/settings/advanced.cpp index 9f6161f..d77cd5c 100755 --- a/tools/bsnes/ui_qt/settings/advanced.cpp +++ b/tools/bsnes/ui_qt/settings/advanced.cpp @@ -147,12 +147,12 @@ void AdvancedSettingsWindow::initializeUi() { if(part[i] == config.system.input) inputDriver->setCurrentIndex(i); } - regionAuto->setChecked(snes.config.region == SNES::Autodetect); - regionNTSC->setChecked(snes.config.region == SNES::NTSC); - regionPAL->setChecked (snes.config.region == SNES::PAL); + regionAuto->setChecked(SNES::config.region == SNES::System::Autodetect); + regionNTSC->setChecked(SNES::config.region == SNES::System::NTSC); + regionPAL->setChecked (SNES::config.region == SNES::System::PAL); - portSatellaview->setChecked(snes.config.expansion_port == SNES::ExpansionBSX); - portNone->setChecked (snes.config.expansion_port == SNES::ExpansionNone); + portSatellaview->setChecked(SNES::config.expansion_port == SNES::System::ExpansionBSX); + portNone->setChecked (SNES::config.expansion_port == SNES::System::ExpansionNone); focusPause->setChecked (config.input.focusPolicy == Configuration::Input::FocusPolicyPauseEmulation); focusIgnore->setChecked(config.input.focusPolicy == Configuration::Input::FocusPolicyIgnoreInput); @@ -171,12 +171,12 @@ void AdvancedSettingsWindow::inputDriverChange(int index) { if(index >= 0) config.system.input = inputDriver->itemText(index).toUtf8().data(); } -void AdvancedSettingsWindow::setRegionAuto() { snes.config.region = SNES::Autodetect; } -void AdvancedSettingsWindow::setRegionNTSC() { snes.config.region = SNES::NTSC; } -void AdvancedSettingsWindow::setRegionPAL() { snes.config.region = SNES::PAL; } +void AdvancedSettingsWindow::setRegionAuto() { SNES::config.region = SNES::System::Autodetect; } +void AdvancedSettingsWindow::setRegionNTSC() { SNES::config.region = SNES::System::NTSC; } +void AdvancedSettingsWindow::setRegionPAL() { SNES::config.region = SNES::System::PAL; } -void AdvancedSettingsWindow::setPortSatellaview() { snes.config.expansion_port = SNES::ExpansionBSX; } -void AdvancedSettingsWindow::setPortNone() { snes.config.expansion_port = SNES::ExpansionNone; } +void AdvancedSettingsWindow::setPortSatellaview() { SNES::config.expansion_port = SNES::System::ExpansionBSX; } +void AdvancedSettingsWindow::setPortNone() { SNES::config.expansion_port = SNES::System::ExpansionNone; } void AdvancedSettingsWindow::pauseWithoutFocus() { config.input.focusPolicy = Configuration::Input::FocusPolicyPauseEmulation; } void AdvancedSettingsWindow::ignoreInputWithoutFocus() { config.input.focusPolicy = Configuration::Input::FocusPolicyIgnoreInput; } diff --git a/tools/bsnes/ui_qt/settings/advanced.hpp b/tools/bsnes/ui_qt/settings/advanced.hpp deleted file mode 100755 index e2cd094..0000000 --- a/tools/bsnes/ui_qt/settings/advanced.hpp +++ /dev/null @@ -1,54 +0,0 @@ -class AdvancedSettingsWindow : public QObject { - Q_OBJECT - -public: - QWidget *panel; - QVBoxLayout *layout; - QLabel *title; - QGridLayout *driverLayout; - QLabel *videoLabel; - QLabel *audioLabel; - QLabel *inputLabel; - QComboBox *videoDriver; - QComboBox *audioDriver; - QComboBox *inputDriver; - QLabel *driverInfo; - - QLabel *regionTitle; - QHBoxLayout *regionLayout; - QButtonGroup *regionGroup; - QRadioButton *regionAuto; - QRadioButton *regionNTSC; - QRadioButton *regionPAL; - - QLabel *portTitle; - QHBoxLayout *portLayout; - QButtonGroup *portGroup; - QRadioButton *portSatellaview; - QRadioButton *portNone; - QWidget *portSpacer; - - QLabel *focusTitle; - QHBoxLayout *focusLayout; - QButtonGroup *focusButtonGroup; - QRadioButton *focusPause; - QRadioButton *focusIgnore; - QRadioButton *focusAllow; - QWidget *spacer; - - void setup(); - void initializeUi(); - -public slots: - void videoDriverChange(int index); - void audioDriverChange(int index); - void inputDriverChange(int index); - void setRegionAuto(); - void setRegionNTSC(); - void setRegionPAL(); - void setPortSatellaview(); - void setPortNone(); - void pauseWithoutFocus(); - void ignoreInputWithoutFocus(); - void allowInputWithoutFocus(); -} *winAdvancedSettings; diff --git a/tools/bsnes/ui_qt/settings/audio.hpp b/tools/bsnes/ui_qt/settings/audio.hpp deleted file mode 100755 index f0667b4..0000000 --- a/tools/bsnes/ui_qt/settings/audio.hpp +++ /dev/null @@ -1,28 +0,0 @@ -class AudioSettingsWindow : public QObject { - Q_OBJECT - -public: - QWidget *panel; - QVBoxLayout *layout; - QLabel *title; - QHBoxLayout *boxes; - QLabel *frequencyLabel; - QComboBox *frequency; - QLabel *latencyLabel; - QComboBox *latency; - QGridLayout *sliders; - QLabel *volumeLabel; - QSlider *volume; - QLabel *frequencySkewLabel; - QSlider *frequencySkew; - QWidget *spacer; - - void setup(); - void syncUi(); - -public slots: - void frequencyChange(int value); - void latencyChange(int value); - void volumeAdjust(int value); - void frequencySkewAdjust(int value); -} *winAudioSettings; diff --git a/tools/bsnes/ui_qt/settings/cheateditor.cpp b/tools/bsnes/ui_qt/settings/cheateditor.cpp index c9a93f5..b726041 100755 --- a/tools/bsnes/ui_qt/settings/cheateditor.cpp +++ b/tools/bsnes/ui_qt/settings/cheateditor.cpp @@ -42,10 +42,10 @@ void CheatEditorWindow::setup() { } void CheatEditorWindow::syncUi() { - addCode->setEnabled(cartridge.loaded()); + addCode->setEnabled(SNES::cartridge.loaded()); QList itemList = list->selectedItems(); - editCode->setEnabled(cartridge.loaded() && itemList.count() == 1); - deleteCode->setEnabled(cartridge.loaded() && itemList.count() == 1); + editCode->setEnabled(SNES::cartridge.loaded() && itemList.count() == 1); + deleteCode->setEnabled(SNES::cartridge.loaded() && itemList.count() == 1); } //called when loading a new game, or after adding / deleting a code: @@ -57,10 +57,10 @@ void CheatEditorWindow::reloadList() { list->setSortingEnabled(false); listItem.reset(); - if(cartridge.loaded()) { - for(unsigned i = 0; i < cheat.count(); i++) { - Cheat::cheat_t code; - cheat.get(i, code); + if(SNES::cartridge.loaded()) { + for(unsigned i = 0; i < SNES::cheat.count(); i++) { + SNES::Cheat::cheat_t code; + SNES::cheat.get(i, code); //only want to show one code / description line in list lstring lcode, ldesc; @@ -91,8 +91,8 @@ void CheatEditorWindow::updateList() { disconnect(list, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(itemChanged(QTreeWidgetItem*))); for(unsigned i = 0; i < listItem.size(); i++) { - Cheat::cheat_t code; - cheat.get(i, code); + SNES::Cheat::cheat_t code; + SNES::cheat.get(i, code); //only want to show one code / description line in list lstring lcode, ldesc; @@ -116,7 +116,7 @@ void CheatEditorWindow::updateList() { //called when item enabled checkbox was clicked (eg cheat code enable state was toggled on or off) void CheatEditorWindow::itemChanged(QTreeWidgetItem *item) { signed i = listItem.find(item); - if(i >= 0) item->checkState(1) == Qt::Checked ? cheat.enable(i) : cheat.disable(i); + if(i >= 0) item->checkState(1) == Qt::Checked ? SNES::cheat.enable(i) : SNES::cheat.disable(i); } void CheatEditorWindow::listChanged() { @@ -124,11 +124,11 @@ void CheatEditorWindow::listChanged() { } void CheatEditorWindow::addNewCode() { - if(cartridge.loaded()) winCodeEditor->addCode(); + if(SNES::cartridge.loaded()) winCodeEditor->addCode(); } void CheatEditorWindow::editSelectedCode() { - if(cartridge.loaded()) { + if(SNES::cartridge.loaded()) { QTreeWidgetItem *item = list->currentItem(); if(item && item->isSelected()) { signed i = listItem.find(item); @@ -138,7 +138,7 @@ void CheatEditorWindow::editSelectedCode() { } void CheatEditorWindow::deleteSelectedCode() { - if(cartridge.loaded()) { + if(SNES::cartridge.loaded()) { QTreeWidgetItem *item = list->currentItem(); if(item && item->isSelected()) { signed i = listItem.find(item); @@ -148,7 +148,7 @@ void CheatEditorWindow::deleteSelectedCode() { if(winCodeEditor->activeCode >= 0) winCodeEditor->dismiss(); //remove code, and resync listItem with cheat list - cheat.remove(i); + SNES::cheat.remove(i); reloadList(); } } diff --git a/tools/bsnes/ui_qt/settings/cheateditor.hpp b/tools/bsnes/ui_qt/settings/cheateditor.hpp deleted file mode 100755 index 053f50c..0000000 --- a/tools/bsnes/ui_qt/settings/cheateditor.hpp +++ /dev/null @@ -1,28 +0,0 @@ -class CheatEditorWindow : public QObject { - Q_OBJECT - -public: - QWidget *panel; - QVBoxLayout *layout; - QLabel *title; - QTreeWidget *list; - QHBoxLayout *controls; - QPushButton *addCode; - QPushButton *editCode; - QPushButton *deleteCode; - - void setup(); - void syncUi(); - void reloadList(); - void updateList(); - -public slots: - void itemChanged(QTreeWidgetItem *item); - void listChanged(); - void addNewCode(); - void editSelectedCode(); - void deleteSelectedCode(); - -private: - array listItem; -} *winCheatEditor; diff --git a/tools/bsnes/ui_qt/settings/input.hpp b/tools/bsnes/ui_qt/settings/input.hpp deleted file mode 100755 index 97583be..0000000 --- a/tools/bsnes/ui_qt/settings/input.hpp +++ /dev/null @@ -1,32 +0,0 @@ -class InputSettingsWindow : public QObject { - Q_OBJECT - -public: - QWidget *panel; - QVBoxLayout *layout; - QLabel *title; - QHBoxLayout *selection; - QComboBox *port; - QComboBox *device; - QTreeWidget *list; - QHBoxLayout *controls; - QPushButton *assign; - QPushButton *assignAll; - QPushButton *unassign; - - void setup(); - void syncUi(); - -public slots: - void portChanged(); - void reloadList(); - void listChanged(); - void updateList(); - void assignKey(); - void assignAllKeys(); - void unassignKey(); - -private: - array deviceItem; - array listItem; -} *winInputSettings; diff --git a/tools/bsnes/ui_qt/settings/paths.cpp b/tools/bsnes/ui_qt/settings/paths.cpp index 2b4b0cb..2faebad 100755 --- a/tools/bsnes/ui_qt/settings/paths.cpp +++ b/tools/bsnes/ui_qt/settings/paths.cpp @@ -127,74 +127,74 @@ void PathSettingsWindow::setup() { } void PathSettingsWindow::syncUi() { - gamePath->setText (snes.config.path.rom == "" ? "" : (const char*)snes.config.path.rom); - savePath->setText (snes.config.path.save == "" ? "" : (const char*)snes.config.path.save); - patchPath->setText(snes.config.path.patch == "" ? "" : (const char*)snes.config.path.patch); - cheatPath->setText(snes.config.path.cheat == "" ? "" : (const char*)snes.config.path.cheat); - dataPath->setText (snes.config.path.data == "" ? "" : (const char*)snes.config.path.data); + gamePath->setText (config.path.rom == "" ? "" : (const char*)config.path.rom); + savePath->setText (config.path.save == "" ? "" : (const char*)config.path.save); + patchPath->setText(config.path.patch == "" ? "" : (const char*)config.path.patch); + cheatPath->setText(config.path.cheat == "" ? "" : (const char*)config.path.cheat); + dataPath->setText (config.path.data == "" ? "" : (const char*)config.path.data); } void PathSettingsWindow::selectGamePath() { string path = utility.selectFolder("Default Game Path"); if(path.length() > 0) { - snes.config.path.rom = path; + config.path.rom = path; syncUi(); } } void PathSettingsWindow::defaultGamePath() { - snes.config.path.rom = ""; + config.path.rom = ""; syncUi(); } void PathSettingsWindow::selectSavePath() { string path = utility.selectFolder("Default Save RAM Path"); if(path.length() > 0) { - snes.config.path.save = path; + config.path.save = path; syncUi(); } } void PathSettingsWindow::defaultSavePath() { - snes.config.path.save = ""; + config.path.save = ""; syncUi(); } void PathSettingsWindow::selectPatchPath() { string path = utility.selectFolder("Default UPS Patch Path"); if(path.length() > 0) { - snes.config.path.patch = path; + config.path.patch = path; syncUi(); } } void PathSettingsWindow::defaultPatchPath() { - snes.config.path.patch = ""; + config.path.patch = ""; syncUi(); } void PathSettingsWindow::selectCheatPath() { string path = utility.selectFolder("Default Cheat File Path"); if(path.length() > 0) { - snes.config.path.cheat = path; + config.path.cheat = path; syncUi(); } } void PathSettingsWindow::defaultCheatPath() { - snes.config.path.cheat = ""; + config.path.cheat = ""; syncUi(); } void PathSettingsWindow::selectDataPath() { string path = utility.selectFolder("Default Export Data Path"); if(path.length() > 0) { - snes.config.path.data = path; + config.path.data = path; syncUi(); } } void PathSettingsWindow::defaultDataPath() { - snes.config.path.data = ""; + config.path.data = ""; syncUi(); } diff --git a/tools/bsnes/ui_qt/settings/paths.hpp b/tools/bsnes/ui_qt/settings/paths.hpp deleted file mode 100755 index a0ca502..0000000 --- a/tools/bsnes/ui_qt/settings/paths.hpp +++ /dev/null @@ -1,49 +0,0 @@ -class PathSettingsWindow : public QObject { - Q_OBJECT - -public: - QWidget *panel; - QVBoxLayout *layout; - QLabel *title; - QLabel *gameLabel; - QHBoxLayout *games; - QLineEdit *gamePath; - QPushButton *gameSelect; - QPushButton *gameDefault; - QLabel *saveLabel; - QHBoxLayout *saves; - QLineEdit *savePath; - QPushButton *saveSelect; - QPushButton *saveDefault; - QLabel *patchLabel; - QHBoxLayout *patches; - QLineEdit *patchPath; - QPushButton *patchSelect; - QPushButton *patchDefault; - QLabel *cheatLabel; - QHBoxLayout *cheats; - QLineEdit *cheatPath; - QPushButton *cheatSelect; - QPushButton *cheatDefault; - QLabel *dataLabel; - QHBoxLayout *data; - QLineEdit *dataPath; - QPushButton *dataSelect; - QPushButton *dataDefault; - QWidget *spacer; - - void setup(); - void syncUi(); - -public slots: - void selectGamePath(); - void defaultGamePath(); - void selectSavePath(); - void defaultSavePath(); - void selectPatchPath(); - void defaultPatchPath(); - void selectCheatPath(); - void defaultCheatPath(); - void selectDataPath(); - void defaultDataPath(); -} *winPathSettings; diff --git a/tools/bsnes/ui_qt/settings/settings.hpp b/tools/bsnes/ui_qt/settings/settings.hpp deleted file mode 100755 index 8e97014..0000000 --- a/tools/bsnes/ui_qt/settings/settings.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "video.moc" -#include "audio.moc" -#include "input.moc" -#include "paths.moc" -#include "cheateditor.moc" -#include "advanced.moc" - -#include "utility/inputcapture.moc" -#include "utility/codeeditor.moc" - -class SettingsWindow : public QObject { - Q_OBJECT - -public: - QWidget *window; - QHBoxLayout *layout; - QListWidget *list; - QListWidgetItem *video; - QListWidgetItem *audio; - QListWidgetItem *input; - QListWidgetItem *paths; - QListWidgetItem *cheatcodes; - QListWidgetItem *advanced; - QWidget *panel; - QStackedLayout *panelLayout; - - void setup(); - -public slots: - void listChanged(); -} *winSettings; diff --git a/tools/bsnes/ui_qt/settings/utility/codeeditor.cpp b/tools/bsnes/ui_qt/settings/utility/codeeditor.cpp index f5d7c7f..d00c0ad 100755 --- a/tools/bsnes/ui_qt/settings/utility/codeeditor.cpp +++ b/tools/bsnes/ui_qt/settings/utility/codeeditor.cpp @@ -75,8 +75,8 @@ void CodeEditorWindow::setup() { void CodeEditorWindow::syncUi() { //only activate add button when code is valid string code = codeValue->text().toUtf8().data(); - Cheat::cheat_t temp; - bool valid = cheat.decode(code, temp); + SNES::Cheat::cheat_t temp; + bool valid = SNES::cheat.decode(code, temp); codeAdd->setEnabled(valid); //only activate delete button when a code is selected @@ -93,8 +93,8 @@ void CodeEditorWindow::codeChanged() { syncUi(); } void CodeEditorWindow::addCodeToList() { string code = codeValue->text().toUtf8().data(); - Cheat::cheat_t temp; - if(cheat.decode(code, temp) == true) codeList->addItem(utf8() << code); + SNES::Cheat::cheat_t temp; + if(SNES::cheat.decode(code, temp) == true) codeList->addItem(utf8() << code); syncUi(); } @@ -122,15 +122,15 @@ void CodeEditorWindow::accept() { if(activeCode == -1) { //adding a new code - cheat.add(enabled->isChecked(), code, desc); + SNES::cheat.add(enabled->isChecked(), code, desc); winCheatEditor->reloadList(); } else if(codeList->count() > 0) { //editing an existing code - cheat.edit(activeCode, enabled->isChecked(), code, desc); + SNES::cheat.edit(activeCode, enabled->isChecked(), code, desc); winCheatEditor->updateList(); } else { //deleting an existing code - cheat.remove(activeCode); + SNES::cheat.remove(activeCode); winCheatEditor->reloadList(); } @@ -156,8 +156,8 @@ void CodeEditorWindow::editCode(unsigned code) { codeList->clear(); codeValue->setText(""); - Cheat::cheat_t item; - cheat.get(activeCode, item); + SNES::Cheat::cheat_t item; + SNES::cheat.get(activeCode, item); description->setPlainText(utf8() << item.desc); diff --git a/tools/bsnes/ui_qt/settings/utility/codeeditor.hpp b/tools/bsnes/ui_qt/settings/utility/codeeditor.hpp deleted file mode 100755 index dc19466..0000000 --- a/tools/bsnes/ui_qt/settings/utility/codeeditor.hpp +++ /dev/null @@ -1,43 +0,0 @@ -class CodeEditorWindow : public QObject { - Q_OBJECT - -public: - QWidget *window; - QVBoxLayout *layout; - QLabel *descLabel; - QTextEdit *description; - QLabel *codeLabel; - QHBoxLayout *codeLayout; - QListWidget *codeList; - QVBoxLayout *controls; - QLineEdit *codeValue; - QPushButton *codeAdd; - QPushButton *codeDelete; - QPushButton *codeDeleteAll; - QWidget *spacer; - QCheckBox *enabled; - QHBoxLayout *finishControls; - QPushButton *okButton; - QPushButton *cancelButton; - - void setup(); - void syncUi(); - void addCode(); - void editCode(unsigned code); - CodeEditorWindow(); - -public slots: - void listChanged(); - void codeChanged(); - void addCodeToList(); - void deleteCodeFromList(); - void deleteAllCodesFromList(); - void accept(); - void dismiss(); - -private: - signed activeCode; - void showWindow(const char *title); - - friend class CheatEditorWindow; -} *winCodeEditor; diff --git a/tools/bsnes/ui_qt/settings/utility/inputcapture.cpp b/tools/bsnes/ui_qt/settings/utility/inputcapture.cpp index c954367..2a17712 100755 --- a/tools/bsnes/ui_qt/settings/utility/inputcapture.cpp +++ b/tools/bsnes/ui_qt/settings/utility/inputcapture.cpp @@ -37,8 +37,8 @@ void InputCaptureWindow::setup() { connect(mouseAxes, SIGNAL(released()), this, SLOT(assignMouseAxis())); connect(mouseButtons, SIGNAL(released()), this, SLOT(assignMouseButton())); - winInputMouseCaptureWindow = new InputMouseCaptureWindow; - winInputMouseCaptureWindow->setup(); + winInputMouseCapture = new InputMouseCaptureWindow; + winInputMouseCapture->setup(); winInputCalibration = new InputCalibrationWindow; winInputCalibration->setup(); @@ -96,8 +96,8 @@ void InputCaptureWindow::inputEvent(uint16_t code, bool forceAssign /* = false * //input polling is global, need to block mouse actions that may be UI interactions. //custom controls on window allow mouse assignment instead. if(forceAssign == false) { - if(winInputMouseCaptureWindow->window->isActiveWindow()) { - winInputMouseCaptureWindow->inputEvent(code); + if(winInputMouseCapture->window->isActiveWindow()) { + winInputMouseCapture->inputEvent(code); return; } if(!window->isActiveWindow()) return; @@ -205,7 +205,7 @@ void InputCaptureWindow::inputEvent(uint16_t code, bool forceAssign /* = false * if(!activeGroup) { window->hide(); - winInputMouseCaptureWindow->window->hide(); + winInputMouseCapture->window->hide(); } else { //try and map the next code in this input group groupIndex++; @@ -214,7 +214,7 @@ void InputCaptureWindow::inputEvent(uint16_t code, bool forceAssign /* = false * } else { //all group codes mapped window->hide(); - winInputMouseCaptureWindow->window->hide(); + winInputMouseCapture->window->hide(); activeGroup = 0; } } @@ -224,12 +224,12 @@ void InputCaptureWindow::assignMouseAxis() { //refresh input state so that mouse release event (from SIGNAL(released()) //is not sent immediately after window is visible. inputManager.refresh(); - winInputMouseCaptureWindow->activate(InputMouseCaptureWindow::AxisMode); + winInputMouseCapture->activate(InputMouseCaptureWindow::AxisMode); } void InputCaptureWindow::assignMouseButton() { inputManager.refresh(); - winInputMouseCaptureWindow->activate(InputMouseCaptureWindow::ButtonMode); + winInputMouseCapture->activate(InputMouseCaptureWindow::ButtonMode); } InputCaptureWindow::InputCaptureWindow() { @@ -243,6 +243,9 @@ void InputCaptureWindow::Window::closeEvent(QCloseEvent*) { //window closed by user, cancel key assignment winInputCapture->activeObject = 0; winInputCapture->activeGroup = 0; + + winInputMouseCapture->window->hide(); + winInputCalibration->dismiss(); } void InputCaptureWindow::ImageWidget::paintEvent(QPaintEvent*) { @@ -452,3 +455,7 @@ void InputCalibrationWindow::dismiss() { void InputCalibrationWindow::Window::closeEvent(QCloseEvent*) { winInputCalibration->dismiss(); } + +InputCalibrationWindow::InputCalibrationWindow() { + activeJoypad = -1; +} diff --git a/tools/bsnes/ui_qt/settings/utility/inputcapture.hpp b/tools/bsnes/ui_qt/settings/utility/inputcapture.hpp deleted file mode 100755 index f197204..0000000 --- a/tools/bsnes/ui_qt/settings/utility/inputcapture.hpp +++ /dev/null @@ -1,88 +0,0 @@ -class InputCaptureWindow : public QObject { - Q_OBJECT - -public: - struct Window : public QWidget { - void closeEvent(QCloseEvent*); - } *window; - QVBoxLayout *layout; - QHBoxLayout *hlayout; - QLabel *title; - QPushButton *mouseAxes; - QPushButton *mouseButtons; - QWidget *imageSpacer; - struct ImageWidget : public QWidget { - void paintEvent(QPaintEvent*); - } *imageWidget; - QWidget *spacer; - - void setup(); - void activate(InputObject *object); - void activate(InputGroup *group); - void inputEvent(uint16_t code, bool forceAssign = false); - InputCaptureWindow(); - -public slots: - void assignMouseAxis(); - void assignMouseButton(); - -private: - InputObject *activeObject; - InputGroup *activeGroup; - unsigned groupIndex; - bool inputLock; - - friend class InputCaptureWindow::Window; -} *winInputCapture; - -class InputMouseCaptureWindow : public QObject { - Q_OBJECT - -public: - enum Mode { AxisMode, ButtonMode }; - - QWidget *window; - QVBoxLayout *layout; - QLabel *info; - QLabel *captureBox; - QHBoxLayout *buttonLayout; - QPushButton *xAxis; - QPushButton *yAxis; - QWidget *spacer; - - void setup(); - void activate(Mode); - void inputEvent(uint16_t code); - -public slots: - void assignAxisX(); - void assignAxisY(); - -private: - Mode activeMode; - signed activeMouse; -} *winInputMouseCaptureWindow; - -class InputCalibrationWindow : public QObject { - Q_OBJECT - -public: - struct Window : public QWidget { - void closeEvent(QCloseEvent*); - } *window; - QVBoxLayout *layout; - QLabel *info; - QPushButton *ok; - QWidget *spacer; - - void setup(); - void activate(unsigned joy); - -public slots: - void dismiss(); - -private: - int activeJoypad; - - friend class InputCalibrationWindow::Window; -} *winInputCalibration; diff --git a/tools/bsnes/ui_qt/settings/video.hpp b/tools/bsnes/ui_qt/settings/video.hpp deleted file mode 100755 index 7c5f3ce..0000000 --- a/tools/bsnes/ui_qt/settings/video.hpp +++ /dev/null @@ -1,29 +0,0 @@ -class VideoSettingsWindow : public QObject { - Q_OBJECT - -public: - QWidget *panel; - QVBoxLayout *layout; - QLabel *title; - QGridLayout *sliders; - QLabel *lcontrast; - QSlider *contrast; - QLabel *lbrightness; - QSlider *brightness; - QLabel *lgamma; - QSlider *gamma; - QHBoxLayout *options; - QCheckBox *enableGammaRamp; - QCheckBox *enableNtscMergeFields; - QWidget *spacer; - - void setup(); - void syncUi(); - -public slots: - void gammaRampToggle(int); - void ntscFieldsToggle(int); - void contrastAdjust(int); - void brightnessAdjust(int); - void gammaAdjust(int); -} *winVideoSettings; diff --git a/tools/bsnes/ui_qt/utility/cartridge.cpp b/tools/bsnes/ui_qt/utility/cartridge.cpp index 294fcd4..1100fac 100755 --- a/tools/bsnes/ui_qt/utility/cartridge.cpp +++ b/tools/bsnes/ui_qt/utility/cartridge.cpp @@ -2,7 +2,7 @@ string Utility::selectCartridge() { audio.clear(); QString filename = QFileDialog::getOpenFileName(0, "Load Cartridge", - utf8() << (snes.config.path.rom != "" ? snes.config.path.rom : snes.config.path.current), + utf8() << (config.path.rom != "" ? config.path.rom : config.path.current), "SNES images (*.smc *.sfc *.swc *.fig *.bs *.st" #if defined(GZIP_SUPPORT) " *.zip *.gz" @@ -12,66 +12,150 @@ string Utility::selectCartridge() { #endif ");;" "All files (*)" - ); - return string() << filename.toUtf8().constData(); + ); + + string name = filename.toUtf8().constData(); + if(strlen(name) > 0) config.path.current = basepath(name); + return name; } string Utility::selectFolder(const char *title) { audio.clear(); QString pathname = QFileDialog::getExistingDirectory(0, - title, utf8() << snes.config.path.current, - QFileDialog::ShowDirsOnly); - return string() << pathname.toUtf8().constData(); + title, utf8() << config.path.current, + QFileDialog::ShowDirsOnly); + string path = pathname.toUtf8().constData(); + strtr(path, "\\", "/"); + if(strend(path, "/") == false) path << "/"; + return path; } -void Utility::loadCartridge(const char *filename) { - switch(cartridge.detect_image_type(filename)) { - case Cartridge::TypeNormal: loadCartridgeNormal(filename); break; - case Cartridge::TypeBsxSlotted: winLoader->loadBsxSlottedCartridge(filename, ""); break; - case Cartridge::TypeBsxBios: winLoader->loadBsxCartridge(filename, ""); break; - case Cartridge::TypeBsx: winLoader->loadBsxCartridge(snes.config.path.bsx, filename); break; - case Cartridge::TypeSufamiTurboBios: winLoader->loadSufamiTurboCartridge(filename, "", ""); break; - case Cartridge::TypeSufamiTurbo: winLoader->loadSufamiTurboCartridge(snes.config.path.st, filename, ""); break; +void Utility::loadCartridge(const char *filename) { + SNES::MappedRAM memory; + if(loadCartridge(filename, memory) == false) return; + SNES::Cartridge::Type type = SNES::cartridge.detect_image_type(memory.data(), memory.size()); + memory.reset(); + + switch(type) { + case SNES::Cartridge::TypeNormal: loadCartridgeNormal(filename); break; + case SNES::Cartridge::TypeBsxSlotted: winLoader->loadBsxSlottedCartridge(filename, ""); break; + case SNES::Cartridge::TypeBsxBios: winLoader->loadBsxCartridge(filename, ""); break; + case SNES::Cartridge::TypeBsx: winLoader->loadBsxCartridge(config.path.bsx, filename); break; + case SNES::Cartridge::TypeSufamiTurboBios: winLoader->loadSufamiTurboCartridge(filename, "", ""); break; + case SNES::Cartridge::TypeSufamiTurbo: winLoader->loadSufamiTurboCartridge(config.path.st, filename, ""); break; + case SNES::Cartridge::TypeSuperGameBoyBios: winLoader->loadSuperGameBoyCartridge(filename, ""); break; + case SNES::Cartridge::TypeGameBoy: winLoader->loadSuperGameBoyCartridge(config.path.sgb, filename); break; } } -bool Utility::loadCartridgeNormal(const char *base) { - if(!*base) return false; - unloadCartridge(); - cartridge.load_normal(base); +bool Utility::loadCartridgeNormal(const char *base) { + unloadCartridge(); + if(loadCartridge(cartridge.baseName = base, SNES::memory::cartrom) == false) return false; + SNES::cartridge.load(SNES::Cartridge::ModeNormal); + + loadMemory(cartridge.baseName, ".srm", SNES::memory::cartram); + loadMemory(cartridge.baseName, ".rtc", SNES::memory::cartrtc); + + cartridge.name = basename(base); + modifySystemState(LoadCartridge); return true; } -bool Utility::loadCartridgeBsxSlotted(const char *base, const char *slot) { - if(!*base) return false; - unloadCartridge(); - cartridge.load_bsx_slotted(base, slot); +bool Utility::loadCartridgeBsxSlotted(const char *base, const char *slot) { + unloadCartridge(); + if(loadCartridge(cartridge.baseName = base, SNES::memory::cartrom) == false) return false; + loadCartridge(cartridge.slotAName = slot, SNES::memory::bsxflash); + SNES::cartridge.load(SNES::Cartridge::ModeBsxSlotted); + + loadMemory(cartridge.baseName, ".srm", SNES::memory::cartram); + loadMemory(cartridge.baseName, ".rtc", SNES::memory::cartrtc); + + cartridge.name = basename(base); + if(*slot) cartridge.name << " + " << basename(slot); + modifySystemState(LoadCartridge); return true; } -bool Utility::loadCartridgeBsx(const char *base, const char *slot) { - if(!*base) return false; +bool Utility::loadCartridgeBsx(const char *base, const char *slot) { unloadCartridge(); - cartridge.load_bsx(base, slot); + if(loadCartridge(cartridge.baseName = base, SNES::memory::cartrom) == false) return false; + loadCartridge(cartridge.slotAName = slot, SNES::memory::bsxflash); + SNES::cartridge.load(SNES::Cartridge::ModeBsx); + + loadMemory(cartridge.baseName, ".srm", SNES::memory::bsxram ); + loadMemory(cartridge.baseName, ".psr", SNES::memory::bsxpram); + + cartridge.name = (*slot ? basename(slot) : basename(base)); + modifySystemState(LoadCartridge); return true; } -bool Utility::loadCartridgeSufamiTurbo(const char *base, const char *slotA, const char *slotB) { - if(!*base) return false; - unloadCartridge(); - cartridge.load_sufami_turbo(base, slotA, slotB); +bool Utility::loadCartridgeSufamiTurbo(const char *base, const char *slotA, const char *slotB) { + unloadCartridge(); + if(loadCartridge(cartridge.baseName = base, SNES::memory::cartrom) == false) return false; + loadCartridge(cartridge.slotAName = slotA, SNES::memory::stArom); + loadCartridge(cartridge.slotBName = slotB, SNES::memory::stBrom); + SNES::cartridge.load(SNES::Cartridge::ModeSufamiTurbo); + + loadMemory(cartridge.slotAName, ".srm", SNES::memory::stAram); + loadMemory(cartridge.slotBName, ".srm", SNES::memory::stBram); + + if(!*slotA && !*slotB) cartridge.name = basename(base); + else if(!*slotB) cartridge.name = basename(slotA); + else if(!*slotA) cartridge.name = basename(slotB); + else cartridge.name = string() << basename(slotA) << " + " << basename(slotB); + modifySystemState(LoadCartridge); return true; -} +} + +bool Utility::loadCartridgeSuperGameBoy(const char *base, const char *slot) { + unloadCartridge(); + if(loadCartridge(cartridge.baseName = base, SNES::memory::cartrom) == false) return false; + loadCartridge(cartridge.slotAName = slot, SNES::memory::gbrom); + SNES::cartridge.load(SNES::Cartridge::ModeSuperGameBoy); + + loadMemory(cartridge.slotAName, ".sav", SNES::memory::gbram); + + cartridge.name = (*slot ? basename(slot) : basename(base)); + + modifySystemState(LoadCartridge); + return true; +} + +void Utility::saveMemory() { + if(SNES::cartridge.loaded() == false) return; + + switch(SNES::cartridge.mode()) { + case SNES::Cartridge::ModeNormal: + case SNES::Cartridge::ModeBsxSlotted: { + saveMemory(cartridge.baseName, ".srm", SNES::memory::cartram); + saveMemory(cartridge.baseName, ".rtc", SNES::memory::cartrtc); + } break; + + case SNES::Cartridge::ModeBsx: { + saveMemory(cartridge.baseName, ".srm", SNES::memory::bsxram ); + saveMemory(cartridge.baseName, ".psr", SNES::memory::bsxpram); + } break; + + case SNES::Cartridge::ModeSufamiTurbo: { + saveMemory(cartridge.slotAName, ".srm", SNES::memory::stAram); + saveMemory(cartridge.slotBName, ".srm", SNES::memory::stBram); + } break; + + case SNES::Cartridge::ModeSuperGameBoy: { + saveMemory(cartridge.slotAName, ".sav", SNES::memory::gbram); + } break; + } +} void Utility::unloadCartridge() { - if(cartridge.loaded()) { - cartridge.unload(); - modifySystemState(UnloadCartridge); - } + if(SNES::cartridge.loaded() == false) return; + saveMemory(); + modifySystemState(UnloadCartridge); } void Utility::modifySystemState(system_state_t state) { @@ -81,19 +165,19 @@ void Utility::modifySystemState(system_state_t state) { switch(state) { case LoadCartridge: { //must call cartridge.load_cart_...() before calling modifySystemState(LoadCartridge) - if(cartridge.loaded() == false) break; + if(SNES::cartridge.loaded() == false) break; + loadCheats(); application.power = true; application.pause = false; - snes.power(); + SNES::system.power(); //warn if unsupported hardware detected string chip; - if(cartridge.has_superfx()) chip = "SuperFX"; - else if(cartridge.has_sa1()) chip = "SA-1"; - else if(cartridge.has_st011()) chip = "ST011"; - else if(cartridge.has_st018()) chip = "ST018"; - else if(cartridge.has_dsp3()) chip = "DSP-3"; + if(SNES::cartridge.has_superfx()) chip = "SuperFX"; + else if(SNES::cartridge.has_st011()) chip = "ST011"; + else if(SNES::cartridge.has_st018()) chip = "ST018"; + else if(SNES::cartridge.has_dsp3()) chip = "DSP-3"; //unplayable; only partially supported if(chip != "") { QMessageBox::warning(winMain->window, "Warning", utf8() << "

Warning:
Unsupported " << chip << " chip detected. " @@ -101,34 +185,36 @@ void Utility::modifySystemState(system_state_t state) { } showMessage(utf8() - << "Loaded " << cartridge.name() - << (cartridge.patched() ? ", and applied UPS patch." : ".")); - winMain->window->setWindowTitle(utf8() << BSNES_TITLE << " - " << cartridge.name()); + << "Loaded " << cartridge.name + << (false ? ", and applied UPS patch." : ".")); + winMain->window->setWindowTitle(utf8() << BSNES_TITLE << " - " << cartridge.name); } break; case UnloadCartridge: { - if(cartridge.loaded() == false) break; //no cart to unload? - cartridge.unload(); + if(SNES::cartridge.loaded() == false) break; //no cart to unload? + saveCheats(); + + SNES::cartridge.unload(); application.power = false; application.pause = true; - showMessage(utf8() << "Unloaded " << cartridge.name() << "."); + showMessage(utf8() << "Unloaded " << cartridge.name << "."); winMain->window->setWindowTitle(utf8() << BSNES_TITLE); } break; case PowerOn: { - if(cartridge.loaded() == false || application.power == true) break; + if(SNES::cartridge.loaded() == false || application.power == true) break; application.power = true; application.pause = false; - snes.power(); + SNES::system.power(); showMessage("Power on."); } break; case PowerOff: { - if(cartridge.loaded() == false || application.power == false) break; + if(SNES::cartridge.loaded() == false || application.power == false) break; application.power = false; application.pause = true; @@ -137,20 +223,20 @@ void Utility::modifySystemState(system_state_t state) { } break; case PowerCycle: { - if(cartridge.loaded() == false) break; + if(SNES::cartridge.loaded() == false) break; application.power = true; application.pause = false; - snes.power(); + SNES::system.power(); showMessage("System power was cycled."); } break; case Reset: { - if(cartridge.loaded() == false || application.power == false) break; + if(SNES::cartridge.loaded() == false || application.power == false) break; application.pause = false; - snes.reset(); + SNES::system.reset(); showMessage("System was reset."); } break; @@ -161,3 +247,182 @@ void Utility::modifySystemState(system_state_t state) { winCheatEditor->reloadList(); winCheatEditor->syncUi(); } +// + +bool Utility::loadCartridge(const char *filename, SNES::MappedRAM &memory) { + if(file::exists(filename) == false) return false; + Reader::Type filetype = Reader::detect(filename, config.file.autodetect_type); + + uint8_t *data; + unsigned size; + + switch(filetype) { default: + case Reader::Normal: { + FileReader fp(filename); + if(!fp.ready()) return false; + size = fp.size(); + data = fp.read(); + } break; + + #ifdef GZIP_SUPPORT + case Reader::GZIP: { + GZReader fp(filename); + if(!fp.ready()) return false; + size = fp.size(); + data = fp.read(); + } break; + + case Reader::ZIP: { + ZipReader fp(filename); + if(!fp.ready()) return false; + size = fp.size(); + data = fp.read(); + } break; + #endif + + #ifdef JMA_SUPPORT + case Reader::JMA: { + try { + JMAReader fp(filename); + size = fp.size(); + data = fp.read(); + } catch(JMA::jma_errors) { + return false; + } + } break; + #endif + } + + if((size & 0x7fff) == 512) memmove(data, data + 512, size -= 512); + memory.map(data, size); + return true; +} + +bool Utility::loadMemory(const char *filename, const char *extension, SNES::MappedRAM &memory) { + if(memory.size() == 0 || memory.size() == -1U) return false; + + string name; + name << filepath(basename(filename), config.path.save); + name << extension; + + file fp; + if(fp.open(name, file::mode_read) == false) return false; + + unsigned size; + uint8_t *data = new uint8_t[size = fp.size()]; + fp.read(data, size); + fp.close(); + + memcpy(memory.data(), data, min(size, memory.size())); + return true; +} + +bool Utility::saveMemory(const char *filename, const char *extension, SNES::MappedRAM &memory) { + if(memory.size() == 0 || memory.size() == -1U) return false; + + string name; + name << filepath(basename(filename), config.path.save); + name << extension; + + file fp; + if(fp.open(name, file::mode_write) == false) return false; + + fp.write(memory.data(), memory.size()); + fp.close(); + return true; +} + +void Utility::loadCheats() { + string name, data; + name << filepath(basename(cartridge.baseName), config.path.cheat); + name << ".cht"; + + SNES::cheat.clear(); + if(data.readfile(name)) SNES::cheat.load(data); +} + +void Utility::saveCheats() { + string name; + name << filepath(basename(cartridge.baseName), config.path.cheat); + name << ".cht"; + + file fp; + if(SNES::cheat.count() > 0 || file::exists(name)) { + if(fp.open(name, file::mode_write)) { + fp.print(SNES::cheat.save()); + fp.close(); + } + } +} + +// + +//ensure file path is absolute (eg resolve relative paths) +string Utility::filepath(const char *filename, const char *pathname) { + //if no pathname, return filename as-is + string file(filename); + file.replace("\\", "/"); + + string path = (!pathname || !*pathname) ? (const char*)config.path.current : pathname; + //ensure path ends with trailing '/' + path.replace("\\", "/"); + if(!strend(path, "/")) path.append("/"); + + //replace relative path with absolute path + if(strbegin(path, "./")) { + ltrim(path, "./"); + path = string() << config.path.base << path; + } + + //remove folder part of filename + lstring part; + part.split("/", file); + return path << part[part.size() - 1]; +} + +//remove directory information and file extension ("/foo/bar.ext" -> "bar") +string Utility::basename(const char *filename) { + string name(filename); + + //remove extension + for(signed i = strlen(name) - 1; i >= 0; i--) { + if(name[i] == '.') { + name[i] = 0; + break; + } + } + + //remove directory information + for(signed i = strlen(name) - 1; i >= 0; i--) { + if(name[i] == '/' || name[i] == '\\') { + i++; + char *output = name(); + while(true) { + *output++ = name[i]; + if(!name[i]) break; + i++; + } + break; + } + } + + return name; +} + +//remove filename and return path only ("/foo/bar.ext" -> "/foo/") +string Utility::basepath(const char *filename) { + string path(filename); + path.replace("\\", "/"); + + //remove filename + for(signed i = strlen(path) - 1; i >= 0; i--) { + if(path[i] == '/') { + path[i] = 0; + break; + } + } + + if(!strend(path, "/")) path.append("/"); + return path; +} + diff --git a/tools/bsnes/ui_qt/utility/utility.cpp b/tools/bsnes/ui_qt/utility/utility.cpp index 945f549..8f30ed0 100755 --- a/tools/bsnes/ui_qt/utility/utility.cpp +++ b/tools/bsnes/ui_qt/utility/utility.cpp @@ -57,6 +57,7 @@ void Utility::inputEvent(uint16_t code) { if(isButtonDown(code, inputUiGeneral.pauseEmulation)) { application.pause = !application.pause; + if(application.pause) audio.clear(); } if(isButtonDown(code, inputUiGeneral.resetSystem)) { @@ -80,11 +81,11 @@ void Utility::inputEvent(uint16_t code) { } if(isButtonDown(code, inputUiGeneral.toggleCheatSystem)) { - if(cheat.enabled() == false) { - cheat.enable(); + if(SNES::cheat.enabled() == false) { + SNES::cheat.enable(); showMessage("Cheat system enabled."); } else { - cheat.disable(); + SNES::cheat.disable(); showMessage("Cheat system disabled."); } } @@ -125,15 +126,15 @@ void Utility::showMessage(const char *message) { void Utility::updateSystemState() { string text; - if(cartridge.loaded() == false) { + if(SNES::cartridge.loaded() == false) { text = "No cartridge loaded"; } else if(application.power == false) { text = "Power off"; } else if(application.pause == true || application.autopause == true) { text = "Paused"; - } else if(ppu.status.frames_updated == true) { - ppu.status.frames_updated = false; - text << (int)ppu.status.frames_executed; + } else if(SNES::ppu.status.frames_updated == true) { + SNES::ppu.status.frames_updated = false; + text << (int)SNES::ppu.status.frames_executed; text << " fps"; } else { //nothing to update @@ -144,12 +145,12 @@ void Utility::updateSystemState() { } void Utility::acquireMouse() { - if(cartridge.loaded()) { - if(snes.config.controller_port1 == SNES::Input::DeviceMouse - || snes.config.controller_port2 == SNES::Input::DeviceMouse - || snes.config.controller_port2 == SNES::Input::DeviceSuperScope - || snes.config.controller_port2 == SNES::Input::DeviceJustifier - || snes.config.controller_port2 == SNES::Input::DeviceJustifiers + if(SNES::cartridge.loaded()) { + if(SNES::config.controller_port1 == SNES::Input::DeviceMouse + || SNES::config.controller_port2 == SNES::Input::DeviceMouse + || SNES::config.controller_port2 == SNES::Input::DeviceSuperScope + || SNES::config.controller_port2 == SNES::Input::DeviceJustifier + || SNES::config.controller_port2 == SNES::Input::DeviceJustifiers ) input.acquire(); } } @@ -165,9 +166,9 @@ void Utility::updateAvSync() { void Utility::updateVideoMode() { if(config.video.context->region == 0) { - snes.video.set_mode(SNES::Video::ModeNTSC); + SNES::video.set_mode(SNES::Video::ModeNTSC); } else { - snes.video.set_mode(SNES::Video::ModePAL); + SNES::video.set_mode(SNES::Video::ModePAL); } } @@ -213,6 +214,6 @@ void Utility::updateEmulationSpeed() { } void Utility::updateControllers() { - snes.input.port_set_device(0, snes.config.controller_port1); - snes.input.port_set_device(1, snes.config.controller_port2); + SNES::input.port_set_device(0, SNES::config.controller_port1); + SNES::input.port_set_device(1, SNES::config.controller_port2); } diff --git a/tools/bsnes/ui_qt/utility/utility.hpp b/tools/bsnes/ui_qt/utility/utility.hpp index afbaf57..f08d746 100755 --- a/tools/bsnes/ui_qt/utility/utility.hpp +++ b/tools/bsnes/ui_qt/utility/utility.hpp @@ -16,18 +16,34 @@ public: void updateEmulationSpeed(); void updateControllers(); - //cartridge.cpp + //cartridge.cpp + struct Cartridge { + string name, baseName, slotAName, slotBName; + } cartridge; + string selectCartridge(); string selectFolder(const char *title); void loadCartridge(const char*); bool loadCartridgeNormal(const char*); bool loadCartridgeBsxSlotted(const char*, const char*); bool loadCartridgeBsx(const char*, const char*); - bool loadCartridgeSufamiTurbo(const char*, const char *, const char*); + bool loadCartridgeSufamiTurbo(const char*, const char *, const char*); + bool loadCartridgeSuperGameBoy(const char*, const char*); + void saveMemory(); void unloadCartridge(); enum system_state_t { LoadCartridge, UnloadCartridge, PowerOn, PowerOff, PowerCycle, Reset }; - void modifySystemState(system_state_t state); + void modifySystemState(system_state_t state); + + bool loadCartridge(const char*, SNES::MappedRAM&); + bool loadMemory(const char*, const char*, SNES::MappedRAM&); + bool saveMemory(const char*, const char*, SNES::MappedRAM&); + void loadCheats(); + void saveCheats(); + + string filepath(const char *filename, const char *pathname); + string basename(const char *filename); + string basepath(const char *filename); //window.cpp void showCentered(QWidget *window); diff --git a/tools/bsnes/ui_qt/utility/window.cpp b/tools/bsnes/ui_qt/utility/window.cpp index cb8b144..6ed37ca 100755 --- a/tools/bsnes/ui_qt/utility/window.cpp +++ b/tools/bsnes/ui_qt/utility/window.cpp @@ -2,31 +2,39 @@ void Utility::showCentered(QWidget *window) { QRect deskRect = QApplication::desktop()->availableGeometry(window); - //place window offscreen, so that it can be shown to get proper frameSize() - window->move(std::numeric_limits::max(), std::numeric_limits::max()); + #ifdef _WIN32 + if(window->isMinimized() == false) { + //place window offscreen, so that it can be shown to get proper frameSize() + window->move(std::numeric_limits::max(), std::numeric_limits::max()); + } window->showNormal(); - - //force-resize window to be as small as minimumSize() will allow, and then center it window->resize(0, 0); window->move( deskRect.center().x() - (window->frameSize().width() / 2), deskRect.center().y() - (window->frameSize().height() / 2) ); + #else + if(window->isVisible() == false) window->showMinimized(); + window->resize(0, 0); - #ifndef _WIN32 - //Xlib frame size (excluding inside) is QSize(0, 0) at first, wait for it to be valid + //Xlib returns a frame size of 0,0 at first; wait for it to be valid for(unsigned counter = 0; counter < 4096; counter++) { if(window->frameSize() != window->size()) break; application.processEvents(); } - #endif - //in case frame size changed, recenter window window->move( deskRect.center().x() - (window->frameSize().width() / 2), deskRect.center().y() - (window->frameSize().height() / 2) ); + for(unsigned counter = 0; counter < 4096; counter++) { + window->showNormal(); + application.processEvents(); + if(window->isMinimized() == false) break; + } + #endif + //ensure window has focus application.processEvents(); window->activateWindow(); @@ -84,6 +92,15 @@ void Utility::resizeMainWindow() { //get effective desktop work area region (ignore Windows taskbar, OS X doc, etc.) QRect deskRect = QApplication::desktop()->availableGeometry(winMain->window); + if(winMain->window->isVisible() == false) { + #ifdef _WIN32 + winMain->window->move(std::numeric_limits::max(), std::numeric_limits::max()); + winMain->window->showNormal(); + #else + winMain->window->showMinimized(); + #endif + } + //calculate frame geometry (window border + menubar + statusbar) unsigned frameWidth = winMain->window->frameSize().width() - winMain->canvasContainer->size().width(); unsigned frameHeight = winMain->window->frameSize().height() - winMain->canvasContainer->size().height();