[What Was New 003]

- added: alphabetical file sorting
- added: background logo/backdrop + nicer menus
- added: scrolling in ROM selector
- fixed: switching between pal/ntsc ROMS doesn't mess up timings
- fixed: GC controller config works now
- fixed: freeze autoloading on ROM load
- fixed: zipped ROMS should now load in a reasonable time
- fixed: precompiled dols for autosaving to various locations (see readme)
- changed: GC default quickload slot (to sd) (thanks kerframil)
- changed: default load/save dirs are now "/snes9x/roms" and "/snes/save/"  (thanks kerframil)
- changed: Classic X and Y defaults aren't switched
- changed: if autosave is enabled, it doesn't ask to save SRAM anymore. It is saved in the background.
- updated README
This commit is contained in:
michniewski 2008-08-06 01:55:59 +00:00
parent 6892e8152e
commit dee563ab2d
22 changed files with 1504 additions and 463 deletions

View File

@ -1,4 +1,6 @@
.PHONY = all wii gc wii-clean gc-clean wii-run gc-run .PHONY = all wii gc wii-clean gc-clean wii-run gc-run mca mcb sd smb mca-clean mcb-clean sd-clean smb-clean specials specials-clean
VERSION := 003
all: wii gc all: wii gc
@ -21,3 +23,42 @@ gc-clean:
gc-run: gc-run:
$(MAKE) -f Makefile.gc run $(MAKE) -f Makefile.gc run
# Custom Quicksave Versions
specials: sd mcb mca smb
specials-clean: mca-clean mcb-clean smb-clean sd-clean
mca:
touch source/ngc/snes9xGX.h
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=0" "LOADTYPE:='"MCSLOTA"'" "VERSION:=$(VERSION)" -f Makefile.wii
touch source/ngc/snes9xGX.h
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=0" "LOADTYPE:='"MCSLOTA"'" "VERSION:=$(VERSION)" -f Makefile.gc
mca-clean:
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=0" "LOADTYPE:='"MCSLOTA"'" "VERSION:=$(VERSION)" -f Makefile.wii clean
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=0" "LOADTYPE:='"MCSLOTA"'" "VERSION:=$(VERSION)" -f Makefile.gc clean
mcb:
touch source/ngc/snes9xGX.h
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=1" "LOADTYPE:='"MCSLOTB"'" "VERSION:=$(VERSION)" -f Makefile.wii
touch source/ngc/snes9xGX.h
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=1" "LOADTYPE:='"MCSLOTB"'" "VERSION:=$(VERSION)" -f Makefile.gc
mcb-clean:
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=1" "LOADTYPE:='"MCSLOTB"'" "VERSION:=$(VERSION)" -f Makefile.wii clean
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=1" "LOADTYPE:='"MCSLOTB"'" "VERSION:=$(VERSION)" -f Makefile.gc clean
sd:
touch source/ngc/snes9xGX.h
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=3" "LOADTYPE:='"SD"'" "VERSION:=$(VERSION)" -f Makefile.wii
touch source/ngc/snes9xGX.h
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=3" "LOADTYPE:='"SD"'" "VERSION:=$(VERSION)" -f Makefile.gc
sd-clean:
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=3" "LOADTYPE:='"SD"'" "VERSION:=$(VERSION)" -f Makefile.wii clean
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=3" "LOADTYPE:='"SD"'" "VERSION:=$(VERSION)" -f Makefile.gc clean
smb:
touch source/ngc/snes9xGX.h
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=4" "LOADTYPE:='"SMB"'" "VERSION:=$(VERSION)" -f Makefile.gc
smb-clean:
$(MAKE) "CUSTOMFLAGS:=-DQUICK_SAVE_SLOT=4" "LOADTYPE:='"SMB"'" "VERSION:=$(VERSION)" -f Makefile.gc clean

View File

@ -9,13 +9,16 @@ endif
include $(DEVKITPPC)/gamecube_rules include $(DEVKITPPC)/gamecube_rules
LOADTYPE = '"sd"'
VERSION = '"version"'
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# TARGET is the name of the output # TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed # BUILD is the directory where object files & intermediate files will be placed
# SOURCES is a list of directories containing source code # SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files # INCLUDES is a list of directories containing extra header files
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
TARGET := snes9xgx-mm-gc TARGET := executables/snes9xgx-$(VERSION)-$(LOADTYPE)-gc
BUILD := build_gc BUILD := build_gc
SOURCES := source/snes9x source/unzip source/ngc source/smb SOURCES := source/snes9x source/unzip source/ngc source/smb
DATA := data DATA := data
@ -25,18 +28,19 @@ INCLUDES := source/snes9x source/unzip source/ngc source/smb
# options for code generation # options for code generation
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
CUSTOMFLAGS = -DQUICK_SAVE_SLOT=1 -DSMB_SVID='"Crunchewy"' \
-DSMB_IP='"192.168.1.111"' -DGW_IP='"192.168.1.1"'
CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) \ CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) \
-DNGC -DNO_ASM -DCPU_SHUTDOWN -DSPC700C \ -DNGC -DNO_ASM -DCPU_SHUTDOWN -DSPC700C \
-DSPC700_SHUTDOWN -DNEW_COLOUR_BLENDING \ -DSPC700_SHUTDOWN -DNEW_COLOUR_BLENDING \
-DNO_INLINE_GET_SET -DSDD1_DECOMP -DCORRECT_VRAM_READS \ -DNO_INLINE_GET_SET -DSDD1_DECOMP -DCORRECT_VRAM_READS \
-DDETECT_NASTY_FX_INTERLEAVE -DNGC_ZOOM -DSDUSE_LFN \ -DDETECT_NASTY_FX_INTERLEAVE -DNGC_ZOOM -DSDUSE_LFN \
-DQUICK_SAVE_SLOT=4 -DSMB_SVID='"Crunchewy"' \ -DFORCE_WII=0 $(CUSTOMFLAGS) \
-DSMB_IP='"192.168.1.111"' -DGW_IP='"192.168.1.1"' -DFORCE_WII=0 \
-fomit-frame-pointer -fno-exceptions -Wno-unused-parameter -pipe -fomit-frame-pointer -fno-exceptions -Wno-unused-parameter -pipe
CXXFLAGS = $(CFLAGS) CXXFLAGS = $(CFLAGS)
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -Wl,--cref LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -Wl,--cref
# -mogc
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project # any extra libraries we wish to link with the project

View File

@ -9,13 +9,17 @@ endif
include $(DEVKITPPC)/wii_rules include $(DEVKITPPC)/wii_rules
LOADTYPE = '"sd"'
VERSION = '"version"'
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# TARGET is the name of the output # TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed # BUILD is the directory where object files & intermediate files will be placed
# SOURCES is a list of directories containing source code # SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files # INCLUDES is a list of directories containing extra header files
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
TARGET := snes9xgx-mm-wii TARGET := executables/snes9xgx-$(VERSION)-$(LOADTYPE)-wii
BUILD := build_wii BUILD := build_wii
SOURCES := source/snes9x source/unzip source/ngc source/smb SOURCES := source/snes9x source/unzip source/ngc source/smb
DATA := data DATA := data
@ -25,18 +29,19 @@ INCLUDES := source/snes9x source/unzip source/ngc source/smb
# options for code generation # options for code generation
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
CUSTOMFLAGS = -DQUICK_SAVE_SLOT=3 -DSMB_SVID='"Crunchewy"' \
-DSMB_IP='"192.168.1.111"' -DGW_IP='"192.168.1.1"'
CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) \ CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) \
-DNGC -DHW_RVL -DNO_ASM -DCPU_SHUTDOWN -DSPC700C \ -DNGC -DHW_RVL -DNO_ASM -DCPU_SHUTDOWN -DSPC700C \
-DSPC700_SHUTDOWN -DNEW_COLOUR_BLENDING \ -DSPC700_SHUTDOWN -DNEW_COLOUR_BLENDING \
-DNO_INLINE_GET_SET -DSDD1_DECOMP -DCORRECT_VRAM_READS \ -DNO_INLINE_GET_SET -DSDD1_DECOMP -DCORRECT_VRAM_READS \
-DDETECT_NASTY_FX_INTERLEAVE -DNGC_ZOOM -DSDUSE_LFN \ -DDETECT_NASTY_FX_INTERLEAVE -DNGC_ZOOM -DSDUSE_LFN \
-DQUICK_SAVE_SLOT=3 -DSMB_SVID='"Crunchewy"' \ -DFORCE_WII=1 $(CUSTOMFLAGS)\
-DSMB_IP='"192.168.1.111"' -DGW_IP='"192.168.1.1"' -DFORCE_WII=1 \
-fomit-frame-pointer -fno-exceptions -Wno-unused-parameter -pipe -fomit-frame-pointer -fno-exceptions -Wno-unused-parameter -pipe
CXXFLAGS = $(CFLAGS) CXXFLAGS = $(CFLAGS)
LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -Wl,--cref LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -Wl,--cref
# -mogc
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project # any extra libraries we wish to link with the project

View File

@ -10,28 +10,30 @@
­———————————————————————————————————————————————————————————————————————•ßrK• ­———————————————————————————————————————————————————————————————————————•ßrK•
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬ ×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· SNES9XGX v2.0.1b8 ·oø×O0| |0O×øo· SNES9XGX v003 ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨' `¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
******************************************************************************* PLEASE NOTE: THIS DOCUMENT IS A WORK IN PROGRESS
PLEASE NOTE: THIS DOCUMENT IS A WORK IN PROGRESS - IT IS INCOMPLETE AND SOME OF
THE INFORMATION IS OUT OF DATE
*******************************************************************************
Welcome to the revolution in GameCube emulators! SNES9X is by far the most [What's New 003]
complete and accurate Super Nintendo Entertainment System emulator to date.
Taking full power of the ATi-GX chipset and packed full of features that are
to die for after playing your games you'll never want to come back to
reality.
SNES9X is a very popular open source emulator mainly for the PC platform, but - added: alphabetical file sorting
has seen many ports to other consoles such as the Nintendo DS, Microsoft XBOX - added: background logo/backdrop + nicer menus
and now thanks to SoftDev the Nintendo GameCube! This is a straight port and - added: scrolling in ROM selector
is not based on any previous SNES emulators that have existed for the - fixed: switching between pal/ntsc ROMS doesn't mess up timings
GameCube. You can get more information on SNES9X here from the below URL. - fixed: GC controller config works now
http://snes9x.ipherswipsite.com/ - fixed: freeze autoloading on ROM load
- fixed: zipped ROMS should now load in a reasonable time
- fixed: precompiled dols for autosaving to various locations (see readme)
- changed: GC default quickload slot (to sd) (thanks kerframil)
- changed: default load/save dirs are now "/snes9x/roms" and
"/snes/save/" (thanks kerframil)
- changed: Classic X and Y defaults aren't switched
- changed: if autosave is enabled, it doesn't ask to save SRAM
anymore. It is saved in the background.
- updated README
[What's New 002] [Whats Was New 002]
- added: classic and nunchuk support - added: classic and nunchuk support
- added: all controllers can now be configured - added: all controllers can now be configured
- added: GC version (untested) - added: GC version (untested)
@ -49,6 +51,227 @@ http://snes9x.ipherswipsite.com/
- fixed: autoload sram/freeze - fixed: autoload sram/freeze
- fixed: rom plays immediately after loading - fixed: rom plays immediately after loading
[older update history at the bottom]
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· FEATURES ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
- Based on Snes9x 1.5 - superior ROM compatibility
- Auto Load/Save Freeze States and SRAM
- Custom controller configurations
- Wiimote, Nunchuk, Classic, and Gamecube controller support
- Autodetect PAL/NTSC
- Zip Support
- Open Source!
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· SETUP & INSTALLATION ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Unzip the archive into a folder. You'll find 4 variations of the dol for both
wii and gamecube versions. The variants auto save and load preferences and sram
to/from different locations as follows (you can also manually save and load
SRAM to any location).
[A default version is provided for quick install. See loading from HBC below.]
filename preferences/sram autoloading location
------------------------- -------------------------------------
snes9xGX-003-sd-xxxx.dol SD card
snes9xGX-003-mcslota-xxxx.dol Memory card in slot A
snes9xGX-003-mcslotb-xxxx.dol Memory card in slot B
snes9xGX-003-smb-xxxx.dol SMB share (see SMB section below)
snes9xGX-003-noload-xxxx.dol none - doesn't load prefs nor autosave SRAM
The last part of the filename (shown above as xxxx), denotes the wii and gamecube
versions.
----------------------------
ROMS, Preferences, and Saves:
----------------------------
Your SNES rom images must be in the Super Magicom (SMC) or FIG format. Generally,
all images you find will be in this format, but if you run across one that isn't
please download RTOOL which will allow you to convert the image into SMC format.
Wii
----------
On the Wii, you can load roms from any SD card (Front SD, SD Gecko, etc).
By default, ROMs are loaded from "snes9x/roms/" and saves and preferences are
stored in "snes9x/saves/". Therefore, on your SD card, you should have the following
folders:
snes9x/
roms/
saves/
Gamecube
------------
You can load roms from DVD, SD card or SMB share. If you wish to use an SD card
or SMB share, you must create the same folder tree as above. Put your roms in the
"snes9x/roms" folder. On DVD you can either place your roms at the top level, or
optionally you may have an SNESROMS folder at the top level of the DVD, in which
case the game selectorwill default to showing that folder when first entered.
If you create a bootable DVD of Snes9xGx you can put roms on the same DVD.
------------------------------
Loading / Running the Emulator:
------------------------------
Via Homebrew Channel:
--------------------
The most popular method of running homebrew on the wii is through the Homebrew
Channel. If you already have the channel installed, just copy over the apps folder
included in the archive into the root of your SD card (the SD autosaving version
for wii is included in the apps/Snes9xGX/ folder renamed to boot.dol).
Remember to also create the snes9x/roms and snes9x/saves directories. See above.
If you wish to use a version that autosaves to other available saving locations,
just choose the appropriate dol, copy it into the apps/Snes9XGX/ folder, and
RENAME it to boot.dol (remove the other version). Then proceed to copy
the entire apps folder to your sd card and run it with the HBC.
If you haven't installed the homebrew channel yet, read about how to here:
http://hbc.hackmii.com/
Gamecube:
---------
You can load it via sdload and an SD card in slot A, or by streaming it to your
cube, or by booting a bootable DVD (gamecube only) with it on it. This document doesn't cover
how to do any of that. A good source for information on these topics is the
tehskeen forums:
http://www.tehskeen.com/forums/
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· ABOUT SNES9X ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Welcome to the revolution in GameCube emulators! SNES9X is by far the most
complete and accurate Super Nintendo Entertainment System emulator to date.
Taking full power of the ATi-GX chipset and packed full of features that are
to die for after playing your games you'll never want to come back to
reality.
SNES9X is a very popular open source emulator mainly for the PC platform, but
has seen many ports to other consoles such as the Nintendo DS, Microsoft XBOX
and now thanks to SoftDev the Nintendo GameCube! This is a straight port and
is not based on any previous SNES emulators that have existed for the
GameCube. You can get more information on SNES9X here from the below URL.
http://snes9x.ipherswipsite.com/
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· DEFAULT CONTROLLER MAPPING ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
NOTE: You can change the controller configurations to your liking in the menu
under the Config Controllers option.
Below are the default button mappings for supported controllers. The wiimote
configuration allows you to play with the wiimote held sideways.
Wiimote SNES Nunchuk SNES
--------------------- ---------------------
1 Y Z Y
2 B B B
A A A A
B X C X
- SELECT 2 SELECT
+ START 1 START
HOME Emulator menu HOME Emulator menu
LT - LT
RT + RT
Classic SNES GC PAD SNES
--------------------- ---------------------
X X Y Y
B B B B
A A A A
Y Y X X
- SELECT Z SELECT
+ START START START
HOME Emulator menu
LT LT LT LT
RT RT RT RT
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· ZIP SUPPORT ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
The Zip support in the emulator is courtesy of the zlib library. Currently,
it supports only the Inflate method.
The good news is that this is by far the most common zip method!
You should note also that this implementation assumes that the first file
in each archive is the required rom in smc/fig format.
In an attempt to save you time, we recommend using 7-Zip as the compressor,
as it gives a gain of 5-25% better compression over standard zips. This being
said, you can very well use WinZip or any other zip utility to create your zipped
ROMs.
To use 7-Zip compression on either linux or windows, use the following command:
7za a -tzip -mx=9 myrom.zip myrom.smc
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· MAIN MENU ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Once the DOL file is loaded you will be presented with main menu where you can
load a ROM, set options for the emulator, set the joypad configuration, save or
load freezes, manage SRAM, etc.
After loading a game the game will start running immediately. If you have the
auto-load SRAM option enabled it will automatically load SRAM (if it exists)
before starting play.
You can return to the main menu at any time by pressing
the c-stick (the yellow control stick) to the left, or by pressing L+R+X+Y.
Return to the game by selecting "Resume Game" or by pressing the B button until
play resumes.
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· TURBO MODE ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
TurboMode increases the playback speed of the game by about 2x. To use TurboMode
simply press the c-stick (yellow control stick) to the right and hold it right
as long as you want playback to be double-speed. Release the c-stick when you
want normal playback speed to resume.
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· IMPORTING AND EXPORTING SRAM ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Snes9xGx 2.0.1 now includes the ability to load SRAM from Snes9x on other
platforms (Mac/PC/Linux/Etc) and to save back to those platforms. To use this
feature simply save or load SRAM to/from SD card or an SMB share.
The only thing to be aware of is that Snes9xGx requires that the SRM file have a
name that is the rom name (not necessarily the same as the file name!) with .SRM
at the end. For example, the game "Super Mario All-Stars + World" has a rom name
of "ALL_STARS + WORLD", so the SRAM file should have the name "ALL_STARS +
WORLD.srm". You can see the rom name for a game by loading the game - the rom
name is shown in the information that is briefly shown at the bottom of the
screen. A perhaps easier way to find the correct name is simply to load the game
and then save SRAM to SD or SMB and look at the filename that Snes9xGx uses.
That's the name you should use when importing an SRAM from another platform.
To use an Snes9xGx SRAM on another platform just do the opposite: save SRAM to
SD or SMB, and then copy that saved SRAM file to the other platform. You may
have to rename the file to be what that version of snes9x expects it to be.
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· UPDATE HISTORY (old) ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
[What Was New 2.0.1b8] [What Was New 2.0.1b8]
* Added: SD slot B options for freezes, sram and loading of roms * Added: SD slot B options for freezes, sram and loading of roms
* Changed: SMB options no longer displayed in menus when run on a Wii * Changed: SMB options no longer displayed in menus when run on a Wii
@ -166,207 +389,6 @@ changes to the emulator settings again and save them.
* Analog Clip * Analog Clip
* XenoGC Support (GC-Linux Homebrew DVD Compatibility) * XenoGC Support (GC-Linux Homebrew DVD Compatibility)
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· SETUP & INSTALLATION ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Unzip the archive into a folder. You'll find 6 variations of the dol, along
with an "inject" tool for (optionally) injecting a rom into a dol. The six
variants auto save and load preferences and sram to/from different locations
as follows (you can also manually save and load SRAM to any location):
filename preferences/sram autoloading location
------------------------- -------------------------------------
snes9xGx201b8-mcslota.dol Memory card in slot A
snes9xGx201b8-mcslotb.dol Memory card in slot B
snes9xGx201b8-sdslota.dol SD card in SD adapter in slot A
snes9xGx201b8-sdslotb.dol SD card in SD adapter in slot B
snes9xGx201b8-smb.dol SMB share (see SMB section below)
snes9xGx201b8-noload.dol none - doesn't load prefs nor autosave SRAM
Your SNES rom images must be in the Super Magicom (SMC) or FIG format. Generally,
all images you find will be in this format, but if you run across one that isn't
please download RTOOL which will allow you to convert the image into SMC format.
You can load roms from DVD, SD card or SMB share. If you wish to use an SD card
or SMB share, you must create an SNESROMS and an SNESSAVE folder at the top
level (root) of the card or share. Put your roms in the SNESROMS folder. On DVD
you can either place your roms at the top level, or optionally you may have an
SNESROMS folder at the top level of the DVD, in which case the game selector
will default to showing that folder when first entered. If you create a bootable
DVD of Snes9xGx you can put roms on the same DVD.
Now that you have that set up all you need to do is load the dol of your choice.
You can load it via sdload and an SD card in slot A, or by streaming it to your
cube, or by booting a bootable DVD with it on it. This document doesn't cover
how to do any of that. A good source for information on these topics is the
tehskeen forums:
http://www.tehskeen.com/forums/
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· DEFAULT CONTROLLER MAPPING ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Wiimote SNES
---------------------
1 Y
2 B
A A
B X
- SELECT
+ START
HOME Emulator menu
LT
RT
This configuration allows you to play with the wiimote held sideways.
Nunchuk SNES
---------------------
Z Y
B B
A A
C X
2 SELECT
1 START
HOME Emulator menu
- LT
+ RT
Classic SNES
---------------------
X Y
B B
A A
Y X
- SELECT
+ START
HOME Emulator menu
LT LT
RT RT
GC PAD SNES
---------------------
Y Y
B B
A A
X X
Z SELECT
START START
LT LT
RT RT
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· PARTIAL PKZIP SUPPORT ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
The Zip support in the emulator is courtesy of the zlib library. Currently,
it supports only the Inflate method.
The good news is that this is by far the most common zip method!
You should note also that this implementation assumes that the first file
in each archive is the required rom in smc/fig format.
In an attempt to save you time, we recommend using 7-Zip as the compressor,
as it gives a gain of 5-25% better compression over standard zips.
To use 7-Zip compression on either linux or windows, use the following command:
7za a -tzip -mx=9 myrom.zip myrom.smc
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· MAIN MENU ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Once the DOL file is loaded you will be presented with main menu where you can
load a rom from DVD, SD or SMB, set options for the emulator, set the joypad
configuration (on a per-game basis), save or load freezes, manage SRAM, etc.
After loading a game the game will start running immediately. If you have the
auto-load SRAM option enabled it will automatically load SRAM (if it exists)
before starting play. You can return to the main menu at any time by pressing
the c-stick (the yellow control stick) to the left, or by pressing L+R+X+Y.
Return to the game by selecting "Resume Game" or by pressing the B button until
play resumes.
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· TURBO MODE ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
TurboMode increases the playback speed of the game by about 2x. To use TurboMode
simply press the c-stick (yellow control stick) to the right and hold it right
as long as you want playback to be double-speed. Release the c-stick when you
want normal playback speed to resume.
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· IMPORTING AND EXPORTING SRAM ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Snes9xGx 2.0.1 now includes the ability to load SRAM from Snes9x on other
platforms (Mac/PC/Linux/Etc) and to save back to those platforms. To use this
feature simply save or load SRAM to/from SD card or an SMB share.
The only thing to be aware of is that Snes9xGx requires that the SRM file have a
name that is the rom name (not necessarily the same as the file name!) with .SRM
at the end. For example, the game "Super Mario All-Stars + World" has a rom name
of "ALL_STARS + WORLD", so the SRAM file should have the name "ALL_STARS +
WORLD.srm". You can see the rom name for a game by loading the game - the rom
name is shown in the information that is briefly shown at the bottom of the
screen. A perhaps easier way to find the correct name is simply to load the game
and then save SRAM to SD or SMB and look at the filename that Snes9xGx uses.
That's the name you should use when importing an SRAM from another platform.
To use an Snes9xGx SRAM on another platform just do the opposite: save SRAM to
SD or SMB, and then copy that saved SRAM file to the other platform. You may
have to rename the file to be what that version of snes9x expects it to be.
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· INJECTING A ROM ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
Injecting a rom is not required to use snes9xGx, but if you primarily use
snes9xGx by streaming it to your cube you may wish to inject a rom into the dol.
In that case the game will start playing immediately once Snes9xGx loads. If you
have the auto-load SRAM option enabled it will load SRAM before starting the
game as well.
To inject a rom you use the "inject.exe" tool on Windows or the "inject" tool on
Mac OS X. This tool works at the command line and has syntax as follows:
inject original.dol gamerom.smc output.dol
On the Mac you will either need to copy the inject tool into a location that is
in your "PATH" or just go into the directory that has the inject tool in it and
proceed the command with "./" like this:
./inject original.dol gamerom.smc output.dol
Once you run the tool on your dol, just stream the outputted dol to your cube,
or otherwise load it and Snes9xGx will load and the game will start running.
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· WAVEBIRD WIRELESS CONTROLLER ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
This note applies to all homebrew GC software. The Wavebird wireless controller
CAN be used with homebrew, including Snes9xGx, but to enable it you must press a
button on the controller when you power up the GC and see the Gamecube logo.
This will initialize the controller and allow it to function in Snes9xGx and
other homebrew software.
You must do this each time you power up your Gamecube. Also, if you unplug the
wireless receiver while Snes9xGx is running and plug it back in, it will not
work - you will then have to plug in a wired controller to continue play. Until
someone figures out how to properly handle the Wavebird, this will continue to
be the case. My ears are open!
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· SMB ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'
TBD
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬ ×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· CREDITS ·oø×O0| |0O×øo· CREDITS ·oø×O0|
@ -378,10 +400,9 @@ TBD
GameCube Port 2.0 WIP6 and earlier - SoftDev GameCube Port 2.0 WIP6 and earlier - SoftDev
Additional improvements to 2.0 WIP6 - eke-eke Additional improvements to 2.0 WIP6 - eke-eke
GameCube 2.0.1bx enhancements - crunchy2 GameCube 2.0.1bx enhancements - crunchy2
v001 updates - michniewski v00x updates - michniewski
GX - http://www.gc-linux.org GX - http://www.gc-linux.org
Font - Qoob Team libogc - Shagkur & wintermute
libogc - Shagkur
Testing Testing
@ -389,9 +410,8 @@ TBD
Documentation Documentation
original by brakken/updated by crunchy2 brakken, crunchy2, michniewski
×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬ ×—–­—–­—–­—–­ –­—–­—–­—–­—–­—–­—–­—–­—–­—–­— ­—–­—–­—–­—–­—–­—–­—–­—-­—–­-–•¬
|0O×øo· SNES9XGX v2.0.1b8 ·oø×O0| |0O×øo· ·oø×O0|
`¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨' `¨•¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ ¨¨¨¨¨¨¨¨¨¨¨¨¨'

View File

@ -31,7 +31,7 @@
#include "ftfont.h" #include "ftfont.h"
#include "video.h" #include "video.h"
#include "aram.h" #include "aram.h"
#include "ngcunzip.h" #include "unzip.h"
#include "filesel.h" #include "filesel.h"
#include "smbload.h" #include "smbload.h"
#include "sdload.h" #include "sdload.h"
@ -140,13 +140,17 @@ int selection = 0;
int int
FileSelector () FileSelector ()
{ {
u32 p, wp; u32 p, wp, ph, wh;
signed char a; signed char a, c;
int haverom = 0; int haverom = 0;
int redraw = 1; int redraw = 1;
int selectit = 0; int selectit = 0;
float mag = 0; float mag = 0;
u16 ang = 0; u16 ang = 0;
int scroll_delay = 0;
bool move_selection = 0;
#define SCROLL_INITIAL_DELAY 15
#define SCROLL_LOOP_DELAY 4
while (haverom == 0) while (haverom == 0)
{ {
@ -154,17 +158,25 @@ FileSelector ()
ShowFiles (offset, selection); ShowFiles (offset, selection);
redraw = 0; redraw = 0;
VIDEO_WaitVSync(); // slow things down a bit so we don't overread the pads
p = PAD_ButtonsDown (0); p = PAD_ButtonsDown (0);
ph = PAD_ButtonsHeld (0);
#ifdef HW_RVL #ifdef HW_RVL
wp = WPAD_ButtonsDown (0); wp = WPAD_ButtonsDown (0);
wh = WPAD_ButtonsHeld (0);
wpad_get_analogues(0, &mag, &ang); // get joystick info from wii expansions wpad_get_analogues(0, &mag, &ang); // get joystick info from wii expansions
#else #else
wp = 0; wp = 0;
wh = 0;
#endif #endif
a = PAD_StickY (0); a = PAD_StickY (0);
c = PAD_SubStickX (0);
VIDEO_WaitVSync(); // slow things down a bit so we don't overread the pads
/*** Check for exit combo ***/
if ( (c < -70) || (wp & WPAD_BUTTON_HOME) || (wp & WPAD_CLASSIC_BUTTON_HOME) ) return 0;
/*** Check buttons, perform actions ***/
if ( (p & PAD_BUTTON_A) || selectit || (wp & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) ) if ( (p & PAD_BUTTON_A) || selectit || (wp & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) )
{ {
if ( selectit ) if ( selectit )
@ -274,28 +286,57 @@ FileSelector ()
return 0; return 0;
} }
} // End of B } // End of B
if ( (p & PAD_BUTTON_DOWN) || (wp & (WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN)) || (a < -PADCAL) || (mag>JOY_THRESHOLD && (ang>130 && ang<230)) ) if ( ((p | ph) & PAD_BUTTON_DOWN) || ((wp | wh) & (WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN)) || (a < -PADCAL) || (mag>JOY_THRESHOLD && (ang>130 && ang<230)) )
{ {
selection++; if ( (p & PAD_BUTTON_DOWN) || (wp & (WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN)) ) { /*** Button just pressed ***/
if (selection == maxfiles) scroll_delay = SCROLL_INITIAL_DELAY; // reset scroll delay.
selection = offset = 0; move_selection = 1; //continue (move selection)
if ((selection - offset) >= PAGESIZE) }
offset += PAGESIZE; else if (scroll_delay == 0) { /*** Button is held ***/
redraw = 1; scroll_delay = SCROLL_LOOP_DELAY;
move_selection = 1; //continue (move selection)
} else {
scroll_delay--; // wait
}
if (move_selection)
{
selection++;
if (selection == maxfiles)
selection = offset = 0;
if ((selection - offset) >= PAGESIZE)
offset += PAGESIZE;
redraw = 1;
move_selection = 0;
}
} // End of down } // End of down
if ( (p & PAD_BUTTON_UP) || (wp & (WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP)) || (a > PADCAL) || (mag>JOY_THRESHOLD && (ang>300 || ang<50)) ) if ( ((p | ph) & PAD_BUTTON_UP) || ((wp | wh) & (WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP)) || (a > PADCAL) || (mag>JOY_THRESHOLD && (ang>300 || ang<50)) )
{ {
selection--; if ( (p & PAD_BUTTON_UP) || (wp & (WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP)) ) { /*** Button just pressed***/
if (selection < 0) scroll_delay = SCROLL_INITIAL_DELAY; // reset scroll delay.
{ move_selection = 1; //continue (move selection)
selection = maxfiles - 1; }
offset = selection - PAGESIZE + 1; else if (scroll_delay == 0) { /*** Button is held ***/
} scroll_delay = SCROLL_LOOP_DELAY;
if (selection < offset) move_selection = 1; //continue (move selection)
offset -= PAGESIZE; } else {
if (offset < 0) scroll_delay--; // wait
offset = 0; }
redraw = 1;
if (move_selection)
{
selection--;
if (selection < 0) {
selection = maxfiles - 1;
offset = selection - PAGESIZE + 1;
}
if (selection < offset)
offset -= PAGESIZE;
if (offset < 0)
offset = 0;
redraw = 1;
move_selection = 0;
}
} // End of Up } // End of Up
if ( (p & PAD_BUTTON_LEFT) || (wp & (WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT)) ) if ( (p & PAD_BUTTON_LEFT) || (wp & (WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT)) )
{ {
@ -400,7 +441,7 @@ OpenSMB ()
* Function to load from an SD Card * Function to load from an SD Card
*/ */
int int
OpenSD (int slot) OpenSD ()
{ {
char msg[80]; char msg[80];
char buf[50] = ""; char buf[50] = "";
@ -412,8 +453,8 @@ OpenSD (int slot)
/* don't mess with DVD entries */ /* don't mess with DVD entries */
havedir = 0; // gamecube only havedir = 0; // gamecube only
/* get current SDCARD directory */ /* change current dir to snes roms directory */
sprintf ( currSDdir, getcwd(buf,50) ); // FIX: necessary? sprintf ( currSDdir, "%s/%s", ROOTSDDIR, SNESROMDIR );
/* Parse initial root directory and get entries list */ /* Parse initial root directory and get entries list */
@ -425,7 +466,7 @@ OpenSD (int slot)
else else
{ {
/* no entries found */ /* no entries found */
sprintf (msg, "SNESROMS not found on SDCARD"); // FIX: update error msg sprintf (msg, "No Files Found!");
WaitPrompt (msg); WaitPrompt (msg);
return 0; return 0;
} }
@ -492,7 +533,7 @@ LoadDVDFile (unsigned char *buffer)
else else
{ {
return UnZipBuffer (buffer, discoffset, rootdirlength); return UnZipBuffer (buffer, discoffset, 1, NULL); // unzip from dvd
} }
return rootdirlength; return rootdirlength;
} }

View File

@ -12,12 +12,13 @@
int OpenDVD (); int OpenDVD ();
int OpenSMB (); int OpenSMB ();
int OpenSD (int slot); int OpenSD ();
#define LOAD_DVD 1 #define LOAD_DVD 1
#define LOAD_SMB 2 #define LOAD_SMB 2
#define LOAD_SDC 4 #define LOAD_SDC 4
#define SNESROMDIR "SNESROMS" #define ROOTSDDIR "fat:/"
#define SNESSAVEDIR "SNESSAVE" #define SNESROMDIR "snes9x/roms"
#define SNESSAVEDIR "snes9x/saves"
#endif #endif

View File

@ -29,12 +29,13 @@
#include "video.h" #include "video.h"
#include "ftfont.h" #include "ftfont.h"
#include "dkpro.h" #include "dkpro.h"
#include "tempgfx.h"
#include "snes9xGX.h" #include "snes9xGX.h"
#include "aram.h" #include "aram.h"
#include <zlib.h> #include <zlib.h>
#include "gfx_bg.h"
/*** Globals ***/ /*** Globals ***/
FT_Library ftlibrary; FT_Library ftlibrary;
FT_Face face; FT_Face face;
@ -228,7 +229,7 @@ licence ()
else else
ypos += 24; ypos += 24;
setfontsize (16); // FIX setfontsize (16);
setfontcolour (0x00, 0x00, 0x00); setfontcolour (0x00, 0x00, 0x00);
DrawText (-1, ypos += 40, (char*)"Snes9x - Copyright (c) Snes9x Team 1996 - 2006"); DrawText (-1, ypos += 40, (char*)"Snes9x - Copyright (c) Snes9x Team 1996 - 2006");
@ -237,7 +238,7 @@ licence ()
DrawText (-1, ypos += 20, (char*)"redistribute it under the conditions of the"); DrawText (-1, ypos += 20, (char*)"redistribute it under the conditions of the");
DrawText (-1, ypos += 20, (char*)"GNU GENERAL PUBLIC LICENSE Version 2"); DrawText (-1, ypos += 20, (char*)"GNU GENERAL PUBLIC LICENSE Version 2");
DrawText (-1, ypos += DrawText (-1, ypos +=
20, (char*)"Additionally, the developers of this port disclaims"); 20, (char*)"Additionally, the developers of this port disclaim");
DrawText (-1, ypos += DrawText (-1, ypos +=
20, (char*)"all copyright interests in the Nintendo GameCube"); 20, (char*)"all copyright interests in the Nintendo GameCube");
DrawText (-1, ypos += DrawText (-1, ypos +=
@ -281,7 +282,7 @@ showdklogo ()
int w, h, p, dispoffset; int w, h, p, dispoffset;
p = 0; p = 0;
dispoffset = dispoffset =
((screenheight != 480 ? 360 : 350) * 320) + ((640 - dkpro_WIDTH) >> 2); ((screenheight != 480 ? 365 : 355) * 320) + ((640 - dkpro_WIDTH) >> 2);
dkunpack (); dkunpack ();
@ -354,11 +355,11 @@ unpackbackdrop ()
/*** If it's PAL50, need to move down a few lines ***/ /*** If it's PAL50, need to move down a few lines ***/
offset = ((screenheight - 480) >> 1) * 320; offset = ((screenheight - 480) >> 1) * 320;
inbytes = tempgfx_COMPRESSED; inbytes = BG_COMPRESSED;
outbytes = tempgfx_RAW; outbytes = BG_RAW;
res = res =
uncompress ((Bytef *) backdrop + offset, &outbytes, (Bytef *) tempgfx, uncompress ((Bytef *) backdrop + offset, &outbytes, (Bytef *) bg,
inbytes); inbytes);
#ifndef HW_RVL #ifndef HW_RVL
@ -390,11 +391,11 @@ void
WaitButtonA () WaitButtonA ()
{ {
#ifdef HW_RVL #ifdef HW_RVL
while ( (PAD_ButtonsDown (0) & PAD_BUTTON_A) || (WPAD_ButtonsDown(0) & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) ); while ( (PAD_ButtonsDown (0) & PAD_BUTTON_A) || (WPAD_ButtonsDown(0) & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) ) VIDEO_WaitVSync();
while (!(PAD_ButtonsDown (0) & PAD_BUTTON_A) && !(WPAD_ButtonsDown(0) & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) ); while (!(PAD_ButtonsDown (0) & PAD_BUTTON_A) && !(WPAD_ButtonsDown(0) & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) ) VIDEO_WaitVSync();
#else #else
while ( PAD_ButtonsDown (0) & PAD_BUTTON_A ); while ( PAD_ButtonsDown (0) & PAD_BUTTON_A ) VIDEO_WaitVSync();
while (!(PAD_ButtonsDown (0) & PAD_BUTTON_A) ); while (!(PAD_ButtonsDown (0) & PAD_BUTTON_A) ) VIDEO_WaitVSync();
#endif #endif
} }
@ -410,7 +411,7 @@ WaitButtonAB ()
while ( (PAD_ButtonsDown (0) & (PAD_BUTTON_A | PAD_BUTTON_B)) while ( (PAD_ButtonsDown (0) & (PAD_BUTTON_A | PAD_BUTTON_B))
|| (WPAD_ButtonsDown(0) & (WPAD_BUTTON_A | WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_A | WPAD_CLASSIC_BUTTON_B)) || (WPAD_ButtonsDown(0) & (WPAD_BUTTON_A | WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_A | WPAD_CLASSIC_BUTTON_B))
); ) VIDEO_WaitVSync();
while ( TRUE ) while ( TRUE )
{ {
@ -424,7 +425,7 @@ WaitButtonAB ()
#else #else
u32 gc_btns; u32 gc_btns;
while ( (PAD_ButtonsDown (0) & (PAD_BUTTON_A | PAD_BUTTON_B)) ); while ( (PAD_ButtonsDown (0) & (PAD_BUTTON_A | PAD_BUTTON_B)) ) VIDEO_WaitVSync();
while ( TRUE ) while ( TRUE )
{ {
@ -504,7 +505,7 @@ ShowAction (char *msg)
* Generic Menu Routines * Generic Menu Routines
****************************************************************************/ ****************************************************************************/
void void
DrawMenu (char items[][20], char *title, int maxitems, int selected) DrawMenu (char items[][20], char *title, int maxitems, int selected, int fontsize)
{ {
int i, w; int i, w;
int ypos; int ypos;
@ -516,7 +517,8 @@ DrawMenu (char items[][20], char *title, int maxitems, int selected)
}; };
#endif #endif
ypos = (screenheight - (maxitems * 32)) >> 1; //ypos = (screenheight - (maxitems * 32)) >> 1; previous
ypos = (screenheight - (maxitems * (fontsize + 8))) >> 1;
if (screenheight == 480) if (screenheight == 480)
ypos += 52; ypos += 52;
@ -525,30 +527,36 @@ DrawMenu (char items[][20], char *title, int maxitems, int selected)
clearscreen (); clearscreen ();
#if 0 //#if 0
DrawPolygon (4, bounding, 0x00, 0x00, 0xc0); // DrawPolygon (4, bounding, 0x00, 0x00, 0xc0);
DrawPolygon (4, base, 0x00, 0x00, 0xc0); // DrawPolygon (4, base, 0x00, 0x00, 0xc0);
setfontsize (32); setfontsize (30);
DrawText (-1, 80, title); if (title != NULL)
DrawText (-1, screenheight - 50, "Snes9x - GX 2.0"); DrawText (-1, 60, title);
#endif setfontsize (12);
DrawText (510, screenheight - 20, "Snes9x GX 003");
//#endif
setfontsize (24); setfontsize (fontsize); // set font size
setfontcolour (0, 0, 0); setfontcolour (0, 0, 0);
for (i = 0; i < maxitems; i++) for (i = 0; i < maxitems; i++)
{ {
if (i == selected) if (i == selected)
{ {
for( w = 0; w < 32; w++ ) //for( w = 0; w < 32; w++ )
DrawLineFast( 30, 610, (i << 5) + (ypos-26) + w, 0x80, 0x80, 0x80 ); for( w = 0; w < (fontsize + 8); w++ )
//DrawLineFast( 30, 610, (i << 5) + (ypos-26) + w, 0x80, 0x80, 0x80 ); previous
DrawLineFast( 30, 610, i * (fontsize + 8) + (ypos-(fontsize + 2)) + w, 0x80, 0x80, 0x80 );
setfontcolour (0xff, 0xff, 0xff); setfontcolour (0xff, 0xff, 0xff);
DrawText (-1, (i << 5) + ypos, items[i]); //DrawText (-1, (i << 5) + ypos, items[i]); previous
DrawText (-1, i * (fontsize + 8) + ypos, items[i]);
setfontcolour (0x00, 0x00, 0x00); setfontcolour (0x00, 0x00, 0x00);
} }
else else
DrawText (-1, i * 32 + ypos, items[i]); DrawText (-1, i * (fontsize + 8) + ypos, items[i]);
//DrawText (-1, i * 32 + ypos, items[i]); previous
} }
showscreen (); showscreen ();
@ -563,7 +571,7 @@ DrawMenu (char items[][20], char *title, int maxitems, int selected)
****************************************************************************/ ****************************************************************************/
int menu = 0; int menu = 0;
int int
RunMenu (char items[][20], int maxitems, char *title) RunMenu (char items[][20], int maxitems, char *title, int fontsize)
{ {
int redraw = 1; int redraw = 1;
int quit = 0; int quit = 0;
@ -578,7 +586,7 @@ RunMenu (char items[][20], int maxitems, char *title)
{ {
if (redraw) if (redraw)
{ {
DrawMenu (&items[0], title, maxitems, menu); DrawMenu (&items[0], title, maxitems, menu, fontsize);
redraw = 0; redraw = 0;
} }

View File

@ -27,7 +27,8 @@ void legal ();
void highlight (int on); void highlight (int on);
void WaitButtonA (); void WaitButtonA ();
void setfontcolour (u8 r, u8 g, u8 b); void setfontcolour (u8 r, u8 g, u8 b);
int RunMenu (char items[][20], int maxitems, char *title); int RunMenu (char items[][20], int maxitems, char *title, int fontsize = 24);
void DrawMenu (char items[][20], char *title, int maxitems, int selected, int fontsize = 24);
void WaitPrompt (char *msg); void WaitPrompt (char *msg);
int WaitPromptChoice (char *msg, char* bmsg, char* amsg); int WaitPromptChoice (char *msg, char* bmsg, char* amsg);
void ShowAction (char *msg); void ShowAction (char *msg);

691
source/ngc/gfx_bg.h Normal file
View File

@ -0,0 +1,691 @@
/*
* File : bg3.bmp
* Width : 640
* Height: 480
*/
#define BG_WIDTH (640)
#define BG_HEIGHT (480)
#define BG_RAW (614400)
#define BG_COMPRESSED (8789)
static unsigned char bg[]=
{
0x78,0x9c,0xed,0xdd,0x77,0xb0,0x94,0xf5,0xbd,0xf8,0x71,0x9d,0x4c,
0x26,0xe3,0x24,0x93,0xdc,0xeb,0xe4,0xc6,0x4b,0x20,0x89,0xf1,0xc6,
0x68,0x8c,0x28,0x18,0x31,0x51,0x2c,0x80,0xb1,0x05,0x84,0x83,0x68,
0xec,0x25,0x41,0x63,0x41,0x11,0xa4,0x6d,0x7b,0xbe,0xbb,0xdf,0xe7,
0xd9,0x3d,0x20,0x96,0x44,0xa3,0x46,0x13,0x1b,0x8a,0xd8,0x00,0xa5,
0x8a,0x8a,0x0a,0xa8,0x80,0x02,0x8a,0x8a,0x35,0xc4,0x82,0x68,0x40,
0x40,0x4a,0x72,0x6b,0xca,0xef,0xf7,0x9c,0x43,0x09,0xe6,0xf7,0xbb,
0xf7,0x9a,0x4a,0xf1,0xf5,0x9e,0x79,0xcd,0x39,0xbb,0xec,0xd9,0xf6,
0xc7,0x67,0xbe,0xdf,0xdd,0x67,0x97,0x5f,0x37,0x7e,0x5d,0xf8,0x35,
0x00,0x00,0x1f,0x1d,0xcd,0xbf,0x2e,0x02,0x00,0x00,0x00,0x00,0x00,
0x6c,0x67,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0xfb,0x7e,
0xd5,0xf8,0xd5,0x16,0xb3,0xae,0xb1,0xaa,0xf0,0xcb,0xc6,0x92,0xe2,
0x92,0xc6,0xdb,0xc5,0xe5,0x8d,0xf7,0xb7,0xe8,0x7d,0x01,0xf8,0x7b,
0x59,0xd5,0x78,0xb3,0x38,0xbf,0x3e,0xb9,0x74,0x63,0x76,0x45,0x79,
0x64,0x76,0x75,0x79,0x74,0x36,0xbd,0xf4,0x52,0x7d,0x79,0x71,0xdd,
0x56,0x70,0xdf,0x00,0xfe,0x56,0xd6,0x35,0x96,0x16,0x66,0x65,0xd7,
0x96,0x2e,0x8a,0xbd,0x92,0x43,0x7e,0xdc,0xb1,0xdc,0xfe,0xa7,0xfb,
0x94,0x0e,0xac,0x9f,0x98,0xa4,0xd9,0xfd,0xe5,0x9f,0x37,0x56,0x6f,
0xf1,0xfb,0x07,0xf0,0xb7,0xf2,0x76,0x7d,0x72,0x71,0x50,0x76,0x68,
0xe5,0xa0,0x49,0x9d,0x86,0xb6,0x5f,0xb5,0x67,0xff,0xdd,0x7f,0xb5,
0xdb,0x85,0x5f,0x9c,0xf7,0xf9,0x41,0x7b,0x36,0x4e,0x4e,0x6e,0xcc,
0x16,0x95,0x56,0x6f,0x05,0xf7,0x11,0xe0,0xaf,0xef,0xbd,0xc2,0xc3,
0xd9,0x45,0xe5,0x4e,0xb7,0x1d,0x59,0xec,0xf4,0xef,0x5f,0xba,0xb0,
0xdd,0x6f,0xdb,0xf5,0x6b,0xfb,0x5f,0xed,0xfa,0xb5,0xfb,0xfd,0x97,
0xfa,0xb5,0x79,0xa8,0xcd,0xd0,0x5e,0xe9,0xcd,0x95,0xd7,0x1b,0xeb,
0xb6,0x82,0xfb,0x09,0xf0,0xd7,0xb5,0xae,0xfe,0x62,0x71,0x44,0x7a,
0x50,0xe5,0xd8,0x57,0xdb,0x0f,0x68,0xf7,0x5f,0x6d,0xf3,0xd9,0xd7,
0xf6,0xc2,0xb6,0xff,0xb9,0xde,0x17,0xd6,0xb6,0xb9,0xa8,0xdd,0x88,
0x73,0x2a,0x8f,0xd4,0x57,0x15,0xb7,0xf4,0xfd,0x04,0xf8,0x6b,0x5b,
0x59,0x9f,0x56,0x3c,0xf9,0xaa,0xae,0xe5,0x83,0x7f,0xdd,0xf6,0xa2,
0xd6,0xb9,0xb7,0xd9,0xfc,0x6b,0xfb,0xdb,0x2f,0xf4,0xfb,0xec,0xe8,
0x83,0x8a,0x3f,0xab,0x2f,0x29,0x6d,0xe9,0xfb,0x09,0xf0,0xd7,0xb6,
0xb4,0x7e,0x63,0xe9,0xb0,0x3b,0xba,0x17,0xbf,0xf4,0x9b,0x0d,0x6b,
0xbf,0xcd,0xe7,0x5f,0xbe,0x0f,0xfe,0xfc,0x63,0xbb,0x0e,0x2e,0x64,
0xcf,0x95,0xd7,0x5f,0x7e,0x5d,0x61,0x4d,0xe3,0xfd,0xc2,0x8a,0xc6,
0x8a,0xe2,0xaa,0xc6,0x9a,0x82,0xf7,0x86,0x81,0x6d,0xd9,0x1b,0xf5,
0x91,0xa5,0x83,0xa7,0x76,0x1b,0xda,0xee,0x37,0x1f,0xdc,0xfb,0x6e,
0xda,0x03,0x3f,0xff,0x4f,0x03,0x4f,0xcb,0x66,0x95,0xd7,0x34,0x56,
0x16,0x16,0xd7,0xe7,0x17,0x1f,0xab,0x4f,0x28,0xdd,0x99,0x8d,0x2e,
0x8f,0xab,0xcf,0x28,0xbd,0x50,0x7f,0xa7,0xb8,0x66,0x2b,0x78,0x0c,
0x00,0x7f,0x9a,0xf5,0xef,0x69,0x2c,0xce,0x1a,0xa5,0x6f,0x4d,0xef,
0x3c,0xa4,0xdd,0xef,0xbf,0xd0,0xaf,0xdd,0xef,0xdb,0xf5,0x6b,0x7d,
0x0d,0x70,0xb3,0xf9,0xd7,0xee,0xd5,0x9d,0x07,0x34,0x65,0x93,0xcb,
0xaf,0xd4,0x1f,0x28,0x8e,0x4c,0x7f,0x50,0x39,0xbe,0x76,0x54,0xe8,
0x56,0x39,0x74,0x44,0xd7,0xda,0x89,0xb5,0x52,0x3a,0xa6,0xfc,0x8c,
0x63,0x04,0x81,0x6d,0xce,0xba,0xd6,0xfd,0xeb,0xeb,0x59,0x5a,0x6a,
0xff,0xe8,0xc1,0x43,0x3e,0xff,0xde,0x3f,0xf5,0xff,0xec,0x6b,0xff,
0x3c,0xb0,0xdd,0xbf,0x7f,0xf1,0x03,0xeb,0xbf,0x76,0x2f,0xfe,0xe3,
0xc0,0xde,0xe9,0xa8,0xca,0x0d,0xe9,0x19,0x95,0x43,0x0a,0x3d,0xae,
0xed,0xdd,0xb7,0xcf,0xb3,0x27,0x9c,0xd2,0x67,0xd9,0x31,0x7d,0x0f,
0x7a,0x76,0x9f,0xa4,0xfb,0xa5,0x69,0xf6,0x48,0xf9,0xdd,0x2d,0xfe,
0x58,0x00,0xfe,0x14,0xeb,0xd7,0x7f,0x6f,0xd6,0x2f,0x2d,0xb5,0x1f,
0xf5,0xc5,0x62,0x9b,0x1f,0x75,0xac,0x1c,0x5e,0xef,0x9c,0xec,0x7e,
0xff,0x17,0x86,0xed,0xf6,0x9f,0xed,0xfa,0x6d,0x7a,0xfd,0x6f,0xf6,
0x3f,0x0d,0x3e,0x31,0x2d,0x57,0x7a,0x25,0x47,0x8d,0x38,0xef,0xb4,
0xd3,0x96,0xf4,0x3a,0xbe,0xc7,0xef,0x7b,0x1c,0xdf,0xe3,0xff,0xf4,
0xec,0xd3,0xf4,0xbb,0x9e,0xdf,0xef,0xb0,0xa8,0x53,0x1c,0x16,0x1e,
0xad,0x2f,0xf3,0xfe,0x30,0xf0,0x97,0x6b,0xfe,0x7b,0xc9,0xd7,0x7f,
0xf9,0xcf,0x5f,0x36,0xee,0x2b,0xf6,0x4b,0x7b,0x55,0xce,0xcf,0xae,
0x2f,0x4f,0xa8,0xdf,0x56,0x1e,0x96,0x1e,0x96,0xec,0xfe,0xc2,0x57,
0x07,0x6e,0x7c,0xff,0x77,0xe7,0x7b,0xf6,0x2c,0x9c,0x92,0x76,0x4f,
0xbe,0x73,0x41,0xff,0x87,0x7b,0x9e,0xf0,0x9d,0xdf,0x75,0x3f,0xbe,
0xc7,0x6f,0x7a,0xac,0xf7,0xdb,0x96,0x19,0xd8,0x71,0xf0,0xfe,0xb7,
0xa6,0xf5,0x05,0xa5,0x35,0x7f,0xb7,0xfb,0x0d,0xf0,0x97,0x59,0xd7,
0xbc,0x76,0xfd,0xcf,0xc6,0x5b,0x85,0xa7,0xea,0xd3,0x4b,0x73,0xeb,
0x4b,0x8a,0xab,0x9b,0xdf,0x2d,0xcc,0xc9,0x46,0x96,0x0e,0x19,0xdd,
0xa1,0xf8,0xe5,0xdf,0xb4,0xed,0xf7,0x85,0x7f,0xfb,0xe7,0x0b,0xff,
0xe9,0xb2,0xa3,0x2b,0x27,0x54,0x3b,0xc7,0x81,0xa7,0xf6,0x78,0x2f,
0x9f,0x7d,0xbf,0xdd,0x38,0xfb,0x5a,0x7f,0xf6,0xe9,0xf9,0xbb,0x5e,
0xdf,0xdf,0xfd,0xf9,0xa6,0x6c,0x7c,0x79,0xf9,0x56,0xf0,0x98,0x00,
0x3e,0x8c,0x96,0xb5,0xdf,0xda,0xe6,0x55,0x85,0x65,0x8d,0xa5,0x85,
0x25,0x8d,0x25,0xb9,0x77,0x0a,0xcb,0x9a,0x57,0x17,0xde,0x6b,0xcc,
0x2a,0x5e,0xf4,0xc3,0x6f,0x94,0x3b,0xfe,0xe7,0x17,0x2e,0xdc,0x65,
0xd6,0xce,0x83,0xbb,0xa5,0xe7,0x57,0x8e,0x28,0x9e,0x7c,0xed,0x29,
0xdf,0xed,0xfe,0x9f,0x1f,0x98,0x7d,0xeb,0x7f,0xfe,0xb6,0xe7,0xc9,
0x9d,0x57,0x75,0x88,0xd7,0x84,0xb7,0xfe,0xae,0x6b,0x57,0x80,0x3f,
0xd7,0xba,0xc2,0x3b,0x8d,0x17,0x8a,0xd3,0xeb,0x63,0x4a,0xd7,0x65,
0x8d,0x72,0x35,0x0b,0x95,0x90,0x35,0x2a,0xd7,0x66,0x77,0x95,0x1f,
0xad,0xcf,0x28,0xd5,0x47,0x7c,0xb3,0xb2,0xef,0xb3,0xff,0x78,0xc9,
0x17,0x46,0x74,0x4f,0xea,0x59,0xbd,0x72,0xf0,0x25,0x7d,0xc7,0x1c,
0x7b,0xfc,0xb1,0xbf,0xeb,0xf1,0x87,0xbd,0xef,0x26,0x3d,0x4f,0x38,
0xea,0x3f,0x76,0xaf,0x16,0x1b,0x2f,0x36,0xd6,0x6e,0x05,0x8f,0x0b,
0xe0,0x7f,0xf6,0x7e,0xe3,0xe9,0xe2,0x2d,0xd9,0xe0,0x72,0xaf,0xd8,
0x29,0xf9,0x56,0xd2,0xa9,0xb8,0x4f,0xb9,0x7d,0xae,0x63,0xe1,0x1b,
0xd5,0xfd,0x2b,0xbd,0xd2,0xfe,0x95,0xf3,0xeb,0x5d,0x2a,0x7b,0x0c,
0x3f,0x28,0x39,0x3f,0xbb,0xb5,0xfc,0x58,0xcb,0x7e,0xf8,0xa2,0x73,
0x26,0xe7,0x7b,0xdd,0xdf,0xf7,0xcc,0xf7,0xbb,0x3d,0xfb,0xac,0x5f,
0xf7,0xf5,0x38,0xfe,0xd8,0xd6,0x75,0x60,0x7e,0xfa,0x37,0x5f,0xa9,
0x5c,0x70,0xf9,0xb3,0x2d,0xdf,0x13,0xb3,0x15,0x3c,0x36,0x80,0xff,
0xde,0x7b,0x85,0x19,0x59,0xb1,0x7c,0x70,0xe8,0x5c,0x3e,0xb9,0xdf,
0x0f,0xfa,0x9e,0x77,0x66,0xdf,0x13,0x4e,0x3f,0xe3,0xf4,0x3e,0xa7,
0x9f,0x7e,0x6a,0x9f,0x93,0xfb,0xf6,0x3c,0xf9,0xc0,0x21,0x5f,0x1d,
0xd8,0x31,0xf6,0x4a,0x06,0x67,0x37,0x96,0x67,0xd6,0xdf,0x2a,0xbe,
0x56,0x4f,0x4b,0xdf,0xe8,0xdf,0xe3,0xbe,0x7d,0xcf,0x6b,0x3f,0xb3,
0xfd,0xb9,0x07,0x3c,0x71,0xcc,0x09,0xbd,0xfe,0xed,0x03,0xf3,0xef,
0xf8,0xee,0xbf,0xf9,0x72,0x3e,0xff,0x9e,0x69,0xf9,0xbe,0xd4,0x2d,
0xfe,0xd8,0x00,0xfe,0x07,0x8d,0x79,0xc5,0x62,0xba,0x5f,0x72,0xda,
0xf9,0x85,0xef,0x9d,0x72,0xca,0x51,0xbd,0xba,0x9e,0x7a,0x58,0xef,
0x2e,0xa7,0x76,0x69,0xd5,0xed,0x94,0xa3,0x7b,0xf5,0x3e,0xbd,0xa9,
0xf7,0x1e,0xa5,0xbd,0x87,0x96,0xea,0xf3,0x4b,0xab,0x9b,0x5b,0xbe,
0x1b,0xeb,0xa6,0x62,0x53,0x75,0xff,0xec,0x98,0xf4,0x8c,0xe4,0x94,
0xd8,0x2d,0x69,0x7f,0xd1,0xa1,0x93,0x7a,0x6f,0x7a,0x0d,0xf0,0xd8,
0xdf,0xf4,0xfc,0xee,0xb7,0xff,0x6d,0xb7,0xea,0x90,0xfa,0x0b,0xf6,
0xbf,0xc0,0xd6,0xae,0x31,0xbe,0xd8,0xad,0x78,0xcc,0xe0,0xc2,0x69,
0x87,0xf6,0x39,0xec,0xb4,0xae,0xbd,0xbb,0x9d,0xd6,0xad,0xe9,0x0f,
0xba,0x36,0x75,0x39,0xf5,0xdb,0x4d,0xc7,0xf4,0x6b,0x73,0xf6,0xe9,
0xd9,0xd3,0xe5,0x96,0xcb,0xbf,0xdf,0x58,0x58,0x18,0x97,0xdd,0x5a,
0x9a,0x50,0x9f,0x5b,0x7a,0xb2,0x3e,0xba,0x34,0x30,0x76,0xaa,0x7e,
0xfb,0xf4,0xa6,0xb7,0xd7,0xbf,0x17,0x9c,0xcf,0xbf,0xd3,0xda,0x2f,
0x39,0x20,0xbd,0x26,0x79,0xc3,0xfb,0x1f,0xc0,0xd6,0xae,0x71,0x6f,
0xf1,0xe0,0xc2,0x01,0x83,0x4f,0x38,0xa5,0x6b,0xaf,0x0f,0xce,0xbe,
0x6e,0x4d,0x5d,0x5b,0x7e,0x9e,0x7a,0x44,0xaf,0xae,0xfd,0x3e,0x77,
0xf6,0x29,0xd9,0x53,0xe5,0x96,0xf7,0x49,0xd6,0x36,0xbf,0x5f,0x58,
0xd6,0xfc,0x6e,0xf1,0xbd,0x96,0xe3,0x05,0x1b,0x4b,0x0b,0x0f,0x67,
0x03,0xcb,0x1d,0xfb,0x7d,0xf7,0xc1,0xd6,0xfd,0x6f,0x9f,0x9e,0xbf,
0xeb,0x76,0xc1,0x17,0x1f,0x39,0x23,0x7b,0xb0,0xbc,0x62,0x4b,0x3f,
0x2e,0x80,0xff,0x4d,0x63,0x66,0xf1,0xa2,0xb8,0x47,0xb2,0xf7,0x39,
0x47,0x9d,0x76,0xf4,0x29,0x47,0x1c,0x7b,0xf8,0xa9,0x87,0xf7,0x3a,
0xfc,0xb4,0xf5,0xbe,0x7d,0xea,0x91,0x3d,0x8f,0x3c,0xfd,0xd0,0xde,
0x6d,0x4b,0x7b,0x0e,0xbb,0x38,0x9b,0x50,0x7e,0xac,0x7e,0x5f,0xe9,
0xee,0xfa,0xdd,0xe5,0x7b,0xea,0xe3,0x4a,0x0f,0xd4,0xe7,0x94,0x5e,
0x6a,0xbc,0x53,0x7c,0x23,0x5f,0x03,0x1e,0x39,0xa8,0x69,0x54,0xd3,
0xf1,0xc7,0xfe,0xae,0xe7,0x89,0x5d,0x7f,0xf5,0xc5,0xca,0x51,0x97,
0x5f,0x57,0x7f,0xad,0xb4,0x6e,0x4b,0x3f,0x2e,0x80,0xff,0xd5,0xb2,
0xc2,0xc4,0xac,0x5f,0xb9,0x43,0xd2,0xae,0xb4,0xc7,0xf9,0x07,0x7c,
0xef,0xb0,0x33,0x0e,0xef,0x73,0xf8,0xe9,0x87,0xf7,0x3e,0xfc,0xf4,
0xae,0xbd,0x3b,0xf7,0xdd,0xef,0x94,0x2f,0x0f,0xd9,0xe5,0x92,0xaf,
0xc5,0x1e,0xc9,0x19,0xe9,0xc9,0x49,0xf7,0xf4,0x90,0xa4,0x63,0xba,
0x6f,0xe8,0x90,0x1e,0x10,0x8e,0x48,0xfb,0x24,0xfd,0xb3,0x6b,0xca,
0x53,0xeb,0x77,0x96,0x9a,0x86,0x35,0xdd,0x70,0xc2,0x89,0x47,0xfe,
0xeb,0xbe,0x17,0xef,0x36,0xbe,0x47,0x7a,0x65,0x65,0x7e,0x63,0x55,
0x71,0xcb,0x3f,0x2e,0x80,0xff,0xdd,0xdb,0xf5,0x47,0x8a,0x3f,0x4c,
0xcf,0xac,0x74,0xae,0x7d,0x35,0x7c,0xb9,0xf4,0xf9,0x61,0xbb,0x0c,
0xfd,0xdc,0x25,0xbb,0x14,0xda,0x0c,0xde,0x35,0x7c,0xb5,0x72,0x60,
0x3c,0x3c,0x74,0x89,0xfb,0x25,0x87,0x0d,0xbd,0x30,0xfe,0xf4,0xb4,
0xfb,0x1a,0x13,0xfb,0x4c,0x1c,0x3e,0xe9,0xb8,0xfb,0x87,0xdf,0x7e,
0x72,0xb9,0x71,0xec,0xb0,0x0e,0xb5,0x13,0xd2,0x8b,0x2a,0xdd,0x8a,
0xfb,0x5c,0xb5,0xe7,0xa0,0xaf,0xde,0x71,0x50,0x3c,0x2f,0xb9,0xa5,
0xfe,0x6c,0x69,0xe5,0x56,0xf0,0x98,0x00,0x3e,0x9c,0x55,0x85,0xd7,
0xeb,0x73,0x8b,0x63,0xb3,0x6b,0x4b,0x21,0x3d,0xa3,0x72,0x6c,0xda,
0x23,0x39,0x36,0x3d,0x33,0xa9,0x65,0x57,0x94,0x8b,0xe9,0x77,0x2a,
0x1d,0x07,0x5f,0x1f,0x97,0x1e,0xf6,0xfe,0xc8,0x95,0xed,0x57,0x5c,
0xb1,0x62,0xaf,0xf5,0x56,0xee,0xb3,0xf2,0xf2,0x95,0x07,0x4f,0x1b,
0x79,0x4c,0x3e,0x03,0xbf,0x9d,0x1e,0x11,0x7a,0xa7,0x83,0x2b,0x37,
0x67,0x33,0x4b,0xaf,0xff,0x05,0xc7,0xfd,0xcd,0xca,0xce,0x2a,0xef,
0x50,0xdb,0xa1,0xd6,0x35,0x1d,0x5d,0xd9,0xfc,0x74,0xdf,0xfa,0x3b,
0xe5,0x2d,0xff,0x1c,0x01,0x5b,0xbf,0x75,0xb9,0xb5,0x85,0xb5,0xcd,
0xeb,0x3f,0xd3,0xf6,0xa7,0xfc,0xdd,0xfb,0xcd,0xef,0x16,0x7e,0xde,
0x98,0x57,0x9c,0x5d,0x9f,0x53,0x9a,0x53,0x5f,0x50,0xfc,0x45,0xfd,
0x89,0x62,0xff,0xda,0xfe,0xc9,0xf4,0xee,0xef,0x8f,0x78,0x6f,0xf7,
0xe5,0x57,0x2e,0xdb,0x73,0xd9,0x95,0xef,0xed,0xb9,0xfc,0xca,0xe5,
0x7b,0x6e,0xf8,0xfd,0x6b,0x2b,0xae,0x78,0xbd,0xa9,0xeb,0xf0,0xc3,
0xd3,0xab,0x2b,0xb3,0xea,0x0b,0x8b,0x6f,0x34,0x56,0xe4,0xb7,0xbb,
0xee,0xcf,0xba,0xdf,0xef,0xd4,0xfb,0x96,0x3f,0x7e,0xff,0x3f,0x14,
0x5a,0xbe,0x67,0xe1,0xb3,0xf7,0xef,0x38,0xec,0xc9,0xfa,0xac,0xd2,
0xc6,0xd3,0x9f,0xba,0xa9,0xef,0x07,0xf6,0xd3,0x7d,0xe3,0x0e,0xc1,
0x4c,0x04,0xfe,0xd8,0xba,0xe6,0x35,0xad,0xef,0xd1,0xbe,0x9f,0xcf,
0xc0,0x35,0x1b,0xbe,0xd3,0xe5,0xcf,0xbe,0xbe,0xc6,0xec,0xe2,0x71,
0x43,0x4f,0xad,0xae,0xee,0xb0,0xfc,0xf2,0xe5,0xad,0x73,0x6f,0xd9,
0x95,0xcb,0x37,0xcc,0xbf,0x56,0x7b,0x2c,0xbf,0x72,0x45,0xb7,0xfe,
0x97,0x1e,0x94,0xde,0x5b,0x59,0x95,0xdf,0xe6,0xca,0xe6,0x95,0xc5,
0xf7,0xf3,0xdb,0xff,0x93,0x6f,0xb3,0xf1,0x64,0xf1,0xac,0x9b,0x3e,
0x55,0xdc,0xf4,0x3d,0x83,0x6f,0xfe,0xc3,0x80,0xb3,0xf2,0x99,0xfa,
0xc9,0x45,0x6d,0x2f,0x69,0x3d,0xbd,0x70,0xa7,0x4b,0xea,0xf5,0x5f,
0x95,0x5a,0x2e,0xdb,0x32,0x27,0x5b,0xce,0xff,0xd4,0x4d,0xd1,0x6b,
0x8c,0xb0,0x9d,0x5b,0xd7,0x3a,0xc3,0x3e,0x9c,0xd5,0x8d,0xa5,0x85,
0x57,0x1b,0x8b,0x0a,0x0b,0x1b,0x4f,0x17,0xe7,0x35,0x9e,0x2f,0xbe,
0xd4,0x78,0xa5,0xf0,0x7a,0xe3,0x97,0x85,0x15,0xad,0x33,0xe9,0xc3,
0x5f,0xcf,0x26,0x8d,0xa7,0x0b,0x3f,0x08,0x1d,0xc3,0xe4,0x6f,0xae,
0xb8,0x6c,0xc5,0x9e,0xef,0xe5,0x6b,0xbf,0xcd,0xe7,0xdf,0x7b,0x57,
0xae,0xc8,0xd7,0x7f,0xcf,0x37,0xed,0x3f,0xfc,0xa8,0xec,0x8e,0xca,
0x73,0xf9,0x0c,0x9b,0x95,0xaf,0xd9,0xe6,0xe4,0xb7,0xfb,0x8b,0xc6,
0x7b,0x7f,0xd2,0xed,0xbc,0x98,0xef,0x73,0xff,0xe1,0xcd,0xb6,0x03,
0x36,0xcd,0xbf,0x7f,0x6d,0x73,0xe1,0x67,0xb2,0x75,0xe5,0xae,0x63,
0x3f,0x3b,0xac,0xf5,0xf4,0xda,0x5d,0x2e,0xda,0x35,0x3f,0xdd,0x72,
0xd9,0xc1,0x1b,0xe6,0xe4,0x4e,0xd7,0x8d,0x2a,0xfd,0x59,0x8f,0x09,
0xd8,0x76,0x34,0x3e,0xac,0x25,0x85,0x87,0xb2,0x6b,0x4a,0x85,0x74,
0x50,0xe5,0xa2,0xf4,0x9c,0xca,0xf9,0xe9,0x80,0xca,0xe0,0x74,0x70,
0xa5,0x91,0x5d,0x5f,0x1e,0x5d,0x7f,0xb2,0xf8,0xde,0x87,0xbe,0x9e,
0xcd,0xbd,0x5e,0xb8,0x21,0xed,0x53,0xd9,0xfb,0xec,0x4b,0xb3,0x17,
0xf7,0x59,0x71,0x79,0xeb,0x6b,0x7f,0x5f,0x5b,0xd1,0x3a,0xf7,0x5a,
0x7e,0x7f,0xe3,0xc0,0xdb,0x2e,0xfb,0xe6,0xb0,0xbd,0x6a,0x27,0xe7,
0xb7,0x35,0x30,0x3d,0xad,0xd2,0x14,0x9b,0x92,0x33,0xd2,0xfe,0x95,
0x5a,0x36,0xb6,0xfc,0x4a,0xeb,0xff,0x87,0xf4,0xe1,0x6e,0xa7,0xef,
0xa8,0x4f,0x17,0x37,0xae,0xfb,0x76,0x5a,0xb8,0x7e,0xcd,0xb7,0x63,
0xf3,0x92,0xf2,0x55,0x37,0x7c,0x72,0xd3,0x9a,0xf0,0x13,0x57,0x4f,
0x28,0xad,0x6b,0x3c,0x5f,0xf8,0xd8,0x8c,0x36,0x43,0x5a,0xe6,0x63,
0xcb,0xbf,0xff,0xe9,0x8f,0x07,0xd8,0x1e,0xfd,0xa2,0x7e,0x7d,0xa9,
0xa9,0x76,0x64,0x72,0x62,0xed,0xfc,0x30,0x20,0x0e,0x0a,0x83,0xe2,
0x80,0x70,0x4e,0xed,0xa4,0x70,0x6c,0x3c,0x32,0x74,0x49,0x2f,0x4e,
0xde,0xf8,0xb3,0xae,0x77,0x6d,0xe1,0x95,0xfa,0xe8,0xe2,0xf7,0xe3,
0xbe,0xc9,0x7e,0xfd,0x4e,0x4d,0x1b,0xc7,0x8c,0x19,0x31,0xed,0xe0,
0x69,0x23,0x1f,0x3c,0x74,0xdc,0xc8,0x1f,0xf5,0x39,0xa7,0xf9,0x5b,
0xc3,0x76,0xab,0x1d,0x16,0x8f,0x49,0x0e,0x88,0xdd,0xc3,0x45,0xb1,
0x5a,0xad,0xd5,0x92,0xea,0xa0,0x78,0x66,0x38,0xac,0xd6,0x25,0xa4,
0xd9,0x82,0x0f,0x37,0x9f,0xb2,0xc1,0xa5,0x8d,0x33,0xef,0x73,0x13,
0x3a,0x0c,0xfb,0xc4,0xfc,0xb6,0x83,0x5a,0x7e,0xdf,0x21,0x5d,0x57,
0x59,0xd2,0xbc,0x63,0x79,0xe3,0xfc,0xfb,0x87,0x3b,0xce,0x6a,0xbd,
0xec,0xa7,0x5e,0x69,0x3b,0xb0,0xed,0xe2,0x4f,0x0f,0x18,0x98,0xad,
0x2b,0x6d,0xe9,0xe7,0x1c,0xd8,0x1a,0x2c,0x2f,0xdc,0x9c,0x1d,0x5c,
0x19,0x5a,0x9b,0x1c,0x66,0xc5,0x39,0x61,0x6e,0x3a,0x2f,0xcc,0x8f,
0x4f,0x87,0xd9,0x71,0x56,0x98,0x1a,0xc7,0x55,0x4f,0xc9,0xe7,0xd1,
0x73,0x8d,0xb7,0x0b,0x6f,0x36,0xde,0x2c,0xb6,0x58,0x96,0xaf,0x15,
0x17,0xd4,0xe7,0x14,0xe7,0xd4,0xe7,0xe7,0xa7,0x37,0x5e,0xc7,0x3b,
0x85,0xe7,0xeb,0x33,0x8b,0x13,0xeb,0x63,0x4b,0x63,0xeb,0x13,0x4a,
0x8f,0xd5,0x9f,0x2d,0xbe,0xdd,0x7a,0xfe,0xbb,0x85,0xc7,0xb3,0x9f,
0x94,0xce,0x8b,0x47,0x54,0xf6,0xaf,0x7d,0x39,0xb4,0x49,0xda,0x54,
0xdb,0x84,0x76,0xd5,0xf6,0xb1,0x6b,0x72,0x4a,0x5a,0xac,0x9c,0x1b,
0xf7,0x4b,0xae,0xaa,0xcd,0xab,0xbe,0x12,0x17,0x55,0x9f,0x89,0x0b,
0xc2,0xd3,0x71,0x56,0x75,0x6c,0xed,0xec,0xd0,0x3e,0x6d,0xae,0xfc,
0xa2,0xb1,0xa4,0xb8,0xfe,0x36,0xdf,0x28,0x2e,0x69,0xac,0x2a,0xac,
0x6a,0xbc,0xb5,0xe9,0x3e,0xbc,0xd9,0x78,0xab,0x75,0x4d,0xfa,0x44,
0x3e,0xe3,0xda,0xfc,0xeb,0xfa,0x3d,0xef,0xc7,0x2e,0xbd,0xa6,0xd2,
0x3a,0xff,0x5a,0xf6,0xbf,0x69,0xbe,0xdf,0xcd,0x3a,0x94,0x3f,0xb7,
0xaa,0x6d,0xff,0x96,0xf9,0xd7,0x66,0xda,0x67,0x86,0xae,0x4b,0x3f,
0xb3,0xfe,0xb2,0x4f,0x7c,0x6c,0xf0,0xf3,0x5b,0xfc,0x39,0x07,0xb6,
0x0a,0xf5,0xd9,0x85,0xee,0xb5,0x21,0xe1,0xd5,0xf4,0xa9,0x30,0x33,
0x7b,0x24,0x3c,0x9c,0x3e,0x12,0x1e,0x49,0xa7,0x27,0x8f,0xa6,0x33,
0xc2,0x13,0xf1,0xd9,0x70,0x66,0xbe,0x2e,0x4c,0xd3,0x21,0x95,0x21,
0xb9,0x41,0xe9,0xb0,0xca,0xcd,0xd9,0x88,0xf2,0xa9,0xf1,0xe4,0xe4,
0xc4,0xdc,0xf0,0x6c,0x41,0xbe,0x8e,0x5a,0x5d,0x78,0x32,0xbb,0xa2,
0xd4,0x37,0x9e,0x98,0x9c,0x10,0x7b,0x26,0x3d,0xe3,0x71,0xc9,0xf1,
0xf1,0x8c,0x4a,0x73,0x36,0xbd,0xb4,0x2c,0xbf,0xfe,0xb7,0xeb,0xe3,
0x8b,0x97,0xc4,0x63,0x2b,0xdd,0x62,0xe7,0xa4,0x53,0x6d,0xff,0xd0,
0x31,0xee,0x17,0xba,0xc4,0x13,0x92,0x8b,0xd2,0x46,0xf9,0xb0,0xda,
0x4f,0xc3,0x9a,0xb8,0x38,0xcc,0xcb,0x6f,0x6b,0x46,0xfa,0x50,0x98,
0x9a,0x3e,0x54,0x7d,0x3c,0x9d,0x56,0x6d,0xaa,0x75,0x4d,0xb2,0x74,
0x50,0x79,0x48,0xeb,0xed,0x0e,0xac,0xb4,0xac,0x07,0x1f,0xcd,0x8a,
0xe5,0xc1,0x9b,0xee,0x47,0xa5,0x32,0xab,0xbe,0xae,0x78,0xd6,0x1d,
0xeb,0xdf,0xe3,0x6d,0xfb,0xca,0xa7,0x06,0x0e,0x4e,0xaf,0x6a,0x7d,
0x6f,0xa3,0xed,0xd2,0x9d,0x2f,0x6e,0x6a,0x59,0xdf,0xd5,0xe3,0xfa,
0xf5,0xde,0x86,0xf7,0x40,0x36,0xee,0x87,0x5b,0xd7,0x82,0x5b,0xfa,
0x39,0x07,0xfe,0xf6,0x3e,0xc4,0x6b,0x84,0xab,0xeb,0x57,0x15,0x0f,
0x8c,0xaf,0x55,0x67,0x64,0xb7,0x86,0x51,0xd9,0xe8,0x64,0x4c,0x76,
0x77,0xb8,0x3b,0xbd,0x3b,0x8c,0x49,0x6f,0x0b,0xa3,0xd3,0x3b,0xc3,
0x41,0xb5,0xe3,0x92,0x5e,0xb5,0xfe,0xe1,0xbc,0x7c,0x6f,0x7c,0x41,
0xed,0xa0,0xea,0xa1,0xf1,0xa4,0x50,0x8e,0x97,0x56,0x1b,0xf9,0x5e,
0xb5,0x43,0x5a,0x4d,0xde,0xa8,0x3f,0x51,0xfc,0x41,0xfc,0x4e,0x32,
0x30,0x0e,0xaf,0x5e,0x13,0xaf,0x0b,0xd7,0xd4,0xae,0xa8,0x26,0xf1,
0xcc,0x6a,0xe7,0x5a,0x9f,0x70,0x7f,0x7d,0x49,0xf1,0xc6,0xb4,0x7b,
0xe5,0xc4,0x5a,0xa1,0xda,0xc8,0xcf,0xbf,0x2a,0xfe,0x30,0x0c,0xaf,
0x85,0xea,0x90,0xfc,0xba,0x8e,0x8a,0x87,0x85,0x33,0x6a,0xff,0x51,
0x7d,0x26,0xbb,0x3f,0xdc,0x95,0x8e,0x0b,0x63,0xd3,0x7b,0xc2,0x8d,
0xe9,0x0d,0xd5,0x51,0xf9,0xfc,0xbb,0x2e,0xee,0x19,0x0e,0xc9,0x67,
0xf2,0xb9,0xb5,0x73,0xc2,0x79,0xf1,0xd4,0xb0,0x4f,0xfa,0xb3,0x64,
0x50,0xbe,0x57,0xee,0x5f,0xfb,0x41,0x38,0x27,0x5e,0x10,0x4e,0x8b,
0xbb,0x87,0xeb,0xeb,0x4f,0x94,0x3e,0xf6,0x44,0xdb,0xc1,0xad,0xf3,
0x2d,0x5f,0xd3,0x3d,0x57,0x1f,0x50,0xfa,0xf4,0xe2,0xb6,0x03,0xda,
0xce,0xff,0xc4,0xa0,0x09,0x8d,0x75,0xc5,0x75,0x8d,0x99,0xc5,0x8f,
0xcf,0xdd,0xf0,0xef,0xf9,0x9e,0xb7,0xc3,0x84,0xcf,0xb5,0xbe,0x1f,
0xf2,0xb1,0x91,0x4f,0x94,0xb7,0xf8,0xeb,0xb2,0xc0,0x56,0x61,0x49,
0x76,0x66,0xb9,0x16,0x5f,0xad,0x5e,0x97,0x8d,0x49,0xc6,0x65,0x13,
0xc3,0x83,0xd9,0x94,0x30,0x29,0x9d,0x18,0xc6,0xa5,0x63,0xc3,0xf8,
0xf4,0x27,0x61,0x9f,0xd8,0x2b,0xfc,0x30,0xbe,0x59,0x9d,0x9f,0xaf,
0x05,0x9f,0x8b,0x47,0x87,0xee,0xb5,0xa7,0xaa,0x6f,0xc5,0x5f,0x84,
0xc5,0xd9,0x82,0x7c,0x0e,0x1d,0x14,0x26,0x65,0xa5,0x72,0xb7,0xda,
0xc4,0x7c,0x0f,0xfb,0x52,0x78,0x29,0xbe,0x1c,0x5e,0x4a,0x9f,0x0d,
0x4f,0xc5,0x47,0xab,0x23,0x6a,0x5f,0xaf,0x7e,0x2f,0xbb,0xb7,0x72,
0x74,0xed,0x82,0x30,0x37,0xbf,0xfc,0x1b,0xe9,0x92,0xf0,0x6e,0xf6,
0x6e,0x58,0x9a,0xbe,0x15,0x16,0xa7,0x6f,0x86,0x4b,0x62,0xbb,0xea,
0x63,0xf1,0xd5,0x7c,0xc6,0x8e,0x0b,0x93,0xe2,0xcd,0xe1,0xa2,0x98,
0xe4,0x73,0x77,0x54,0xf5,0x96,0xf4,0x96,0x70,0x6f,0xfa,0xcd,0xea,
0x5e,0xf1,0xc5,0xea,0xa2,0x74,0x4e,0x98,0x9f,0x3e,0x1a,0xda,0xc7,
0x0b,0x92,0xa3,0xe2,0xd4,0xf0,0x5c,0x7e,0x7a,0x5e,0xfa,0x5c,0x18,
0x14,0xbf,0x10,0x7e,0x96,0x9d,0x55,0xd9,0xf8,0xbe,0xef,0x67,0xc7,
0x76,0x19,0xb6,0x2e,0xeb,0x52,0xfe,0xec,0xb2,0xb6,0xfd,0x77,0xbe,
0xab,0x69,0xd8,0xc6,0xc7,0xb6,0xeb,0xe4,0x5d,0x86,0xb6,0xce,0xbf,
0x55,0x9f,0xeb,0xdf,0xba,0x37,0x6e,0x39,0x36,0xa6,0xbe,0xce,0x7b,
0xbf,0x40,0xab,0x67,0xb2,0xae,0xe5,0x99,0xe9,0xd4,0x70,0x6f,0x36,
0x31,0x99,0x94,0x4d,0x4a,0xae,0x4e,0xcb,0xa1,0x10,0x87,0x56,0x87,
0xc4,0x6a,0xf5,0x47,0x71,0x58,0xd8,0x2f,0x7e,0x3b,0x79,0x3a,0xbe,
0x16,0x66,0xa7,0x73,0xc3,0x9c,0xb4,0x6f,0x78,0xbe,0xb6,0xaa,0x3a,
0x3b,0x9b,0x9e,0x4c,0xcf,0x16,0xe6,0xf3,0xea,0x2b,0xa1,0x9a,0x76,
0x4d,0xa6,0xe5,0xe7,0xcd,0xc8,0x67,0xe6,0xfd,0xe9,0xbd,0xf9,0x5a,
0xee,0xde,0xea,0xdd,0xe9,0xa4,0xf0,0x64,0x2c,0xe4,0x7f,0x7b,0x5e,
0xd2,0xbb,0xb6,0xbc,0xfa,0x46,0xf6,0x54,0x78,0xbc,0x3e,0x27,0x59,
0x50,0x7f,0x26,0x59,0xd8,0x78,0x21,0x79,0xa5,0xfe,0x5e,0x38,0x39,
0xee,0x57,0x7d,0x27,0x1d,0x9f,0xff,0xcd,0xfd,0x61,0x7c,0x6c,0x0a,
0xbb,0xd5,0x3a,0x84,0x9b,0xd2,0xfb,0xf2,0x79,0x38,0x3a,0xdc,0x93,
0xf6,0xa8,0x76,0x8c,0x77,0x87,0x9f,0x67,0x8f,0x85,0x59,0xd9,0x9c,
0xa4,0x47,0x3c,0x38,0x29,0xc4,0x95,0xd5,0x47,0xf3,0xd3,0xf3,0xb2,
0x51,0x61,0xaf,0x78,0x52,0xf2,0x60,0xf3,0x8e,0x95,0xd6,0xd7,0xf3,
0x5a,0x8f,0x71,0x8e,0xc5,0x75,0xd9,0x0e,0x95,0xd6,0xbd,0x6f,0x3a,
0x79,0xd3,0xfa,0x6e,0xc0,0xa8,0x4f,0x17,0x36,0xbe,0x07,0xd2,0xfa,
0x5a,0x60,0xbe,0x4e,0x7c,0xa2,0x65,0x6d,0xb8,0x15,0x3c,0xef,0xc0,
0x96,0xf7,0x48,0x7a,0x60,0xe5,0xb5,0x7c,0x76,0x4d,0xcc,0x26,0x85,
0x87,0xb3,0xbb,0xc2,0x7e,0xb5,0x2f,0x86,0xdd,0x6b,0xbb,0x87,0x3d,
0x6a,0xed,0xf3,0x3d,0xe8,0x01,0xa1,0x4b,0xec,0x96,0xbc,0x19,0xa7,
0xe4,0xeb,0xc1,0xfb,0xf2,0x3d,0xea,0xd4,0xf0,0x4e,0x36,0x2e,0xb9,
0x3f,0x9b,0x90,0x8c,0xcf,0xa6,0x26,0xe3,0xd2,0x7d,0x42,0x9f,0xda,
0xc0,0xf0,0xaf,0xe9,0x5d,0xe1,0x8e,0x7c,0xcf,0x7c,0x73,0x1c,0x1a,
0xce,0x8f,0x57,0x56,0x47,0xa7,0x37,0xe7,0x73,0x70,0x74,0xe8,0x10,
0xbb,0x84,0x29,0xf1,0xf5,0x30,0xbe,0x3e,0x25,0x99,0x56,0x7f,0x24,
0x4c,0xcb,0x26,0xe4,0x7b,0xe2,0xa9,0x61,0x46,0xf6,0x48,0xd8,0xb3,
0x76,0x5c,0xbe,0x8e,0xbc,0x37,0x5f,0x63,0x4e,0x08,0x3f,0xca,0xd7,
0x73,0x83,0xd2,0x13,0x2a,0x97,0xc7,0xc7,0xc3,0x6d,0xd9,0x98,0x7c,
0xfd,0xd7,0x2b,0x74,0x8d,0x67,0x84,0xa7,0xb2,0x3b,0x93,0x3b,0xeb,
0x93,0x93,0x73,0xe3,0xd7,0xab,0x2f,0xc5,0x19,0xc9,0xed,0xd9,0xb8,
0x7c,0x3e,0x7e,0x23,0x74,0x4a,0xc7,0x54,0xae,0xb8,0xe1,0x93,0xa5,
0x8d,0xb3,0xed,0xe3,0x57,0xce,0x2c,0xaf,0xab,0xf7,0x2d,0xed,0x50,
0x6b,0x0a,0x1d,0x6a,0x9f,0x09,0x83,0x36,0xac,0xf1,0x46,0x5d,0xb7,
0xd3,0xa6,0xcb,0x6c,0x7a,0xed,0x6f,0x2b,0x78,0xce,0x81,0xad,0xc3,
0xe4,0xb4,0x4b,0xe5,0xad,0x7c,0xdd,0x37,0x39,0xdf,0xf7,0x3e,0x96,
0xde,0x16,0xda,0xd7,0xbe,0x95,0xcf,0xbc,0x2e,0xe1,0x90,0xb8,0x7f,
0xfe,0xb3,0x47,0x72,0x76,0x3c,0x3e,0x79,0x2f,0x4e,0xca,0xe7,0xe3,
0xe4,0x30,0x35,0x5f,0xc7,0x3d,0x90,0x4d,0x4e,0x1e,0xc8,0xa6,0x24,
0x13,0xb3,0x07,0x93,0xd1,0x71,0xaf,0xd0,0x39,0xdf,0x17,0x3f,0x96,
0xde,0x51,0x1d,0x9f,0xde,0x13,0x4e,0x88,0x5f,0xad,0xee,0x5b,0x3b,
0x26,0x4c,0x4e,0xef,0xc8,0xe7,0x5f,0xcb,0x2c,0x3d,0x38,0xfc,0x32,
0x3e,0x94,0xcf,0xbd,0x87,0xc3,0x13,0xd9,0x4d,0xc9,0x59,0xf1,0xb8,
0xd0,0x14,0xcf,0x0c,0x85,0x74,0x68,0x68,0x53,0xbb,0x30,0xdf,0x2b,
0xdf,0x9b,0xaf,0xf5,0x26,0x86,0x62,0xdc,0x37,0x8c,0xce,0x4e,0xad,
0x8c,0x8b,0x33,0xaa,0xa3,0xf3,0x19,0x3c,0x36,0xed,0x91,0x5f,0xd7,
0x91,0xc9,0x93,0xe9,0x7d,0xc9,0xbd,0xf9,0x5c,0xbe,0x3c,0xad,0x84,
0xb7,0xd3,0xd1,0xf9,0xef,0x53,0xf2,0xfb,0xf3,0xf9,0x50,0xad,0xbf,
0x5e,0x6a,0xba,0x6b,0xe7,0x61,0x9b,0x1f,0xef,0xbc,0xae,0x31,0xb9,
0xd8,0x74,0xcd,0x4e,0xe5,0xcf,0x2d,0x6f,0xd3,0xff,0x33,0x1b,0x8e,
0x77,0x5e,0x97,0x6d,0x78,0xcf,0x77,0xc3,0xfc,0xf3,0xda,0x1f,0xb0,
0xb9,0x29,0xf9,0xfc,0x7b,0x3b,0x5f,0xd7,0x4d,0xcd,0xa6,0x86,0x29,
0xe9,0x03,0x61,0x62,0x9c,0x1c,0x26,0xd5,0x26,0x86,0x31,0xf1,0x82,
0xea,0x7e,0x69,0x73,0x52,0x49,0x07,0x25,0xef,0xe6,0x7b,0xd4,0x29,
0xf9,0x7a,0x6f,0x46,0x36,0x2b,0x3c,0x99,0x4d,0xcb,0x7f,0x9f,0x1c,
0x26,0xe7,0x6b,0xb8,0x6b,0xe3,0xae,0xf9,0x3e,0xf6,0xad,0x30,0x26,
0x1d,0x1b,0x26,0xa6,0x3f,0x0b,0x9f,0xcf,0xd7,0x8b,0xc7,0xc4,0x43,
0x92,0x39,0xf1,0xce,0x7c,0xbd,0x38,0x3a,0xec,0x11,0x8f,0xaf,0xae,
0xce,0x2f,0xfb,0x70,0xf6,0x58,0xb2,0x30,0x3b,0x33,0x9f,0x79,0x9f,
0x0f,0x6d,0x6b,0x6d,0xf2,0xf5,0x65,0xfb,0xb0,0x7f,0xed,0x92,0xb0,
0x30,0xde,0x91,0xff,0xed,0x3d,0xe1,0xf2,0xb8,0x67,0x72,0x72,0xec,
0x95,0x2c,0x89,0xf7,0x54,0xef,0xce,0xee,0xc9,0xe7,0xdf,0xe1,0xe1,
0xc2,0xf4,0x3b,0x95,0x7c,0xf6,0x25,0x63,0xb3,0x7b,0xc3,0x7d,0xd9,
0x82,0x7c,0xfe,0xde,0x91,0xdf,0xc7,0xab,0x92,0xcf,0xc7,0xde,0xc9,
0xd3,0x8d,0xb5,0xc5,0xcf,0x4c,0x6b,0xb3,0xfe,0xb5,0xbd,0x65,0x9f,
0xed,0xdf,0x25,0x9f,0x77,0x4b,0xb3,0xa6,0xd2,0xce,0x4b,0xdb,0x5e,
0xdc,0x7a,0xfc,0x5f,0xb6,0xae,0xd2,0xfa,0xf8,0x36,0x3b,0xcf,0x6b,
0x7f,0xc0,0x1f,0x9b,0x9a,0xee,0x5b,0x79,0x25,0x9d,0x1b,0x1e,0x6a,
0x99,0x6b,0xe9,0xa4,0x30,0x3b,0x9d,0x17,0xe6,0xc4,0x27,0xc3,0xdc,
0x74,0x76,0x38,0x2e,0x9e,0x12,0xbe,0x1f,0x6f,0x0b,0x2f,0x67,0xf7,
0xe7,0xb3,0x67,0x7a,0x32,0x39,0xed,0x9f,0x54,0xd3,0x59,0xf9,0x7a,
0x6e,0x4a,0x3e,0xff,0x66,0x25,0x85,0xf8,0xd5,0x50,0x8f,0x8b,0xc2,
0xed,0xf9,0xfc,0x1b,0x97,0xde,0x1e,0x2a,0xb5,0xe1,0xa1,0x11,0x6f,
0x0a,0x4f,0xe7,0xb3,0xef,0xbe,0xf4,0xfa,0xea,0x97,0x63,0xbf,0xb0,
0x32,0x9f,0x61,0xd3,0xb3,0x47,0x93,0xd9,0xf9,0xfa,0x2f,0xc4,0xcb,
0xaa,0x3f,0x8e,0x31,0x1c,0x58,0x3b,0x3c,0x5c,0x94,0x9e,0x18,0x16,
0xa6,0xb7,0xe4,0x7f,0x3b,0x2a,0x8c,0x8e,0xe5,0x70,0x49,0x6d,0x6e,
0x75,0x6e,0x7e,0x1d,0xe3,0xb3,0xb1,0xf9,0xda,0xb1,0x63,0xa8,0xa5,
0xe7,0x56,0x8a,0xd9,0x23,0xc9,0x3d,0xd9,0xd8,0x7c,0xaf,0x3d,0x29,
0xdc,0x91,0x8d,0xcf,0xaf,0xb3,0x73,0x68,0x9f,0xde,0x52,0x59,0xdd,
0x78,0xae,0xb0,0xe9,0xbd,0xdf,0x0d,0x73,0x2d,0x6e,0xfc,0x0c,0xf0,
0x66,0x9f,0x77,0x5b,0xd7,0x18,0x55,0xdc,0x78,0x7c,0x74,0xcb,0x31,
0x32,0xd1,0xfc,0x03,0x36,0xf3,0x7c,0xd6,0xb5,0x5c,0x89,0xb3,0xf3,
0xb9,0x37,0x3b,0x3c,0x99,0xce,0x0c,0xd3,0xf2,0x7d,0xeb,0x9d,0xe9,
0x98,0xdc,0xc3,0x21,0xc4,0x6f,0x86,0xa3,0xe3,0xd3,0x61,0x4e,0x3e,
0x7f,0x1e,0xa8,0xcf,0x48,0x7e,0x90,0xee,0x1d,0x0e,0x8a,0x0f,0x87,
0xc7,0xf3,0x7d,0xe8,0x94,0x6c,0x66,0x38,0xbe,0xb6,0x4f,0xb8,0x2b,
0x3e,0x9e,0x5f,0xb6,0xe5,0x7d,0x8f,0x49,0xd5,0xf9,0xe9,0x8b,0x61,
0x51,0xfa,0x72,0x78,0x24,0x9d,0x12,0x1e,0x4f,0x6b,0x61,0x8f,0xda,
0x19,0x61,0x5d,0xbe,0xf6,0x9b,0x51,0x9f,0x95,0xcc,0xca,0x9e,0x4e,
0x5e,0x49,0x5f,0x0b,0x8b,0xd3,0x57,0xc2,0xf5,0xe9,0x01,0x21,0xa6,
0x07,0x27,0xe3,0xf2,0x79,0x3b,0x26,0x9f,0x95,0x77,0xa6,0x33,0xc2,
0x2b,0xf9,0xed,0xdc,0x95,0xaf,0xfd,0xc6,0x67,0xf7,0x25,0x37,0xc6,
0xdd,0xc3,0xcf,0xb2,0x1f,0x96,0x8f,0xcb,0x67,0xf1,0xe8,0xfa,0xd8,
0x70,0x4f,0x76,0x77,0xee,0xe1,0x50,0x8a,0x5f,0x09,0xa1,0xbe,0xb8,
0xb4,0xae,0x31,0xa1,0xb8,0xf1,0xb3,0x1e,0x1b,0xe7,0xda,0xc6,0xe3,
0x5b,0x36,0x1d,0xff,0xd7,0xf2,0xf8,0x1a,0x4b,0x0a,0x3b,0xce,0x68,
0x3b,0x64,0xe3,0x7b,0xc0,0x1d,0x36,0xce,0x45,0x80,0xc6,0xd2,0xc2,
0xe3,0xd9,0x80,0xf2,0xfe,0xf1,0xb4,0x30,0x2c,0xc6,0x6a,0x2d,0x2d,
0x56,0xaf,0xc9,0xe7,0xdf,0xad,0xf9,0xba,0xec,0xe6,0x74,0x5c,0x18,
0x1e,0xdb,0xe7,0xfb,0xd9,0xb7,0xf3,0xb5,0xe1,0x94,0xf0,0x68,0x36,
0x31,0xd9,0x27,0x9e,0x95,0x1c,0x16,0x67,0xe5,0xf3,0x70,0x4a,0x78,
0x20,0x9d,0x16,0xbe,0x59,0x3b,0x28,0xcc,0x88,0x53,0x5a,0x8f,0x17,
0xbc,0x3b,0xbd,0xa5,0x7a,0x53,0x1c,0x15,0x6e,0x4b,0x6f,0x0e,0xd7,
0xa4,0xd7,0x87,0x5b,0x63,0xef,0x96,0xd7,0x11,0x93,0x87,0xb3,0xf9,
0xc9,0x82,0xfa,0x82,0x64,0x7e,0xfd,0xe9,0x64,0x5e,0x3e,0xcf,0xe6,
0x66,0xf3,0xc2,0x63,0x71,0xff,0x7c,0xfe,0x9d,0x55,0x39,0xb6,0x76,
0x4d,0xb8,0x23,0xdf,0xff,0xde,0x9b,0xcf,0xcf,0xe1,0xe9,0x6d,0xd5,
0xf1,0xe9,0xf8,0x30,0x2e,0x7b,0x20,0xc9,0xe2,0x5e,0xe1,0xce,0x6c,
0x60,0xb9,0x5f,0x7c,0x2e,0xdc,0x9e,0x8d,0xcb,0xd7,0x80,0xf7,0xe6,
0xe7,0xcf,0x0c,0x17,0xc5,0x4e,0x61,0x6a,0xeb,0xb1,0x7d,0x7f,0xb4,
0xae,0xcb,0x66,0x96,0x37,0x1d,0xeb,0xb7,0xf9,0x3a,0xaf,0x3e,0xe8,
0x0f,0xc7,0x40,0xb7,0xbe,0xfe,0xf7,0x9c,0xf9,0x07,0x1f,0x11,0x6b,
0x5b,0xbf,0xcb,0xef,0xbf,0xb7,0xba,0xf1,0x48,0xf1,0xdc,0xf4,0xbb,
0x95,0x43,0xe3,0x9e,0x61,0xcf,0xda,0xde,0x61,0xef,0xb8,0x47,0x38,
0x37,0xce,0xae,0xde,0x96,0xef,0x79,0x6f,0x4f,0x27,0x84,0x18,0xbf,
0x16,0xce,0x8a,0x2b,0xc3,0xc4,0x6c,0x5a,0x32,0x27,0xfb,0x49,0xd8,
0x33,0x5e,0x56,0x39,0x22,0x2e,0x0e,0x33,0xb3,0xc9,0xe1,0xc1,0x7c,
0x8d,0xb8,0x47,0xed,0xe8,0x64,0x7e,0x1c,0x57,0x6d,0x3d,0xe6,0x25,
0x1e,0x19,0x3a,0xd7,0x0e,0x0b,0x87,0xc4,0x83,0xf2,0x35,0x62,0xa7,
0x70,0x68,0xdc,0x27,0xdf,0x3b,0x1f,0x53,0xe9,0x9a,0x5e,0x1c,0x4a,
0xe9,0xb0,0x6a,0xbf,0x7c,0x8f,0x3c,0x3b,0x7b,0xa0,0x75,0x8f,0x3d,
0x25,0x3d,0xa0,0x7a,0x61,0xbe,0xbf,0x6d,0x5f,0x3b,0x20,0xf4,0xce,
0xf7,0xd8,0x27,0xc5,0x6f,0x85,0x0e,0xb5,0x47,0xab,0x93,0xf2,0x3d,
0xee,0xf8,0x7c,0xcf,0x7b,0x52,0x3c,0x26,0x5c,0x99,0x76,0xa9,0xcc,
0x8e,0x8f,0xe4,0x6b,0xc2,0x89,0x61,0x4a,0x3e,0xff,0xee,0x6f,0x79,
0xbd,0xb1,0xf6,0xf5,0x30,0xb6,0xb1,0xa6,0xb8,0xb6,0x7e,0x55,0x71,
0xd3,0xf7,0x5b,0xb5,0xce,0xbf,0x41,0xe5,0xcd,0x3f,0xeb,0x71,0x6b,
0x63,0x6d,0xb1,0xe5,0xf1,0xfd,0x78,0xe4,0xc7,0x2a,0x9b,0xbf,0xff,
0xf1,0xa9,0x9b,0x06,0x15,0xff,0xb7,0xe7,0x04,0xf8,0x68,0x58,0xd5,
0xf8,0x49,0xf1,0x90,0x5a,0xa5,0xfa,0xbd,0xd8,0x27,0x1c,0x99,0xcf,
0xae,0x43,0xe3,0x51,0xe1,0xaa,0xda,0xec,0xea,0x2d,0x2d,0xaf,0xc9,
0xe5,0xfb,0xcd,0xfe,0xf9,0xfc,0xcb,0xe2,0x3b,0x61,0x42,0x36,0x3d,
0x2c,0xc8,0x86,0x85,0x43,0xd2,0x91,0x95,0x9e,0xb5,0xd5,0x61,0x5a,
0xcb,0x7b,0x1a,0xe9,0xe5,0xe1,0x6b,0xb1,0x67,0x78,0x36,0xde,0x95,
0xef,0x61,0xef,0xca,0xe7,0xdf,0x5e,0xd5,0x4e,0xf1,0xe0,0xa4,0x53,
0xdc,0x37,0x7c,0xad,0xf6,0x8d,0x7c,0x56,0x1e,0x91,0x9c,0x19,0x9b,
0x92,0x5d,0x6b,0xbb,0x85,0xaf,0xd6,0xbe,0x12,0xbe,0x5c,0xbb,0x37,
0xbc,0x9c,0x4d,0x0d,0x53,0xf3,0xf9,0x77,0x4f,0xec,0x58,0xed,0x1e,
0x7b,0x27,0x47,0xc6,0xdd,0xc2,0x17,0x6b,0xed,0x72,0x7b,0x87,0x5a,
0x7c,0xa5,0x3a,0x2e,0x9f,0x7f,0x0f,0x65,0xf7,0x27,0x7b,0xc7,0x73,
0x92,0x9e,0xb5,0x6b,0xc3,0xb2,0xf4,0x9e,0x64,0x7c,0x76,0x7f,0xcb,
0xb1,0x89,0xf9,0x0c,0x7e,0x28,0x5f,0x37,0x7e,0x23,0x24,0xf5,0x65,
0xa5,0x35,0x9b,0xef,0x7f,0x17,0x7f,0x7a,0xc0,0x80,0xf8,0x99,0x64,
0xd3,0x9c,0x9b,0xb1,0xe3,0x90,0xb7,0x1a,0xf9,0xe3,0x6b,0x2c,0x2a,
0x6c,0xda,0x13,0x6f,0xd0,0x66,0xc6,0xc7,0x86,0x4c,0xde,0x30,0x1b,
0x81,0x8f,0xb6,0xf7,0xea,0xe5,0x52,0xa1,0xf6,0xab,0x6a,0xcb,0x3a,
0xeb,0xbe,0xda,0x9d,0x61,0x4c,0x6d,0x42,0x58,0x18,0xef,0xaa,0xde,
0x9c,0xde,0x96,0xef,0x37,0x1f,0x0d,0xdd,0xf2,0x39,0x35,0x36,0x5d,
0x54,0x9d,0x92,0x3d,0x16,0x16,0xa4,0x7d,0xc2,0x49,0xe9,0xd0,0xca,
0x80,0xda,0xca,0x30,0x21,0x9d,0x18,0x1e,0x8c,0x17,0x86,0x03,0x63,
0x8f,0xf0,0x54,0x3e,0xff,0x46,0xe5,0x97,0xbf,0x33,0x0e,0xad,0x9e,
0x1e,0xfb,0x86,0xbe,0xb5,0x8b,0x43,0x23,0xde,0x12,0x0e,0xcf,0xf7,
0xca,0x3d,0x6b,0xb7,0x86,0x6a,0xbc,0x20,0x9c,0x5d,0x3b,0x3b,0x0c,
0xa9,0xce,0xaf,0xce,0xcd,0xe7,0xe6,0xfd,0xe9,0xe4,0x70,0x55,0xbe,
0x36,0xec,0x1c,0xef,0x09,0x3f,0x8d,0x85,0xea,0xb9,0xf1,0x7b,0xd5,
0x8b,0x6b,0xa3,0xc2,0x3b,0xe9,0xf4,0xfc,0x36,0xa7,0x86,0xa7,0xb3,
0xa1,0x61,0xaf,0x78,0x7a,0xf2,0xdd,0xda,0xbf,0x55,0x1f,0xcc,0xee,
0xce,0xf7,0xd9,0x31,0x19,0x90,0xef,0x9b,0x27,0xa6,0x0f,0x86,0x05,
0xf9,0x3e,0xbd,0x57,0xb6,0xa8,0xbc,0x66,0xf3,0xcf,0xb6,0xb5,0x7c,
0x9f,0xd5,0xe8,0x4f,0x6f,0xfa,0xae,0xab,0x5d,0x26,0xef,0x3a,0xb4,
0xf5,0xf1,0xd5,0xfb,0xae,0xff,0x3c,0xdc,0xc6,0x63,0x9f,0x37,0xbd,
0x36,0xb8,0xb4,0xb4,0xa5,0x9f,0x77,0x60,0xcb,0x5b,0x9c,0x9d,0x5e,
0x9a,0x90,0xef,0x6f,0x9f,0x4f,0x7f,0x1e,0x16,0xe7,0x5e,0x4a,0x17,
0x86,0xb1,0xe9,0x0d,0xe1,0xf6,0x7c,0xbf,0xf9,0x48,0x7a,0x63,0xd8,
0xb5,0x76,0x78,0x78,0x2e,0x3e,0x15,0x1e,0xcd,0xe6,0x26,0x73,0xf3,
0xb5,0xd7,0x25,0xe9,0x99,0x95,0x31,0xf1,0xcd,0x7c,0xfe,0x4d,0x0e,
0x53,0xe3,0x77,0xc2,0x71,0xb1,0x67,0x72,0x47,0x9c,0x50,0xbd,0x25,
0xb6,0xbc,0x5e,0xf8,0x60,0x78,0x22,0x3e,0x55,0x7d,0x36,0xbe,0x1e,
0x7e,0x9d,0xce,0x0e,0xfb,0xc6,0xb3,0x93,0xf3,0x6a,0xff,0xa7,0xba,
0x3c,0x5b,0x91,0x2c,0x4b,0x97,0x85,0x5f,0xa5,0x2f,0x85,0x49,0xe9,
0xd4,0xd6,0xcf,0xd6,0x9d,0x9c,0xef,0x77,0x8f,0x88,0xef,0x87,0x17,
0xf3,0xdb,0x5b,0x94,0x9f,0xff,0x56,0xfa,0x6e,0xf5,0xf1,0xec,0xde,
0x64,0x5a,0xf6,0x78,0xb8,0x2f,0xdd,0xab,0x7a,0x54,0x3c,0x32,0x79,
0x35,0xbe,0x5a,0x1d,0x9d,0x4e,0xc9,0xe7,0xe5,0x01,0xa1,0x43,0x5c,
0x9a,0xdf,0x9f,0x99,0xe1,0x85,0xf4,0x9a,0xd0,0x21,0x9d,0x52,0x59,
0xdb,0xbc,0xa6,0xb0,0xe9,0xf8,0x97,0x3f,0xd2,0xf2,0xf9,0xb7,0x96,
0xc7,0xd6,0x77,0xe3,0xf1,0xd1,0xf9,0xfe,0x78,0xd3,0x5e,0x79,0xc3,
0xf7,0xe1,0x6f,0xe9,0xe7,0x1d,0xd8,0xf2,0xe6,0x64,0x47,0x97,0x17,
0xc4,0xd9,0xf9,0x4c,0x9a,0x14,0xc6,0xa5,0x77,0x26,0xa3,0xd2,0x9f,
0x85,0x1b,0xd3,0x31,0xf9,0x7e,0x73,0x4a,0x18,0x9f,0x7e,0x27,0xec,
0x13,0x8f,0xcf,0xd7,0x65,0x4f,0x84,0xd9,0xd9,0xf3,0xc9,0x94,0xb8,
0x6b,0xa8,0xa7,0x47,0x55,0x5e,0x8e,0xcf,0x54,0x27,0xa7,0x0f,0x84,
0x71,0xb1,0x43,0xf5,0xe2,0xf4,0x7b,0x95,0x93,0xe2,0xf8,0xea,0xed,
0xe9,0xed,0xf9,0x1a,0xf0,0xae,0xf0,0x70,0xf6,0x64,0x98,0x9b,0x7b,
0x3c,0x3b,0x29,0x1c,0x9c,0x5e,0x98,0xfc,0x38,0xae,0x0a,0x4f,0x65,
0x2f,0x25,0x2f,0x66,0x8b,0xc2,0xfc,0x7c,0x3f,0xfd,0x50,0x3a,0x2d,
0x99,0x98,0xc6,0xb0,0x5b,0xad,0x67,0xe8,0x53,0xfb,0x79,0x18,0x9d,
0xde,0x97,0x9f,0xf7,0x58,0x3e,0x5f,0x27,0xe5,0x7b,0xec,0x87,0x93,
0xe9,0xf5,0x7b,0x92,0xa6,0xf8,0x95,0x70,0x4c,0xed,0xba,0xb0,0x36,
0xbd,0x3b,0x99,0x9c,0xce,0x08,0xa5,0xda,0xae,0xd5,0xf6,0xf1,0x85,
0xf0,0x5c,0xfa,0x54,0x3e,0x2f,0x67,0xe4,0xb3,0xf0,0x87,0x95,0x35,
0xcd,0xab,0x0b,0x9b,0xbe,0xfb,0x65,0xc3,0x1a,0x70,0xe3,0x71,0x7e,
0x9f,0xbc,0xe1,0xaa,0x62,0xcb,0xda,0x6f,0xe3,0xcc,0x6b,0x59,0x0f,
0xee,0x38,0xbd,0xcd,0x90,0x4d,0x97,0x6d,0xfd,0x7e,0x04,0x7b,0x60,
0xf8,0xa8,0x9b,0x92,0x1e,0x52,0xb9,0x26,0x5e,0x15,0x6e,0x8e,0xb7,
0x87,0xdb,0xd3,0x5b,0xab,0xb7,0xa4,0x2d,0x3f,0x47,0x87,0x5b,0xd3,
0xcb,0x43,0xf7,0x5a,0xbb,0xea,0x49,0xb1,0x4f,0x32,0x2d,0x5f,0x73,
0xfd,0x34,0xbd,0xad,0x5a,0xac,0x7d,0x25,0x5c,0x9e,0x5f,0x7e,0x7a,
0xbc,0xb2,0x3a,0x22,0x5e,0x16,0x86,0xe5,0xf3,0xf0,0xca,0xec,0xea,
0xf2,0xee,0xf1,0xac,0xea,0x15,0xf1,0xfa,0x70,0x53,0x7a,0x73,0xcb,
0xf7,0xb7,0x84,0xab,0xd3,0x6a,0xe8,0x1b,0xdb,0x86,0x7e,0xe9,0xd9,
0x95,0xe6,0x7c,0x5f,0x7c,0x6b,0x3a,0x36,0xb9,0x3f,0x1b,0x9f,0xaf,
0x2b,0xc7,0x86,0x31,0xf1,0xea,0x70,0x61,0xed,0x5f,0xc2,0xc1,0xf1,
0xbc,0xe4,0xd0,0x38,0xa2,0xda,0x88,0x3f,0xc9,0x6f,0xef,0x9e,0x7c,
0xf6,0x4e,0xcc,0xe7,0xdf,0x98,0x24,0x4d,0x0f,0xad,0xee,0x5a,0xeb,
0x13,0x7a,0xd5,0xe6,0x84,0x2b,0xd3,0xe1,0xe1,0x87,0xe9,0x15,0x61,
0xef,0xd8,0x14,0xba,0xc7,0x46,0x72,0x4f,0xbc,0x29,0xdc,0x16,0x47,
0xe5,0x7b,0xee,0x01,0xc9,0xca,0xfc,0xbe,0x3f,0x3e,0xf2,0x63,0xe5,
0xcd,0x67,0xda,0xc6,0xf9,0xb7,0x63,0xf3,0x5b,0xe5,0xdb,0xaf,0xfc,
0xf8,0xa6,0x7f,0xfb,0xc4,0x55,0xf5,0xd2,0xa0,0x6b,0xff,0xf0,0x39,
0xb8,0x96,0xef,0x4a,0xd8,0xd2,0xcf,0x3b,0xb0,0xe5,0xcd,0xcc,0x7a,
0x97,0xbf,0x1e,0xbf,0x1e,0xf6,0xab,0x1d,0x18,0xba,0xc5,0xa3,0xab,
0xdd,0x6b,0xdf,0x0d,0xc7,0xd5,0xbe,0x53,0x3d,0xa8,0xf6,0x95,0xea,
0xbf,0xc4,0x1f,0x24,0xc3,0xd3,0x4e,0xc9,0x81,0xb5,0x8e,0x61,0xdf,
0xda,0x7e,0xe1,0x5f,0xe2,0xb7,0xf3,0x3d,0x6e,0xb7,0xca,0x81,0xb5,
0x7d,0xaa,0xfb,0xd6,0xf6,0x0d,0x7b,0xd6,0xbe,0x1e,0xee,0xad,0x2f,
0x28,0xfe,0x20,0xdd,0x23,0x69,0x5f,0x3b,0x24,0x1c,0x19,0x8f,0xaa,
0x1e,0x11,0x3b,0x57,0xf7,0xa9,0xed,0x9e,0x5f,0xf6,0x9b,0xe1,0xa7,
0xd9,0xa0,0x72,0xfb,0xb8,0x6f,0xb5,0x43,0xed,0xc0,0x6a,0xb7,0xd8,
0xb5,0xda,0x35,0x76,0xc9,0xaf,0xf7,0x6b,0xd5,0x2f,0xc5,0x2e,0xe1,
0xea,0xec,0x9a,0xf2,0x37,0xe3,0xee,0xe1,0x6b,0xb5,0x4e,0xd5,0x23,
0x63,0x53,0xf5,0x84,0x78,0x42,0xe8,0x11,0x0f,0xc8,0xf7,0xdb,0x1d,
0xc3,0xb0,0x2c,0xa9,0x74,0xae,0x75,0xa9,0xb6,0xaf,0xed,0x13,0x3a,
0xe4,0xb7,0xb1,0x7b,0xfa,0xa3,0x4a,0x21,0xb6,0x4f,0x3a,0xd5,0xf6,
0xab,0x76,0xac,0x75,0xac,0x7e,0x25,0x0e,0x69,0x9d,0x7f,0x2d,0x6b,
0xbc,0x4f,0x3c,0xb1,0xcb,0xe0,0x96,0xe3,0xfa,0x3e,0x7e,0xf9,0x86,
0xf7,0x3f,0x5a,0x8f,0xf1,0x5b,0x5b,0xee,0xb2,0xf1,0xff,0xfe,0x58,
0xfc,0xe9,0x01,0x7d,0xeb,0x6b,0x4b,0x2d,0x97,0xdd,0x69,0x7e,0x9b,
0x41,0x2d,0xa7,0xbb,0xa4,0xb7,0x57,0xb6,0xf4,0xf3,0x0e,0x6c,0x79,
0x8b,0xea,0xa3,0x8a,0x49,0x76,0x7e,0xe5,0xbb,0xe9,0x09,0x49,0x8f,
0x78,0x4c,0x72,0x74,0x3c,0x3c,0x39,0x2c,0x76,0x49,0x7a,0xc5,0xd3,
0x2a,0x83,0xb3,0xbb,0xca,0xa3,0xb3,0xf3,0xcb,0xdf,0x4f,0xcf,0xab,
0x9c,0x9a,0xf6,0x4a,0x8e,0x49,0x07,0x55,0x66,0x64,0x23,0x4a,0x17,
0xa7,0x83,0x2b,0x03,0xd3,0xb3,0x2a,0x7d,0xf3,0xd3,0x4f,0x35,0x56,
0x14,0xa6,0x64,0xc5,0xf2,0xf1,0xf1,0xa8,0xa4,0x73,0x3c,0x28,0x74,
0x8e,0x47,0x87,0xde,0xf1,0xfc,0x4a,0x23,0xbb,0xb9,0xfc,0x68,0x76,
0x5d,0xe9,0xbc,0xf4,0xf4,0xfc,0x6f,0x4f,0xad,0xf4,0x8e,0xdd,0x93,
0x23,0xd3,0x63,0x92,0xde,0x69,0xcf,0xe4,0xdc,0xf4,0xb2,0xf2,0xfd,
0xf5,0xdb,0x4b,0xf5,0xac,0x54,0xfe,0x5e,0x7a,0x5c,0xf2,0xed,0x78,
0x50,0xd2,0x29,0x7e,0x2b,0xff,0xdb,0xee,0xc9,0x59,0xf9,0x7a,0x72,
0x5e,0xfd,0xe6,0xd2,0xd9,0xe9,0xf7,0x2b,0x7d,0xb3,0x61,0x95,0x62,
0x36,0xb4,0x92,0xd5,0x67,0x97,0xc6,0x64,0x17,0x94,0xfb,0xa7,0x03,
0x2a,0xa7,0xa5,0x4d,0x95,0xde,0xf9,0x3c,0x7c,0xb7,0x79,0x79,0x61,
0x79,0xf3,0xaa,0x42,0x16,0x77,0xad,0xec,0x50,0xeb,0x50,0xfd,0x71,
0xf3,0x8e,0x95,0x3f,0x1c,0xfb,0xb7,0xb6,0xb8,0xc3,0xf4,0xb6,0x43,
0x37,0x7e,0x27,0xfe,0xa2,0xc6,0xfa,0xc7,0x3a,0x28,0x7e,0x26,0xd9,
0x21,0xf6,0x0d,0x1b,0x4f,0x03,0x1f,0x6d,0xef,0x36,0xbf,0x5d,0x78,
0xa5,0xf1,0x4c,0xf1,0xc9,0xc6,0x93,0xc5,0x99,0x8d,0x27,0x72,0x0f,
0x95,0xa6,0xd5,0x1f,0x2a,0x3d,0xd1,0x98,0x57,0x7c,0xb6,0xf1,0x72,
0x71,0x61,0x63,0x76,0xf1,0xf1,0xfc,0xf7,0x59,0xf5,0x07,0x4a,0x53,
0xea,0x8f,0x97,0xde,0x6e,0xbc,0x5c,0x58,0xd8,0x78,0x21,0x3f,0xff,
0xd1,0xfc,0x6f,0x16,0x14,0x97,0x36,0xaf,0x2e,0x2c,0x6d,0x2c,0x2c,
0xcc,0xaa,0x3f,0x58,0x9a,0xdc,0x98,0x54,0x9a,0x98,0xff,0x9c,0xd9,
0x78,0xb6,0xb8,0xb8,0x79,0x69,0xe1,0xcd,0xc6,0xc2,0xe2,0xbc,0xc6,
0xe3,0xb9,0x79,0xc5,0xc7,0x1a,0x0f,0x97,0x1e,0xaa,0x3f,0x5c,0x9a,
0xd1,0x78,0xa4,0x34,0x37,0xff,0xf7,0xf9,0xf9,0xed,0x3d,0x93,0x5f,
0xff,0xbc,0xc6,0xcc,0xe2,0x03,0xf5,0x49,0xa5,0x71,0x8d,0xfb,0x4a,
0x93,0x1a,0xd3,0x4b,0xf3,0x1a,0xaf,0x17,0x57,0x36,0x9e,0x2f,0x3c,
0x91,0xff,0xdd,0xec,0xc6,0x2b,0xc5,0x57,0xf3,0xcb,0xbc,0xd6,0xbc,
0xac,0xf8,0x72,0xe3,0xe9,0xfc,0xf2,0xcf,0xe5,0xf7,0xe3,0xa1,0xd2,
0x43,0xf9,0xfd,0xfd,0x65,0xf3,0xbb,0xb9,0x95,0x85,0x49,0x59,0x53,
0x79,0xe7,0x45,0x9f,0x1d,0xd8,0xe5,0x9a,0x9d,0xca,0x1b,0xbf,0x07,
0x75,0x61,0x7e,0xbb,0xad,0x9f,0x8d,0x6b,0xf9,0x4e,0xfc,0x91,0x3f,
0xb6,0xd6,0x03,0xfe,0xbf,0xd6,0xfc,0x8f,0xff,0xfe,0x7e,0x61,0x55,
0xf3,0x9a,0xd6,0xcb,0xac,0x69,0xfd,0x3f,0x81,0xdf,0xff,0xc0,0xbf,
0xad,0x3f,0x7f,0xcd,0x1f,0x5d,0xdf,0x9a,0xcd,0x7e,0x5f,0xfd,0xdf,
0x5e,0xef,0xf2,0x7c,0xa6,0xad,0xde,0xec,0xbc,0xd5,0x1f,0xb8,0x9e,
0xd5,0xff,0xcf,0xf5,0xae,0xde,0xec,0x3a,0x57,0xb7,0x6a,0xb9,0x3f,
0x6b,0x0a,0x4d,0x77,0xaf,0xff,0x0e,0x98,0x9d,0xe7,0x7e,0x7a,0xd0,
0xa6,0xd7,0xf6,0x1a,0x33,0xd6,0x1f,0x1b,0xb3,0x70,0xa7,0x4b,0x06,
0xb5,0xec,0x7d,0xb7,0x82,0xe7,0x19,0xe0,0xaf,0x6a,0xe3,0x9c,0xdb,
0xec,0xd8,0x97,0x4f,0x5c,0x7d,0x7b,0x69,0x6d,0xe3,0xad,0x42,0xcb,
0xfb,0xbd,0x3b,0x5d,0xfb,0xfd,0xf2,0x16,0xbf,0x8f,0x00,0x7f,0x23,
0x1f,0xf8,0x7c,0x47,0xeb,0xf7,0xc0,0xac,0x5f,0xef,0xb5,0xbc,0xd6,
0x67,0xed,0x07,0x6c,0xcf,0x7e,0x9c,0x76,0xa8,0xb4,0x7e,0xee,0x77,
0xed,0x2e,0x17,0x7d,0xf2,0x86,0xb3,0x4a,0x8f,0x3b,0xae,0x0f,0xd8,
0x60,0x4d,0xeb,0xeb,0x77,0xdb,0xb1,0xc6,0xdb,0x85,0xef,0xc7,0x1d,
0xc2,0x0e,0xb5,0x2f,0x55,0x63,0x7d,0x4d,0x69,0x8b,0xdf,0x1f,0x80,
0xbf,0xbb,0xf7,0x0b,0x2b,0xb6,0xf8,0x7d,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xc3,0x5a,0xbd,0xe9,
0xfb,0xf2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x60,0xab,0x32,0x0c,0x00,0x00,0x00,0xb6,0x77,0xef,0x37,
0xbf,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb6,
0x31,0xc3,0xdf,0x1f,0x06,0x00,0x00,0x00,0xdb,0xbd,0x66,0x00,0x00,
0x00,0xd8,0xfe,0xad,0x6a,0x5e,0x55,0x00,0x00,0x00,0x00,0x00,0x00,
0xd8,0xae,0x0c,0x5f,0x35,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xd8,0xb6,0xac,0x1c,0xbe,0xb2,0x00,0x00,0xc0,0x47,0xca,
0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xd8,0xda,0xac,0x18,0xbe,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x8b,0x7a,0x6f,
0xf8,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xc0,0x56,0x62,0xf9,0xf0,0xe5,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x56,0x62,
0xd9,0x88,0x65,0x00,0x1f,0x4d,0xc3,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x80,0x6d,0xd0,0x50,0x00,0x00,0x00,0xd8,0xde,0xfd,
0x72,0xc4,0x2f,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x6c,0x57,0x86,
0x03,0x7c,0x64,0x0d,0x05,0x00,0x00,0x00,0x00,0x00,0xd8,0x9e,0xbc,
0x3b,0xe2,0xdd,0x61,0x00,0x00,0x00,0x00,0xc0,0x76,0x6b,0x28,0x00,
0x00,0x00,0x00,0x00,0xc0,0x76,0x65,0x38,0x00,0x00,0x00,0x6c,0xff,
0xde,0x19,0xf1,0xce,0x30,0x80,0x8f,0xa8,0xa1,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x82,0xa5,0x23,0x96,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x13,0xde,
0x1e,0xf1,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,
0x8d,0x59,0x32,0x62,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xc0,0x36,0xe1,0xad,0x4b,0xdf,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x60,0x7b,0x30,0x02,0x00,0x00,0x00,0xb6,0x7f,0x6f,0x5e,
0xfa,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
0xb6,0x62,0x08,0x00,0x00,0x00,0x6c,0xef,0xde,0xb8,0xf4,0x8d,0xa1,
0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x99,0x21,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0x82,0xd7,0x2f,0x7d,0x1d,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x9b,0xf0,
0x8b,0x4b,0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xc0,0x56,0x6c,0xf1,0xa5,0x8b,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x6d,0xcf,0x60,0x00,0x00,0x00,0x00,0x60,
0xfb,0xf4,0xf3,0x91,0x3f,0x1f,0x02,0xf0,0x91,0x74,0x29,0x00,0x00,
0x00,0x00,0xb0,0x1d,0x1b,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xdb,0xaa,0xd7,0x46,0xbe,0x36,0x04,0x00,0x80,0x8f,0x94,0xc1,
0x00,0x00,0x00,0xb0,0xdd,0xbb,0x14,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xb6,0x5d,0xaf,0x8e,0x7c,0x15,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd8,0x4a,0xbc,0x32,
0xf2,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x2d,0xea,0xe5,0x91,0x2f,0x03,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x6c,0x51,0x2f,0x8d,0x7c,0x09,0x00,0x80,0x8f,0x92,0xcb,0x00,0x00,
0x00,0x00,0x80,0xed,0xd6,0x96,0x7e,0xfd,0x11,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xfe,0x32,0x83,0x00,0x3e,0x8a,0x5e,0xbc,0xec,
0xc5,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x6c,0xd5,0x06,0x01,0x7c,0x24,0x8d,0x04,0x00,0x00,0x00,0x00,
0xb6,0x57,0x8b,0x2e,0x5b,0x34,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0xed,0xc2,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xb6,0x5e,0x2f,0x5c,0xf6,0xc2,0x60,0x00,0x00,0x00,
0xf8,0x08,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x25,0x3d,0x7f,0xd9,0xf3,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xf0,0x77,0xf3,0xdc,0x65,0xcf,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x7f,0x63,0x0b,0x2f,0x5b,0x08,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xb1,0x1d,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,
0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,
0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,0x92,0x24,0x49,
0x92,0x24,0x49,0x92,0x24,0x49,0x7f,0x97,0xfe,0x2f,0x91,0x73,0x60,
0x14,0x14
};

View File

@ -500,7 +500,8 @@ SaveSRAMToMC (int slot, int silent)
int datasize; int datasize;
int offset; int offset;
ShowAction ((char*) "Saving SRAM to MC..."); if (!silent)
ShowAction ((char*) "Saving SRAM to MC...");
/*** Build SRAM filename ***/ /*** Build SRAM filename ***/
sprintf (filename, "%s.srm", Memory.ROMName); sprintf (filename, "%s.srm", Memory.ROMName);
@ -551,7 +552,8 @@ SavePrefsToMC (int slot, int silent)
int offset; int offset;
char msg[80]; char msg[80];
ShowAction ((char*) "Saving Prefs to MC..."); if (!silent)
ShowAction ((char*) "Saving Prefs to MC...");
datasize = preparePrefsData (); datasize = preparePrefsData ();
offset = SaveBufferToMC (savebuffer, slot, PREFS_FILE_NAME, datasize, silent); offset = SaveBufferToMC (savebuffer, slot, PREFS_FILE_NAME, datasize, silent);

View File

@ -47,9 +47,7 @@ extern unsigned char savebuffer[];
static int bufoffset; static int bufoffset;
static char membuffer[MEMBUFFER]; static char membuffer[MEMBUFFER];
char freezecomment[2][32] = { {"Snes9x GX 2.0.1b8 Freeze"}, {"Freeze"} }; char freezecomment[2][32] = { {"Snes9x GX 003 Freeze"}, {"Freeze"} };
extern char rootSDdir[MAXPATHLEN];
/** /**
@ -153,10 +151,10 @@ NGCFreezeGame (int where, bool8 silent)
/*** Freeze to SDCard in slot A or slot B ***/ /*** Freeze to SDCard in slot A or slot B ***/
#ifdef SDUSE_LFN #ifdef SDUSE_LFN
sprintf (filename, "%s/%s/%s.frz", rootSDdir, SNESSAVEDIR, Memory.ROMName); sprintf (filename, "%s/%s/%s.frz", ROOTSDDIR, SNESSAVEDIR, Memory.ROMName);
#else #else
/*** Until we have LFN on SD ... ***/ /*** Until we have LFN on SD ... ***/
sprintf (filename, "%s/%s/%08x.frz", rootSDdir, SNESSAVEDIR, Memory.ROMCRC32); sprintf (filename, "%s/%s/%08x.frz", ROOTSDDIR, SNESSAVEDIR, Memory.ROMCRC32);
#endif #endif
} }
else else
@ -182,7 +180,8 @@ NGCFreezeGame (int where, bool8 silent)
if (smbfile) if (smbfile)
{ {
ShowAction ((char*) "Saving freeze game..."); if (!silent)
ShowAction ((char*) "Saving freeze game...");
len = bufoffset; len = bufoffset;
offset = 0; offset = 0;
@ -222,7 +221,8 @@ NGCFreezeGame (int where, bool8 silent)
if (handle > 0) if (handle > 0)
{ {
ShowAction ((char*) "Saving freeze game..."); if (!silent)
ShowAction ((char*) "Saving freeze game...");
len = fwrite (membuffer, 1, bufoffset, handle); len = fwrite (membuffer, 1, bufoffset, handle);
fclose (handle); fclose (handle);
@ -238,13 +238,14 @@ NGCFreezeGame (int where, bool8 silent)
} }
else else
{ {
sprintf(msg, "Couldn't save to %s/%s/", rootSDdir, SNESSAVEDIR); sprintf(msg, "Couldn't save to %s/%s/", ROOTSDDIR, SNESSAVEDIR);
WaitPrompt (msg); WaitPrompt (msg);
} }
} }
else /*** MC in slot A or slot B ***/ else /*** MC in slot A or slot B ***/
{ {
ShowAction ((char*) "Saving freeze game..."); if (!silent)
ShowAction ((char*) "Saving freeze game...");
ClearSaveBuffer (); ClearSaveBuffer ();
@ -378,10 +379,10 @@ NGCUnfreezeGame (int from, bool8 silent)
{ {
#ifdef SDUSE_LFN #ifdef SDUSE_LFN
sprintf (filename, "%s/%s/%s.frz", rootSDdir, SNESSAVEDIR, Memory.ROMName); sprintf (filename, "%s/%s/%s.frz", ROOTSDDIR, SNESSAVEDIR, Memory.ROMName);
#else #else
/*** From SDCard ***/ /*** From SDCard ***/
sprintf (filename, "%s/%s/%08x.frz", rootSDdir, SNESSAVEDIR, Memory.ROMCRC32); sprintf (filename, "%s/%s/%08x.frz", ROOTSDDIR, SNESSAVEDIR, Memory.ROMCRC32);
#endif #endif
handle = fopen (filename, "rb"); handle = fopen (filename, "rb");

View File

@ -30,7 +30,7 @@
#include "video.h" #include "video.h"
#include "mcsave.h" #include "mcsave.h"
#include "filesel.h" #include "filesel.h"
#include "ngcunzip.h" #include "unzip.h"
#include "smbload.h" #include "smbload.h"
#include "mcsave.h" #include "mcsave.h"
#include "sdload.h" #include "sdload.h"
@ -43,7 +43,7 @@
#include "button_mapping.h" #include "button_mapping.h"
#include "ftfont.h" #include "ftfont.h"
extern void DrawMenu (char items[][20], char *title, int maxitems, int selected); extern void DrawMenu (char items[][20], char *title, int maxitems, int selected, int fontsize);
#define PSOSDLOADID 0x7c6000a6 #define PSOSDLOADID 0x7c6000a6
extern int menu; extern int menu;
@ -181,7 +181,7 @@ LoadManager ()
{ {
case 0: case 0:
/*** Load from SD ***/ /*** Load from SD ***/
quit = OpenSD (0); quit = OpenSD ();
break; break;
case 1: case 1:
@ -208,14 +208,14 @@ LoadManager ()
if ( retval == 1 ) // if ROM was loaded, load the SRAM & settings if ( retval == 1 ) // if ROM was loaded, load the SRAM & settings
{ {
if ( GCSettings.AutoLoad == 1 ) if ( GCSettings.AutoLoad == 1 )
{
quickLoadSRAM ( SILENT ); quickLoadSRAM ( SILENT );
S9xSoftReset(); // reset after loading sram
}
else if ( GCSettings.AutoLoad == 2 ) else if ( GCSettings.AutoLoad == 2 )
{ {
/*** load SRAM first in order to get joypad config ***/
quickLoadSRAM ( SILENT );
quickLoadFreeze ( SILENT ); quickLoadFreeze ( SILENT );
} }
S9xSoftReset(); // reset after loading sram
} }
menu = oldmenu; menu = oldmenu;
@ -250,23 +250,23 @@ SaveManager ()
{ {
if ( isWii ) /* Wii menu */ if ( isWii ) /* Wii menu */
{ {
ret = RunMenu (savemenuwii, savecountwii, (char*)"Save Manager"); ret = RunMenu (savemenuwii, savecountwii, (char*)"SRAM Manager");
if (ret >= savecountwii-1) if (ret >= savecountwii-1)
ret = savecount-1; ret = savecount-1;
} }
else /* Gamecube menu */ else /* Gamecube menu */
ret = RunMenu (savemenu, savecount, (char*)"Save Manager"); ret = RunMenu (savemenu, savecount, (char*)"SRAM Manager");
switch (ret) switch (ret)
{ {
case 0: case 0:
/*** Save to SD***/ /*** Save to SD***/
SaveSRAMToSD (0, NOTSILENT); SaveSRAMToSD (NOTSILENT);
break; break;
case 1: case 1:
/*** Load from SD***/ /*** Load from SD***/
LoadSRAMFromSD (0, NOTSILENT); LoadSRAMFromSD (NOTSILENT);
break; break;
case 2: case 2:
@ -448,6 +448,7 @@ GetInput (u16 ctrlr_type)
{ {
u32 exp_type, pressed; u32 exp_type, pressed;
pressed=0; pressed=0;
s8 gc_px = 0;
while( PAD_ButtonsHeld(0) while( PAD_ButtonsHeld(0)
#ifdef HW_RVL #ifdef HW_RVL
@ -459,13 +460,14 @@ GetInput (u16 ctrlr_type)
{ {
VIDEO_WaitVSync(); VIDEO_WaitVSync();
// get input based on controller type // get input based on controller type
//if (ctrlr_type == CTRLR_GCPAD) if (ctrlr_type == CTRLR_GCPAD)
//{ {
pressed = PAD_ButtonsHeld (0); pressed = PAD_ButtonsHeld (0);
//} gc_px = PAD_SubStickX (0);
}
#ifdef HW_RVL #ifdef HW_RVL
//else else
//{ {
// if ( WPAD_Probe( 0, &exp_type) == 0) // check wiimote and expansion status (first if wiimote is connected & no errors) // if ( WPAD_Probe( 0, &exp_type) == 0) // check wiimote and expansion status (first if wiimote is connected & no errors)
// { // {
pressed = WPAD_ButtonsHeld (0); pressed = WPAD_ButtonsHeld (0);
@ -473,8 +475,11 @@ GetInput (u16 ctrlr_type)
// if (ctrlr_type != CTRLR_WIIMOTE && exp_type != ctrlr_type+1) // if we need input from an expansion, and its not connected... // if (ctrlr_type != CTRLR_WIIMOTE && exp_type != ctrlr_type+1) // if we need input from an expansion, and its not connected...
// pressed = 0; // pressed = 0;
// } // }
//} }
#endif #endif
/*** check for exit sequence (c-stick left OR home button) ***/
if ( (gc_px < -70) || (pressed & WPAD_BUTTON_HOME) || (pressed & WPAD_CLASSIC_BUTTON_HOME) )
return 0;
} // end while } // end while
while( pressed == (PAD_ButtonsHeld(0) while( pressed == (PAD_ButtonsHeld(0)
#ifdef HW_RVL #ifdef HW_RVL
@ -485,19 +490,23 @@ GetInput (u16 ctrlr_type)
return pressed; return pressed;
} // end GetInput() } // end GetInput()
int cfg_text_count = 4; int cfg_text_count = 7;
char cfg_text[][20] = { char cfg_text[][20] = {
" ", "Remapping ",
"Press Any Button", "Press Any Button",
"on the", "on the",
" " // identify controller " ", // identify controller
" ",
"Press C-Left or",
"Home to exit"
}; };
u32 u32
GetButtonMap(u16 ctrlr_type, char* btn_name) GetButtonMap(u16 ctrlr_type, char* btn_name)
{ {
u32 pressed, previous; u32 pressed, previous;
char title[20]; char temp[20] = "";
int k;
pressed = 0; previous = 1; pressed = 0; previous = 1;
switch (ctrlr_type) { switch (ctrlr_type) {
@ -515,9 +524,13 @@ GetButtonMap(u16 ctrlr_type, char* btn_name)
break; break;
}; };
sprintf (cfg_text[0], "Remapping %s", btn_name); // note which button we are remapping /*** note which button we are remapping ***/
sprintf (temp, (char*)"Remapping ");
for (k=0; k<9-strlen(btn_name) ;k++) strcat(temp, " "); // add whitespace padding to align text
strncat (temp, btn_name, 9); // snes button we are remapping
strncpy (cfg_text[0], temp, 19); // copy this all back to the text we wish to display
DrawMenu(&cfg_text[0], title, cfg_text_count, 1); // display text DrawMenu(&cfg_text[0], NULL, cfg_text_count, 1); // display text
// while (previous != pressed && pressed == 0); // get two consecutive button presses (which are the same) // while (previous != pressed && pressed == 0); // get two consecutive button presses (which are the same)
// { // {
@ -562,7 +575,7 @@ ConfigureButtons (u16 ctrlr_type)
unsigned int* currentpadmap; unsigned int* currentpadmap;
char temp[20] = ""; char temp[20] = "";
int i, j; int i, j, k;
/*** Update Menu Title (based on controller we're configuring) ***/ /*** Update Menu Title (based on controller we're configuring) ***/
switch (ctrlr_type) { switch (ctrlr_type) {
@ -591,21 +604,24 @@ ConfigureButtons (u16 ctrlr_type)
{ {
// get current padmap button name to display // get current padmap button name to display
for ( j=0; for ( j=0;
j < ctrlr_def[ctrlr_type].num_btns &&
currentpadmap[i] != ctrlr_def[ctrlr_type].map[j].btn // match padmap button press with button names currentpadmap[i] != ctrlr_def[ctrlr_type].map[j].btn // match padmap button press with button names
&& j < ctrlr_def[ctrlr_type].num_btns
; j++ ); ; j++ );
memset (temp, 0, sizeof(temp)); memset (temp, 0, sizeof(temp));
strncpy (temp, cfg_btns_menu[i], 12); // copy snes button information strncpy (temp, cfg_btns_menu[i], 12); // copy snes button information
if (currentpadmap[i] == ctrlr_def[ctrlr_type].map[j].btn) // check if a match was made if (currentpadmap[i] == ctrlr_def[ctrlr_type].map[j].btn) // check if a match was made
{
for (k=0; k<7-strlen(ctrlr_def[ctrlr_type].map[j].name) ;k++) strcat(temp, " "); // add whitespace padding to align text
strncat (temp, ctrlr_def[ctrlr_type].map[j].name, 6); // update button map display strncat (temp, ctrlr_def[ctrlr_type].map[j].name, 6); // update button map display
}
else else
strcat (temp, (char*)"---"); // otherwise, button is 'unmapped' strcat (temp, (char*)"---"); // otherwise, button is 'unmapped'
strncpy (cfg_btns_menu[i], temp, 19); // move back updated information strncpy (cfg_btns_menu[i], temp, 19); // move back updated information
} }
ret = RunMenu (cfg_btns_menu, cfg_btns_count, menu_title); ret = RunMenu (cfg_btns_menu, cfg_btns_count, menu_title, 18);
switch (ret) switch (ret)
{ {
@ -627,7 +643,8 @@ ConfigureButtons (u16 ctrlr_type)
strncpy(temp, cfg_btns_menu[ret], 6); // get the name of the snes button we're changing strncpy(temp, cfg_btns_menu[ret], 6); // get the name of the snes button we're changing
pressed = GetButtonMap(ctrlr_type, temp); // get a button selection from user pressed = GetButtonMap(ctrlr_type, temp); // get a button selection from user
// FIX: check if input is valid for this controller // FIX: check if input is valid for this controller
currentpadmap[ret] = pressed; // update mapping if (pressed != 0) // check if a the button was configured, or if the user exited.
currentpadmap[ret] = pressed; // update mapping
break; break;
case -1: /*** Button B ***/ case -1: /*** Button B ***/

View File

@ -31,7 +31,7 @@ extern unsigned int wmpadmap[];
extern unsigned int ccpadmap[]; extern unsigned int ccpadmap[];
extern unsigned int ncpadmap[]; extern unsigned int ncpadmap[];
#define PREFSVERSTRING "Snes9x GX 002 Prefs" #define PREFSVERSTRING "Snes9x GX 003 Prefs"
char prefscomment[2][32] = { {PREFSVERSTRING}, {"Preferences"} }; char prefscomment[2][32] = { {PREFSVERSTRING}, {"Preferences"} };
@ -125,7 +125,7 @@ void quickLoadPrefs (bool8 silent)
case CARD_SLOTA+2: case CARD_SLOTA+2:
case CARD_SLOTB+2: case CARD_SLOTB+2:
LoadPrefsFromSD(QUICK_SAVE_SLOT-2, silent); LoadPrefsFromSD(silent);
break; break;
case CARD_SLOTA+4: case CARD_SLOTA+4:
@ -144,7 +144,7 @@ void quickSavePrefs (bool8 silent)
break; break;
case CARD_SLOTA+2: case CARD_SLOTA+2:
case CARD_SLOTB+2: case CARD_SLOTB+2:
SavePrefsToSD(QUICK_SAVE_SLOT-2, silent); SavePrefsToSD(silent);
break; break;
case CARD_SLOTA+4: case CARD_SLOTA+4:
SavePrefsToSMB(silent); SavePrefsToSMB(silent);

View File

@ -14,7 +14,7 @@
#include <string.h> #include <string.h>
#include <ogcsys.h> #include <ogcsys.h>
#include "sdload.h" #include "sdload.h"
#include "ngcunzip.h" #include "unzip.h"
#include "memmap.h" #include "memmap.h"
#include "video.h" #include "video.h"
#include "ftfont.h" #include "ftfont.h"
@ -27,13 +27,40 @@
extern unsigned char savebuffer[]; extern unsigned char savebuffer[];
extern char output[16384]; extern char output[16384];
FILE * filehandle; FILE * filehandle;
char rootSDdir[MAXPATHLEN] = "fat:/";
char currSDdir[MAXPATHLEN]; char currSDdir[MAXPATHLEN];
extern int offset; extern int offset;
extern int selection; extern int selection;
extern FILEENTRIES filelist[MAXFILES]; extern FILEENTRIES filelist[MAXFILES];
/***************************************************************************
* FileSortCallback
*
* Quick sort callback to sort file entries with the following order:
* .
* ..
* <dirs>
* <files>
***************************************************************************/
static int FileSortCallback(const void *f1, const void *f2)
{
/* Special case for implicit directories */
if(((FILEENTRIES *)f1)->filename[0] == '.' || ((FILEENTRIES *)f2)->filename[0] == '.')
{
if(strcmp(((FILEENTRIES *)f1)->filename, ".") == 0) { return -1; }
if(strcmp(((FILEENTRIES *)f2)->filename, ".") == 0) { return 1; }
if(strcmp(((FILEENTRIES *)f1)->filename, "..") == 0) { return -1; }
if(strcmp(((FILEENTRIES *)f2)->filename, "..") == 0) { return 1; }
}
/* If one is a file and one is a directory the directory is first. */
if(((FILEENTRIES *)f1)->flags == 1 && ((FILEENTRIES *)f2)->flags == 0) return -1;
if(((FILEENTRIES *)f1)->flags == 0 && ((FILEENTRIES *)f2)->flags == 1) return 1;
return stricmp(((FILEENTRIES *)f1)->filename, ((FILEENTRIES *)f2)->filename);
}
/*************************************************************************** /***************************************************************************
* Update SDCARD curent directory name * Update SDCARD curent directory name
***************************************************************************/ ***************************************************************************/
@ -75,7 +102,7 @@ int updateSDdirname()
/* handles root name */ /* handles root name */
sprintf(temp, "/%s/..", SNESROMDIR); sprintf(temp, "/%s/..", SNESROMDIR);
if (strcmp(currSDdir, temp) == 0) if (strcmp(currSDdir, temp) == 0)
sprintf(currSDdir,"%s",rootSDdir); sprintf(currSDdir,"%s",ROOTSDDIR);
/* update current directory name */ /* update current directory name */
sprintf(currSDdir, "%s/%s",currSDdir, filelist[selection].filename); sprintf(currSDdir, "%s/%s",currSDdir, filelist[selection].filename);
@ -103,7 +130,7 @@ int parseSDdirectory() {
/* open the directory */ /* open the directory */
sddir = diropen(currSDdir); sddir = diropen(currSDdir);
if (sddir == NULL) { if (sddir == NULL) {
sprintf(currSDdir,"%s",rootSDdir); // if we can't open the previous dir, open root dir sprintf(currSDdir,"%s",ROOTSDDIR); // if we can't open the previous dir, open root dir
sddir = diropen(currSDdir); sddir = diropen(currSDdir);
WaitPrompt(msg); WaitPrompt(msg);
if (sddir == NULL) { if (sddir == NULL) {
@ -127,6 +154,9 @@ int parseSDdirectory() {
/*** close directory ***/ /*** close directory ***/
dirclose(sddir); dirclose(sddir);
/* Sort the file list */
qsort(filelist, nbfiles, sizeof(FILEENTRIES), FileSortCallback);
return nbfiles; return nbfiles;
} }
@ -141,14 +171,10 @@ LoadSDFile (char *filename, int length)
char zipbuffer[2048]; char zipbuffer[2048];
char filepath[MAXPATHLEN]; char filepath[MAXPATHLEN];
FILE *handle; FILE *handle;
char *rbuffer; unsigned char *rbuffer;
PKZIPHEADER pkzip; u32 size;
z_stream zs;
int res, outbytes = 0;
int size;
int have;
rbuffer = (char *) Memory.ROM; rbuffer = (unsigned char *) Memory.ROM;
/* Check filename length */ /* Check filename length */
if ((strlen(currSDdir)+1+strlen(filelist[selection].filename)) < MAXPATHLEN) if ((strlen(currSDdir)+1+strlen(filelist[selection].filename)) < MAXPATHLEN)
@ -167,67 +193,11 @@ LoadSDFile (char *filename, int length)
if (IsZipFile (zipbuffer)) if (IsZipFile (zipbuffer))
{ {
/*** Unzip the ROM ***/ /*** Unzip the ROM ***/
memcpy (&pkzip, zipbuffer, sizeof (PKZIPHEADER)); size = UnZipBuffer (rbuffer, 0, 0, handle); // unzip from SD
pkzip.uncompressedSize = FLIP32 (pkzip.uncompressedSize);
memset (&zs, 0, sizeof (zs));
zs.zalloc = Z_NULL;
zs.zfree = Z_NULL;
zs.opaque = Z_NULL;
zs.avail_in = 0;
zs.next_in = Z_NULL;
res = inflateInit2 (&zs, -MAX_WBITS);
if (res != Z_OK)
{
fclose (handle);
return 0;
}
size = (sizeof (PKZIPHEADER) +
FLIP16 (pkzip.filenameLength) +
FLIP16 (pkzip.extraDataLength));
do
{
zs.avail_in = 2048 - size;
zs.next_in = (Bytef *) zipbuffer + size;
do
{
zs.avail_out = 16384;
zs.next_out = (Bytef *) output;
res = inflate (&zs, Z_NO_FLUSH);
have = 16384 - zs.avail_out;
if (have)
{
memcpy (rbuffer + outbytes, output, have);
outbytes += have;
}
}
while (zs.avail_out == 0);
sprintf (filepath, "Read %d bytes of %d", outbytes,
pkzip.uncompressedSize);
//ShowAction (filepath);
ShowProgress (filepath, outbytes, pkzip.uncompressedSize);
size = 0;
fread (zipbuffer, 1, 2048, handle);
}
while (res != Z_STREAM_END
&& (u32) outbytes < pkzip.uncompressedSize);
inflateEnd (&zs);
fclose (handle); fclose (handle);
return pkzip.uncompressedSize; return size;
} }
else else
@ -326,18 +296,19 @@ SaveBufferToSD (char *filepath, int datasize, bool silent)
/**************************************************************************** /****************************************************************************
* Save SRAM to SD Card * Save SRAM to SD Card
****************************************************************************/ ****************************************************************************/
void SaveSRAMToSD (int slot, bool silent) void SaveSRAMToSD (bool silent)
{ {
char filepath[1024]; char filepath[1024];
int datasize; int datasize;
int offset; int offset;
ShowAction ((char*) "Saving SRAM to SD..."); if (!silent)
ShowAction ((char*) "Saving SRAM to SD...");
#ifdef SDUSE_LFN #ifdef SDUSE_LFN
sprintf (filepath, "%s/%s/%s.srm", rootSDdir, SNESSAVEDIR, Memory.ROMName); sprintf (filepath, "%s/%s/%s.srm", ROOTSDDIR, SNESSAVEDIR, Memory.ROMName);
#else #else
sprintf (filepath, "%s/SNESSAVE/%08x.srm", rootSDdir, Memory.ROMCRC32); sprintf (filepath, "%s/%s/%08x.srm", ROOTSDDIR, SNESSAVEDIR, Memory.ROMCRC32);
#endif #endif
datasize = prepareEXPORTsavedata (); datasize = prepareEXPORTsavedata ();
@ -359,7 +330,7 @@ void SaveSRAMToSD (int slot, bool silent)
* Load SRAM From SD Card * Load SRAM From SD Card
****************************************************************************/ ****************************************************************************/
void void
LoadSRAMFromSD (int slot, bool silent) LoadSRAMFromSD (bool silent)
{ {
char filepath[1024]; char filepath[1024];
int offset = 0; int offset = 0;
@ -367,9 +338,9 @@ LoadSRAMFromSD (int slot, bool silent)
ShowAction ((char*) "Loading SRAM from SD..."); ShowAction ((char*) "Loading SRAM from SD...");
#ifdef SDUSE_LFN #ifdef SDUSE_LFN
sprintf (filepath, "%s/%s/%s.srm", rootSDdir, SNESSAVEDIR, Memory.ROMName); sprintf (filepath, "%s/%s/%s.srm", ROOTSDDIR, SNESSAVEDIR, Memory.ROMName);
#else #else
sprintf (filepath, "%s/%s/%08x.srm", rootSDdir, SNESSAVEDIR, Memory.ROMCRC32); sprintf (filepath, "%s/%s/%08x.srm", ROOTSDDIR, SNESSAVEDIR, Memory.ROMCRC32);
#endif #endif
offset = LoadBufferFromSD (filepath, silent); offset = LoadBufferFromSD (filepath, silent);
@ -391,18 +362,19 @@ LoadSRAMFromSD (int slot, bool silent)
* Save Preferences to SD Card * Save Preferences to SD Card
****************************************************************************/ ****************************************************************************/
void void
SavePrefsToSD (int slot, bool silent) SavePrefsToSD (bool silent)
{ {
char filepath[1024]; char filepath[1024];
int datasize; int datasize;
int offset; int offset;
ShowAction ((char*) "Saving prefs to SD..."); if (!silent)
ShowAction ((char*) "Saving prefs to SD...");
#ifdef SDUSE_LFN #ifdef SDUSE_LFN
sprintf (filepath, "%s/%s/%s", rootSDdir, SNESSAVEDIR, PREFS_FILE_NAME); sprintf (filepath, "%s/%s/%s", ROOTSDDIR, SNESSAVEDIR, PREFS_FILE_NAME);
#else #else
sprintf (filepath, "%s/%s/%s", rootSDdir, SNESSAVEDIR, PREFS_FILE_NAME); sprintf (filepath, "%s/%s/%s", ROOTSDDIR, SNESSAVEDIR, PREFS_FILE_NAME);
#endif #endif
datasize = preparePrefsData (); datasize = preparePrefsData ();
@ -420,7 +392,7 @@ SavePrefsToSD (int slot, bool silent)
* Load Preferences from SD Card * Load Preferences from SD Card
****************************************************************************/ ****************************************************************************/
void void
LoadPrefsFromSD (int slot, bool silent) LoadPrefsFromSD (bool silent)
{ {
char filepath[1024]; char filepath[1024];
int offset = 0; int offset = 0;
@ -428,9 +400,9 @@ LoadPrefsFromSD (int slot, bool silent)
ShowAction ((char*) "Loading prefs from SD..."); ShowAction ((char*) "Loading prefs from SD...");
#ifdef SDUSE_LFN #ifdef SDUSE_LFN
sprintf (filepath, "%s/%s/%s", rootSDdir, SNESSAVEDIR, PREFS_FILE_NAME); sprintf (filepath, "%s/%s/%s", ROOTSDDIR, SNESSAVEDIR, PREFS_FILE_NAME);
#else #else
sprintf (filepath, "%s/%s/%s", rootSDdir, SNESSAVEDIR, PREFS_FILE_NAME); sprintf (filepath, "%s/%s/%s", ROOTSDDIR, SNESSAVEDIR, PREFS_FILE_NAME);
#endif #endif
offset = LoadBufferFromSD (filepath, silent); offset = LoadBufferFromSD (filepath, silent);

View File

@ -21,15 +21,15 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
static int FileSortCallback(const void *f1, const void *f2);
int updateSDdirname(); int updateSDdirname();
int parseSDdirectory(); int parseSDdirectory();
int LoadSDFile (char *filename, int length); int LoadSDFile (char *filename, int length);
void SaveSRAMToSD (int slot, bool silent); void SaveSRAMToSD (bool silent);
void LoadSRAMFromSD (int slot, bool silent); void LoadSRAMFromSD (bool silent);
void SavePrefsToSD (int slot, bool silent); void SavePrefsToSD (bool silent);
void LoadPrefsFromSD (int slot, bool silent); void LoadPrefsFromSD (bool silent);
extern char rootSDdir[MAXPATHLEN];
extern char currSDdir[MAXPATHLEN]; extern char currSDdir[MAXPATHLEN];
#endif #endif

View File

@ -18,7 +18,7 @@ extern "C"
{ {
#include "smb.h" #include "smb.h"
} }
#include "ngcunzip.h" #include "unzip.h"
#include "memmap.h" #include "memmap.h"
#include "video.h" #include "video.h"
#include "ftfont.h" #include "ftfont.h"
@ -382,7 +382,9 @@ SaveSRAMToSMB (bool8 silent)
int offset; int offset;
sprintf (filepath, "%s\\%s.srm", SNESSAVEDIR, Memory.ROMName); sprintf (filepath, "%s\\%s.srm", SNESSAVEDIR, Memory.ROMName);
ShowAction ((char*) "Saving SRAM to SMB...");
if (!silent)
ShowAction ((char*) "Saving SRAM to SMB...");
datasize = prepareEXPORTsavedata (); datasize = prepareEXPORTsavedata ();
@ -436,7 +438,9 @@ SavePrefsToSMB (bool8 silent)
int offset; int offset;
sprintf (filepath, "%s\\%s", SNESSAVEDIR, PREFS_FILE_NAME); sprintf (filepath, "%s\\%s", SNESSAVEDIR, PREFS_FILE_NAME);
ShowAction ((char*) "Saving preferences to SMB...");
if (!silent)
ShowAction ((char*) "Saving preferences to SMB...");
datasize = preparePrefsData (); datasize = preparePrefsData ();

View File

@ -229,7 +229,7 @@ unsigned int wmpadmap[] = { WPAD_BUTTON_B, WPAD_BUTTON_2,
}; };
/*** Classic Controller Padmap ***/ /*** Classic Controller Padmap ***/
unsigned int ccpadmap[] = { WPAD_CLASSIC_BUTTON_A, WPAD_CLASSIC_BUTTON_B, unsigned int ccpadmap[] = { WPAD_CLASSIC_BUTTON_A, WPAD_CLASSIC_BUTTON_B,
WPAD_CLASSIC_BUTTON_Y, WPAD_CLASSIC_BUTTON_X, WPAD_CLASSIC_BUTTON_X, WPAD_CLASSIC_BUTTON_Y,
WPAD_CLASSIC_BUTTON_FULL_L, WPAD_CLASSIC_BUTTON_FULL_R, WPAD_CLASSIC_BUTTON_FULL_L, WPAD_CLASSIC_BUTTON_FULL_R,
WPAD_CLASSIC_BUTTON_MINUS, WPAD_CLASSIC_BUTTON_PLUS, WPAD_CLASSIC_BUTTON_MINUS, WPAD_CLASSIC_BUTTON_PLUS,
WPAD_CLASSIC_BUTTON_UP, WPAD_CLASSIC_BUTTON_DOWN, WPAD_CLASSIC_BUTTON_UP, WPAD_CLASSIC_BUTTON_DOWN,
@ -399,7 +399,34 @@ decodepad (int pad)
} }
} }
/****************************************************************************
* setFrameTimerMethod()
* change frametimer method depending on whether ROM is NTSC or PAL
****************************************************************************/
extern u8 vmode_60hz;
int timerstyle;
void setFrameTimerMethod()
{
/*
Set frametimer method
(timerstyle: 0=NTSC vblank, 1=PAL int timer)
*/
if ( Settings.PAL ) {
if(vmode_60hz == 1)
timerstyle = 1;
else
timerstyle = 0;
//timediffallowed = Settings.FrameTimePAL;
} else {
if(vmode_60hz == 1)
timerstyle = 0;
else
timerstyle = 1;
//timediffallowed = Settings.FrameTimeNTSC;
}
return;
}
/**************************************************************************** /****************************************************************************
* NGCReportButtons * NGCReportButtons
* Called on each rendered frame * Called on each rendered frame
@ -445,7 +472,7 @@ NGCReportButtons ()
if ( GCSettings.AutoSave == 1 ) if ( GCSettings.AutoSave == 1 )
{ {
if ( WaitPromptChoice ((char*)"Save SRAM?", (char*)"Don't Save", (char*)"Save") ) //if ( WaitPromptChoice ((char*)"Save SRAM?", (char*)"Don't Save", (char*)"Save") )
quickSaveSRAM ( SILENT ); quickSaveSRAM ( SILENT );
} }
else if ( GCSettings.AutoSave == 2 ) else if ( GCSettings.AutoSave == 2 )
@ -465,6 +492,11 @@ NGCReportButtons ()
mainmenu (); mainmenu ();
FrameTimer = 0; FrameTimer = 0;
ConfigRequested = 0; ConfigRequested = 0;
setFrameTimerMethod(); // set frametimer method every time a ROM is loaded
// auto load freeze/sram?
} }
else else
{ {
@ -486,7 +518,7 @@ u32 wpad_get_analogues(int pad, float* mag, u16* ang)
u32 exp_type = 0; u32 exp_type = 0;
#ifdef HW_RVL #ifdef HW_RVL
struct expansion_t exp; struct expansion_t exp;
memset( &exp, 0, sizeof(exp) ); // FIX: necessary? we only look at the struct if an expansion is connected... memset( &exp, 0, sizeof(exp) );
if ( WPAD_Probe( pad, &exp_type) == 0) // check wiimote and expansion status (first if wiimote is connected & no errors) if ( WPAD_Probe( pad, &exp_type) == 0) // check wiimote and expansion status (first if wiimote is connected & no errors)
{ {
@ -597,8 +629,6 @@ SetDefaultButtonMap ()
****************************************************************************/ ****************************************************************************/
/* Eke-Eke: initialize frame Sync */ /* Eke-Eke: initialize frame Sync */
extern void S9xInitSync(); extern void S9xInitSync();
extern u8 vmode_60hz;
int timerstyle;
void void
emulate () emulate ()
@ -607,24 +637,8 @@ emulate ()
S9xSetSoundMute (TRUE); S9xSetSoundMute (TRUE);
AudioStart (); AudioStart ();
S9xInitSync(); S9xInitSync();
/* setFrameTimerMethod(); // also called in NGCReportButtons()
Set frametimer method
(timerstyle: 0=NTSC vblank, 1=PAL int timer)
*/
if ( Settings.PAL ) {
if(vmode_60hz == 1)
timerstyle = 1;
else
timerstyle = 0;
//timediffallowed = Settings.FrameTimePAL;
} else {
if(vmode_60hz == 1)
timerstyle = 0;
else
timerstyle = 1;
//timediffallowed = Settings.FrameTimeNTSC;
}
while (1) while (1)
{ {

View File

@ -160,8 +160,8 @@
#include "snes9x.h" #include "snes9x.h"
// FIX: these are unused, but could be... must also change "freezecomment", PREFSVERSTRING, and "sramcomment" // FIX: these are unused, but could be... must also change "freezecomment", PREFSVERSTRING, and "sramcomment"
#define GCVERSION "002" //#define GCVERSION "002"
#define GCVERSIONSTRING "Snes9x 1.5 v002" //#define GCVERSIONSTRING "Snes9x 1.5 v002"
#define NOTSILENT 0 #define NOTSILENT 0
#define SILENT 1 #define SILENT 1
@ -204,7 +204,7 @@ END_EXTERN_C
3 SD card in slot B 3 SD card in slot B
4 SMB share ***/ 4 SMB share ***/
#ifndef QUICK_SAVE_SLOT #ifndef QUICK_SAVE_SLOT
#define QUICK_SAVE_SLOT 1 #define QUICK_SAVE_SLOT 2 // save to SD
#endif #endif
/*** default SMB settings ***/ /*** default SMB settings ***/

View File

@ -28,7 +28,7 @@ extern int padcal;
extern unsigned short gcpadmap[]; extern unsigned short gcpadmap[];
//extern unsigned short padmap[4]; //extern unsigned short padmap[4];
char sramcomment[2][32] = { {"Snes9x GX 2.0.1b8 SRAM"}, {"Savegame"} }; char sramcomment[2][32] = { {"Snes9x GX 003 SRAM"}, {"Savegame"} };
/**************************************************************************** /****************************************************************************
* Prepare Memory Card SRAM Save Data * Prepare Memory Card SRAM Save Data
@ -140,7 +140,7 @@ decodesavedata (int readsize)
// Check for exportable format sram - it has the sram comment at the start // Check for exportable format sram - it has the sram comment at the start
memcpy (sramcomment, savebuffer, 32); memcpy (sramcomment, savebuffer, 32);
if ( strncmp (sramcomment, "Snes9x GX 2.0", 13) == 0 ) if ( (strncmp (sramcomment, "Snes9x GX 2.0", 13) == 0) || (strncmp (sramcomment, "Snes9x GX 00", 12) == 0) ) // version 2.0.XX or 00x
{ {
offset = 64; offset = 64;
@ -243,7 +243,7 @@ void quickLoadSRAM (bool8 silent)
break; break;
case CARD_SLOTA+2: case CARD_SLOTA+2:
case CARD_SLOTB+2: case CARD_SLOTB+2:
LoadSRAMFromSD(QUICK_SAVE_SLOT-2, silent); LoadSRAMFromSD(silent);
break; break;
case CARD_SLOTA+4: case CARD_SLOTA+4:
LoadSRAMFromSMB(SILENT); LoadSRAMFromSMB(SILENT);
@ -261,7 +261,7 @@ void quickSaveSRAM (bool8 silent)
break; break;
case CARD_SLOTA+2: case CARD_SLOTA+2:
case CARD_SLOTB+2: case CARD_SLOTB+2:
SaveSRAMToSD(QUICK_SAVE_SLOT-2, silent); SaveSRAMToSD(silent);
break; break;
case CARD_SLOTA+4: case CARD_SLOTA+4:
SaveSRAMToSMB(SILENT); SaveSRAMToSMB(SILENT);

184
source/ngc/unzip.cpp Normal file
View File

@ -0,0 +1,184 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Unzip - borrowed from the GPP
*
* softdev July 2006
****************************************************************************/
#include <gccore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>
#include "dvd.h"
#include "video.h"
#include "ftfont.h"
#include "unzip.h"
/*
* PKWare Zip Header - adopted into zip standard
*/
#define PKZIPID 0x504b0304
#define MAXROM 0x500000
#define ZIPCHUNK 2048
/*
* Zip files are stored little endian
* Support functions for short and int types
*/
u32
FLIP32 (u32 b)
{
unsigned int c;
c = (b & 0xff000000) >> 24;
c |= (b & 0xff0000) >> 8;
c |= (b & 0xff00) << 8;
c |= (b & 0xff) << 24;
return c;
}
u16
FLIP16 (u16 b)
{
u16 c;
c = (b & 0xff00) >> 8;
c |= (b & 0xff) << 8;
return c;
}
/****************************************************************************
* IsZipFile
*
* Returns TRUE when PKZIPID is first four characters of buffer
****************************************************************************/
int
IsZipFile (char *buffer)
{
unsigned int *check;
check = (unsigned int *) buffer;
if (check[0] == PKZIPID)
return 1;
return 0;
}
/*****************************************************************************
* unzip
*
* It should be noted that there is a limit of 5MB total size for any ROM
******************************************************************************/
int
UnZipBuffer (unsigned char *outbuffer, u64 discoffset, short where, FILE* filehandle)
{
PKZIPHEADER pkzip;
int zipoffset = 0;
int zipchunk = 0;
char out[ZIPCHUNK];
z_stream zs;
int res;
int bufferoffset = 0;
int have = 0;
char readbuffer[2048];
char msg[128];
/*** Read Zip Header ***/
switch (where) {
case 0: // SD Card
fseek(filehandle, 0, SEEK_SET);
fread (readbuffer, 1, 2048, filehandle); break;
case 1: // DVD
dvd_read (readbuffer, 2048, discoffset); break;
}
/*** Copy PKZip header to local, used as info ***/
memcpy (&pkzip, readbuffer, sizeof (PKZIPHEADER));
pkzip.uncompressedSize = FLIP32 (pkzip.uncompressedSize);
sprintf (msg, "Unzipping %d bytes ... Wait",
pkzip.uncompressedSize);
ShowAction (msg);
/*** Prepare the zip stream ***/
memset (&zs, 0, sizeof (z_stream));
zs.zalloc = Z_NULL;
zs.zfree = Z_NULL;
zs.opaque = Z_NULL;
zs.avail_in = 0;
zs.next_in = Z_NULL;
res = inflateInit2 (&zs, -MAX_WBITS);
if (res != Z_OK)
return 0;
/*** Set ZipChunk for first pass ***/
zipoffset =
(sizeof (PKZIPHEADER) + FLIP16 (pkzip.filenameLength) +
FLIP16 (pkzip.extraDataLength));
zipchunk = ZIPCHUNK - zipoffset;
/*** Now do it! ***/
do
{
zs.avail_in = zipchunk;
zs.next_in = (Bytef *) & readbuffer[zipoffset];
/*** Now inflate until input buffer is exhausted ***/
do
{
zs.avail_out = ZIPCHUNK;
zs.next_out = (Bytef *) & out;
res = inflate (&zs, Z_NO_FLUSH);
if (res == Z_MEM_ERROR)
{
inflateEnd (&zs);
return 0;
}
have = ZIPCHUNK - zs.avail_out;
if (have)
{
/*** Copy to normal block buffer ***/
memcpy (&outbuffer[bufferoffset], &out, have);
bufferoffset += have;
}
}
while (zs.avail_out == 0);
/*** Readup the next 2k block ***/
zipoffset = 0;
zipchunk = ZIPCHUNK;
switch (where) {
case 0: // SD Card
fread (readbuffer, 1, 2048, filehandle); break;
case 1: // DVD
discoffset += 2048;
dvd_read (readbuffer, 2048, discoffset); break;
}
}
while (res != Z_STREAM_END);
inflateEnd (&zs);
if (res == Z_STREAM_END)
{
if (pkzip.uncompressedSize == (u32) bufferoffset)
return bufferoffset;
else
return pkzip.uncompressedSize;
}
return 0;
}

35
source/ngc/unzip.h Normal file
View File

@ -0,0 +1,35 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Unzip - borrowed from the GPP
*
* softdev July 2006
****************************************************************************/
#ifndef _UNZIP_
#define _UNZIP_
extern int IsZipFile (char *buffer);
int UnZipBuffer (unsigned char *outbuffer, u64 discoffset, short where, FILE* filehandle);
/*
* Zip file header definition
*/
typedef struct
{
unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50
unsigned short zipversion __attribute__ ((__packed__));
unsigned short zipflags __attribute__ ((__packed__));
unsigned short compressionMethod __attribute__ ((__packed__));
unsigned short lastmodtime __attribute__ ((__packed__));
unsigned short lastmoddate __attribute__ ((__packed__));
unsigned int crc32 __attribute__ ((__packed__));
unsigned int compressedSize __attribute__ ((__packed__));
unsigned int uncompressedSize __attribute__ ((__packed__));
unsigned short filenameLength __attribute__ ((__packed__));
unsigned short extraDataLength __attribute__ ((__packed__));
}
PKZIPHEADER;
u32 FLIP32 (u32 b);
u16 FLIP16 (u16 b);
#endif

View File

@ -392,10 +392,10 @@ clearscreen (int colour)
VIDEO_ClearFrameBuffer (vmode, xfb[whichfb], colour); VIDEO_ClearFrameBuffer (vmode, xfb[whichfb], colour);
#ifdef HW_RVL #ifdef HW_RVL
// on wii copy from memory // on wii copy from memory
//memcpy ((char *) xfb[whichfb], (char *) backdrop, 640 * screenheight * 2); memcpy ((char *) xfb[whichfb], (char *) backdrop, 640 * screenheight * 2);
#else #else
// on gc copy from aram // on gc copy from aram
//ARAMFetch ((char *) xfb[whichfb], (char *) AR_BACKDROP, 640 * screenheight * 2); // FIX ARAMFetch ((char *) xfb[whichfb], (char *) AR_BACKDROP, 640 * screenheight * 2); // FIX
#endif #endif
} }